인프런 커뮤니티 질문&답변

gooroom님의 프로필 이미지
gooroom

작성한 질문수

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

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

MessageSource와 LocaleResolver 관련 질문

작성

·

392

1

안녕하세요 강사님! 유용한 강의 정말 감사드리며 열심히 듣고 있습니다!

이번 강의를 듣던 중 MessageSource와 LocaleResolver에 관련하여 궁금한 점이 생겼습니다!

우선 메인 실행 클래스에서 LocaleResolver를 빈으로 등록하는 것과 HelloWorldController에서 MessageSource를 주입 받는 것까지는 이해를 했습니다!

저는 단순히 LocaleResolver 빈을 MessageSource에 주입한다고 생각을 하고 있었는데 각 클래스의 구현 코드를 확인해보니 MessageSource에 LocaleResolver 빈이 주입되지 않는 거 같다고 생각을 했습니다.

혹시 주입이 되는 것이 아니라면 LocaleResolver 빈은 어디에 주입이 되며, MessageSource에는 어떤 빈이 주입이 되는지 궁금합니다!

답변 1

1

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

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

질문에  대한 답변이 늦어 죄송합니다. 

먼저, LocaleResolver는 지역 코드 및 언어에 관한 정보를 설정하게 됩니다. 기본적으로 말씀하신 실행 클래스에서 @Bean으로 등록해서 사용하게 되면, 사용자로부터의 Request에 Accept-Language 설정이 없을 경우에 사용될 기본값이 설정됩니다. 반대로 Accept-Language를 설정하게 되면 해당 값을 사용할 수 있게 됩니다. 

MessageSource는 사용자로부터의 요청에 대한 결과를 처리하는 과정에서 발생하는 문자열을 각 언어별로 새로운 HTML 페이지를 생성하지 않게 하기 위한 메시지 표시를 위한 객체로써, getMessage()라는 메소드에 필요한 Key를 요청하게 되면, 해당 Value를 message.properties 파일에서 검색하여 반환하게 됩니다. 이때 Locale 정보를 같이 전달할수도 있으며, 전달하지 않을 경우에는 LocaleResolver에서 설정한 기본 값을 사용하게 됩니다. 예를 들어 아래와 같이 사용하실 수도 있습니다.

@GetMapping(path = "/hello-world-internationalized")
public String helloWorldInternationalized(
@RequestHeader(name = "Accept-Language", required = false) Locale locale,
HttpServletRequest request) {
if (locale == null)
locale = localeResolver.resolveLocale(request);

return messageSource.getMessage("greeting.message", null, locale);
}

위 코드에서 사용자로부터의 Locale 정보가 없으면, localeResolver로부터 값을 가져와서 사용할 수 있게 됩니다. 

위 Controller 클래스에서 localeResolver 객체의 주입은 생성자난 setter 메소드 등에서 할 수 있으며, 

생성자를 이용할 경우 다음과 같이 주입 가능합니다. 

@Autowired
public HelloWorldController(MessageSource messageSource, LocaleResolver localeResolver) {
this.messageSource = messageSource;
this.localeResolver = localeResolver;
}

따라서, LocaleResolver 빈을 직접 MessageSource에 주입한다는 것보다는, 

MessageSource를 사용하기 위해 LocaleResolver 객체를 사용한다는 표현이 맞을 것 같습니다. 

사용해 보시다가, 추가 질문사항 있으시면 다시 질문게시판에 글 남겨 주세요.

감사합니다. 

위 코드에서 사용자로부터의 Locale 정보가 없으면, localeResolver로부터 값을 가져와서 사용할 수 있게 됩니다. 

라고 말씀해주셨는데

마지막에 강의에서 나온거와 같이

굳이 localeResolver 를 가져오지 않아도

default 로 설정된 한국어로 나오지않나요?

gooroom님의 프로필 이미지
gooroom

작성한 질문수

질문하기