본문 바로가기
관리자

Programming-[Backend]/JPA

(34)
[Querydsl]3. 기본 문법 - 서브쿼리, Case, 상수 문자 더하기 1. 서브쿼리 서브 쿼리의 필요성과 SQL 사용 권장 사항 서브쿼리를 사용하면 SQL의 결과를 한 번에 깔끔하게 가져올 수 있다. 그러나 SQL로 모든 데이터를 한번에 가져오고, 깔끔하게 정리까지 할려는 것은 과한 측면이 있다. SQL문 하나에 모든 데이터를 가져오도록 하지말고, 작은 SQL문으로 쪼개어 애플리케이션이나 화면단에서 데이터를 합치자. 너무 방대한 쿼리문을 작성하는 것보다 여러 개의 의미있는 SQL문을 작성하는 것이 재사용성과 가독성을 높이는데 도움을 줄 수 있다. 다만, 성능이 매우 중요하고 실시간으로 데이터를 빠르게 받아와야 하는 경우에는 쿼리 횟수를 줄여서 성능을 확보하는 것이 중요할 수도 있다. raw 데이터를 가져오는 방식으로 SQL문을 작성해야한다. SQL문에서 제공하는 기본적인 ..
[Querydsl]2. 기본 문법 기본문법은 대부분 익숙한 내용이라, 몰랐던 부분이나 중요한 부분만 위주로 개조식으로 작성한다. Q객체 생성하기 Maven으로 Build를 하면 Q 객체를 생성해줬었는데, Gradle은 Build를 해도 Q객체를 생성하지 않는다. 이전 글에서 배운 것처럼 compileQuerydsl을 직접해줘서 Q객체를 생성해줘야 한다. 기본 문법 static import를 안해서 어색할 수 있다. Q객체의 alias를 "m"과 같이 설정하고, 해당 객체를 querydsl 문법으로 넘기는 방식을 적용함을 자각하고 있자. 이 alias는 querydsl이 JPQL을 작성할 때 sql문의 alias로 사용한다. 같은 Q객체를 동시에 조회해야할 때, Q 객체의 alias를 지정해서 사용해주면 된다! 똑같은 엔티티에서 다른 내용..
[Querydsl]1. 프로젝트 생성 및 예제 작성해보기 Querydsl 왜 쓸까? 1. 문법이 sql문과 거의 유사하기 때문에 배우기 쉽고 간결하다. 자바처럼 프로퍼티 탐색('.' 찍기)으로 문법 검색이 가능하다. 2. JPQL의 String으로 작성하는 sql문에 비해서, querydsl의 문법은 자바의 문법을 차용하기 때문에 Compile 시점에 미리 에러를 잡아준다. (전체 파일이 실행되기 전에 문제가 있으면 바로 알려준다.) 3. 검색 조건 등 복잡하고 동적인 쿼리를 가능하게 해준다. 물론 한계가 있어서 통계성 쿼리 등은 natvie 쿼리 등으로 해결해야한다. 1. 프로젝트 생성 및 환경 설정 스타터에 querydsl은 없다. 그림상에 있는 dependencies들만 추가하여 프로젝트를 생성한다. springBoot가 querydsl의 버전을 관리해주..
[spring data JPA]4. 구현체 분석, 기타 기능 : Specification, Query by Example, Projections, Native query 1. 스프링 데이터 JPA 구현체 분석1 이때까지 학습했던 스프링 데이터 JPA의 JpaRepository를 자세히 살펴보자. 스프링 데이터 JPA의 구현체는 JpaRepository의 구현체로, SimpleJpaRepository라는 클래스이다. EntityManager를 사용한다. 스프링 데이터 JPA의 구현체들도 결국엔 EntityManager를 사용한다. em으로 축약해서 사용하고 있고, 필요하면 JPQL문법을 사용해서 구현이 된 것을 확인할 수 있다. @Repository를 사용한다. 클래스에 @Repository가 정의된 것을 확인할 수 있다. 이렇게 함으로써 기본적으로 스프링에서 요구하는 sepc을 맞출 수 있다. 또한 Repository에서 발생하는 Exception들을 스프링에 맞게 변환..
[spring data JPA] 3. 확장 : Auditing, Paging - @CreatedAt, @PageableDefault 등 1. 사용자 정의 레포지토리 구현 JpaRepository를 상속받는 Repository를 사용해야되는 경우, 내가 정의하는 메소드 외에 기본적으로 Spring Data JPA에서 제공하는 모든 메서드를 구현해야되서 사용이 힘들다. 따라서 내가 정의한 메서드만 Override 할 수 있도록 사용자 정의 레포지토리를 작성할 수 있다. 인터페이스를 MemberRepository 라고 하고, 그에 맞는 구현체는 MemberRepositoryImpl이라고 작성해주면, 스프링 부트가 알아서 사용자 정의 구현체임을 식별하여 Spring data JPA의 기능을 활용할 수 있도록 처리해준다. [인터페이스 이름 + Impl] 이라는 규칙을 적용해야되는 것을 기억하자. xml 이나 JavaConfig에서 설정을 바꾸어 ..
[spring data JPA] 2. 페이징과 정렬, 벌크 연산 @EntityGraph, JPA Hint Lock 1. 순수 JPA 페이징 JPA만 사용해서 페이징을 하는 방법은, JPQL문을 작성해서 setFirstResult, setMaxResults를 넣어주면 된다. Repository 파일에 다음과 같이 작성한다. 이미 API 상 setFirstResult, setMaxResults가 주어져서 상당히 편하다. setFirstResult는 어디부터 시작할지 결정하는, 말 그대로 offset이고, limit은 offset부터 몇개까지 결과를 반환할지를 결정한다. totalCount 메서드로 총 갯수를 구해서 구 메서드의 합계 결과를 바탕으로 Page 결과를 도출할 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 public List findByPage(int age, int offset, int ..
[spring data JPA] 1. 초기 설정 및 Data Jpa 기본 1. 초기 세팅 이전 강의와 거의 동일하게 프로젝트를 만들고 환경 설정을 해준다. application.yml 파일은 다음과 같다. 환경 설정에서 띄어쓰기, 오타 등의 실수는 치명적이다. 정확히 써야한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 spring: datasource: url: jdbc:h2:tcp://localhost/~/datajpa username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show-sql: true format_sql: true logging.level: org.hibernate.S..
[JPA활용-1] 3. 도메인 개발 : Unique 제약 조건, main/test 환경 설정 분리, JPQL 동적 쿼리 등 스프링의 @Repository에 JPA의 @PersistenceContext 추가 그냥 스프링만 이용할 때는 @Repository 어노테이션을 추가하여 @Component 로서 Component Scan이 되게 하였다. 여기에 @PersistenceContext 어노테이션으로 EntityManager를 불러오면, 스프링이 EntityManager를 만들어서 Repository에 주입해주게 된다. Member 객체와 관련한 기본적인 기능을 갖는 MemberRepository를 보면, EntityManager를 @PersistenceContext 어노테이션과 함께 작성한 것을 확인할 수 있다. 추가로, 엔티티 자체를 들고 와야하거나 특정 파라미터를 추가해야된다면, 기본편에서 배운 JPQL 문법을 사용해야 한..