본문 바로가기

728x90
반응형

Spring 정리/Spring JPA

(19)
N + 1 문제 개요 N + 1이란, JPA를 사용하면서, 연관관계에 있는 엔티티들을 조회할 때, 조인과 관련하여 쿼리 실행 횟수가 불필요하게 늘어나는 경우를 말합니다. N + 1 문제를 위해서, 엔티티의 연관관계 설정에 따라서 발생하는 결과를 알아봅니다. 연관관계 조회 타입 엔티티 연관관계에서 기본 설정 값은 아래와 같습니다. @OneToOne, @ManyToOne : EAGER (연관 엔티티가 1개만 있기 때문에 하나정도는 같이 조회하는 의미로 EAGER로 만들지 않았나 생각합니다.) @ManyToMany, @OneToMany : LAZY (연관 엔티티가 여러개인 리스트라 쿼리 양이 많으므로, 최대한 해당 엔티티 리스트를 사용할 때 쿼리를 날리라는 의미에서 LAZY라고 생각합니다. ) 아래 Review 엔티티가 US..
영속성 전이(CASCADE)와 고아객체 * 개요 영속성과 고아객체는 DB에서 사용하는 CASCADE와 관련이 있습니다. DB에서 설정이 가능하지만, 이 관계는 또한 JPA를 사용해서 자바 코드단에서 설정할 수 있습니다. 이번 시간에 사용방법을 알아보겠습니다. * 영속성 전이(CASCADE)를 사용하는 때는? 특정 엔티티를 영속 상태로 만들 때, 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용합니다. 예를 들어, 부모 엔티티를 저장할 때, 자식 엔티티도 저장할 수 있습니다. * DB SQL로 제약상태 추가하기 DB에서 테이블을 만들 때, 수정과 삭제를 전이시키기 위해서 CASCADE를 사용합니다. 조건은 부모 테이블의 PK칼럼을 참조해야하며, 부모의 PK 칼럼을 자손에서는 FK칼럼으로 등록해야 합니다. 예를들어, ON DELETE CAS..
JPA 프록시(+즉시로딩, 지연로딩 비교) 개요 엔티티가 양방향으로 매핑을 하는데 혹시 연관관계를 조회할 필요가 없는 경우는 어떻게 할까요? 예를들어, Member가 Team을 칼럼으로 가지고 있지만, Member만 조회하고 싶을 때 어떻게 해야할까요? Team을 거의 사용하지 않은 경우, 매번 Member와 함께 조회하는 것은 비효율적입니다. JPA는 Proxy와 지연로딩을 통해서 해당 문제를 해결합니다. JPA 프록시 내부 동작 방식 JPA라고 해서 프록시가 특별한 것은 아닙니다. 단지 Hibernate가 내부적으로 프록시를 이용해서 구현할 뿐입니다. 기존의 프록시의 특징과 비교해서 살펴보면 이해가 쉽습니다. "JPA 프록시"의 핵심은 가짜 엔티티 객체를 조회해서 실제 DB조회를 끝까지 미루기 위함입니다. 1. JPA 프록시 객체는 실제 클래..
N:M 테이블 관계 설계하기 * 개요 4가지 JPA 관계 중에, N:M을 알아봅니다. N:M은 실무에서는 잘 사용하지 않는 관계로, 1:N, N:1로 나누어 관리하는 것이 좋습니다. * 특징 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없습니다. 따라서, 일대다, 다대일 관계로 풀어내야 합니다. 객체는 컬렉션을 사용해서 객체 2개로 다대다 관계가 가능합니다. @ManyToMany @JoinTable 2개를 이용해서, 각 MEMBER_ID, PRODUCT_ID를 PK, FK를 가지는 중간 테이블을 생성할 수 있습니다. 양방향 매핑, 단방향 매핑 모두 가능합니다. 하지만, 중간테이블에 주문시간, 수량같은 데이터가 추가되는 경우가 있을 수 있기 때문에 사용하지 않는게 좋습니다. * 한계 극복 중간 테이블을 엔티티..
연관관계 매핑 연관관계 - 객체와 테이블 연관관계의 차이를 이해한다. - 객체의 참조와 테이블의 외래 키를 매핑한다. 연관관계가 있다는 것은 테이블이 조회, 생성, 삭제 시 서로 연관되어 있다는 의미입니다. 예를 들어, 축구선수A가 B팀에 입단하면, 축구선수A 정보에 B팀을 추가해야하며, B팀 리스트에도 축구선수가 추가되어야 합니다. 만약 C팀으로 옮기면, 축구선수 A는 소속팀을 C팀으로 바꿔야 하고, B팀 리스트에서 선수A를 삭제합니다. 연관관계의 기본 개념은 다음과 같습니다. - 1:N 혹은 N:1 관계에서 외래키는 항상 N쪽에 있다.(외래키의 주인은 N이다.) - 1:1 관계에서 외래키의 위치는 설계에 따라 달라진다. - (N:M 관계는 다른 게시물에서 설명) JPA의 연관관계 매핑을 학습하기 이전에, 기본개념을..
N:1 테이블 관계 설계하기 * 개요 연관관계를 정하기 위해서는 단방향인지 양방향인지, 연관관계의 주인이 어디인지를 먼저 고려해야 합니다. * JPA에서 연관관계란? 테이블에서는 외래키 하나로, 테이블을 조인하고, 참조가 가능합니다. 따라서 사실상 방향이라는 개념이 없습니다. 하지만, 객체에서는 참조용 필드가 있는 쪽으로만 참조가 가능합니다. 한쪽만 참조하면 단방향, 양쪽이 모두 참조하여 양방향입니다. 예를 들어 A->B, B->A 처럼 참조가 2군데이면 양방향 객체 참조입니다. 이처럼 2군데로 참조하기 때문에, 외래키를 관리할 곳이 필요합니다. 이 외래키를 관리할 곳을 연관관계의 주인이라고 하며, 외래키가 주인이 아닌 곳은, 외래키에 영향을 주지 못하고 단지 조회만 가능합니다. * N:1 양방향 N:1 관계는, 가장 많이 사용하는..
1:N 테이블 관계 설계하기 * 개요 연관관계를 정하기 위해서는 단방향인지 양방향인지, 연관관계의 주인이 어디인지를 먼저 고려해야 합니다. * 1:N 단방향 Team : Member가 1: N 관계를 가지고 있으며, Team에서 외래키를 관리하는 연관관계의 주인인 경우입니다. 외래키를 관리하는 Team 객체를 기준으로 보면, Member가 N이므로 TEAM_ID 외래키를 가지고 있습니다. Team 객체가 연관관계 주인이므로, List members로 Member 객체를 참조합니다. 이는 객체와 테이블의 차이로 반대편 테이블의 외래키를 관리하는 특이한 경우입니다. 하지만, Member는 Team의 어떠한 정보도 참조하지 않습니다. 연관관계의 주인이 아니기 때문입니다. List members로만 서로의 객체 수정이 가능합니다. * 1:..
1:1 테이블 관계 설계하기 * 개요 연관관계를 정하기 위해서는 단방향인지 양방향인지, 연관관계의 주인이 어디인지를 먼저 고려해야 합니다. 1 : 1연관관계의 경우, 대상 테이블에 외래키를 관리하는 경우 단방향이 제한됩니다. 매핑 방식은 마치 N : 1에서 연관관계 주인에 따라 @JoinColumn과 mappedBy를 사용하는 것과 비슷합니다. * 1: 1 주테이블에 외래키 단방향 1 : 1 주 테이블 외래키 단방향의 경우, N : 1 단방향과 같은 개념이라고 보면 됩니다. 테이블 구조 상, 외래키를 관리하고 있는 MEMBER 테이블처럼, Member 객체가 Locker locker를 가지고 있습니다. 연관관계 주인이 Member이므로, Locker locker를 통해서 연관관계 객체들이 수정 될 수 있습니다. * 1: 1 주테이블..

728x90
반응형