Spring Boot에서는 JPA의 설정(EntityManagerFactory, TransactionManager 등)을 자동으로 구성합니다. DB 연결 정보는 application.properties(또는 application.yml)에서 간단히 지정하며 @PersistenceContext로 EntityManager를 주입받아 사용합니다.
Spring이 직접 EntityManager를 관리하기 때문에 직접 close할 필요는 없고, 각 요청마다 별도의 EntityManager 인스턴스를 제공합니다.
기존 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에서 JPA를 더 쉽게 사용할 수 있도록 지원하는 모듈입니다. 반복적인 CRUD 코드를 줄이고, 인터페이스만으로 데이터 접근 계층을 구현할 수 있습니다.
public interface MemberRepository extends JpaRepository<Member, Long> {
// 추가 쿼리 메서드 선언 가능
}
JpaRepository의 기본 구현체입니다. save, findAll, delete 등 다양한 메서드를 기본 제공하며, Paging, Sorting 등 부가 기능까지 지원합니다.
메서드 이름 규칙만 맞추면 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 = ? 쿼리를 자동으로 생성합니다.
엔티티의 생성 및 수정 시간을 자동으로 관리하는 기능입니다. 모든 엔티티에 createdAt, updatedAt 필드를 반복적으로 작성할 필요가 없습니다.
@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();
}
}
적용방법
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;
}
이런 식으로 엔티티에서 상속을 받으면 생성 및 수정 시각 필드가 자동으로 관리됩니다.
자료 및 코드 출처: 스파르타 코딩클럽