Spring 파일 업로드를 구현하다가 발생한 문제..
처음엔 /uploadAjax.do를 못찾아가서
컨트롤러 위에 @ResponseBody도 추가하고, @CrossOrigin(origins = "http://your-client-domain.com")도 추가하고
파라미터로 HttpServletRequest request도 추가하고.. 별 짓을 다해서 네트워크 오류는 사라졌다.
그런데 새로운 오류가 발생!
Failed to load resource: the server responded with a status of 404 ()
보통 경로가 잘못되어 나타나는 에러라는데, 난 눈 씻고 찾아봐도 경로가 잘못된 부분은 없었다.
코드를 따라 경위를 확인해보니, ajax가 호출은 하는데 서버로부터 응답을 못받고 있었음
$.ajax({
url : 'uploadAjax.do',
processData : false,
contentType : false,
data : formData,
type : 'POST',
dataType : 'json',
success : function(result) {
showUploadedImages(result);
},
error : function(jqXHR, textStatus, xhr) {
console.log("에러 : ", textStatus);
}
});
컨트롤러는 다 타는데 결국 찍히는 건 에러..
* 컨트롤러에 @ResponseBody 있는지도 확인!
@ResponseBody가 있음에도 불구하고 에러가 난다면 해결 방법은 아래와 같다.
해결 방법
dispatcher-servlet.xml와 pom.xml에 JSON 데이터를 처리하고 다루는 데 필요한 코드를 넣어주면 된다.
dispatcher-servlet.xml 파일을 보면
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter라는 bean이 있는데
거기에 property로 messageConverters를 추가하면 된다.
아래와 같이 변경
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="webBindingInitializer">
<bean class="egovframework.example.cmmn.web.EgovBindingInitializer"/>
</property>
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
bean > RequestMappingHandlerAdapter
Spring MVC에서 HTTP 요청을 처리하는 핵심 컴포넌트이다.
@RequestMapping이나 다른 HTTP 매핑 어노테이션을 처리하는 역할 수행
요청이 들어오면, 해당 요청을 어떤 메소드로 매핑할지 결정, 그 메소드에 적합한 파라미터를 바인딩, 반환된 값을 응답으로 변환
property > messageConverters > MappingJackson2HttpMessageConverter
JSON 형식의 데이터를 Java 객체로 변환하거나, Java 객체를 JSON 형식으로 변환할 수 있다.
Spring MVC에서 클라이언트와 서버 간에 JSON 데이터 포맷을 자동으로 변환
- Spring MVC 애플리케이션에서 JSON 형식의 요청과 응답을 처리할 때 필요
- @RequestMapping 또는 @GetMapping, @PostMapping 등의 어노테이션을 사용하여 HTTP 요청을 처리하고, 요청과 응답 데이터를 자동으로 바인딩하거나 변환해야 할 때 유용
pom.xml
<!-- Jackson Core 라이브러리 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.0</version>
</dependency>
<!-- Jackson Databind 라이브러리 (데이터 바인딩을 위한 필수 의존성) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
<!-- Jackson Annotations 라이브러리 (어노테이션을 위한 필수 의존성) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.13.0</version>
</dependency>
이후 프로젝트 우클릭 > Maven > Update Project
다시 실행해보면 해결됨!

- jackson-core: Jackson 라이브러리의 핵심 기능을 제공. JSON 데이터를 읽고 쓰는 기본적인 기능을 담당
- jackson-databind: JSON 데이터를 Java 객체에 바인딩하거나, 반대로 Java 객체를 JSON 데이터로 변환하는 기능 제공. Jackson을 사용할 때 기본적으로 필수 의존성이다.
- jackson-annotations: Jackson에서 JSON 변환을 제어하기 위해 사용하는 어노테이션을 포함하고 있다. @JsonProperty, @JsonIgnore와 같은 어노테이션을 제공하여 JSON 직렬화 및 역직렬화 방식 커스터마이즈 가능