JPA

Spring

[JPA] 일대다(1:N), 다대일(N:1) 관계

JPA의 일대다, 다대일 관계에 대해 알아보자. 일대다(1:N) 데이터베이스에서 일대다 관계는 굉장히 다양한 경우에 적용될 수 있다. 예를 들어, 장바구니와 담긴 상품, 교실과 학생, 게시판과 게시글 등이 있다. 이런 관계를 구현하기 위해 @OneToMany 어노테이션을 이용하여 다음과 같이 구현할 수 있다. 다음은 주문과 상품의 관계에 대한 일대다 양방향 관계를 나타낸 코드이다. @Entity public class Order { // ... @OneToMany(mappedBy = "order") private List products = new ArrayList(); // ... } @Entity public class Product { // ... @ManyToOne @JoinColumn(name ..

Spring

[JPA] 연관관계의 주인

JPA를 사용하며 알아야할 개념중 '연관관계의 주인'에 대해서 살펴보자. 연관관계의 주인이란? JPA에서 연관관계의 주인은 엔티티 간의 양방향 연관관계를 관리하는데 중요한 역할을 하는 개념이다. 양방향 연관관계란 두 개의 엔티티 클래스가 서로를 참조하고 있는 상태를 의미한다. 연관관계의 주인은 일반적으로 두 개의 연관관계 테이블중 외래키를 가지고 있는 테이블에 해당하는 엔티티가 연관관계의 주인이 된다. 연관관계의 주인을 엔티티간의 관계를 주도하고 관리하게 된다. 주인 엔티티의 필드를 사용하여 연관관계 간의 관계를 매핑하며, 이 필드는 데이터베이스 테이블에 반영된다. 더불어 연관관계의 주인이 아닌 엔티티는 읽기 전용(Read-Only) 엔티티로 사용되게 된다. 주인 엔티티가 데이터베이스에 영향을 미치기 때..

나혼자삽질

[JPA] object references an unsaved transient instance - save the transient instance before flushing

이슈 org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing JPA 연관관계를 이용해 저장하려던 중 위와 같은 오류 발생 원인 연관관계에 놓인 두 엔티티를 저장하려 할때, 부모 엔티티의 FK가 영속되지 않아 발생한 오류 나의 경우 다대다 관계에 대한 테스트중 자식 엔티티를 바라보는 부모 엔티티의 필드 값이 영속 시점에 적절히 저장되지 않아 발생한 이슈 해결 연관관계 엔티티를 함께 저장하기 위해서 Cascade 옵션을 통해 부모 엔티티가 저장될때 자식 엔티티가 함께 저장되도록 처리한다. @ManyToMany(cascade =..

Spring

[JPA]연관관계 - 다대다(N:M)

JPA 연관관계 다대다(N:M) 실무에선 보통 사용하지 않는것을 권장한다. 관계형 데이터베이스에서 정규화된 2개의 테이블로 다대다를 표현할 수 없다. 관계형 데이터베이스에서 다대다를 표현하기 위해서는 중간 테이블을 통해 일대다, 다대일로 나누어서 표현해야한다. JPA에서는 관계형 데이터베이스가 중간 테이블을 만드는 것과 달리 @ManyToMany 어노테이션을 통해 별도의 중간 테이블에 해당하는 엔티티를 만들지 않고도 다대다를 표현할 수 있다. 단방향 다대다 다대다 관계를 JPA를 통한 단방향 구현시 아래와 같이 코드 작성이 가능하다. Member (연관관계의 주인) @Entity @Table(name = "member") @Getter public class MemberEntity { @Id @Gener..

Spring

[JPA]연관관계 - 일대일 관계

JPA 1:1(일대일) 관계 일대일 관계는 주 테이블혹은 대상 테이블 중에 외래 키를 넣을 테이블 선택이 가능하다. 일대일 관계에서는 반대도 일대일 관계가 된다. 다대일 관계에서는 다(N)에 해당하는 곳이 외래 키를 가지고 있지만(연관관계의 주인) 일대일 관계에서는 주 테이블이나 대상 테이블에 외래 키를 둘 수 있어서 선택 해야 한다. 일대일 관계에서는 외래 키를 주 테이블에 둘지, 대상 테이블에 둘지에 따라 약간의 차이가 있다. 1. 주 테이블에 외래 키가 있는 경우 주 테이블에 외래 키를 둘 경우, 주 테이블에 매핑되는 주 객체에도 객체 참조를 두는 구조를 만들게 된다. 일대일 단방향 주 테이블 Parent에 단방향 일대일 관계에 해당하는 Child 객체필드를 만든후, @OneToOne 어노테이션 선..

Spring

[JPA] 연관관계 조회 방식별(Fetch, Lazy) 성능 차이 테스트

개요 N+1 문제와 해결 방법 JPA를 이용해 별도의 옵션 없이 엔티티를 조회할 경우, 엔티티에 연결되어 있는 연관관계들이 함께 조회된다. 함께 조회되는 시점에 부모 엔티티를 조회 하는 쿼리(1) + 연결되어 있는 연관관계 엔티티들에 대한 조회 쿼리(N)가 DB 요청으로 날아가게 된다. 예를들어 4개의 연관관계를 가지고 있는 엔티티 100개를 조회할 경우 100 + 400, 총 500회의 조회 쿼리가 날아가게 됨으로 성능에 큰 영향을 미치게된다. 이런 문제는 완벽하지는 않으나 Fetch Join, Entity Graph, Batch_Size를 통해 해결 할 수 있다. 보통 연관관계 엔티티들에 대해 FetchType을 통해 연관관계 엔티티를 즉시 조회(Eager)할지, 지연 조회(Lazy)할 지 정할 수 ..

Spring

[JPA]Spring Data JPA 시작

개요 MyBatis로 개발을 하던 중 요즘 많은 곳에서 JPA를 사용한다는 이야기를 접하게 되었다. 결과적으로 MyBatis와 달리 생산성이 어마무시하게 늘어나는 걸 보고 본격적으로 공부하고 정리해보게 되었다. 목차 1. JPA란? 2. JPA 사용 목적 3. SpringData JPA를 이용한 간단한 CRUD JPA란? JPA는 자바 진영의 ORM 기술 표준이다. 아주 오래전 EJB를 사용하던 때 한 회사원이 EJB의 복잡성과 어려움에 견디지 못하고 퇴근하고 Hibernate를 만들었고 이걸 접한 JAVA에서 Hibernate 담당자들을 데려와 여러 개발자와 함께 JPA 표준을 만들었다는 이야기가 있다. 중요한건 JPA는 하나의 명세일뿐 JPA를 기반으로 Hibernate, OpenJPA, Eclips..

turtleDev
'JPA' 태그의 글 목록