[Spring] Spring Data JPA (2)

이연우·2025년 7월 29일

TIL

목록 보기
72/100

🔍 Query Methods란?

  • Spring Data JPA에서 메서드 이름을 기반으로 데이터베이스 쿼리를 자동 생성하는 기능
  • 직접 SQL을 작성하지 않고도 복잡한 쿼리를 쉽게 수행할 수 있게 됨

🔧 사용 방법 예시

public interface MemberRepository extends JpaRepository<Member, Long> {
    // 이름과 주소로 회원 검색
    Member findByNameAndAddress(String name, String address);
}
-- 실제로 실행되는 SQL
SELECT * FROM member WHERE name = ? AND address = ?;

🧠 쿼리 메서드 해석 규칙

메서드 이름 구성의미
findBy조회 시작 키워드
Namename 컬럼 조건
AndAddressaddress 컬럼 조건 추가

✅ 메서드 네이밍 규칙만 지키면 자동으로 JPQL이 생성

⚠️ 주의 사항

⛔ 복잡한 쿼리는 직접 확인 필수
이름으로만 추론된 쿼리가 의도한 대로 동작하지 않을 수 있음
→ 반드시 로그 또는 @Query로 SQL 확인

📖 참고 문서
Spring 공식 문서 - Query Methods → 필요한 Query Method를 찾아서 구현


🕓 JPA Auditing (순수 JPA 기준)이란?

  • 엔티티의 생성 시간, 수정 시간을 자동으로 기록해 주는 기능
  • 모든 엔티티마다 날짜 필드를 수동으로 관리하는 번거로움을 해결

❗ 문제점: 모든 엔티티마다 중복 필드 작성

@Entity
public class User {
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}
@Entity
public class Item {
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

💡 해결 방법: 공통 슈퍼클래스로 추출

@MappedSuperclass
public class BaseEntity {
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

    @PrePersist
    public void prePersist() {
        LocalDateTime now = LocalDateTime.now();
        createdAt = now;
        updatedAt = now;
    }

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

🕵️‍♂️ Spring Data JPA Auditing이란?

  • 엔티티의 생성 및 수정 시간을 자동으로 관리해 주는 기능
  • Auditing 기능을 어노테이션 기반으로 더 쉽게 사용할 수 있게 해 줌

🏷️ 주요 어노테이션 목록

어노테이션설명
@EnableJpaAuditingAuditing 기능 활성화 (Application 클래스에 선언)
@MappedSuperclass공통 필드를 가진 상위 클래스로 사용
@EntityListeners(AuditingEntityListener.class)엔티티 변화 감지 리스너 설정
@CreatedDate생성 시각 자동 저장
@LastModifiedDate수정 시각 자동 저장
@CreatedBy / @LastModifiedBy생성자 / 수정자 저장 (Spring Security 필요)
@Temporal날짜 타입 지정 (옵션)

⚙️ 적용 방법

1️⃣ @EnableJpaAuditing 추가

@EnableJpaAuditing
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

→ 메인 클래스 위에 선언하여 Auditing 기능 활성화

2️⃣ BaseEntity 생성

@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;
}

→ 모든 엔티티가 상속받으면 createdAt, modifiedAt을 자동으로 가짐

3️⃣ 엔티티에 상속 적용

@Entity
public class User extends BaseEntity {
    @Id
    private Long id;
    private String name;
}

User 클래스는 생성/수정 시간 자동 관리

💡 @CreatedBy, @LastModifiedBy는 언제 사용할까?

  • 로그인한 사용자 정보와 함께 생성/수정 기록을 남기고 싶을 때 사용
  • Spring Security의 AuditorAware<T>를 구현해야 동작

🧠 요약 정리

항목Query MethodsJPA Auditing
기능메서드 이름만으로 자동 SQL 생성생성일 · 수정일을 자동 기록
장점코드 간결, SQL 없이 개발 가능중복 제거, 시간 일관성 확보
단점쿼리 복잡성 증가 시 해석 어려움AuditorAware 설정이 번거로울 수 있음
보완@Query, Native Query 사용Spring Security 연동

0개의 댓글