1. 페이징
DATA JPA 를 사용할때, Pagable 객체를 같이 넘기면 페이징처리된 결과를 받을 수 있다.
// PageRequest 는 Pagable 인터페이스의 하위 구현 클래스
val pageRequest: PageRequest = PageRequest.of(page, limit, Sort.by("createdAt").descending())
data JPA 에 이 객체를 받는 인터페이스를 선언하고 넘긴다.
Page<LoanMaster> findAllByUserIdIn(List<Integer> userIds, Pageable pageable);
반환형을 보면, User 객체가 아닌 Page 객체를 받게 되는데 이게 참 유용하다.
int getNumber() | 현재 페이지의 정보 |
int getSize() | 한 페이지의 크기 |
int getTotalPages | 전체 페이지의 수 |
int getNumberOfElements() | 결과 데이터 수 |
boolean hasPreviousPage() | 이전 페이지의 존재 여부 |
boolean hasNextPage() | 다음 페이지의 존재 여부 |
boolean isLastPage() | 마지막 페이지 여부 |
Pageable nextPageable() | 다음 페이지 객체 |
Pageable previousPageable() | 이전 페이지 객체 |
List<T> getContent() | 조회된 데이터 |
boolean hasContent() | 결과 존재 여부 |
Sort getSort() | 검색 시 사용된 Sort 정보 |
이외에도, nextPageable() 로 받은 다음 페이지 객체를 이용하여 다음 페이지의 페이지넘버를 아는 등 여러가지 작업을 할 수 있다.
나는 명세에 맞춰 작업하기에 Page 객체를 꺼내 적절히 Response DTO 로 변경하여 반환했지만,
클라이언트와 협업이 되는 상황에서는 아래와 같이 유연하게 대처가 가능하다.
- 컨트롤러에서 page, limit 같은 값이 아닌 Pageable 을 받는다 -> 정렬 기준이나, 방법이 바뀌면 메서드를 계속 추가해야하는 문제점 해결
- 반환을 Pageable 로 한다 -> 클라이언트에서 Page 객체의 모든 정보를 사용할 수 있음.
2. Json 응답시 Null 필드 제외
@RequestParam 의 require 옵션을 false 로 주면 해당 파라미터가 들어와도 안들어와도 괜찮은 상황을 구현할 수 있다.
그렇다면, 값이 있을때는 Response 에 설정하고, 값이 null 일때는 아예 값을 빼버리는 동작은 어떻게 구현할까.
그 방법은, DTO 클래스단에
@JsonInclude(JsonInclude.Include.NON_NULL)
를 붙이면 된다.
@JsonInclude(JsonInclude.Include.NON_NULL)
class ResponseDto(
val name: String,
val age: Int?
)
위와 같은 상황에서 age 가 null 로 들어온다면
{
name: "~"
}
이처럼 age 는 응답에서 제외된다.
3. Envers
Spring JPA 에는 해당 엔티티의 생성시간, 수정시간, 작성자 등을 기록할 수 있는 Auditing 기능이 있었다.
Envers 는 엔티티가 변경 된 전체 이력을 관리하는 History 기능이다.
추적할 엔티티클래스에 @Audit 에너테이션을 붙이면, _AUD 라는 postFix 가 붙은 테이블이 자동으로 생기면서 변경이력을 기록한다.
자동으로 생성된 테이블은, 기존의 테이블 + REV, REVTYPE 컬럼이다.
- REV : 수정 번호
- REVTYPE : (0 : 추가, 1: 수정, 2: 삭제)
기존 테이블 행의 많은 컬럼중 하나라도 수정이 일어나도 AUD 테이블에 행이 생성되며 이력이 관리되기 때문에, 행의 갯수가 더 많다.
특정 행을 이력 관리에서 제외하고 싶으면 @NoAudit 을 붙이면 된다.
추가적으로, [해당 컬럼이 해당 이력에 변경되었는지를 알고싶다] 면
@Audited 엔 withModifiedFlag 옵션이 있다.
true 로 값을 셋팅하면 Column에 _mod 를 붙인 Flag 컬럼이 추가적으로 생성되며 값의 변경 여부 true/false 로 저장한다.
modifiedColumnName 으로 생성될 컬럼의 이름을 직접 지정할 수 있다.
https://www.baeldung.com/database-auditing-jpa
https://github.com/dlxotn216/spring-data-envers
'TIL' 카테고리의 다른 글
TIL) Requset Wrapping, ContentCachingRequestWrapper , RequestBodyAdviceAdapter (Header/Body 의 차이와 성능이슈) (0) | 2021.10.23 |
---|---|
TIL) Kotlin : runCatching, DTO/Entity 작성 팁 (0) | 2021.10.21 |
TIL) 깃 충돌, 예외 처리 전략, @CreatedDate vs @CreationTimeStamp (0) | 2021.10.17 |
TIL) 트래킹 브랜치, @RequestParam 디폴트, Kotlin any() (0) | 2021.10.15 |
TIL) 쿠키/세션, 코틀린 스트림 파이프라인, 정규식 (0) | 2021.10.14 |