[데브코스] JPA - Spring Data JPA

Updated: Categories:

W8D4 - Spring Data JPA에서 쿼리를 사용하는 방법에 대해 알아보자

Spring Data JPA

  • JPA 한층 더 편리하게 사용할 수 있도록 해주는 모듈
  • Entity Manager, Transaction Manager 설정 등을 자동으로 해준다.
  • 데이터 저장계층에 대한 인터페이스를 지원해준다. (JpaRepository)
  • 기본제공되는 CRUD 메소드를 사용할 수 있다.
public interface 레포지토리 extends JpaRepository<엔티티, PK타입> {
}


Method Query

  • 메소드 이름과 엔티티명을 조합해서 쿼리를 만들 수 있다.
  • 공식문서는 여기에서 확인 가능
  • 추가할 쿼리 작성은 Repository에서~
ex) 메소드 쿼리 만들기
public interface 레포지토리 extends JpaRepository<엔티티, PK타입> {
  // Data와 일치하는 값을 모두 찾는다
  List<엔티티> findAllByData(Data data);

  // Data와 일치하는 값을 찾고 + Time 기준으로 order by
  List<엔티티> findAllByDataOrderByTime(Data data);
}


Custom Query

  • 조합에 한계가 있는 복잡한 쿼리는 직접 쿼리를 명시해서 사용할 수 있다.
  • 이렇게 사용할 수 있는 쿼리 종류에는 두 가지가 있다.

JPQL

  • Java Persistence Query Language
  • 비교적 간단한 쿼리를 작성할 때 사용
  • Repository에 @Query 어노테이션을 사용하여 쿼리를 작성한다.
  • 쿼리에 객체 문법을 사용할 수 있다 (WOW)
public interface 레포지토리 extends JpaRepository<엔티티, PK타입> {
  @Query("SELECT e FROM 엔티티 AS e WHERE e.data  ...")
  Optional<엔티티> findByData(Data data);
}

Querydsl

  • 복잡한 join, 동적쿼리 등을 작성할 때 사용
  • 컴파일 시점 문법 오류 발견이 가능
  • JPQL보다 발전된 형태임..!

복잡한 쿼리 순서 : 기본 JPA -> Method Query -> JPQL -> Querydsl


기타 등등

DTO

  • 계층간 데이터 전달엔 DTO 객체를 쓰자 -> 엔티티가 이동하는건 X
  • Controller 계층에선 Entity를 사용하지 않고 DTO를 보내거나 받기만 한다
    • 즉 요청 데이터를 DTO로 받아서(또는 조합해서) Service 계층으로 보내준다.
    • Service의 결과값 또한 DTO로 받아서 Response
  • Service 계층에선 Entity 관리 + DTO Convert
    • DTO 값을 받아서 Entity 로직(Repository 사용)을 작성
    • Repository 리턴값인 Entity를 DTO로 변환하여 컨트롤러 계층으로 보내준다.

Pageable

  • 페이징을 위한 인터페이스로, 구현체로는 PageRequest가 있음
  • 페이징 쿼리를 쉽게 날릴 수 있다.
  • 컨트롤러에서 요청을 Pageable로 받을 수 있다.
  • Pageable는 다음과 같은 http 파라미터를 가진다.
    • page : 현재 페이지, 0부터 시작한다.
    • size : 한 페이지에 노출할 데이터 건수
    • sort : 정렬 조건 정의 (ASC, DESC)
  • 다양한 메소드 참고 - 참고링크
Controller
@GetMapping
public ... controller(Pageable pageable){
  service.findAll(pageable);
  ...
}
Service
public ... findAll(Pageable pageable){
  // 리턴 타입은 Page<Entity> 임.
  repository.findAll(pageable);
}

@ExceptionHandler

  • @Controller, @RestController가 적용된 Bean내에서 발생하는 예외를 잡아서 하나의 메소드에서 처리해주는 기능을 한다.
  • 해당 Exception이 발생하면 해당 메소드를 통해 Response 해준다
@ExceptionHandler(NotFoundException.class)
public Object 메소드 (Exception e){
    ... 여기서 처리 ...
}

Spring Boot 인코딩 설정

  • 한글 깨지는거 원인 : 스프링부트 기본 설정이 UTF8 이 아님
application.yaml
server:
  servlet:
    encoding:
      charset: UTF-8
      enabled: true
      force: true