JPA

JPA

[JPA] 페치전략 + 영속성 컨텍스트 등록 방식에 따른 N+1 문제

페치 전략에 따라도 다르지만 영속성 컨텍스트에 어떻게 추가하는지에 따라 또 달라집니다. EAGER Fetch EntityManager.find() find 메소드와 EAGER 페치전략을 사용하면 inner join으로 N+1문제 없이 주로 같이 조회가 되는 연관관계의 경우에 사용할 수 있습니다. EntityManger.createQuery() EAGER 페치전략을 사용해도 EntityManger.createQuery(JPQL)를 사용하면 한 번의 쿼리에 정보를 모두 가져오지 않지만 EAGER 페치전략을 사용하기 때문에 곧바로 N+1 문제가 터집니다. Spring Data JPA JpaRepository의 기본구현체인 SimpleJpaRepository의 findById 와 findAll, 커스텀 find..

JPA

[JPA] 양방향 연관관계와 단방향 연관관계

SQLMapper를 대충 경험하고 JPA를 시작해서 요즘 들어깨닫는게 많다. N+1 문제가 발생하는 원인과 해결하는 법을 알았는데 그 이전에 JPA를 SQLMapper처럼 사용할줄 알고(단방향 연관관계 사용) 필요할 때 양방향 연관관계를 사용해야한다는 걸 알았고 정리하려고 글을 쓴다. JPA 단방향 연관관계 DB설계에서 글과 댓글은 1:N의 관계를 갖는다. 이때 댓글은 글의 id를 외래키로 가진다. 그럼 예시와 같은 글과 댓글의 화면을 렌더링 해주려면 해당 글과 해당 글의 댓글을 가져와야한다. 글은 View 렌더링으로, 댓글은 Ajax로 해당 글의 id를 통해 비동기로 가져오는 서비스의 흐름을 가진다면 Entity @Entity @Getter @NoArgsConstructor @AllArgsConstru..

JPA

[JPA] 연관관계 맵핑 이후 조회 쿼리 시 생각해야할 것

가장 중요한 것은 필요한 정보만큼의 쿼리를 날리는 것이다. 조인을 하지 않고 너무 적은 정보를 가져와 발생하는 예상하기 어려운 N+1 문제도, 서비스 동작시에 필요없는 정보도 조인으로 가져오는 것도 문제다. 같은 객체를 DB에서 가져오더라도, 필요한 정보의 양이 다르면 메소드를 분리해야 한다. EntityGraph를 사용하든 Fetch Join을 사용하든 서비스에서 필요한 정보의 양은 서비스의 동작 마다 다르다. 코드 예시를 보자 Team Entity @Entity @Getter @NamedEntityGraph(name = "Team.withAll", attributeNodes = { @NamedAttributeNode("tags"), @NamedAttributeNode("zones"), @NamedAt..

JPA

[JPA] N+1, Fetch Join, JPQL @Query 사용 후기

N+1 문제 이전에 김영한님의 JPA 강의 중 연관관계 어노테이션에 @XToOne에 Fetch.Type을 LAZY를 추천한다. @XToMany는 기본으로 LAZY가 걸려있지만 @XToOne은 EAGER가 걸려 SELCT 하는 엔티티가 참조하는 엔티티도 모두 불러오기 때문이다. 참조 타입을 LAZY로 걸고 해당 엔티티를 사용하지 않으면 N+1 문제를 발생하는 쿼리를 발생시키지 않지만 LAZY를 걸어도 해당 엔티티를 사용하면 엔티티 프록시 객체는 모든 값을 가지고 있지 않기 때문에 값을 가져오기 위해 (영속성 컨텍스트,DB)로 N+1 문제를 발생하는 쿼리를 날린다. Join, Fetch Join Spring Data JPA가 제공해주는 것 외에도 JPQL을 사용해야하는 경우엔 @Query를 사용한다. JPQ..

JPA

[JPA] 연관관계 매핑

연관관계 매핑 ORM은 Object Relation Mapping의 약자로 객체와 관계형 데이터베이스 사이의 간격을 객체(엔티티)에 연관관계를 매핑해서 관계형 데이터베이스와 소통하는 기술이다. 엔티티 매핑은 객체와 데이터베이스 사이의 일대일로 대응되기에 JPA 어노테이션과 디테일 설정을 통해 쉽게 설정할 수 있다. 연관관계 매핑은 객체의 참조와 테이블의 외래 키를 매핑을 의미하는데 JPA에서는 PK가 아닌 PK에 해당하는 엔티티 객체 자체를 참조한다. 연관 관계시에 고려해야할 것 방향성 데이터베이스는 외래 키로 테이블 조인을 하기에 방향성이 없지만, 객체는 참조를 통해 다른 객체에 접근할 수 있어 방향성을 가진다. 단방향 연관관계 : 두 엔티티 사이에 하나의 객체만 다른 객체를 참조 양방향 연관관계 : ..

JPA

[JPA] 엔티티 매핑

@Entity 테이블과 매핑할 클래스는 해당 어노테이션을 붙여 JPA가 관리하고 엔티티라 한다 리플렉션 API를 활용한 동적 프록시를 이용하므로 1.기본 생성자 필수(public or protected 접근제한자) 2. final 클래스, enum, interface, inner 클래스는 사용불가 관련 포스팅 프록시 패턴, 리플렉션 API 데이터베이스 스키마 자동생성 자바 애플리케이션 실행 시점에 DDL을 이용한 스키마 자동생성 데이터베이스 방언을 활용해서 사용하는 데이터베이스에 맞는 적절한 DDL 생성 생성된 DDL은 개발 장비에서만 사용할 것 hibernate.hbm2ddl.auto 옵션 설명 create 기존 테이블 삭제 후 다시 생성(DROP + CREATE) create-drop CREATE와 ..

JPA

[JPA] 영속성 컨텍스트

엔티티 @Entity가 붙은 클래스는 JPA가 관리하고, DB에서 테이블과 맵핑이 될 클래스 @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; public Member(String name) { this.name = name; } } JPA가 엔티티 생성 시에 기본생성자를 사용하기에 필수 지연로딩을 위한 프록시 객체 생성 시에 상속을 통해 만들어서 final Class, private 생성자는 사용 불가 영속성 컨텍스트 영속성 컨텍..

JPA

[JPA] JPA, Hibernate, Spring Data JPA

개요 김영한님의 스프링, JPA 강의를 듣다가 야생형으로 프로젝트를 만들어봐야한다고해서 쓰던 애매한 개념을 갖고 Spring Data JPA의 Repository를 만지작 거리다가 그렇게 깊지않은 지식인데도 헷갈리는것 같아 글을 썼다. JPA? Hibernate? JPA: Java Persistence API의 약자로 데이터베이스와 객체 사이의 개념을 좁히기 위한 Interface이다. Hibernate: JPA에서 정의한 인터페이스를 구현한 구현체이다. DB의 테이블과 매칭되는 Entity를 영속성 컨텍스트를 이용해 엔티티를 관리하는 EntityManager를 사용해 객체와 데이터베이스를 맵핑한다. JPA? Spring Data JPA? Hibernate 사용 코드 public void transact..

비오베베
'JPA' 카테고리의 글 목록