JPA

· JPA
사이드 프로젝트 진행 중에 JPA의 N+1 문제가 발생하였다. 매장 목록 조회 시 매장에 등록된 해쉬태그를 가져오기 위해 일대다 관계를 맺고 있는데 이것 때문에 데이터당 한번씩 더 조회가 되고 있었다. @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.REMOVE }) @JoinTable(name = "tag_of_store", joinColumns = @JoinColumn(name = "store_id"), inverseJoinColumns = @JoinColumn(name = "store_tag_id")) private Set tags; 지금은 데이터가 적어서 문제가 안되지만 데이터 100개를 조회한다면 ..
· JPA
서브 쿼리 함수 JPQL도 SQL처럼 서브 쿼리를 지원한다. 여기서는 몇 가지 제약이 있는데, 서브쿼리를 WHERE, HAVING 절에만 사용할 수 있고 SELECT, FROM 절에서는 사용할 수 없다. 하이버네이트의 HQL은 SELECT 절의 서브 쿼리도 허용한다. 하지만 아직까지 FROM 절의 서브 쿼리는 지원하지 않는다. 일부 JPA 구현체는 FROM 절의 서브 쿼리도 지원한다. // 평균 나이보다 나이가 많은 회원 조회 "SELECT m FROM Member m WHERE m.age > (SELECT avg(m2.age) FROM Member m2)" // 한번이상 주문한 회원 조회 "SELECT m FROM member m WHERE (SELECT COUNT(o) FROM Order o WHER..
· JPA
경로 표현식이라는 것은 쉽게 이야기해서 .(점)을 찍어 객체 그래프를 탐색하는 것이다. "SELECT m.username FROM Member m JOIN m.team t JOIN m.orders o WHERE t.name = '팀A'" 여기서 m.usernam, m.team, m.orders, t.name이 모두 경로 표현식을 사용한 예다. 경로 표현식의 용어 정리 상태 필드(state field) 단순한 값을 저장하기 위한 필드(필드 or 프로터티) 연관 필드(association field) 연관 관계를 위한 필드, 임베디드 타입 포함(필드 or 프로터티) - 단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티 - 컬렉션 값 연관 필드 : @OneToMany, @ManyTo..
· JPA
페치 조인은 SQL에서 이야기하는 조인의 종류는 아니고 JPQL에서 성능 쵝적화를 위해 제공하는 기능이다. 연관덴 엔티티나 컬렉션을 한번에 조회하는 기능인데 join fetch 명령어로 사용할 수 있다. JPQL이 무엇인지 모르겠다면 아래 블로그 글을 참고 바란다. 객체 지향 쿼리 소개(JPQL, Criteria, Native, QueryDSL) JPA를 사용하면 EntityManager.find(), 객체 그래프 탐색(member.getTeam())과 같은 기능만으로 개발하기는 어렵다. 그리고 데이터베이스 테이블이 아닌 엔티티 객체를 대상으로 개발하므로 엔티티 객체를 devbksheen.tistory.com 엔티티 페치 조인 JPQL에서는 조인은 별칭을 사용할 수 없지만 하이버네이트는 별칭은 허용한다...
· JPA
JPA를 사용하면 EntityManager.find(), 객체 그래프 탐색(member.getTeam())과 같은 기능만으로 개발하기는 어렵다. 그리고 데이터베이스 테이블이 아닌 엔티티 객체를 대상으로 개발하므로 엔티티 객체를 대상으로 하는 방법이 필요하다. JPA는 복잡한 검색 조건을 사용해서 엔티티 객체를 조회할 수 있는 다양한 쿼리 기술을 지원한다. JPQL(Java Persistence Query Language) Criteria 쿼리(Criteria Query) : JPQL을 편하게 작성하도록 도와주는 API, 빌더 클래스 모음 네이티브 SQL(Native SQL) : JPA에서 JPQL 대신 직접 SQL을 사용할 수 있다. QueryDSL : Criteria 쿼리처럼 JPQL을 편하게 작성하도..
· JPA
JPA의 데이터 타입을 가장 크게 분류하면 엔티티(Entity) 타입과 값(Value) 타입으로 나눌 수 있다. 엔티티 타입은 @Entity로 정의하는 객체이고, 값 타입은 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체를 말한다. DDD에서는 엔티티 + 값으로 애그리 거트를 구축한다. 값 타입은 다음 3가지로 나눌 수 있다. 기본값 타입(baisc value type) String, int, Integer처럼 자바가 제공하는 기본 데이터 및 래퍼 클래스 타입 임베디드 타입(embedded type) - 복합 값 타입 JPA에서 사용하가 직접 정의한 값 타입 컬렉션 값 타입(collection value type) 하나 이상의 값 타입을 저장할 때 사용 기본값 타..
· JPA
고아 객체 제거 JPA는 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능을 제공하는데 이것을 고아 객체(ORPHAN) 제거라 한다. 이 기능을 사용해서 부모 엔티티의 컬렉션에서 자식 엔티티의 참조만 제거하면 자식 엔티티가 자동으로 삭제한다. @Entiry public class Parent { @Id @GeneratedValue private long id; @OneToMany(mappedBy = "parent", orphanRemoval = true) private List childs; } Parent parent = em.find(Parent.class, id); parent.getChilds().remove(0); // 실제 데이터베이스에서 삭제 orphanRemoval = ..
· JPA
특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶으면 영속성 전이 기능을 사용하면 된다. 쉽게 말해서 영속성 전이를 사용하면 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있다. JPA는 CASCADE 옵션으로 영속성 전이를 제공한다. @Entity @NoArgsConstructor public class Parent { @Id ... @OneToMany(mappedBy = "parent", cascade = {CascadeType.PERSIST , CascadeType.REMOVE}) // 영속성 전이 private List childrens = new ArrayList(); public void addChild(Child child) { // Child 추가 t..
· JPA
객체는 객체 그래프로 연관된 객체들을 탐색한다. 그런데 객체가 데이터베이스에 저장되어 있으므로 연관된 객체를 마음껏 탐색하기는 어렵다. JPA 구현체들은 이 문제를 해결하려고 프록시라는 기술을 사용한다. 프록시를 사용하면 연관된 객체를 처음부터 데이터베이스에서 조회하는것이 아니라, 실제 사용하는 시점에 데이터베이스에서 조회할 수 있다. 프록시의 특징 지연 로딩 기능을 사용하려면 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체를 생성하는데 이것을 프록시 객체, 프록시 클래스라고 한다. 프록시 객체는 실제 클래스를 상속받아서 만들어지므로 실제 클래스와 걷 모양이 같다. 따라서 사용하는 입장에서는 이것이 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다. 프록시 객체는 실제 객..
· JPA
데이터베이스 테이블의 연관관계를 설계하는 방법은 크게 2가지다. 조인 컬럼(외래 키) 사용 조인 테이블(브릿지 테이블) 사용 조인 컬럼 사용 테이블 간에 관계는 주로 조인 컬럼이라 부르는 외래 키 컬럼을 사용해서 관리한다. 연결할 테이블이 많아 질수록 컬럼이 많아질 수 있다. 조인한 테이블이 필수일때는 INNER JOIN(NOT NULL)을, 필수가 아닐때는 OUTER JOIN(NULL)으로 조인한다. 조인 테이블 사용 조인 테이블을 생성해 연결할 테이블들의 기본 키들을 엮어서 연결한다. 나는 보통 브릿지 테이블로 부르고 다대다 연결을 할때, 다른 테이블에 조인이 추가될 가능성이 높을때 주로 사용한다. 테이블마다 필요한 정보만 저장할 수 있어서 이 방법을 선호하지만 조인 테이블이 많아져 SQL이 느려질 ..
beekei
'JPA' 카테고리의 글 목록 (3 Page)