TIL

[250326 TIL] JPA + ENTITY

도원좀비 2025. 3. 26. 20:31

🤔 오늘 학습한 내용 요약

1️⃣ JPA란?

  • Java 객체와 관계형 데이터베이스(RDB)의 패러다임 불일치 문제를 해결하는 기술.
  • 객체 중심적으로 데이터를 다룰 수 있도록 ORM(Object Relational Mapping)을 지원하는 Java의 표준 인터페이스.
  • 대표적인 구현체: Hibernate

2️⃣ JPA를 쓰는 이유

  • 생산성 향상: CRUD SQL을 반복 작성하지 않아도 된다.
  • 유지보수성: 객체 필드 변경 시 SQL이 자동으로 변경되어 관리가 쉽다.
  • 성능 최적화: 1차 캐시, 쓰기 지연, 변경 감지(Dirty Checking), 지연 로딩 등을 통해 성능이 크게 향상된다.

3️⃣ 영속성 컨텍스트의 개념과 특징

  • 엔티티(Entity)를 영속 상태(managed) 로 관리하는 JPA의 핵심 개념.
  • 영속성 컨텍스트는 EntityManager 를 통해 접근 가능.
  • 영속성 컨텍스트에서 관리되는 엔티티는 DB와 자동 동기화된다.

4️⃣ 엔티티(Entity)의 생명주기

  • 비영속(new): 생성된 객체지만, 아직 영속성 컨텍스트와 관계 없음
  • 영속(managed): 영속성 컨텍스트에 저장된 상태
  • 준영속(detached): 영속 상태에서 분리된 상태 (detach, clear, close 시 발생)
  • 삭제(removed): 영속성 컨텍스트에서 삭제 대상이 된 상태 (remove() 호출 시 발생)

5️⃣ 영속성 컨텍스트의 주요 기능

  • 1차 캐시
    • 동일한 트랜잭션 내에서 같은 엔티티 조회 시 DB 조회 없이 캐시에서 즉시 반환
    • 성능 최적화에 도움
  • 동일성 보장
    • 같은 트랜잭션 내에서 조회된 엔티티는 항상 같은 객체 인스턴스를 반환
  • 쓰기 지연(Transactional Write-Behind)
    • 트랜잭션 Commit 시에 한 번에 DB에 변경 사항을 반영하여 성능 향상
  • 변경 감지(Dirty Checking)
    • 엔티티의 변경을 자동으로 감지하여 Update SQL을 자동 실행
    • 별도의 persist() 호출이 필요 없음
  • Flush
    • 영속성 컨텍스트의 변경 사항을 DB에 반영하는 동작
    • 기본적으로 트랜잭션 commit 시 자동 실행, 필요하면 수동 호출(em.flush())

6️⃣ Entity 생성과 매핑

  • Entity 클래스는 @Entity 어노테이션 필수
  • @Id로 PK 설정 필수, 기본 생성자 필수
  • @Table, @Column 등으로 다양한 매핑과 제약 조건 설정 가능
@Entity
@Table(name = "tutor")
public class Tutor {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 20)
    private String name;

    public Tutor() {}
    
    public Tutor(String name) {
        this.name = name;
    }
}

7️⃣ DDL 자동 생성 (hibernate.hbm2ddl.auto)

  • 개발 환경에서 DDL 자동 생성에 활용 가능
  • 실무 환경에서는 validate 또는 none 사용이 권장됨
  • 자주 사용되는 옵션
    • create: 테이블을 새로 생성(DROP 후 CREATE)
    • update: 변경된 사항만 반영
    • validate: 매핑 정확성 확인

📝 배운 내용 중 핵심

  • JPA 덕분에 객체 중심의 개발이 가능하고, DB 작업이 크게 간소화된다.
  • 영속성 컨텍스트를 잘 활용하면 성능, 신뢰성, 유지보수성이 크게 향상된다.
  • 변경 감지쓰기 지연과 같은 JPA의 자동화된 기능을 적극적으로 활용해야 한다.