@ModelAttribute
1.
Model의 attribute에 접근하는 메서드
메서드레벨과 파라미터 레벨에서 모두 사용이 가능하고, 두 반환값 모두 모델 객체에 바인딩이 가능하다.
2.
ModelAttribute는 초기화와 바인딩 작업을 거친다. 그래서 값이 전달되지 않않아도초기화 값을 사용할 수 있다. RequestMapping은 바인딩만 하기 때문에 값이 전달되지 않으면 에러가 발생한다.
3.
form 형태의 Http body 데이터와 Http Body와 requestParam를 생성자나 setter로 바인딩하기 위해 사용한다.
ModelAttribute는 요청된 값이 객체의 타입과 일치하는지 검증하는 작업을 진행한다.
예를 들어 int로 요청이 들어와야 하는자리에 String값으로 요청이 들어오면 BineException이 발생한다.
4.
get요청 :
get요청시 request parameter로 보내는 경우에는 정상적으로 작동하지만, body로 전송하는 경우 안될 수 있다. 혹은 null로 들어갈 수 있다.
이유
1. ContentType을 multipart/form-data로 전송해야만 한다. 그렇지 않으면 415에러가 발생한다. 하지만, 단순히 json데이터를 전송하는데 form-data로 정보를 전송할 필요는 없어보인다.
2. 정보를 요청하는 작업이다. 그런데 RequestBody를 담아 데이터를 보낸다면 의도한 작업이 아니다.
3. Proxy http는 클라이언트와 서버사이에 프록시가 존재할 수도 있는데, 서버에서 get요청에 requestBody를 허용해도 프록시가 허용하지 않으면 문제가 발생한다. 혹은 일부 서버가 requestBody를 받지 않겠다고 하면 get요청의 requestBody가 무시된다.
동작과정
ModelAttribute는 필드를 인자로 받는 생성자가 있는지 Reflection을 사용해 확인한다.
1. 모든 필드가 있는 생성자가 있으면 이 생성자로 값을 주입한다.
2. 만약 없으면 일부 필드를 인자로 받는 생성자를 찾아 사용한다.
3. 이마저도 없으면 기본 생성자를 사용해 객체를 생성한다.
4. 생성자로 주입되지 못한 남은 변수들은 setter를 이용해서 값을 할당해한다.
@RequestParam
1개의 HTTP 파라미터를 얻기 위해 사용되며 기본값을 지정할 수 있음
http파라미터만 받아오기 때문에 body정보를 조회하지 않는다.
@RequestBdoy
Json 형태의 HTTP body 데이터를 MessageConverter를 통해 Java 객체로 변환시킨다.
객체로 바인딩이 아닌 변환을 시키기 때문에 변수가 setter 함수가 없어도 정상적으로 작동한다.
modelAttribute와 달리 생성자와 setter가 없어도 기본 생성자만으로도 정상 작동한다.
이유
MappingJackson2HttpMessageConverter
ObjectMapper를 통해서 Json을 Java객체로 역직렬화한다.
역직렬화 : 생성자를 거치지 않고 리플렉션으로 객체를 구성하는 메커니즘
직렬화가 가능한 클래스는 기본 생성자가 필수다.
어떻게 Json에 명시된 필드 key를 자바 객체의 필드와 매핑 시킬 수 있지?
JacksonObjectMapper는 JSON 오브젝트 필드를 Java 오브젝트 필드에 매핑할 때 getter setter를 사용한다.
get... set... 이중 하나는 무조건 정의되어있어야 한다.
주의해야할 점
@RequestParam, @RequestBody, @ModelAttribute는 모두 어노테이션이다.
어노테이션은 기능이 없다. 그래서 어노테이션에 각각 맞는 처리하는 주체가 동작한다. 실제로 어노테이션이 있음을 인지하고, 어노테이션에 맞는 처리기가 동작한다. Spring은 ArgumentResolver 인터페이스가 존재하며, 각각의 어노테이션의 구현체가 존재한다.
https://dkswnkk.tistory.com/457
'CS' 카테고리의 다른 글
| OSI 7 layer (2) | 2023.01.25 |
|---|---|
| HTTP 버전 (0) | 2022.12.21 |
| Garbage Collector (0) | 2022.12.20 |
| TCP / IP 4계층에 대해 알아보기 (0) | 2022.11.23 |
| 운영체제 구조와 원리 (1) | 2022.09.26 |