티스토리 뷰

 

파일명 : PostController.java
@Slf4j
@RestController
@RequiredArgsConstructor
public class PostController {
/**
* 게시글 전체 조회
* @return
*/
@GetMapping(value = "/posts")
public List<PostResponse> getPostList(@Valid PostSearch postSearch){
log.info(postSearch.toString());
return postService.postList(postSearch);
}
}
파일명 : PostSearch.java
@Data
public class PostSearch {
private String searchWord;
private Integer page = 0;
@Max(value = 100, message = "page size는 100을 초과할 수 없습니다.")
private Integer size = 10;
public PostSearch() {
this.size=10;
this.page=0;
}
@Builder
public PostSearch(String searchWord, Integer page, Integer size) {
this.searchWord = searchWord;
this.page = page;
this.size = size;
}
}

다음과 같은 게시판 Controller와 검색을 위한 DTO가 있다.


원래 하고자했던바는, 

 

URL : http://localhost:8080/posts?page=2&size=5

 - 두 번째 페이지의, 게시물 5개 리턴,

 

URL : http://localhost:8080/posts

 - 특정 page 요청이 아닌경우, page=0, size=10으로 default value로 리턴

 

문제는 page와 size값이 null이 되는것을 발견하였다.

그렇다고, @requestparam defaultvalue을 이용하고 싶지 않았다..

 

솔직히 정확한 원인은 파악하지 못하였다.(짐잠만 할뿐)

결론 : default값을 설정하고 싶다면, 기본 생성자를 이용한다

파일명 : PostSearch.java
설명 : default value를 설정하고자 한다면,, 다음과 같이 생성자를 만들자!
@Data
public class PostSearch {
private String searchWord;
private Integer page;
@Max(value = 100, message = "page size는 100을 초과할 수 없습니다.")
private Integer size;
//default value설정을 위한 생성자 start
public PostSearch() {
this.size=10;
this.page=0;
}
//default value설정을 위한 생성자 end
@Builder
public PostSearch(String searchWord, Integer page, Integer size) {
this.searchWord = searchWord;
this.page = page;
this.size = size;
}
}

 


 

시도 해본 테스트 케이스

1. 명시적 초기화

private Integer page = 0;

 

 

2. @Builder.Defalut 어노테이션 사용

@Builder.Default
@Max(value = 100, message = "page size는 100을 초과할 수 없습니다.")
private Integer size = 10;

 

3. @Builder 어노테이션을 생성자 메서드 -->  클래스로 변경

 


 

짐작가는 부분

여러 테스트를 해본결과 발견한 부분을 공유한다.

 

@Builder 생성자 메서드에 포함된 변수들은 null로 초기화 되는 것을 발견하였다.

(즉, Builder 생성자에 포함되지 않는 변수는 명시적 초기화 성공)

 --> 만약 char, int 타입 변수를 @Builder 생성자 메서드에 포함하면 MethodArgumentNotValidException이 발생하게 된다.

 

private String searchWord;
@Builder.Default
private Integer page = 0;
@Builder.Default
@Max(value = 100, message = "page size는 100을 초과할 수 없습니다.")
private Integer size = 10;
private Integer testInteger = 10;
private char testChar = 'T';
private byte testByte = 1;
private Long testLong = 1L;
private String testString = "Test";
private short testShort = 1;
private boolean testBoolean = true;
public PostSearch() {
this.size=10;
this.page=0;
this.testChar='T';
this.testShort=1;
}
@Builder
public PostSearch(String searchWord, Integer page, Integer size) {
this.searchWord = searchWord;
this.page = page;
this.size = size;
}

 

 

1. API 요청시 Request GET PARAM이 객체에 바인딩 되는 과정

2. 롬복으로 인스턴스 생성시 실행순서

 

이 두가지 확인해보면 정확하게 파악할 수 있지 않을까?

 

'BACK > SPRING+JPA' 카테고리의 다른 글

lombok @Builder  (0) 2023.11.30
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함