상세 컨텐츠

본문 제목

[Spring] 응답 문자열 한글 깨짐 문제 해결

PROGRAMMING/Backend

by koharin 2022. 2. 16. 00:15

본문

728x90
반응형

spring 프로젝트에서 웹 view를 사용하지 않는 경우에는 @ResponseBody annotation을 사용해서 응답을 클라이언트에 반환한다.

이때 spring에서는 제대로 한글 보내는데 안드로이드에서는 한글이 ??? 으로 처리되는 경우가 발생한다.

(spring에서 인코딩도 모두 UTF-8로 설정해줬다.)

 

처음에는 안드로이드 쪽 인코딩 처리가 문제인 줄 알았는데 서버에서 보낸 문자열 자체를 ???으로 받았다.

서버에서 응답을 보낼 때 UTF-8 처리를 해야 할 것 같아서 열심히 찾아봤는데 역시 서버에서 인코딩 처리를 해야 했다.

(전에 다른 부분 구현하면서 알게 됐는데 까먹었...😅)

 

// get my nickname
	@GetMapping(value="review/myNickname")
	public String getMyId(@RequestHeader String token) {
		System.out.println("[+] Get my nickname from Android");
		System.out.println("[+] token: " + token);
		
		// token 유효성 검증
		if(jwtService.checkTokenExp(token)) {
			// token에서 사용자 id 가져오기
			String userId = jwtService.getClaim(token).get("id").toString();
			System.out.println("[+] userId from token: " + userId);
			
			String userNickname = repository.findById(userId).get().getNickname();
			System.out.println("[+] userNickname: " + userNickname);
			return userNickname;
		}else {
			System.out.println("[-] Invalid token");
			return null;
		}
	}

안드로이드에서 필요한 닉네임을 가져오기 위해 서버에서 처리 후 응답을 보내는 코드이다.

view를 반환하지 않기 때문에 리턴값에 @ResponseBody을 사용하는데 

여기서 @RestController를 사용했기 때문에 따로 @ResponseBody를 따로 명시하지 않았다.

@GetMapping annotation에서 produces 옵션으로 Content-Type을 지정할 수 있다. 여기에서 인코딩을 UTF-8로 설정해서 한글 깨짐을 해결했다. 

// get my nickname
	@GetMapping(value="review/myNickname", produces="application/json; charset=utf8")
	public String getMyId(@RequestHeader String token) {
		System.out.println("[+] Get my nickname from Android");
		System.out.println("[+] token: " + token);
		
		// token 유효성 검증
		if(jwtService.checkTokenExp(token)) {
			// token에서 사용자 id 가져오기
			String userId = jwtService.getClaim(token).get("id").toString();
			System.out.println("[+] userId from token: " + userId);
			
			String userNickname = repository.findById(userId).get().getNickname();
			System.out.println("[+] userNickname: " + userNickname);
			return userNickname;
		}else {
			System.out.println("[-] Invalid token");
			return null;
		}
	}

 

한글 깨짐이 해결된 걸 확인할 수 있다.

728x90
반응형

관련글 더보기