JPA

개발 고민

N + 1 문제의 쿼리 개선의 주의사항

N + 1 문제를 해결하는 과정에서 발생하는 성능 차이 개요 프로젝트 도중 N + 1 문제를 해결하는 과정에서 예상하지 못한 성능 문제가 발생하였습니다. N + 1 문제를 해결하고 성능을 개선하면서 1 + 1 쿼리로 바꿨음에도 불구하고 성능이 떨어지는 이슈가 발생한 사례를 소개하도록 하겠습니다. N + 1 문제란 N + 1 문제를 해결하는 과정을 살펴보기 전에 N + 1 문제가 무엇인지 먼저 간단하게 알아보도록 하겠습니다. N + 1 문제는 연관관계가 설정된 엔티티 사이에서 한 엔티티를 조회하였을 때, 조회된 엔티티의 개수(N) 만큼 연관된 엔티티를 조회하기 위해 추가적인 쿼리가 발생하는 문제입니다. N + 1 문제의 해결 방법 N + 1 문제를 해결하기 위한 방법으로는 상황에 따라 FetchJoin, ..

Backend/JPA

JPA 상속관계 매핑

오늘은 JPA의 상속관계 매핑에 대해서 포스팅해보고자 한다. 이전 프로젝트를 진행하면서 상속관계 매핑을 고려하지 않고 엔티티를 구성하여, 많은 부분에서 고생을 한 경험이 있었다ㅠㅠ... 하나 하나 알아가보자. 상속 관계에 대한 데이터베이스와 객체의 패러다임 불 일치 우선 상속이라는 것은 객체에는 존재하지만, 관계형 데이터베이스에는 존재하지 않는다. 이 존재하지 않는다는 것은 물리적으로 존재하지 않는다는 것이다. 하지만, 논리적인 데이터 모델링을 통해서 물리적으로 가능하게끔 만드는 방법은 존재한다. 그 방식이 슈퍼타입, 서브타입 방식이다. 이러한 논리 모델을 물리 모델로 변환하는 세 가지 기법이 있고, 해당 기법들을 JPA가 지원을 해준다. 조인 전략 : 부모 기본 키를 받아 테이블을 생성 (Inherit..

Backend/JPA

JPA 연관관계 매핑의 다중성

JPA에서 가장 중요한 것 두 가지를 꼽으라고 하면, 첫 번째는 영속성 컨텍스트 두 번째는 연관 관계 매핑이다. 어떤 비즈니스 로직이냐에 따라서 적절한 관계를 정해야 하기 때문에 굉장히 중요하다. 다중성을 알아보기 전에 알아봐야 할 용어가 몇 가지 있다. 다중성 : 다대일, 일대다, 일대일, 다대다 방향성 : 단방향, 양방향이 있다. 테이블에는 존재하지 않는다. 연관관계의 주인 : 양방향에서 연관 관계에 대해 관리하는 주체 즉, 읽기전용이 아닌 쪽을 말한다. 그 전에 짚고 넘어가야 할 부분이 있다. 이 부분은 자주 헷갈릴 수 있는 부분인데, 관계를 파악하기 위한 내 개인적인 방법이다. 연관관계 파악하기 때때로 지금 내가 파악하고자 하는 관계가 다대다 관계인지 다대일 관계인지 헷갈리는 경우가 종종 있다. ..

Backend/JPA

영속성 컨텍스트

영속성 컨텍스트란? 영속성 컨텍스트란 엔티티를 영구 저장하는 환경을 의미하고, 애플리케이션과 DB 사이에서 캐시를 이용해 데이터를 보관하는 역할을 한다. 이때 영속성 컨텍스트는 엔티티 매니저를 통해서만 접근이 가능하다. 영속성 컨텍스트에 데이터를 저장하기 위해서는 다음과 같이 저장할 수 있다. EntityManager em = emf.createEntityManager(); em.persist(entity); 영속성 컨텍스트는 환경에 따라 달리 구성될 수 있다. 스프링 같은 멀티 쓰레드 환경에서는 EntityManager : PersistenceContext 관계는 N : 1 관계이고, 단일 쓰레드 환경에서는 1 : 1 관계이다. 이어서 영속성 컨텍스트 내부에서 엔티티의 생명주기에 대해서 살펴보자. 영속..

Bombo_
'JPA' 태그의 글 목록