[오류]Spring formdata 전송 시 null 에러

Inung_92·2023년 2월 16일
1

오류

목록 보기
4/6
post-thumbnail

에러상황

Spring 실습 중 ajax를 이용한 비동기 방식으로 multipart-data를 요청받아 업로드 및 DB등록을 하는 기능을 구현하던 상황. 분명히 ajax에서 설정을 완료하고 console.log에도 데이터가 입력되는 것을 확인하였으나 controller에서 지속해서 null값 반환함. 각 부분별 코드는 아래와 같다.

🖥️ ajax

$.ajax({
  url:"/gallery/regist",
  type:"POST",
  processData:false,  //title=test&writer=ddd 문자열화 방지
  contentType:false, //application/x-www 방지 ...
  data:formData,
  success:function(result, status, xhr){
	...생략    
  }
});

🖥️ controller

@PostMapping("/gallery/regist")
public String regist(Gallery gallery, HttpServletRequest request) {
	//DTO 및 요청객체 테스트
	System.out.println(request.getParameter("title"));
    log.info("넘어온 gallery" + gallery.getTitle());
    
    //request 객체로부터 servletcontext 객체를 얻어와 realpath를 획득
    ServletContext context = 	request.getSession().getServletContext();
    String realPath = context.getRealPath("/resources/data/");
    
    galleryService.regist(gallery, realPath);
    
    return "ok"; //test data
 }

넘어오는 방식이나 요청을 받는 위치에서의 문제는 없었다. 근데 아래와 같이 오류가 나는 것이다.

원인을 찾기 위해서 구글링을 열심히 했지만 Json으로 데이터를 넘겨주지 않았다던지 @RequestBody를 사용하지 않았다던지 하는 등의 이유들을 모두 고려해서 코드를 수정해도 오류는 동일하게 발생하였다.


원인

결국 강사님께 질문을 드렸고, 원인은 servlet-context.xml에 빈을 등록하지 않았던 것. 보통 프로젝트 초기 설정에 빈을 등록해서 사용했지만 내가 까먹고 등록을 안했던 것이다.
여기서 문제는 빈을 등록하는 것을 까먹은 것보다 해당 오류의 원인을 알지 못했던 것이 가장 큰 문제이다.

JSP에서 formData 객체를 이용하여 여러종류의 데이터를 append해주고, ajax를 통해 넘겼을 때 요청의 오류가 아닌 파라미터가 DTO에 매핑이 되지 않았을 때 빈이 등록되지 않았음을 의심했어야했다.


해결

원인은 아주 기초적인 부분이었다. 아래 사진처럼 servlet-context에 MultiPartFileResolver를 등록해주면 되는거였다.

<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <beans:property name="maxUploadSizePerFile" value="3145728"></beans:property>
</beans:bean>	

아주 기본적이고 간단한 문제였는데 왜 오류를 금방 해결하지 못했는지에 대해 생각해보면 너무 어려울 것이라고 생각했던 것이 문제였고, 오류 로그에서 핵심을 짚어내지 못했던 것이다.

다른 사람들은 이렇게 바보같은 실수를 통해 오류로 2시간이나 허비하지 않았으면 좋겠다.
그럼 이만. 👊🏽

profile
서핑하는 개발자🏄🏽

0개의 댓글