티스토리 뷰
파일명 : 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
- python3
- 주사위게임3
- Java
- 프로그래머스
- Level2
- 클래스초기화블럭
- spring
- vue3란?
- 인스턴스초기화블럭
- Leve2
- 문제 리포트
- Mac
- 문자열만들기
- defaultdict
- 명시적 초기화
- LELVE1
- 초기화블럭
- vue3
- builder
- 숫자의표현
- JadenCase
- 괄호 회전하기
- level1
- JAVA 변수 초기화
- collections
- optionsAPI
- vue정의
- composition api
- python2.7
- 다음 큰 숫자
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |