포스트

2021-05-28-TIL

2021-05-28-TIL

@RequestParam to be nullable

1
2
3
4
@GetMapping
public searchDto search(@RequestParam(name = "check-in", required = false) String checkIn) {
            ...
}

기본적으로 파라미터는 required = true값을 갖는다. 따라서 파라미터가 null이라도 동작하도록 하려면 required = false을 추가해주어야 한다.

  • https://stackoverflow.com/questions/12296642/is-it-possible-to-have-empty-requestparam-values-use-the-defaultvalue

@RequestParam Javadoc에 따르면 required의 기본값은 true이고, 요청에 파라미터가 없으면 예외가 난다. Spring MVC에서는 MissingServletRequestParameterException이 나고, 기본 예외 처리기는 이를 400 응답으로 바꾼다(DefaultHandlerExceptionResolver). 선택적인 파라미터를 다루는 방법은 세 가지다.

  • required = false: 값이 없으면 null이 들어온다. 그래서 int 같은 기본형에는 쓸 수 없고 Integer처럼 참조형이어야 한다.
  • defaultValue = "...": 값이 없거나 빈 값일 때 기본값을 쓴다. 기본값을 주면 required는 암묵적으로 false가 된다.
  • Optional<String>: 파라미터 타입을 Optional로 받으면 없음을 타입으로 표현할 수 있다.
1
2
3
4
5
6
@GetMapping
public SearchDto search(
        @RequestParam(name = "check-in", required = false) String checkIn,
        @RequestParam(defaultValue = "1") int guests) {
    ...
}

숙소 검색처럼 조건이 선택적인 API에서는 required = false로 받은 값이 null인지에 따라 쿼리 조건을 붙이거나 뺀다.


String to LocalDate

  • https://stackoverflow.com/questions/8746084/string-to-localdate/22538939#22538939

LocalDate.parse("2021-08-01")처럼 문자열 하나만 넘기면 DateTimeFormatter.ISO_LOCAL_DATE, 즉 yyyy-MM-dd 형식으로 해석한다. 다른 형식이면 포매터를 함께 넘긴다(LocalDate Javadoc).

1
2
LocalDate checkIn = LocalDate.parse("2021-08-01");
LocalDate checkOut = LocalDate.parse("2021.08.30", DateTimeFormatter.ofPattern("yyyy.MM.dd"));

해석에 실패하면 DateTimeParseException이 나는데, 이 예외는 RuntimeException 계열이라 SimpleDateFormat의 ParseException처럼 반드시 잡을 필요는 없다. LocalDate는 불변이고 스레드 안전해서 포매터와 함께 상수로 두고 공유해도 된다.

컨트롤러에서는 직접 파싱하지 않고 @RequestParam(name = "check-in", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate checkIn처럼 받아도 된다. @DateTimeFormat은 java.time 타입을 지원하고, ISO.DATE는 yyyy-MM-dd 형식이다.

참고한 자료외부 출처 2

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다