티스토리 뷰

 

파일명 : 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
링크
«   2024/07   »
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 31
글 보관함