T_era

Spring Data JPA Query Methods 및 JPA Auditing 정리 본문

Programing/Spring

Spring Data JPA Query Methods 및 JPA Auditing 정리

블스뜸 2025. 5. 16. 11:00

Query Methods

메서드 이름 기반 SQL 자동 생성 기능. JpaRepository는 기본 기능만 제공하며, 실제 개발에는 조건부 메서드 필요.

코드 예시:

public interface MemberRepository extends JpaRepository<Member, Long> {
    Member findByNameAndAddress(String name, String address);
}

위 메서드는 다음과 같은 SQL로 자동 생성됨.

SELECT * FROM member WHERE name = ? AND address = ?;

JpaRepository 제네릭 타입의 Entity와 매핑되는 테이블의 SQL 생성. 개발자는 규칙에 따라 메서드 선언, SimpleJpaRepository에서 구현됨.

해석 규칙:

  • find...By...: 조회 수행.
  • ByName: member 테이블의 name 필드 조건.
  • AndAddress: member 테이블의 address 필드 AND 조건 추가.
  • 직접적인 해석을 하는 것보다 공식문서 참고하는 것이 올바르다

JPA Auditing

Entity 생성 및 수정 시간 자동 관리 기능. Entity의 생성 및 수정 시점 추적 가능.

기존 방식:

@MappedSuperclass
public class BaseEntity {
    @Column(updatable = false)
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

    @PrePersist
    public void prePersist() {
        LocalDateTime now = LocalDateTime.now();
        created_at = now;
        updated_at = now;
    }

    @PreUpdate
    public void preUpdate() {
        updated_at = LocalDateTime.now();
    }
}

Spring Data JPA Auditing

어노테이션 기반 Auditing 기능 제공.

사용하는 Annotation:

  • @EnableJpaAuditing: JPA Auditing 활성화.
  • @MappedSuperClass: 상속받는 Entity에 공통 매핑 정보 제공.
  • @EntityListeners(AuditingEntityListener.class): Entity DB 적용 전 커스텀 콜백 요청. AuditingEntityListener는 Auditing 기능 활성화 Listener, 내부적으로 @PrePersist, @PreUpdate 사용.
  • @CreateDate: 생성 시점 자동 기록.
  • @LastModifiedDate: 수정 시점 자동 기록.
  • @Temporal: 날짜 타입 명시 (DATE, TIME, TIMESTAMP). 최신 Hibernate에서 LocalDate, LocalDateTime 생략 가능.
  • @CreatedBy: 생성자 정보 자동 저장. 생성 주체 지정을 위해 AuditorAware<T> 구현 필요 (Spring Security 연동).
  • @LastModifiedBy: 최종 수정자 정보 자동 저장. 생성 주체와 동일하게 AuditorAware<T> 구현 필요 (Spring Security 연동).

적용 방법:

  1. @EnableJpaAuditing을 Spring Boot 애플리케이션 메인 클래스에 추가.
    @EnableJpaAuditing
    @SpringBootApplication
    public class SpringDataJpaApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringDataJpaApplication.class, args);
        }
    }

2. BaseEntity 생성 및 Auditing 관련 어노테이션 적용.

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {

    @CreatedDate
    @Column(updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime createdAt;

    @LastModifiedDate
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime modifiedAt;
}
  1. Auditing 적용 Entity가 BaseEntity 상속.
    @Entity
    public class User extends BaseEntity {
        @Id
        private Long id;
        private String name;
    }
    

상속만으로 Entity 저장/수정 시 createdAt, modifiedAt 필드 자동 관리됨.