- Data Mapping Annotations
(1) @RequestBody, @ModelAttribute, @RequestParam, @PathVariable, @RequestParam
https://mangkyu.tistory.com/72
- ModelAttribute(default: form, parameter, queryParam, body), RequestParam(queryParam), RequestPart(Content-type이 'multipart/form-data'), RequestBody(application/json)
- Spring Controller에서 값을 받을때 default가 @ModelAttribute (Content-type이 multipart/form-data의 형태를 받을때, HTTP 파라메터, 즉 HTTP body로 오든 파라미터로 오든 다 받을 수 있고 body와 파라미터가 같이 오는 경우에도 값이 바인딩된다.) @ModelAttribute는 값을 객체로 바인딩할 때 프로퍼티 접근법을 사용. 기본생성자로 만들고 setter로 값 세팅.
- @RequestPart, @ModelAttribute 둘 다 form을 처리할 수 있는데, 차이는 RequestPart는 개별, @ModelAttribute는 class로 받는다. 개수가 많지 않으면 @RequestPart를 사용해도 좋음.
- @RequestBody는 클라이언트가 보내는 HTTP 요청의 본문의 데이터(Json, XML, TEXT)가 HttpMethodConverter를 통해 파싱되어(직렬화) 객체로 변환되지만, @ModelAttribute는 클라이언트가 보내는 HTTP 파라미터(쿼리스트링, 폼데이터)를 특정 오브젝트에 바인딩(매핑) 해주는 것이기 때문입니다.즉, @ModelAttribute를 사용할 때는 객체의 각 필드에 접근해 데이터를 바인딩 할 수 있는 생성자나 setter가 필요합니다.
https://techblog.woowahan.com/2551/
(2) [Spring] @Valid와 @Validated를 이용한 유효성 검증의 동작 원리 및 사용법 예시 - (1/2)
출처: https://mangkyu.tistory.com/174 [MangKyu's Diary:티스토리]
@NotNull: 해당 값이 null이 아닌지 검증함
@NotEmpty: 해당 값이 null이 아니고, 빈 스트링("") 아닌지 검증함(" "은 허용됨)
@NotBlank: 해당 값이 null이 아니고, 공백(""과 " " 모두 포함)이 아닌지 검증함
@AssertTrue: 해당 값이 true인지 검증함
@Size: 해당 값이 주어진 값 사이에 해당하는지 검증함(String, Collection, Map, Array에도 적용 가능)
@Min: 해당 값이 주어진 값보다 작지 않은지 검증함
@Max: 해당 값이 주어진 값보다 크지 않은지 검증함
@Pattern: 해당 값이 주어진 패턴과 일치하는지 검증함
- Swagger에도 보여지는 @Valid 검증 파라메터 종류: @NotNull, @Size(min = 6), @Pattern(regexp= "^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$").
- 커스텀 어노테이션도 검증할 수 있다. https://mangkyu.tistory.com/206
(3) [Spring] 여러 값을 1개의 쿼리 파라미터로 처리해야하는 경우와 Spring에서 자동으로 콤마 구분자가 처리되는 이유 https://mangkyu.tistory.com/224
- @CookieValue, @RequestHeader도 매우 유용해보임.
- 중요한 것은 위와 같은 어노테이션들이 모두 HandlerMethodArgumentResolver 인터페이스(줄여서 ArgumentResolver, 아규먼트 리졸버)의 구현체들에 의해 처리된다는 것이다. 스프링은 매우 직관적으로 해당 구현체 클래스의 이름을 네이밍해두었는데, 해당 어노테이션 이름에 MethodArgumentResolver를 붙여주면 된다. 우리는 현재 @RequestParam에 의해 어떻게 처리되는지를 보려고 하므로 RequestParamMethodArgumentResolver 클래스를 보 된다.
- GET https://mangkyu.tistory.com/boards?id=1&id=2&id=3&id=4&id=5 로 입력하면, @RequestParam List ids 로 내용을 받을 수 있다.
-
ArgumentResolver, MessageConverter
(1) ArgumentResolver, MessageConverter https://velog.io/@pp8817/HTTP-Message-Converter%EC%99%80-ArgumentResolver
- SpringBoot가 기본적으로 사용하는 MessageConverter에는 0 = ByteArrayHttpMessageConverter, 1 = StringHttpMessageConverter, 2 = MappingJackson2HttpMessageConverter 가 있다.
- 각각을 보면 @RequestBody byte[] data, @ResponseBody return byte[] 쓰기 미디어타입 application/octet-stream, @RequestBody String data, @ResponseBody return "ok" 쓰기 미디어타입 text/plain, @RequestBody HelloData data, @ResponseBody return helloData 쓰기 미디어타입 application/json
- Http 요청 읽기 canRead(), read() / Http 요청 쓰기 canWrite(), write()


- 컨트롤러를 호출할 때에는 request, response의 값, @RequestParam의 파라미터, inputstream등 어디선가 이들에게 데이터를 던져주고 있다. 이건 무엇일까? 바로 Argument Resolver이다. 핸들러 어댑터가 컨트롤러를 호출하기 전에 Argument Resolver를 호출하고 컨트롤러에서 핸들러 어댑터로 반환하기 전에 ReturnValueHandler가 호출되는 것을 볼 수 있다. 핸들러 어댑터가 핸들러(컨트롤러)를 보고 빨간색, 파란색 파라미터가 필요한 것을 확인하면 Argument Resolver에게 물어본다. 그러면 Argument Resolver가 파라미터 2개를 생성해준다. 그때 핸들러 어댑터가 핸들러(컨트롤러)를 호출하면서 Argument Resolver를 통해 생성된 파라미터를 넣어준다.
- HandlerMethodArgumentResolver, HandlerMethodReturnValueHandler, HttpMessageConverter 의 인터페이스를 제공하여 원한다면 확장할 수 있다.
(2) [Spring] @PathVariable 또는 @RequestParam 등의 값을 변환하여 받기(암호화된 @PathVaraible 값 복호화)
https://mangkyu.tistory.com/310
- RequestBody Advice, ControllerAdvice
(1) [Spring] @RequestBody에 ArgumentResolver(아규먼트 리졸버)가 동작하지 않는 이유, RequestBodyAdvice로 @RequestBody에 부가 기능 구현하기
https://mangkyu.tistory.com/250
(2) [Spring] ControllerAdvice는 AOP로 구현되어 있을까? ControllerAdvice의 동작 과정 살펴보기
출처: https://mangkyu.tistory.com/246 [MangKyu's Diary:티스토리]
https://mangkyu.tistory.com/246
- Dispatcher Servlet, HandlerMapping