Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.3'
id 'io.spring.dependency-management' version '1.1.6'
id 'org.springframework.boot' version '3.4.5'
id 'io.spring.dependency-management' version '1.1.7'
}

group = 'org.example'
Expand All @@ -27,8 +27,10 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-security'
testImplementation 'org.springframework.security:spring-security-test'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
testRuntimeOnly 'com.h2database:h2'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
Expand All @@ -41,6 +43,12 @@ dependencies {
compileOnly group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'

// querydsl 의존성
implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.1.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package org.example.expert.domain.comment.entity;

import static com.querydsl.core.types.PathMetadataFactory.*;

import com.querydsl.core.types.dsl.*;

import com.querydsl.core.types.PathMetadata;
import javax.annotation.processing.Generated;
import com.querydsl.core.types.Path;
import com.querydsl.core.types.dsl.PathInits;


/**
* QComment is a Querydsl query type for Comment
*/
@Generated("com.querydsl.codegen.DefaultEntitySerializer")
public class QComment extends EntityPathBase<Comment> {

private static final long serialVersionUID = 1329458967L;

private static final PathInits INITS = PathInits.DIRECT2;

public static final QComment comment = new QComment("comment");

public final org.example.expert.domain.common.entity.QTimestamped _super = new org.example.expert.domain.common.entity.QTimestamped(this);

public final StringPath contents = createString("contents");

//inherited
public final DateTimePath<java.time.LocalDateTime> createdAt = _super.createdAt;

public final NumberPath<Long> id = createNumber("id", Long.class);

//inherited
public final DateTimePath<java.time.LocalDateTime> modifiedAt = _super.modifiedAt;

public final org.example.expert.domain.todo.entity.QTodo todo;

public final org.example.expert.domain.user.entity.QUser user;

public QComment(String variable) {
this(Comment.class, forVariable(variable), INITS);
}

public QComment(Path<? extends Comment> path) {
this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS));
}

public QComment(PathMetadata metadata) {
this(metadata, PathInits.getFor(metadata, INITS));
}

public QComment(PathMetadata metadata, PathInits inits) {
this(Comment.class, metadata, inits);
}

public QComment(Class<? extends Comment> type, PathMetadata metadata, PathInits inits) {
super(type, metadata, inits);
this.todo = inits.isInitialized("todo") ? new org.example.expert.domain.todo.entity.QTodo(forProperty("todo"), inits.get("todo")) : null;
this.user = inits.isInitialized("user") ? new org.example.expert.domain.user.entity.QUser(forProperty("user")) : null;
}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.example.expert.domain.common.entity;

import static com.querydsl.core.types.PathMetadataFactory.*;

import com.querydsl.core.types.dsl.*;

import com.querydsl.core.types.PathMetadata;
import javax.annotation.processing.Generated;
import com.querydsl.core.types.Path;


/**
* QTimestamped is a Querydsl query type for Timestamped
*/
@Generated("com.querydsl.codegen.DefaultSupertypeSerializer")
public class QTimestamped extends EntityPathBase<Timestamped> {

private static final long serialVersionUID = -1617243527L;

public static final QTimestamped timestamped = new QTimestamped("timestamped");

public final DateTimePath<java.time.LocalDateTime> createdAt = createDateTime("createdAt", java.time.LocalDateTime.class);

public final DateTimePath<java.time.LocalDateTime> modifiedAt = createDateTime("modifiedAt", java.time.LocalDateTime.class);

public QTimestamped(String variable) {
super(Timestamped.class, forVariable(variable));
}

public QTimestamped(Path<? extends Timestamped> path) {
super(path.getType(), path.getMetadata());
}

public QTimestamped(PathMetadata metadata) {
super(Timestamped.class, metadata);
}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package org.example.expert.domain.manager.entity;

import static com.querydsl.core.types.PathMetadataFactory.*;

import com.querydsl.core.types.dsl.*;

import com.querydsl.core.types.PathMetadata;
import javax.annotation.processing.Generated;
import com.querydsl.core.types.Path;
import com.querydsl.core.types.dsl.PathInits;


/**
* QManager is a Querydsl query type for Manager
*/
@Generated("com.querydsl.codegen.DefaultEntitySerializer")
public class QManager extends EntityPathBase<Manager> {

private static final long serialVersionUID = 216623447L;

private static final PathInits INITS = PathInits.DIRECT2;

public static final QManager manager = new QManager("manager");

public final NumberPath<Long> id = createNumber("id", Long.class);

public final org.example.expert.domain.todo.entity.QTodo todo;

public final org.example.expert.domain.user.entity.QUser user;

public QManager(String variable) {
this(Manager.class, forVariable(variable), INITS);
}

public QManager(Path<? extends Manager> path) {
this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS));
}

public QManager(PathMetadata metadata) {
this(metadata, PathInits.getFor(metadata, INITS));
}

public QManager(PathMetadata metadata, PathInits inits) {
this(Manager.class, metadata, inits);
}

public QManager(Class<? extends Manager> type, PathMetadata metadata, PathInits inits) {
super(type, metadata, inits);
this.todo = inits.isInitialized("todo") ? new org.example.expert.domain.todo.entity.QTodo(forProperty("todo"), inits.get("todo")) : null;
this.user = inits.isInitialized("user") ? new org.example.expert.domain.user.entity.QUser(forProperty("user")) : null;
}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package org.example.expert.domain.todo.entity;

import static com.querydsl.core.types.PathMetadataFactory.*;

import com.querydsl.core.types.dsl.*;

import com.querydsl.core.types.PathMetadata;
import javax.annotation.processing.Generated;
import com.querydsl.core.types.Path;
import com.querydsl.core.types.dsl.PathInits;


/**
* QTodo is a Querydsl query type for Todo
*/
@Generated("com.querydsl.codegen.DefaultEntitySerializer")
public class QTodo extends EntityPathBase<Todo> {

private static final long serialVersionUID = -1664369315L;

private static final PathInits INITS = PathInits.DIRECT2;

public static final QTodo todo = new QTodo("todo");

public final org.example.expert.domain.common.entity.QTimestamped _super = new org.example.expert.domain.common.entity.QTimestamped(this);

public final ListPath<org.example.expert.domain.comment.entity.Comment, org.example.expert.domain.comment.entity.QComment> comments = this.<org.example.expert.domain.comment.entity.Comment, org.example.expert.domain.comment.entity.QComment>createList("comments", org.example.expert.domain.comment.entity.Comment.class, org.example.expert.domain.comment.entity.QComment.class, PathInits.DIRECT2);

public final StringPath contents = createString("contents");

//inherited
public final DateTimePath<java.time.LocalDateTime> createdAt = _super.createdAt;

public final NumberPath<Long> id = createNumber("id", Long.class);

public final ListPath<org.example.expert.domain.manager.entity.Manager, org.example.expert.domain.manager.entity.QManager> managers = this.<org.example.expert.domain.manager.entity.Manager, org.example.expert.domain.manager.entity.QManager>createList("managers", org.example.expert.domain.manager.entity.Manager.class, org.example.expert.domain.manager.entity.QManager.class, PathInits.DIRECT2);

//inherited
public final DateTimePath<java.time.LocalDateTime> modifiedAt = _super.modifiedAt;

public final StringPath title = createString("title");

public final org.example.expert.domain.user.entity.QUser user;

public final StringPath weather = createString("weather");

public QTodo(String variable) {
this(Todo.class, forVariable(variable), INITS);
}

public QTodo(Path<? extends Todo> path) {
this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS));
}

public QTodo(PathMetadata metadata) {
this(metadata, PathInits.getFor(metadata, INITS));
}

public QTodo(PathMetadata metadata, PathInits inits) {
this(Todo.class, metadata, inits);
}

public QTodo(Class<? extends Todo> type, PathMetadata metadata, PathInits inits) {
super(type, metadata, inits);
this.user = inits.isInitialized("user") ? new org.example.expert.domain.user.entity.QUser(forProperty("user")) : null;
}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package org.example.expert.domain.user.entity;

import static com.querydsl.core.types.PathMetadataFactory.*;

import com.querydsl.core.types.dsl.*;

import com.querydsl.core.types.PathMetadata;
import javax.annotation.processing.Generated;
import com.querydsl.core.types.Path;


/**
* QUser is a Querydsl query type for User
*/
@Generated("com.querydsl.codegen.DefaultEntitySerializer")
public class QUser extends EntityPathBase<User> {

private static final long serialVersionUID = -1825397529L;

public static final QUser user = new QUser("user");

public final org.example.expert.domain.common.entity.QTimestamped _super = new org.example.expert.domain.common.entity.QTimestamped(this);

//inherited
public final DateTimePath<java.time.LocalDateTime> createdAt = _super.createdAt;

public final StringPath email = createString("email");

public final NumberPath<Long> id = createNumber("id", Long.class);

//inherited
public final DateTimePath<java.time.LocalDateTime> modifiedAt = _super.modifiedAt;

public final StringPath nickname = createString("nickname");

public final StringPath password = createString("password");

public final EnumPath<org.example.expert.domain.user.enums.UserRole> userRole = createEnum("userRole", org.example.expert.domain.user.enums.UserRole.class);

public QUser(String variable) {
super(User.class, forVariable(variable));
}

public QUser(Path<? extends User> path) {
super(path.getType(), path.getMetadata());
}

public QUser(PathMetadata metadata) {
super(User.class, metadata);
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
Expand All @@ -18,7 +19,7 @@ public class AdminAccessLoggingAspect {

private final HttpServletRequest request;

@After("execution(* org.example.expert.domain.user.controller.UserController.getUser(..))")
@Before("execution(* org.example.expert.domain.user.controller.UserAdminController.changeUserRole(..))")
public void logAfterChangeUserRole(JoinPoint joinPoint) {
String userId = String.valueOf(request.getAttribute("userId"));
String requestUrl = request.getRequestURI();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.example.expert.aop;


import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.example.expert.aop.service.LogService;
import org.example.expert.domain.common.dto.AuthUser;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Aspect
@Component
@RequiredArgsConstructor
public class ManagerRegistrationLogAspect {

private final LogService logService;
private final HttpServletRequest request; // 요청 정보 추출을 위해 필요

// 매니저 등록 메서드 실행 "직후" 자동 실행
@After("execution(* org.example.expert.domain.manager.service.ManagerService.saveManager(..))")
public void logManagerRegistration(JoinPoint joinPoint) {
// 예시: 첫 번째 파라미터로 User 객체가 들어온다고 가정
Object[] args = joinPoint.getArgs();
String nickname = null;
for (Object arg : args) {
if (arg instanceof AuthUser) {
nickname = ((AuthUser) arg).getNickname();
break;
}
}
String requestUrl = request.getRequestURI();
LocalDateTime now = LocalDateTime.now();
String method = joinPoint.getSignature().getName();

// 로그 저장 (항상 별도 트랜잭션)
logService.saveLog(nickname, now, requestUrl, method);
}
}
Loading