Server

ajax 호출 시 Failed to load resource: the server responded with a status of 404 () 에러 해결방법 - 호출은 되는데 응답 안 될 때

오은이 2024. 11. 15. 23:39

 

 

 

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 직렬화 및 역직렬화 방식 커스터마이즈 가능