JPA를 사용하는 데 있어 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것이다. JPA는 다양한 매핑 어노테이션을 지원하는데 크게 4가지로 분류할 수 있다. 객체와 테이블 매핑 : @Entity, @Table 기본 키 매핑 : @Id 필드와 컬럼 매핑 : @Column 연관관계 매핑 : @ManyToOne, @JoinColumn 이번 포스트에서는 1, 2, 3번에 대해 알아보자. 📂 @Entity JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야 한다. @Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라고 부른다. 속성은 다음과 같다. 속성 기능 기본값 name JPA에서 사용할 엔티티 이름을 지정한다. 보통은 기본값인 클래스 이름을 사용한다. 설정..
이번 포스팅에서는 영속 → 준영속의 상태 변화를 알아보자. 📂 준영속 영속성 컨텍스트가 관리하는 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 것을 준영속 상태라고 한다. 따라서, 준영속 상태의 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다. 영속 상태의 엔티티를 준영속 상태로 만드는 방법엔 크게 3가지가 있다. em.detach(entity) : 특정 엔티티만 준영속 상태로 전환 em.clear() : 영속성 컨텍스트를 완전히 초기화 em.close() : 영속성 컨텍스트를 종료 순서대로 한 번 알아보자. 1️⃣ 엔티티를 준영속 상태로 전환 : detach() em.detach() 메소드는 특정 엔티티를 준영속 상태로 만든다. - detach() 테스트 코드 public void test..
📂 플러시 플러시( flush() )는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다. 플러시를 실행하면 구체적으로 다음과 같은 일이 일어난다. 변경 감지가 동작해서 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해 수정된 엔티티를 찾는다. 수정된 엔티티는 수정 쿼리가 만들어 쓰기 지연 SQL 저장소에 등록한다. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다.(등록, 수정, 삭제 쿼리) 📂 플러시 호출 방법 영속성 컨텍스트를 플러시하는 방법은 아래의 3가지이다. em.flush() 를 직접 호출 트랜잭션 커밋 시 플러시가 자동 호출 JPQL 쿼리 실행 시 플러시가 자동 호출 하나씩 살펴보자. 1️⃣ 직접 호출( em.flush() ) 엔티티 매니저의 flush() 메소드를 직접 호출..
영속성 컨텍스트의 특징은 다음과 같은 것들이 있다. 영속성 컨텍스트는 엔티티를 식별자 값(@Id로 테이블의 기본 키와 매핑한 값)으로 구분하기 때문에, 영속 상태는 식별자 값이 반드시 있어야 한다. 없으면 예외가 발생한다. JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 저장된 엔티티를 데이터베이스에 반영한다. 이를 플러시(Flush)라고 하는데, 다음 포스팅에서 알아보도록하자. 영속성 컨텍스트가 왜 필요하고 어떤 이점이 있는지 엔티티를 CRUD하며 하나씩 알아보자. 1️⃣ 엔티티 조회 영속성 컨텍스트는 내부에 캐시를 가지고 있는데, 이를 1차 캐시라고 한다. 영속 상태의 엔티티는 모두 이곳에 저장된다. 쉽게 얘기하면 영속성 컨텍스트 안에 Map이 하나 있는데, Key는 @Id로 매핑한 식별자이..
JPA가 제공하는 기능은 크게 엔티티와 테이블을 매핑하는 설계 부분 매핑한 엔티티를 실제로 사용하는 부분 이렇게 두 가지로 나눌 수 있다. 엔티티 매니저는 엔티티와 관련된 모든 일(저장, 수정, 삭제, 조회 ...)을 처리한다. 엔티티 매니저에 대해 자세히 알아보자. 구현과 관련된 부분은 하이버네이트를 기준으로 설명한다. 📂 엔티티 매니저 팩토리 & 엔티티 매니저 엔티티 매니저 팩토리는 엔티티 매니저를 만드는 공장이다. 이를 생성하는 비용은 매우 크기 때문에 한 개만 만들어서 애플리케이션 전체에서 공유하도록 설계되어 있다. 반면에 엔티티 매니저를 생성하는 비용은 거의 들지 않는다. 💡 엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 안전하므로 서로 다른 스레드 간에 공유해도 되지만, 엔티티 매니저는..
간단한 JPA 애플리케이션 코드를 개발해보자. - 시작 코드 package jpa_test.start; import javax.persistence.*; import java.util.List; public class JpaMain { public static void main(String[] args) { // [엔티티 매니저 팩토리] - 생성 EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa_test"); // [엔티티 매니저] - 생성 EntityManager em = emf.createEntityManager(); // [트랜잭션] - 획득 EntityTransaction tx = em.getTransaction(); t..