Spring/JPA

Spring/JPA

[JPA , HAN-COMMERCE] N + 1 문제상황(Join형태별)과 해결방안

이번 글은 JPA를 공부 후 프로젝트에 적용하며 JPA 쿼리가 비효율적으로 나가는 상황이 많이 발생 해 블로그 , 책을 참고하여 학습 후 개인 프로젝트에서 테스트 코드를 작성하며 정리합니다. ☀️ N + 1 이란? N + 1 문제는 연관관계가 설정된 엔티티 사이에서 한 엔티티를 조회 시 , 조회된 엔티티의 개수(N개)만큼 연관된 엔티티를 조회하기 위해 추가적인 쿼리가 발생하는 문제를 의미합니다. 엔티티 조회 쿼리(1번) + 조회된 엔티티의 개수(N개)만큼 연관된 엔티티를 조회하기 위한 추가 쿼리(N 번) = N + 1 또는 1 + N ☀️ 테스트 상황 설정 N + 1 문제가 발생하는 상황들을 알아보기 위해 저의 개인 프로젝트 코드를 예시로 설명 하겠습니다. 하나의 카테고리에는 여러개의 상품이 달릴 수 있..

Spring/JPA

[JPA] 프록시와 연관관계에 대해(즉시로딩과 지연로딩)

프록시 em.find() vs em.getReference() em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 실제 클래스를 상속 받아서 만들어지며 실제 클래스와 겉 모양이 같다 프록시 객체는 실제 객체의 참조(target)를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 프록시 객체는 처음 사용할 때 한 번만 초기화 하며 이 때 프록시 객체가 실제 엔티티로 바뀌는 것이 아니고 초기화 되면 프록시 객체를 통해서 실제 엔티티에 접근하는 방식 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 em.getReference()를 호출해도 실제 엔티티 반환 프록시 확인 프록시 인스턴스의..

Spring/JPA

[JPA] 상속관계 매핑

상속관계 매핑 관계형 데이터베이스는 상속 관계 없다 - > 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑한 것이 상속관계 매핑 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXX) JOINED : 조인 전략 SINGLE_TABLE : 단일 테이블 전략 TABLE_PER_CLASS : 구현 클래스마다 테이블 전력 @DiscriminatorColumn(name= "DTYPE") @DiscriminatorValue() 조인 전략(JOINED) 장점 테이블 정규화 외래 키 참조 무결성 제약조건 활용가능 저장공간 효율화 단점 조회시 조인을 많이 사용, 성능 저하 될 수 있음 조회 쿼리가 복잡함 데이터 저..

Spring/JPA

[JPA] 연관관계 매핑의 종류

연관관계 매핑시 고려사항 다중성 다대일 : @ManyToOne 일대다 : @OneToMany 일대일 : @OneToOne 다대다 : @ManyToMany(사용 안하는 거 권장) 단방향, 양방향 태이블은 외래 키 하나로 양쪽 조인 가능하기 때문에 방향이라는 개념 없다 객체는 참조용 필드가 있는 쪽으로만 참조 가능 - > 한족만 참조시 단방향 , 양쪽이 서로 참조하면 양방향 연관관계의 주인 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺지만 객체 양방향 관계는 A->B , B->A 처럼 참조가 2군데이므로 테이블의 외래 키 관리할 곳을 지정해야함 (@JoinColumn) 연관과계의 주인은 외래 키를 관리하는 참조 다중성 종류 다대일 단방향 : 가장 일반적으로 사용되는 연관관계라고 함 나는 실무에서 JPA..

Spring/JPA

[JPA] EntityMapping / 연관관계 매핑2

연관관계의 주인과 mappedBy mappedBy 는 JPA 학습 중에 어려운 개념으로 처음 학습시 이해하기 어려울 수 있다. - 꾸준히 공부 할 것(코드를 쳐보는 게 더 도움 될 듯) 객체와 테이블간에 연관관계를 맺는 차이를 이해해야 한다 객체와 테이블이 관계를 맺는 차이 객체 연관관계는 2개로 ex) 회원 -> 팀 (단방향) / 팀 -> 회원 (단방향) 테이블 연관관계는 1개 ex) 회원 팀의 연관관계 (양방향)  객체의 양방향 관계 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 2개다. 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 함 // A - > B class A { B b; } // B - > A class B { A a; } 테이블은 외래 키 하나로..

Spring/JPA

[JPA] EntityMapping / 연관관계 매핑 1

객체와 테이블 매핑 @Entity @Entty가 붙은 클래스는 JPA가 관리, 엔티티라한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자) final 클래스, enum, interface, inner 클래스 사용x 저장할 필드에 final 사용 불가(다른 강의 들을 때도 주로 private 필드로 생성했음) @Entity 속정 name - JPA에서 사용할 엔티티 이름을 지정하고 기본값으로는 클래스 이름을 그대로 사용한다. @Table 속성 @Table은 엔티티와 매핑할 테이블을 지정한다 name - 매핑할 테이블 이름이며 기본값은 엔티티 이름을 사용한다. uniqueConstraints - DDL 생성 시에 ..

Spring/JPA

[JPA] 영속성 컨텍스트

영속성 컨텍스트는 JPA 개념에서 매우 중요하고 잘 이해하고 넘어가야 하는 개념이므로 최대한 흐름을 머릿속으로 생각하면서 정리하기. 영속성 컨텍스트란? 엔티티를 영구 저장하는 환경이라는 뜻 엔티티 매니저를 통해서 영속성 컨텍스트에 접근 엔티티의 생명주기 1. 비영속 - 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 2. 영속 - 영속성 컨텍스트에 관리되는 상태 3. 준영속 - 영속성 컨텍스트에 저장되었다가 분리된 상태 ex) em.detach(entity) - 특정 엔티티만 준영속 상태로 전환 // em.clear() - 영속성 컨테스트를 완전히 초기화 // em.close() - 영속성 컨텍스트를 종료 4. 삭제 - 삭제된 상태 //객체를 생성한 상태(비영속) Member member = new Me..

Spring/JPA

[JPA | 전체적인 흐름 키워드 위주로 정리] JPA는 무엇인가?

jpa에 대한 전반적인 흐름 파악을 위한 정리 후 다음 글에 키워드 별로 자세히 정리하기 JPA 설명(Java Persistence API) - 자바 진영의 ORM 기술 표준 ORM은 객체 관계 매핑을 의미하며 객체는 객체대로 관계형 데이터베이스는 관계형 데이터베이스대로 설계 후 ORM 프레임워크가 중간에서 매핑 해주는 역할을 한다. - JPA는 인터페이스의 모음으로 jpa를 구현하는 구현체들이 있다. ex) Hibernate, EclipseLink, DataNumcleus - 저장: jpa.persist() , 조회 : jpa.find() , 수정: member.setName() , 삭제: jpa.remove - 객체에 상속을 설정하면 JPA가 해당 상속에 맞춰 쿼리로 처리해준다. - 연관관계와 객체 ..

기만석
'Spring/JPA' 카테고리의 글 목록