JPA에 따라오는 꼬리표, N+1 최근들어 가장 많이 사용하는 API 중 하나인 JPA, 항상 JPA를 쓰면 따라오는 이야기가 있습니다. JPA를 쓰면 N+1 문제가 발생하는데 어떻게 해결해야하나요? JPA를 사용한다라고 하면 항상 나오는 질문입니다. 그때마다 머릿속에 정리가 잘 되지 않아 당황했던 기억이 있는데, 이 기회에 JPA에서 N+1이 발생하는 일반적인 케이스들을 모두 정리해보고자 글을 쓰게 되었어요 :) 흔히 알고있는 즉시로딩, 이 해결책으로 지연로딩 + fetch join을 해도 N+1이 생기는데요. 같이 모든 케이스를 확인해보면서 이야기를 이어나갈까 합니다 😀 모든 예제는 spring boot + spring data jpa환경으로 구성되어있습니다. 가장 많이 사용하는 조합이고, 많은 사람..
객체 지향에서 연관관계를 만드는 목표가 뭘까? "객체 지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다" -(객체지향의 사실과 오해) 일단 먼저 테이블에서 두 테이블의 연관관계를 매핑하기 위해서는 어떻게 매핑할까? FK(외래키)를 한 테이블에 두어서 각각의 테이블을 검색할 때 join을 하면 검색할 수 있다. 다음과 같은 테이블이 있을 때 우리는 두 테이블의 연관관계를 검색하고 확인할 수 있다. SELECT m.*, t.* FROM MEMBER m JOIN TEAM t ON m.TEAM_ID = t.TEAM_ID; SELECT m.*, t.* FROM TEAM t JOIN MEMBER m on t.TEAM_ID = m.TEAM_ID; 즉 하나의 테이블에 fk하나만 설정되어 있으면 서로의 ..
@Entity @Entity가 클래스단에 붙은 클래스는 JPA가 관리하는 Entity라고 지정할 수 있다. JPA에서는 entity를 리플렉션으로 관리하기 때문에 항상 기본 생성자가 필수이다. 접근 제어자의 경우 public과 protected까지만 허용되며 보통은 protected를 많이 쓰는 추세이다. final 클래스, enum 클래스, interface, inner 클래스 모두에 사용이 불가능 하며 필드에는 final 상수로 지정하면 안된다. property name JPA에서 사용할 entity의 이름을 지정할 수 있다. default: class name 가급적 default값을 사용하도록 하자. 동일한 네이밍의 entity 클래스를 사용할 경우에만 건드는 것을 추천. @Table entity..
JPA에서 가장 중요한 두가지 객체와 RDB 매핑하기 영속성 컨텍스트 영속성 컨텍스트 엔티티를 영구 저장하는 환경 엔티티의 생명주기 비영속 (new / transient) 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 영속 (managed) 영속성 컨텍스트에 관리되는 상태 준영속 (detached) 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제 (removed) 삭제된 상태 1. 비영속 Member member = new Member(); member.setId(1L); member.setName("hello"); 즉, 객체만을 만들어두고 다른 행위를 하지 않은 상태이다. 2. 영속 EntityManager em = emf.createEntityManager(); em.getTransaction()...
우리가 만드는 대부분의 어플리케이션은 객체 지향적인 언어를 사용한다. (Java, Scala ...) 하지만 데이터베이스에서는 아직은 RDB가 시장 대부분을 차지하고 있다. (Mysql, Oracle ...) 그래서 어떻게보면 객체를 RDB에 저장하여야하고 RDB에서 데이터를 꺼내서 객체에 매핑해서 사용해야한다. 즉, SQL 중심적인 개발을 진행해야한다. 누구나 한번쯤 느낄 수 있다. CRUD가 반복되는 무한반복 지루한 코딩 자바 객체를 SQL로, SQL를 자바객체로 변환하는 무수히 반복되는 코딩으로 인해서 SQL개발자인지 JAVA 개발자인지 분간이 되지 않는 상황이 오게 된다. 그 과정에서 겪을 수 있는 예를 보자. 객체 CRUD - 필드 추가 회원을 설계하고 회원을 저장하는 개발을 했다고 치자. pu..
- Total
- Today
- Yesterday