Search
Duplicate

확장 기능

사용자 정의 리포지토리 구현

→ 기존의 스프링 데이터 JPA는 모두 인터페이스로 되어 있다. 해당 인터페이스를 상속받아 모두 구현하는 것은 불가능에 가깝다.
그렇다면 특정한 기능(MyBatis의 라이브러리 기능 사용 등등...)을 사용 할 수 있게 사용자 정의 리포지토리 기능을 JPA에서 제공한다.

사용자 정의 인터페이스

Code
참고: 실무에서는 주로 QueryDSL이나 SpringJdbcTemplate을 함께 사용할 때 사용자 정의 리포지토리 기능 자주 사용
참고: 항상 사용자 정의 리포지토리를 사용해야 하는 것은 아니다. 그냥 임의의 리포지토리를 만들어도 된다.

사용자 정의 리포지토리 구현 최신 방식

→ 스프링 데이터 2.x 부터는 사용자 정의 구현 클래스에 리포지토리 인터페이스 이름 + Impl 을 적용하는 대신 사용자 정의 인터페이스 명 + Impl 방식도 지원한다.
Code

Auditing

→ 보통 솔루션 운용을 할 때 엔티티 생성, 변경할 때 생성(변경)한 시간과 사람이 누군지에 대한 기록은 다 남기는 것이 좋다. 하지만, 해당 속성들을 엔티티마다 모두 추가해주는 것은 생산성을 저하시키는 원인이 된다. 이번 시간에는 해당 공통 엔티티들을 공통으로 적용하는 방법을 알아본다.

등록일
수정일
등록자
수정자

스프링 데이터 Auditing::등록일(createdDate), 수정일(updatedDate)

Code

스프링 데이터 Auditing::등록자(createdBy), 수정자(updatedBy)

Code

등록일과 수정일, 등록자와 수정자를 분리해서 쓰고싶다면?

→ 실무에서는 엔티티마다 특성이 다르기 때문에 어떤 엔티티는 등록일,수정일만 쓰고싶은 경우가있고, 등록자와 수정자까지 쓰고싶은 경우도 있다.
이럴 경우 두 속성을 분리해서 상속받아 쓰게끔하면 해결된다.
Code

Web 확장 - 도메인 클래스 컨버터

→ HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩

기존에는 파라미터로 아이디를 받으면 해당 아이디를 리포지토리를 이용해 DB에서 엔티티를 조회한 이후 조회한다.
그런데, 도메인 클래스 컨버터 기능을 사용하면 HTTP 요청을 통해 id를 받을 경우 중간에 도메인 클래스 컨버터가 동작하여 해당 엔티티 객체를 반환해준다.
→ 도메인 클래스 컨버터도 리포지토리를 사용해 엔티티를 찾는다.
Code
주의: 트랜잭션이 없는 범위에서 엔티티를 조회했기 때문에 엔티티를 변경해도 DB에 반영되지 않으니 조회용으로만 사용해야 한다.

Web 확장 - 페이징과 정렬

→ 스프링 데이터가 제공하는 페이징과 정렬 기능을 스프링 MVC에서 편리하게 사용할 수 있다.

파라미터로 Pageable을 받을 수 있다.
Pageable 는 인터페이스, 실제는 org.springframework.data.domain.PageRequest 객체 생성

요청 파라미터

?page=페이지(0부터 시작)&size=가져올 객체 수&sort=정렬기준,desc or asc

기본값

글로벌 설정: 스프링 부트
Code
개별 설정
@PageableDefault 사용
Code

접두사

페이징 정보가 둘 이상이면 접두사로 구분한다.
@Qualifier 에 접두사명 추가 "{접두사명}_xxx"
?member_page=0&order_page=1
Code

Page 내용을 DTO로 변환하기

엔티티를 API로 노출하면 다양한 문제가 발생한다. 그래서 엔티티를 꼭 DTO로 변환해서 반환해야 한다.
Page는 map()을 지원해서 내부 데이터를 다른 것으로 변경할 수 있다.
Code

Page를 1부터 시작하기

스프링 데이터는 Page를 0부터 시작한다.
1부터 시작하는 방법은 크게 2가지가 있다.
1.
Pageable, Page를 파라미터와 응답 값으로 사용하지 않고, 직접 클래스를 만들어서 처리한다. 그리고 직접 PageRequest(Pageable 구현체)를 생성해서 리포지토리에 넘긴다. 물론 응답값도 Page 대신 직접 만들어서 제공해야 한다.
2.
spring.data.web.pageable.one-indexed-parameterstrue 로 설정한다. → 이 방법은 web에서 page 파라미터를 -1 처리 할 뿐이다. 그래서 응답값인 Page에 모두 0페이지 인덱스를 사용하는 한계가 있다.