inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발

다국어 처리를 위한 Internationalization 구현 방법

Failed to convert value of type 'java.lang.String' to required type 'java.util.Locale 오류 문의

해결된 질문

1618

갓다귀갓장국

작성한 질문수 24

1

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요 강사님 POSTMAN에서 Accept-Language에 값을 아무것도 설정 안하거나 en으로 설정했을때 다국어 처리가 잘 되는 것을 확인할 수 있었습니다.
 
이번에는 호기심에 크롬에서 URI를 입력하고 테스트를 해봤는데
제 예상으로는 한국어로 브라우저에 결과값이 찍혀야 되는데
 
Boot로그를 보니 다음과 같은 에러를 확인할 수 있었습니다.
 
로그를 보고 크롬 개발자 Accept-Language 헤더 값을 살펴본 결과 요청 헤더의 Accept-Language 값에 다음과 같이 값을 포함하고 있는 것을 확인하였습니다.
 
이럴 경우 부트에서 파싱을 못해서 저런 상황이 발생하는 것 같은데 해결방법이 있을까요?
 
구글링을 해보니깐 헤더 말고 쿼리 파라미터를 이용해서 ISO언어코드를 넘겨서 처리하는 방법이 있던데
 
헤더로 넘길 경우 이렇게 발생할 에러에 대비해서 쿼리파라미터로 처리 방식으로 바꿔야 하는지 궁금합니다
 

다국어처리 rest-api spring-boot

답변 1

1

Dowon Lee

안녕하세요, 이도원입니다. 

문의하신 작업은 AcceptHeaderLocaleResolver 클래스를 이용하시면 처리할 수 있습니다. 다음과 같은 LocaleResolver를 구현하신 다음, 

public class AcceptHeaderResolver extends AcceptHeaderLocaleResolver {
List<Locale> LOCALES = Arrays.asList(new Locale("en"), new Locale("ar"));

@Override
public Locale resolveLocale(HttpServletRequest request) {
String headerLang = request.getHeader("Accept-Language");
return headerLang == null || headerLang.isEmpty()
? Locale.getDefault()
: Locale.lookup(Locale.LanguageRange.parse(headerLang), LOCALES);
}
}

컨트롤러에서는 @RequestHeader를 이용하여 Locale을 사용하지 마시고, 다음과 같이 HttpServletRequest를 이용하여 "Accept-Language" 값을 얻은 다음에, 정상적으로 처리되게 하실 수 있습니다. 

@GetMapping(path = "/test-world-internationalized")
public String testWorldInternationalizedWithoutHeader(HttpServletRequest request) {
String acceptLanguage = request.getHeader("Accept-Language");
System.out.println(acceptLanguage);
Locale locale = resolver.resolveLocale(request);
return messageSource.getMessage("greeting.message", null, locale);
}

위와 같이 구현하시면, 크롬에서 요청 시 다음과 같이 Accept-Language가 전달된다 하더라도, 

ko,en-US;q=0.9,en;q=0.8

AcceptHeaderResolver 클래스의 resolveLocale 메소드에서 해당 값을 Parsing하여 사용할 수 있습니다. 

감사합니다. 

0

갓다귀갓장국

감사합니다 

JPA

0

65

1

jpa dependency를 추가하고 SecurityConfig클래스에서 오류가 납니다.

0

75

1

웹 브라우저 400 bad request

0

76

1

@Size는 되는데 @Past는 안 됩니다.

0

69

1

pdf 자료는 없나요?

0

81

2

locale 정보가 null 이면 무조건 messages_ko.properties이 호출 되는 문제

0

94

2

Swagger 강의, Unable to infer base url 이거 뜨시는 분들 도움되시라고

0

124

1

강의에서나온 화면 피피티

0

162

1

HelloWorldBean 관련 에러

0

189

2

Swagger API 3.x 오류..

0

223

1

java: variable message not initialized in the default constructor 에러는 어찌하면 좋을까요?

1

283

1

현재 GIT에 올리신 소스를 실행해봤습니다.

0

195

2

고양이 소리가 귀엽네요 !!

0

141

2

git에서 소스받고 실습중인데

0

120

1

post가 안되요

0

107

1

한국어 같은 경우 언어코드인 messages_ko.properties 로 생성하는게 더 좋지 않나요?

0

169

2

리턴타입으로서 EntityModel<User> 와 ResponseEntity질문

0

108

1

예외처리쪽 관련 질문있습니다.

0

162

2

엔티티가 바로 응답으로 나가도 되나요??

0

233

2

안녕하세여 Cannot invoke "co.kr.joneconsulting.resfulservice.repository.PostRepository.save(Object)" because "this.postRepository" is null

0

144

2

사용자 등록하고 나서 H2 에서 보면 신규 사용자의 password, ssn 이 null 로 되어 있습니다.

0

144

2

ApplictionContext 질문

0

198

2

롬북이 안먹히는것같아요

0

161

1

인텔리제이에서스프링부트 파일 실행하면

0

243

1