Spring JPA, 엔티티, 영속성 콘텍스트
JPA(Java Persistence API)
JAVA ORM 기술에 대한 표준 명세로, JAVA에서 제공하는 API이다. 스프링에서 제공하는 것이 아님!
JPA를 사용하면 객체 지향적인 방식으로 데이터베이스와 상호작용할 수 있다. JPA는 객체를 데이터베이스 테이블에 매핑하고, 데이터베이스의 데이터를 객체로 변환하여 애플리케이션에서 사용할 수 있도록 한다.
동작원리
JPA는 Java 애플리케이션과 JDBC 사이에서 동작한다. 개발자가 애플리케이션에서 JPA를 호출하면 객체를 적절히 매핑하고 내부에서 JDBC를 호출한다. 따라서 JPA를 사용하면 개발자가 JDBC API를 직접 호출하지 않아도 된다.
- 주요 구성 요소
- 엔티티(Entity): 데이터베이스 테이블과 매핑되는 자바 클래스
- 영속성 유닛(Persistence Unit): JPA에서 관리되는 엔티티 클래스들의 집합
- 엔티티 매니저(Entity Manager): 엔티티의 라이프사이클을 관리하는 인터페이스
- 영속성 컨텍스트(Persistence Context): 엔티티 매니저에 의해 관리되는 엔티티 객체의 집합
- JPA의 주요 기능
- CRUD 연산: 엔티티의 생성, 읽기, 갱신, 삭제를 지원
- 쿼리 언어(JPQL): 객체지향적인 쿼리를 작성할 수 있는 쿼리 언어를 제공
- 트랜잭션 관리: 데이터베이스 트랜잭션을 처리하고 관리
- 캐싱: 엔티티 객체를 캐싱하여 데이터베이스 접근을 최소화
엔티티(Entity)
엔티티는 JPA에서 데이터베이스 테이블과 매핑되는 자바 클래스를 의미한다. 엔티티 클래스는 데이터베이스 테이블의 구조를 반영하며, 각 인스턴스는 테이블의 한 행(row)을 나타낸다. 엔티티 클래스는 반드시 @Entity 어노테이션으로 선언해야 하며, 기본 키(primary key)를 지정하기 위해 @Id 어노테이션을 사용한다.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters and Setters
}
위 예시에서 User 클래스는 users 테이블과 매핑된다. id, name, email 필드는 각각 테이블의 컬럼에 매핑된다.
영속성 컨텍스트(Persistence Context)
영속성 컨텍스트는 JPA에서 엔티티 객체를 관리하는 환경이다. 엔티티 매니저(Entity Manager)에 의해 관리되며, 엔티티 객체의 상태를 추적하고 관리한다. 영속성 컨텍스트는 데이터베이스와의 동기화를 통해 엔티티 객체의 생명 주기를 관리한다.
영속성 컨텍스트의 주요 기능
- 엔티티 생명주기 관리
- 새로운 상태(new): 아직 영속성 컨텍스트에 의해 관리되지 않는 상태
- 영속 상태(managed): 영속성 컨텍스트에 의해 관리되는 상태, 데이터베이스와 동기화됨
- 준영속 상태(detached): 영속성 컨텍스트에 의해 더 이상 관리되지 않는 상태, 데이터베이스와 동기화되지 않음
- 삭제 상태(removed): 영속성 컨텍스트에 의해 삭제가 예약된 상태, 트랜잭션이 커밋되면 데이터베이스에서 삭제
- 변경 감지(Dirty Checking)
- 영속성 컨텍스트는 엔티티 객체의 상태를 추적하며, 변경 사항이 발생하면 자동으로 데이터베이스에 반영
- 1차 캐시
- 영속성 컨텍스트는 엔티티 객체를 캐싱하여 동일한 트랜잭션 내에서 데이터베이스 접근을 최소화하고 이를 통해 성능을 최적화
public class JpaExample {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("example-unit");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
User user = new User();
user.setName("John Doe");
user.setEmail("john.doe@example.com");
em.persist(user); // 엔티티를 영속성 컨텍스트에 추가
user.setName("John Smith"); // 더티 체킹에 의해 변경 사항 감지
em.getTransaction().commit(); // 변경 사항이 데이터베이스에 반영
em.close();
emf.close();
}
}
위 예시에서 EntityManager는 User 엔티티를 영속성 컨텍스트에 추가하고, 트랜잭션이 커밋될 때 변경 사항을 데이터베이스에 반영한다.
Comments