2022년 3월 1일 기록

yshjft·2022년 3월 1일
0

하루 기록

목록 보기
15/16

✔︎ @ModelAttribute

@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;
}

이해가 안된 다면 이분의 글을 보자!!

참고

✔︎ ObjectMapper & DTO

JSON을 DTO로 DTO를 JSON으로 매핑할 때 ObjectMapper가 사용된다. 이러한 과정에서 ObjectMapper는 기본 생성자와 Setter 또는 Getter(Getter 추천)가 필요하기에 DTO는 기본 생성자와 Getter 또는 Setter가 있어야한다.

참고

✔︎ 테스트 관련 annotation

  • @BeforeAll
    • 테스트 클래스를 초기화할 때 딱 한번 수행되는 메서드
    • static으로 작성되야 한다
  • @BeforeEach
    • 테스트 메스드 실행 이전에 수행된다
  • @AfterAll
    • 테스트 클래스 내 테스트를 모두 실행시킨 후 딱 한번 수행되는 메서드
    • static으로 작성되어야한다
  • @AfterEach
    • 테스트 메서드 실행 이후에 수행
  • @Disabled
    • 해댕 테스트 메서드를 무시한다

참고

✔︎ lenient()

테스트시 사용되지 않을 가능성이 있는 stub에 적용한다. 이를 통해 Unnecessary Stubbing Exception 발생을 해결할 수 있다.

ex) lenient().when(~~) 

참고

profile
꾸준히 나아가자 🐢

0개의 댓글