본문 바로가기

JPA14

Querydsl 실무 활용편 (2) Spring Data Paging 활용 - Querydsl 페이징 연동 사용자 정의 인터페이스 추가 public interface MemberRepositorySupport { List search(MemberSearchCondition condition); Page searchPageSimple(MemberSearchCondition condition, Pageable pageable); Page searchPageComplex(MemberSearchCondition condition, Pageable pageable); } 사용자 정의 인터페이스에 페이징이 추가된 인터페이스를 정의한다. Simple 의 경우, 앞서 Querydsl 결과 조회에서 배웠던 fetchResult 를 사용하여 페이징 결과를 .. 2021. 5. 3.
Querydsl 실무 활용편 (1) 순수 JPA 와 Querydsl MemberJpaRepository @Repository @RequiredArgsConstructor public class MemberJpaRepository { private final EntityManager em; private final JPAQueryFactory queryFactory; public void save(Member member) { em.persist(member); } public Optional findById(Long id) { Member member = em.find(Member.class, id); return Optional.ofNullable(member); } public List findAll() { return em.creat.. 2021. 5. 2.
Querydsl 중급 문법 프로젝션과 결과 반환 - 기본 프로젝션이란 SELECT 대상을 지정하는 것을 의미한다. @DisplayName("프로젝션 대상이 하나인 경우") @Test void simpleProjection() { // given // when List result = queryFactory .select(member.username) .from(member) .fetch(); // then assertThat(result).isNotNull(); result.forEach(name -> System.out.println("name = " + name)); } @DisplayName("Tuple 사용 - 프로젝션 대상이 두 개 이상인 경우") @Test void tupleProjection() { // given /.. 2021. 4. 28.
Querydsl 기본 문법 기본 Q-Type 활용 Q클래스 인스턴스를 사용하는 2가지 방법 QMember member = new QMember("m");// 직접 별칭 주어 새롭게 생성하여 사용 QMember member = QMember.member; // 이미 생성된 인스턴스 사용 새롭게 생성하여 사용하는 경우엔 생성자 안에 별칭을 넣어 사용하면 된다. 그러나, 기본적으로 생성된 인스턴스를 사용하는 것을 권장한다. 실제 사용 시 관련 Q Class 를 static import 하여 사용하는 것을 추천 import static study.querydsl.entity.QMember.*; @DisplayName("QMember static import 하여 사용") @Test void querydsl() { // given: QMe.. 2021. 4. 26.
Querydsl 사용 개요 최신 백엔드 기술로는 주로 Spring Boot 와 Spring Data JPA 사용한다. 그렇지만, 복잡한 쿼리나 동적 쿼리에 대해서 불편함이 존재한다. 이러한 상황 속에서 마지막 퍼즐 조각처럼 사용할 수 있는 기술이 바로 Querydsl 이다. Querydsl 의 경우 다음과 같은 특징을 가진다. 쿼리를 자바 코드로 작성할 수 있도록 해준다. 그리고 이러한 경우 컴파일 시점에 문법적인 오류를 잡아낼 수 있다. 또한, 복잡한 쿼리 즉 동적 쿼리에 대해서 편의성을 제공해준다. 스프링 데이터 JPA + Querydsl 사용은 선택이 아닌 필수 관계형 DB 를 사용하며, 복잡한 핵심 비즈니스 로직을 개발하는데 있어 Querydsl 은 필수적인 기술이다. 이는 단순 반복 문제를 해결해주며, 쿼리를 자바 코드로.. 2021. 4. 25.
쿼리 메소드 기능 쿼리 메소드 기능 3가지 메소드 이름으로 쿼리 생성 메소드 이름으로 JPA NamedQuery 호출 @Query 어노테이션을 사용해서 레포지토리 인터페이스에 쿼리 직접 정의 메소드 이름으로 쿼리 생성 메소드 이름을 분석해서 JPQL 쿼리 실행 예) 이름과 나이를 기준으로 회원 조회 로직 작성 // 순수 JPA public List findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and m.age > :age") .setParameter("username", username) .setParameter("age", a.. 2021. 1. 26.
객체지향 쿼리 언어 JPA 가 지원하는 다양한 쿼리 방법 JPQL JPA Criteria QueryDSL 네이티브 SQL - 범주에서 벗어난 종속적인 방언 사용 시 간혹 JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL JPA 는 SQL 을 추상화한 JPQL 이라는 객체 지향 쿼리 언어 제공 SQL 과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원 JPQL 은 엔티티 객체를 대상으로 쿼리 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리 SQL 은 데이터베이스 테이블을 대상으로 쿼리 SQL 을 추상화하여 특정 데이터베이스 SQL 에 의존 X 정리하면 객체 지향 SQL ※ 참고 JDBC 직접 사용, SpringJdbcTem.. 2021. 1. 25.
프록시와 연관관계 관리 프록시 기초 em.find() 와 em.getReference() em.find 의 경우 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference 의 경우 데이터베이스 조회를 미루는 가짜 프록시 엔티티 객체 조회 사용하는 시점에 실제 쿼리를 요청함 프록시 특징 (1) 실제 클래스를 상속 받아서 만들어짐 실제 클래스와 겉 모양이 같다. 사용하는 입장에서는 이론상 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다. 프록시 객체는 실제 객체의 참조(Target) 를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 프록시 객체의 초기화 실제 엔티티 정보 조회 요청 초기화 요청 → 영속성 컨텍스트 영속성 컨텍스트를 통하여 DB 조회 실제 Entity 생성 해당 Enti.. 2021. 1. 20.
값 타입 JPA 의 데이터 타입 분류 엔티티 타입 @Entity 로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 int, Integer 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으로 변경 시 추적 불가 값 타입 분류 기본값 타입 자바 Primitive 타입 래퍼 클래스 String 기본값 타입의 경우 생명주기를 엔티티에 의존한다. (회원 삭제하면 이름, 나이 필드도 함께 삭제) 값 타입의 경우 서로 다른 엔티티와 공유하면 안된다. (회원 이름이 바뀌었다고 다른 회원의 이름도 함께 변경되면 안된다.) ※ 참고 - 자바의 기본 타입은 절대 공유 되지 않는다. int, double 과 같은 primiti.. 2021. 1. 19.
상속 관계 매핑 객체엔 상속 관계가 있지만 관계형 데이터베이스는 상속 관계는 따로 없다. 다만, 슈터타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다. 여기서 상속관계 매핑이란, 객체의 상속의 구조와 DB 의 슈퍼타입 서브타입 관계를 매핑 주요 전략 - 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 조인 전략 단일 테이블 전략 구현 클래스마다 테이블 전략 위와 같은 3가지 전략 모두 JPA 와 매핑 가능하다. 조인 전략 가장 정규화된 방식 운영 시 어떤 데이터인지 확인하기 위하여 DTYPE 을 넣어주는게 좋다. - @DiscriminatorColumn(부모), @DiscriminatorValue(자식) 단일 테이블 전략에선 DTYPE 반드시 넣어줘야 한다. 장점 테이블 정규화 외래키 참조 무결성.. 2021. 1. 14.