WEEK 6-14: Spring Data JPA

ensalada.de.pollo·2025년 5월 18일

be

목록 보기
36/44

Spring Boot와 JPA

Spring Boot에서는 JPA의 설정(EntityManagerFactory, TransactionManager 등)을 자동으로 구성합니다. DB 연결 정보는 application.properties(또는 application.yml)에서 간단히 지정하며 @PersistenceContext로 EntityManager를 주입받아 사용합니다.

Spring이 직접 EntityManager를 관리하기 때문에 직접 close할 필요는 없고, 각 요청마다 별도의 EntityManager 인스턴스를 제공합니다.

기존 JPA vs. Spring Boot JPA

기존 JPA는 직접 EntityManagerFactory/EntityManager를 생성해야 했습니다. 거기다가 Transaction 및 종료까지 수동으로 관리했습니다.

Spring Boot에서는 의존성 추가만으로 자동 설정을 해주고, 간편한 EntityManager를 사용하게 해줍니다.

@Repository
public class TutorRepository {
    @PersistenceContext
    private EntityManager em;

    public void save(Tutor tutor) { em.persist(tutor); }
    public Tutor findById(Long id) { return em.find(Tutor.class, id); }
    public List<Tutor> findAll() { return em.createQuery("SELECT t FROM Tutor t", Tutor.class).getResultList(); }
    public void delete(Tutor tutor) { em.remove(tutor); }
}

EntityManager

EntityManager는 동시성 문제 방지를 위해서 싱글톤으로 등록되지 않습니다. Spring Boot는 프록시를 싱글톤으로 등록해 요청마다 별도의 EntityManager 인스턴스를 제공하여 각 요청은 독립적으로 EntityManager를 사용하여 안전하게 데이터베이스 작업을 처리할 수 있습니다.

Spring Data JPA

Spring에서 JPA를 더 쉽게 사용할 수 있도록 지원하는 모듈입니다. 반복적인 CRUD 코드를 줄이고, 인터페이스만으로 데이터 접근 계층을 구현할 수 있습니다.

JPA vs. Spring Data JPA

  • JPA: 직접 EntityManager로 CRUD 메서드 작성이 필요합니다.
  • Spring Data JPA: JpaRepository 인터페이스를 상속하는 것만으로 기본 CRUD를 제공합니다.
public interface MemberRepository extends JpaRepository<Member, Long> {
    // 추가 쿼리 메서드 선언 가능
}

SimpleJpaRepository

JpaRepository의 기본 구현체입니다. save, findAll, delete 등 다양한 메서드를 기본 제공하며, Paging, Sorting 등 부가 기능까지 지원합니다.

Query Methods

메서드 이름 규칙만 맞추면 SQL없이 자동적으로 쿼리를 생성합니다. findBy{Field1}And{Field2} 등으로 조건 쿼리 작성이 가능합니다.

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

위 메서드는 SELECT * FROM member WHERE name = ? AND address = ? 쿼리를 자동으로 생성합니다.

JPA Auditing

엔티티의 생성 및 수정 시간을 자동으로 관리하는 기능입니다. 모든 엔티티에 createdAt, updatedAt 필드를 반복적으로 작성할 필요가 없습니다.

순수 JPA Auditing

@MappedSuperclass로 공통 부모 엔티티를 생성합니다. @PrePersist, @PreUpdate로 생성 및 수정 시각을 자동으로 기록합니다.

@MappedSuperclass
public class BaseEntity {
    @Column(updatable = false)
    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

적용방법
1. @EnableJpaAuditing: Application 클래스에 선언합니다.
2. @MappedSuperclass + @EntityListeners(AuditingEntityListener.class)로 공통 엔티티를 작성합니다.
3. @CreatedDate, LastModifiedDate등 annotation으로 생성 및 수정 시각을 자동으로 기록합니다.

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

이런 식으로 엔티티에서 상속을 받으면 생성 및 수정 시각 필드가 자동으로 관리됩니다.

자료 및 코드 출처: 스파르타 코딩클럽

0개의 댓글