본인은 이미지 파일 업로드 요청 시 MultipartFile 타입 DTO 변수에
커맨드 객체를 이용해 자동 바인딩을 하고 싶었음
하지만 바인딩이 되지않고 415에러나 nullPointer예외가 발생함
자료를 찾아보니 아래와 같은 내용을 찾을 수 있었고
또한
@RequestBody와 MultipartFile과는 호환되지 않는다는 내용을 찾아볼 수 있었음
그 방법중 하나가 Spring이 제공하는 Converter 설정이였고
자료를 찾아보며 어노테이션의 차이점을 알 수 있었음
@RequestBody와 @ModelAttribute
@RequestBody와 @ModelAttribute 모두 클라이언트에서 보낸 데이터를
JAVA에서 사용할 수 있는 오브젝트로 만들어주는 공통점이 있음
하지만
두 어노테이션은 세부 수행 동작에서 차이점이 있음
@RequestBody
@RequestMapping(value="/요청", method=RequestMethod.POST)
@ResponseBody
public Map<String, String> uploadFile(@RequestBody ImageFileDTO fileDTO, HttpSession session) {
@RequestBody 어노테이션은 클라이언트가 보내는 HTTP 요청 본문을
JAVA 오브젝트로 변환하는 역할을 함
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
Spring에서 제공하는 HttpMessageConverter를 통해 타입에 맞는 객체로 변환됨
비동기 요청에서
요청값을 JSON 문자열로 변환뒤 POST 요청을 보내면
JSON 값이 HttpMessageConverter를 통해 DTO로 잘 변환됨
공식 문서에 따르면 JSON 오브젝트의 필드 JAVA 오브젝트의 필드에 맵핑할 때
getter 혹은 setter 메서드를 사용한다고 함
getter나 setter 메서드 명의 접두사 get,set를 지우고 나머지 문자의 처 문자를
소문자로 변환한 문자열을 참조해 필드명을 알아냄
실제로 getter나 setter 메서드가 모두 정의돼 있지 않으면
HttpMessageNotWritableException 예외가 발생함
@ModelAttribute
@RequestMapping(value="/요청", method=RequestMethod.POST)
public Map<String, String> uploadFile(@ModelAttribute ImageFileDTO fileDTO, HttpSession session) {
@ModelAttribute 어노테이션은 클라이언트가 보내는 HTTP 파라미터들을
특정 JAVA 오브젝트에 바인딩(맵핑) 하는 것임
/요청?dir=경로&name=이름 과 같은 Query String 형태 혹은
요청 본문에 삽입되는 From 형태의 데이터를 처리함
GET 요청 시 DTO데이터로 바인딩이 잘되지만
POST 요청은 JSON 형태의 데이터를 전송하면
데이터가 바인딩 되지 않아
415 에러가 발생함
참고
https://tecoble.techcourse.co.kr/post/2021-05-11-requestbody-modelattribute/
용어 정리
https://javaboiii.tistory.com/155
'프로젝트_리뷰' 카테고리의 다른 글
Python Project - 북극한파 예상하기 (AOI) (0) | 2024.12.04 |
---|---|
프로젝트 - 비동기처리와 멀티스레드(OpenAI Assistant API) (0) | 2024.11.11 |
프로젝트 - 결제 API 흐름 (0) | 2024.10.28 |
WEB - 중간 프로젝트 발표 팀 피드백 (1) | 2024.09.30 |
Web - 웹 프로젝트 1차 피드백 (1) | 2024.09.01 |