본문 바로가기

TIL

TIL) JPA 페이징, Json 응답시 Null 필드 제외, Envers

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 객체의 모든 정보를 사용할 수 있음.

 

 

https://velog.io/@conatuseus/JPA-Paging-%ED%8E%98%EC%9D%B4%EC%A7%80-%EB%82%98%EB%88%84%EA%B8%B0-o7jze1wqhj

 

JPA Paging (페이지 나누기)

현재 2개의 프로젝트 진행하고 있다. > 두 프로젝트 모두 글 또는 영상을 페이징해서 프론트에 뿌려주는 API가 필요했다. > 그래서 이번에 PageRequest를 사용해 페이징 하는 것을 공부했고 공유하고

velog.io

 

 

 

 

 

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

 

GitHub - dlxotn216/spring-data-envers: Entity Audit을 위해 다양한 테스트를 진행하는 Repository

Entity Audit을 위해 다양한 테스트를 진행하는 Repository. Contribute to dlxotn216/spring-data-envers development by creating an account on GitHub.

github.com