JPA
-
[JPA] 연관관계 설정 - 단방향, 양방향JPA 2022. 7. 10. 17:05
객체의 참조와 테이블 외래키 매핑 단방향 연관관계 A, B 엔티티가 있을 때 A가 B에 대한 단방향 연관관계를 가진다면 A에서 필드로 가지고 있는 B 참조변수로 B를 조회할 수 있지만 반대로 B에서는 A에 접근하는 필드를 가지지 않는다. 객체는 참조(주소)로 테이블은 외래키로 연관관계 맺는다. 객체의 참조와는 달리 테이블에서는 항상 양방향 관계를 가진다. 참조를 통한 연관관계는 언제나 단방향이기 때문에 양방향으로 만들기 위해서는 반대쪽에도 필드를 추가해서 참조를 보관해야한다. ※ 참고 : 객체 그래프 탐색과 조인 - 객체가 참조를 사용하여 연관관계를 탐색하는 것을 객체 그래프 탐색이라고 한다. - 데이터 베이스에서 외래키를 사용하여 연관관계를 탐색하는 것을 조인이라고 한다. 연관관계 매핑이란? 객체가 가..
-
[JPA] 객체와 테이블 매핑, 기본 키 매핑JPA 2022. 7. 10. 14:03
매핑 어노테이션 종류 1. 객체와 테이블 매핑 : @Entity, @Table 2. 기본키 매핑 : @Id 3. 필드와 컬럼 매핑 : @Column 4. 연관관계 매핑 : @ManyToOne, @JoinColumn @Entity JPA를 사용하여 테이블과 매핑할 클래스에 붙힌다. 이때의 JPA가 관리하는 클래스를 엔티티라고 부른다. - 속성 name : JPA에서 사용할 엔티티 이름을 지정하는 속성으로 생략 시, 기본값인 클래스 이름을 사용한다. 다른 패키지에서 이름이 같은 클래스가 충돌하지 않도록 주의해야한다. - 주의사항 1. 기본 생성자가 필수다. 2. final 클래스, enum, interface, inner 클래스에는 사용할 수 없다. 3. 저장할 필드에 final을 사용하면 안된다. @Tab..
-
[JPA] 준영속(detached)과 병합(merge)JPA 2022. 7. 10. 00:11
준영속이란? 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 것을 의미한다. 준영속 상태의 엔티티는 영속성 컨텍스트가 관리하고 있지 않기 때문에 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다. - 거의 비영속 상태와 가깝다 : 영속성 컨텍스트가 관리 X, 기능 사용 불가 - 식별자 값을 가지고 있다. : 영속 상태였었기 때문 - 지연 로딩을 할 수 없다. : 영속성 컨텍스트가 관리하고 있지 않기 때문 준영속 상태로 만드는 방법 1. detach(entity) 특정 엔티티만 준영속 상태로 전환한다. 즉, 영속성 컨텍스트가 해당 엔티티를 관리하지 않는다. (1차 캐시, 쓰기 지연 SQL 저장소에서 해당 엔티티에 대한 모든 정보를 제거한다.) 2. clear() 영속성 컨텍스트를 초기화 하여 모든 엔티티를..
-
[JPA] Flush, 영속성 컨텍스트 변경내용을 DB에 동기화JPA 2022. 7. 10. 00:04
flush는 제목 그대로 영속성 컨텍스트의 변경내용을 데이터 베이스에 반영하는 것이다. flush를 하는 방법은 아래와 같다. 1. 엔티티 매니저의 flush 메서드 직접 호출 2. 트랜잭션 커밋 시, flush 자동 호출 3. JPQL 쿼리 실행 시, flush 자동 호출 엔티티 매니저의 flush 메서드 직접 호출 테스트, 다른 프레임워크와 JPA를 함께 사용하는 경우 이외에는 거의 사용하지 않는다. 트랜잭션 커밋 시, flush 자동 호출 단순 트랜잭션 커밋을 통해 DB에 데이터가 반영되는 것이 아니고 flush 호출을 통해 영속성 컨텍스트의 변경된 내용을 DB에 반영하는 것이기 때문에 JPA는 트랜잭션 커밋 시, flush를 자동 호출한다. JPQL 쿼리 실행 시, flush 자동 호출 JPQL이..
-
[JPA] 엔티티 매니저, 엔티티 매니저 팩토리, 영속성 컨텍스JPA 2022. 7. 9. 23:54
참고사항 1. 엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 안전하기 때문에 서로 다른 스레드 간에 공유해도 되지만 엔티티 매니저는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하기 때문에 스레드 간 절대 공유하면 안된다. 참고사항 2. 엔티티 매니저는 데이터 베이스 연결이 꼭 필요한 시점까지 커넥션을 얻지 않는다. 보통은 트랜잭션을 시작할 때 커넥션을 획득한다. 영속성 컨텍스트란? 엔티티를 영구 저장하는 환경으로 엔티티 매니저의 persist 메서드는 엔티티 매니저를 사용해서 엔티티를 영속성 컨텍스트에 저장한다. 엔티티의 4가지 상태 1. 비영속 : 객체 생성 상태로 영속성 컨텍스트와 관계가 없는 상태 2. 영속 : 영속성 컨텍스트에 저장된 상태 3. 준영속 : 영속성 컨텍스트에 저장되었다가..
-
[JPA] JPA에서 엔티티 매니저 설정JPA 2022. 7. 9. 16:35
1. XML 등 설정 정보를 통해 엔티티 매니저 팩토리를 생성한다. (Persistence 클래스를 사용한다.) 엔티티 매니저 팩토리의 경우 생성하는 비용이 크기 때문에 애플리케이션 전체에서 딱 한번만 생성하고 공유한다. 애플리케이션 종료 시, close 메서드를 호출하여 종료 시킨다. 2. 엔티티 매니저를 생성 엔티티 매니저를 통해 엔티티를 CRUD 할 수 있다. 엔티티 매니저의 경우 DB 커넥션과 밀접하기 때문에 쓰레드간 공유하거나 재사용 할 수 없다. 사용이 끝날 경우 close 메서드를 호출하여 종료 시킨다. 3. 트랜잭션 관리 JPA 사용 시, 트랜잭션 안에서 데이터를 변경해야 한다. 트랜잭션 없이 데이터를 변경할 경우, 예외가 발생한다. 따라서 엔티티 매니저에서 먼저 트랜잭션 API를 받아온다..
-
[JPA] 데이터 베이스 방언 - dialectJPA 2022. 7. 9. 16:27
JPA는 특정 데이터베이스에 종속적이지 않기 때문에 교체에 용이하나 각 DB별 SQL문법과 함수가 조금씩 다르다. - 데이터 타입의 차이 (VARCHAR, VARCHAR2) - 함수명의 차이 (SUBSTRING(), SUBSTR()) - 페이징 처리 차이 (LIMIT, ROWNUM) 위와 같이 각 데이터 베이스별 차이가 나타남에 있어서 SQL 표준이 아니거나 특정 DB만이 가지는 고유한 기술을 JPA에서는 방언(dialect)이라고 한다. JPA에서는 특정 DB에 대한 방언을 설정함으로써 사용자는 JPA의 표준 문법에 맞춰 JPA를 사용하면 애플리케이션 코드를 DB를 교체함에 따라 수정하지 않아도 된다. [참고 : 자바 ORM 표준 JPA 프로그래밍]