본문 바로가기
programming/SpringJava

자바 스프링 사용시 ajax rest api 요청값 한글 깨짐 해결 방법 ResponseEntity 사용하기

by 개코 - 개발과 코딩 2021. 12. 30.

ajax 를 사용해 스프링 서버에서 응답을 받으면 한글이 깨지고 물음표만 나온다. 검색을 해도 나아지지 않는다. 이 한글깨짐은 어노테이션인 ResponseBody 와 관련이 있다. 이것을 ResponseEntity 로 변경하여 다시 시도해 보도록 한다. 한글이 잘 나올 것이다.

자바 스프링 사용시 ajax rest api 요청값 한글 깨짐 해결 방법

자바 스프링프레임워크를 사용하다보면 한글이 깨지는 경우들이 많이 있다.

기본설정부터 깨지는 경우야 meta 태그나 jstl 구문 이마저도 안되면 스프링의 서블릿정보를 바꿔주면 된다.

하지만, 여기까지 했음에도 한글이 깨지고 ? 만 잔뜩 나온다.

자바 파일이나 jsp 파일을 utf-8 로 바꾸라고 하지만 이마저도 되지 않는다.

원인이야 지금도 아리송하지만 어노테이션은 ResponseBody 와 연관이 있다.

한글 깨짐 해결 몇가지

자바 스프링을 처음 접한다면 처음부터 한글 깨짐 현상을 겪게 된다.

처음부터 참 곤혹이다.

프로젝트를 만들고 메이븐으로 이런거 저런거 다 하고 hello world 를 봤지만 이번엔 한글이 문제다.

가장 많이 해결하는 방법을 몇가지 작성해 본다.

메타 태그 추가

html 사용시 튜토리얼 등에는 잘 사용하지 않는다.

영어를 제외한 다른 언어체계 등에서 자주 사용된다.

메타 태그에 문자셋을 utf-8 로 바꾸는 방법이다.

<meta charset="UTF-8">

JSP 파일에 page 추가

jsp 파일에 jstl 의 page 정보를 넣는 방법이 있다.

jsp 파일의 가장 상단에 아래의 문구를 넣어두고 테스트를 해본다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

서블릿 추가

잘 사용하지 않는 방법이기도 하지만 특정한 경우에 한글이 깨지는 경우 사용하게 된다.

보통은 사용하지 않는 경우들이 더 많지만 말이다.

스프링프레임워크의 환경 설정에 문자셋을 설정하는 방법이다.

servlet-context.xml 에 아래의 문구를 추가하면 된다.

<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven>
	    <message-converters>
	        <!-- @ResponseBody Content-Type:application/json;charset=UTF-8  -->
	        <beans:bean class="org.springframework.http.converter.StringHttpMessageConverter">
	            <beans:property name="supportedMediaTypes">
	                <beans:list>
	                    <beans:value>text/html;charset=UTF-8</beans:value>
	                </beans:list>
	            </beans:property>
	        </beans:bean>
	    </message-converters>
	</annotation-driven>

여전히 발생하는 한글 깨짐

위의 한글 깨짐 방법은 자바 스프링프레임워크를 처음 접할 때 깨지는 한글을 수정하는 방법이다.

어느정도 자바스프링을 이용하여 페이지를 만들 줄 안다면 rest api 를 접하고 오픈 api 를 이용해 앱이나 웹페이지를 만들게 될지도 모른다.

이 때 또 사용하는 것이 ajax 이다.

jquery 를 사용한다면 $.ajax 를 사용하게 될지도 모른다.

하지만, 이것을 사용하고 ResponseBody 를 이용해 데이터를 다시 보내면 한글이 깨진다.

RequestMapping 에 produces 를 사용하면 된다고 하지만 이마저도 안되는 경우가 있다.

당혹스런 경우는 produces에 빨간줄이 그어질 때이다.

sts의 버전문제도 있지만 본인은 버전에도 문제가 없었다.

어노테이션의 변경

정확한 이유는 스프링 공식홈페이지에 있지만 자세히 읽어보지 않아 모르겠다.

하지만, 해결방법은 스프링 공식홈페이지에 있으니 원인을 찾아보고 싶다면 방문해 보자.

일단 이 문제는 ResponseBody 어노테이션의 문제로 다른 것으로 변경해 주어야 한다.

이 때 사용할 것이 ResponseEntity 이다.

아래의 코드를 보자.

아마 한글이 깨진다면 아래와 같은 코드일 것이다.

@RequestMapping(value = "/api", method = {RequestMethod.POST, RequestMethod.GET})
public @ResponseBody String GetApiList(HttpServletRequest request, Model model) {

	// api 요청 블라블라블라
    
    // 응답값 전송
	return vReturn;
}

위와 같은 경우라면 한글이 깨진다.

자바 자체에서 한글이 깨지진 않지만 말이다.

위의 코드에서 어노테이션을 ResponseBody 에서 ResponseEntity 로 변경해 준다.

아래는 어노테이션을 변경해준 코드이다.

@RequestMapping(value = "/api", method = {RequestMethod.POST, RequestMethod.GET})
public ResponseEntity<String> GetApiList(HttpServletRequest request, Model model) {
	HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.add("Content-Type", "text/html; charset=UTF-8");
    
    String vReturn = "api 요청 결과값";
    
    return new ResponseEntity<String>(vReturn, responseHeaders, HttpStatus.CREATED);
}

확인할 부분은 ResponseEntity 와 return 문이다.

ResponseEntity 부분과 리턴되는 부분 HttpHeaders 로 Content-type 을 강제로 변경해 주고 있다.

리턴값은 당연히 오픈 api 요청값이다.

만약, ResponseBody , RequestMapping 의 produces 로 해결이 되지 않는다면 ResponseEntity 를 사용해 보도록 한다.

본인은 잘 사용하고 있다.

해당 내용은 스프링 공식홈페이지에서 제시한 해결방법이기도 하다.

반응형

댓글