프로젝트 - 바인딩 왜 안됨 ? (커맨드 객체)
본인은 이미지 파일 업로드 요청 시 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
Spring - 용어 정리 (파싱, 바인딩, 직렬화, 역직렬화, 맵핑)
Spring파싱 (Parsing)파싱은 텍스트나 문자열을 의미 있는 구조로 분석하는 과정예를 들어, 문법적으로 정확한 형태로 분해 해구조체나 트리와 같은 형태로 데이터를 변환하는 작파싱은 주로 텍스
javaboiii.tistory.com