You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// 복합 검색 조건BooleanBuilderbuilder = newBooleanBuilder();
if (title != null) {
builder.and(todo.title.containsIgnoreCase(title));
}
if (startDate != null && endDate != null) {
builder.and(todo.createdAt.between(startDate, endDate));
}
Custom Repository 패턴
동적 검색 조건 처리
Projection을 통한 DTO 직접 조회
집계 함수 활용 (담당자 수, 댓글 수)
3. N+1 문제 해결
// fetchJoin을 통한 N+1 방지@Query("SELECT t FROM Todo t LEFT JOIN FETCH t.user WHERE t.id = :id")
Optional<Todo> findByIdWithUser(@Param("id") Longid);
// QueryDSL fetchJoinquery.select(todo)
.leftJoin(todo.user, user).fetchJoin()
.where(todo.id.eq(todoId));
LEFT JOIN FETCH 사용
QueryDSL fetchJoin 적용
연관 엔티티를 한 번의 쿼리로 조회
4. JPA Cascade 설정
@OneToMany(mappedBy = "todo", cascade = CascadeType.REMOVE)
privateList<Comment> comments; // Todo 삭제 시 댓글도 삭제@OneToMany(mappedBy = "todo", cascade = CascadeType.PERSIST)
privateList<Manager> managers; // Todo 생성 시 담당자 자동 저장
5. AOP를 활용한 관리자 접근 로깅
@Before("execution(* ..UserAdminController.changeUserRole(..))")
publicvoidlogBeforeChangeUserRole(JoinPointjoinPoint) {
// 관리자의 사용자 역할 변경 요청 로깅log.info("User ID: {}, Request Time: {}, URL: {}", ...);
}
민감한 관리자 작업 추적
감사 추적(Audit Trail) 구현
엔티티 관계도
User (1) ──< (N) Todo
└──< (N) Comment
└──< (N) Manager
Todo (1) ──< (N) Comment (cascade: REMOVE)
└──< (N) Manager (cascade: PERSIST)
Manager (N) >── (1) Todo
└>── (1) User
Comment (N) >── (1) Todo
└>── (1) User