Today I Learned
#JPA 심화 5주차: QueryDSL, Auditing, Dynamic Insert / Update
1. QueryDSL
QueryDSL은 타입 안전한 JPQL을 자바 코드로 작성할 수 있게 해주는 라이브러리이다.
장점
- 컴파일 시점에 문법 오류 검출 가능
- IDE 자동완성 지원 → 생산성 향상
- 복잡한 조건을 동적으로 조립 가능
QPost post = QPost.post;
List<Post> result = queryFactory
.selectFrom(post)
.where(post.title.contains("JPA"))
.fetch();
※실무에서는 복잡한 검색 조건, 페이징, 정렬 등을 처리할 때 QueryDSL이 거의 표준처럼 사용된다.
2. Auditing 기능
Auditing은 엔티티의 생성/수정 시점과 작성자 정보를 자동으로 기록해주는 기능이다.
주요 어노테이션
- `@CreateDate`, @LastModifiedDate`, @CreatedBy`, @LastModifiedBy`
설정 방법
- `@EnableJpaAuditing` 활성화
- `AuditorAware` 구현체 등록
@EntityListeners(AuditingEntityListener.class)
public class Post {
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
}
※실무에서는 모든 엔티티에 공통으로 적용되는 BaseEntity를 만들어 상속하는 방식이 일반적이다.
3. ⚙️ Dynamic Insert / Update
기본적으로 JPA는 모든 필드를 대상으로 `INSERT` / `UPDATE` 쿼리를 생성한다.
하지만 동적으로 필요한 필드만 처리하고 싶을 때 사용한다.
Dynamic Insert
- null 값인 필드는 `INSERT` 쿼리에서 제외
- Hibernate의 `@DynamicInsert` 어노테이션 사용
Dynamic Update
- 변경된 필드만 `UPDATE` 쿼리에 포함
- `@DynamicUpdate` 어노테이션 사용
@DynamicInsert
@DynamicUpdate
@Entity
public class User {
private String name;
private String email;
}
※성능 최적화뿐 아니라, DB에서 기본값을 설정해두었을 때 유용하게 쓰인다.
#마치며
단순 조회 최적화뿐 아니라, 실무에서 자주 쓰이는 고급 기능들까지 폭넓게 다룬 내용이었다.
QueryDSL을 통해 복잡한 조건을 우아하게 처리하고, Auditing으로 엔티티의 변경 이력을 자동으로 관리하며, Dynamic Insert/Update로 쿼리 성능까지 세밀하게 조절하는 방법을 배웠다.
이제 그저 JPA를 쓰는 수준을 넘어서, 실제 서비스에 적용 가능한 것들을 갖춰가는 느낌이다.