@Getter
@NoArgsConstructor
@AllArgsConstructor
public class PageParamsDto {
@Min(0)
@NotNull
private int page;
@Min(1)
@NotNull
private int perPage;
}
위의 경우 query parameter로 넘어온 data가 바인딩 되지 않는 문제를 겪었다. 이러한 문제가 발생한 이유는 아래와 같다.
Spring의 경우 URL 파라미터 또는 POST Form Data 형태의 파리미터를 커맨드 객체에 바인딩한다. 이 때 다음 2가지 규칙을 따른다고 한다.
1. NoArgsConstructor과 AllArgsConstructor 둘 다 있는 경우
NoArgsConstructor 호출하고, setter 호출하여 param을 필드에 각각 초기화한다2. AllArgsConstructor만 있는 경우
AllArgsConstructor 호출하여 param을 필드에 각각 초기화한뒤, setter 호출하여 param을 필드에 각각 다시 초기화하여 덮어 씌운다.
즉 나의 경우 NoArgsConstructor과 AllArgsConstructor 둘 다 있지만 setter가 없어 데이터가 제대로 바인딩되지 않는 문제가 발생한 것이다. 따라서 기존 코드에서 NoArgsConstructor를 제거하여 다음과 같이 수정하였다.
@Getter
@AllArgsConstructor
public class PageParamsDto {
@Min(0)
@NotNull
private int page;
@Min(1)
@NotNull
private int perPage;
}
이해가 안된 다면 이분의 글을 보자!!
JSON을 DTO로 DTO를 JSON으로 매핑할 때 ObjectMapper가 사용된다. 이러한 과정에서 ObjectMapper는 기본 생성자와 Setter 또는 Getter(Getter 추천)가 필요하기에 DTO는 기본 생성자와 Getter 또는 Setter가 있어야한다.
테스트시 사용되지 않을 가능성이 있는 stub에 적용한다. 이를 통해 Unnecessary Stubbing Exception 발생을 해결할 수 있다.
ex) lenient().when(~~)