[Spring] QueryDSL, Auditing, Dynamic

Jiwoo·2024년 7월 1일
0

Spring

목록 보기
19/19
post-custom-banner

📌 QueryDSL

  • Entity의 매핑 정보를 활용해 쿼리에 적합하도록 쿼리 전용 클래스로 재구성해주는 기술
  • JPAQueryFactory를 통한 Q클래스를 활용할 수 있는 기능들 제공
  • JPAQueryFactory: 재구성한 Q클래스를 통해 문자열이 아닌 객체 또는 함수로 쿼리를 작성하고 실행하게 해주는 기술

📌 Auditing

  • Entity를 누가 언제 생성/마지막 수정 했는지 자동으로 기록되게 할 수 있다 (e.g. 방명록)
@CreatedDate
private Date created;

@LastModifiedDate
private Date updated;

@CreatedBy
@ManyToOne
private Account createdBy;

@LastModifiedBy
@ManyToOne
private Account updatedBy;

적용 방법

  • 메인 애플리케이션 위에 @EnableJpaAuditing 추가
@EnableJpaAuditing
@SpringBootApplication
public class Application {
  • Entity 클래스 위에 @EntityListeners(AuditingEntityListener.class) 추가
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class TimeStamp {
    @CreatedDate
    private LocalDateTime createdAt;

    @CreatedBy
    @ManyToOne
    private User createdBy;

    @LastModifiedDate
    private LocalDateTime modifiedAt;

    @LastModifiedBy
    @ManyToOne
    private User modifiedBy;
}
  • AuditorAware 구현체 만들기
@Service
public class UserAuditorAware implements AuditorAware<User> {
    @Override
    public Optional<User> getCurrentAuditor() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
			
        if (authentication == null || !authentication.isAuthenticated()) {
            return Optional.empty();
        }

        return Optional.of(((UserDetailsImpl) authentication.getPrincipal()).getUser());
    }
}
  • @EnableJpaAuditing에 AuditorAware 빈 이름 설정
@EnableJpaAuditing(auditorAwareRef = "userAuditorAware") // auditorAware 의 빈이름을 넣어준다.
@SpringBootApplication
public class Application {

📌 Dynamic Insert/Update

Dynamic Insert

Insert 쿼리를 날릴 때 null인 값은 제외하고 쿼리문 만들어진다

  • @DynamicInsert 어노테이션 붙여주면 끝
@DynamicInsert
	public class User {
  ...
}
@Test
  void dynamicInsertTest() {
    // given
    var newUser = User.builder().username("user").build();

    // when
    userRepository.save(newUser);

    // then
    // 부분 생성 쿼리
  }

Dynamic Update

Update 쿼리를 날릴 때 null인 값은 제외하고 쿼리문 만들어진다

@DynamicUpdate
public class User {
  ...
}
@Test
  void dynamicUpdateTest() {
    // given
    var newUser = User.builder().username("user").password("password").build();
    userRepository.save(newUser);

    // when
    newUser.updatePassword("new password");
    userRepository.save(newUser);

    // then
    // 부분 수정 쿼리
  }
post-custom-banner

0개의 댓글