프로그래밍/스프링 프레임워크

JSON 응답 구현시 406 Error 해결

코딩딩 2017. 11. 16. 12:59

스프링 프레임워크를 이용해서 웹 개발시 AJAX를 이용해서 클라이언트 단을 구현하려면
스프링의 컨트롤러에서는 데이터만 JSON응답으로 클라이언트에 넘겨 줘야한다.

JSON을 넘겨주기 위한 방법은 여러가지가 있지만
많이 사용하는 방법은 JSON Mapper를 이용하는 방법이다.
구현 방법은 간략하게
▶ JSON Mapper 라이브러리 추가
▶ <mvc:annotation-driven/> 태그 추가
▶ 컨트롤러 메소드 반환형에 @ResponseBody 어노테이션 추가

실행 결과로 406에러가 떳다면,
위에서 설명한 설정이 제대로 되어있는지 확인하자.

▶ JSON Mapper 라이브러리 추가

스프링의 메이븐 설정을 하는 pom.xml에 JSON관련 라이브러리를 추가
버전은 내가 임의로 한 것이니까 본인 상황에 맞게 설정!

<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-mapper-asl</artifactId> 
    <version>1.9.13</version> 
</dependency>

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.8.5</version> 
</dependency>

 

▶ <mvc:annotation-driven/> 태그 추가

스프링 컨테이너 설정파일인 servlet.xml 파일에 annotation-driven태그 추가

 

위 그림과 같이 Namespaces 탭으로 이동해서 mvc에 체크 후Source에서 <mvc:annotation-driven/> 태그 추가

▶ 컨트롤러 메소드 반환형에 @ResponseBody 어노테이션 추가
해당 컨트롤러의 메소드에 @ResponseBody 어노테이션을 추가해서 데이터만 반환하도록 설정한다.
아래는 예시


@RequestMapping("test.do")
    public @ResponseBody HashMap<String, Object> test(){
    // 컨트롤러의 반환형인 HashMap 데이터만 리턴하겠단 의미
    HashMap<String, Object> result = new HashMap<String,Object>();
    result.put("msg", "안녕");	
    return result;		
}
그래도, 해결이 안된다면 아주간단한 AJAX 구현코드로 Check해보자.
아주 간략한 형태의 AJAX 구문을 첨부한다.
 
$.ajax({
	url : "test.do",
	success : function(data){
		alert(data.msg);	
	}
}); 
 
위의 샘플 코드를 이용해서 상황을 설명!


웹 어플리케이션 실행시 원하는대로 동작을 안할 때 웹 브라우저의 개발자 도구를 이용해서 분석해 봤을때 아래와 같이 406에러가 확인됬다면

요청에 대한 응답을 살펴보자.
아래 그림과 같이 Content-Type가 여전히 text/html인것을 볼 수 있다. (JSON 데이터가 넘어오지 않은 것!)

 

위의 방법으로 설정을 마친후 실행이 성공되면 406 Error는 사라지고 응답을 살펴보면 아래와 같이 JSON으로 변경된 것도 확인 가능하다!