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