프로젝트_리뷰

프로젝트 - 바인딩 왜 안됨 ? (커맨드 객체)

javaboiii 2024. 11. 9. 17:35

 

본인은 이미지 파일 업로드 요청 시 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