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의 자동화된 기능을 적극적으로 활용해야 한다.