JPA & Querydsl
[우아콘2020] QUERYDSL 내용 정리
우아한 형제들에서 코로나로 인해서 2020 우아콘을 온라인으로 진행햇었던것을 보고 내용이 너무 좋아서 정리해놓으면 좋을거 같다고 생각했습니다. 주제는 적제된 데이터가 1000만건에서 10억건까지 되는 과정에서 얻은 Querydsl-JPA 개선 팁입니다. 테스트 환경으로 java(OpenJDK 1.8.0_252) Querydsl(Querydls-JPA 4.2.1) Database(AWS Aurora MySQL 5.6 1.19.6) MySQL 5.6 -> 인덱스 컨디션 푸시다운과 서브쿼리의 최적화 QueryDSL -> 버젼별 문법 변화 Querydsl은 버전에 따라서 문법이 변화하는 경우가 많아서 버전체크가 중요합니다. 4.0.1 버전까지는 list 조회 시 .list() 메서드를 사용 4.0.2 버전부터는..
8. 객체지향 쿼리 언어(JPQL)
1. 객체지향 쿼리 언어 소개 JPA는 다양한 쿼리 방법을 지원 검색 쿼리에서 JPA는 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검 색 조건이 포함된 SQL이 필요 2. JPQL JPQL SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리 SQL을 추상화해서 특정 데이터베이스 SQL에 의존X //검색 String jpql = "select m from Member m where m.age > 18"; List result = em.createQuery(jpql, Membe..
7. 값 타입
1. 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경시 추적 불가 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 private String username; 값 타입 분류 - 기본값 타입 1) 자바 기본 타입(int, double) 2) 래퍼 클래스(Integer, Long) 3) String - 임베디드 타입(embedded type, 복합 값 타입) - 컬렉션 값 타입(collection value type) 2. 기본값 타입 생명주기를 엔티티의 의존 값 타입은 공유하면X 기본 타입은 항상 값을 복사함 Integer같은 래퍼 클래스나 String 같은 특수한 클래스는 공유 가능한 객체이지만 변경X 3..
6. 프록시와 연관관계 관리
1. 프록시 실제 클래스를 상속 받아서 만들어짐 실제 클래스와 겉 모양이 같다. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨(이론상) 프록시 객체는 실제 객체의 참조(target)를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 public void printUserAndTeam(String memberId) { Member member = em.find(Member.class, memberId); // 이때 member의 team은 프록시 Team team = member.getTeam(); /..
5. 고급 매핑
상속관계 매핑 관계형 데이터베이스는 상속 관계X 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 상속관계 매핑: 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 1) 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 - 각각 테이블로 변환 -> 조인 전략 - 통합 테이블로 변환 -> 단일 테이블 전략 - 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 3가지 전략에서 서브타입의 코드는 동일하여 우선적으로 작성 @Entity public class Album4 extends Item4 { private String artist; public String getArtist() { return artist; } public void setArtist(String ar..
4. 다양한 연관관계 매핑
1.연관관계 매핑시 고려사항 3가지 다중성 기본적으로 DB에서의 연관관계 차수에 맞추어 결정하면 됨 종류 다대일: @ManyToOne 일대다: @OneToMany 일대일: @OneToOne 다대다: @ManyToMany - 실무에서 사용X 2) 단방향, 양방향 테이블 - DB 외래 키 하나로 양쪽 조인 가능 사실 방향이라는 개념이 없음 객체 - 애플리케이션 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향 3) 연관관계 주인 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음 객체 양방향 관계는 A->B, B->A 처럼 참조가 2군데 객체 양방향 관계는 참조가 2군데 있음. 둘중 테이블의 외래 키 를 관리할 곳을 지정해야함 연관관계의 주인: 외래 키를 관리하는 ..
3. 연관관계 매핑 기초
1. 연관관계가 필요한 이유 - 객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다. 1)테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다. 2) 객체는 참조를 사용해서 연관된 객체를 찾는다. (테이블과 객체 사이에는 큰 간격이 있다(패러다임의 차이)) 객체를 테이블에 맞추어 모델링의 예 - 협력 관계가 없음) - 참조 대신에 외래 키를 그대로 사용 @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; @Column(name = "TEAM_ID") private Long teamId; … } @Entity public ..
2. 엔티티 맵핑
1. 객체와 테이블 매핑 @Entity - @Entity가 붙은 클래스는 JPA가 관리하는 엔티티 - 기본 생성자 필수 - (jpa에서 프록싱할때 사용하는 등에 필요) - final 클래스 enum, interface, inner 클래스는 사용이 불가능 - 저장할 필드에 final 사용 불가능 @Table - 엔티티와 매핑할 테이블 지정 - 속성 1) name: 매핑할 테이블 이름 2) catalog: 데이터베이스 catalog 매핑 3) schema: 데이터베이스 schema 매핑 4) uniqueConstraints (DDL): DDL 생성 시에 유니크 제약 조건 생성 @Entity @Table(name="Member") public class Member2 { ~ } 2.데이터베이스 스키마 자동 생..