Spring/MVC

스프링 MVC 2편-3장. 메시지, 국제화 (김영한)

광터틀 2022. 8. 29. 15:00

스프링 MVC 2편-3장. 메시지, 국제화 (인프런 - 김영한 강사님)

 

메시지 

'상품명' 이라는 단어를 '상품이름'으로 고쳐야 한다고 가정해보자. 

'상품명'이라는 메시지가 HTML 파일에 하드코딩 되어 있으면 모든 파일을 다 찾아가면서 '상품명'을 '상품이름'으로 고쳐야 한다. 이를 방지하기 위해 메시지들을 한 곳에 모아 관리하는 기능을 메시지 기능이라고 한다. 

 

messages.properties 파일에 다음과 같이 메시지들을 기록한다.  

1
2
3
4
5
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
cs

추후에 필요할 때, 

1
<label for="itemName" th:text="#{item.itemName}"></label>
cs

위와 같이 th:text 로 key 값을 부르면 item.itemName 인 '상품명'을 쓸 수 있다. 

이제 '상품명'을 '상품이름'으로 바꾸고 싶다면 각 페이지마다 '상품명'이 적힌 것을 찾는게 아니라 

messages.properties 파일에서 

1
item.itemName=상품이름
cs

으로 수정하면 된다. 

 

 

MessageSource 인터페이스 

1
2
3
4
5
public interface MessageSource {
String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);
String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;


 
 
 
 
 
 
 
 
 
 
 
cs

 

MessageSource 직접 등록시 

1
2
3
4
5
6
7
8
@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
 
    messageSource.setBasenames("messages""errors");
    messageSource.setDefaultEncoding("utf-8");
    return messageSource;
}
cs

 

메시지 기능을 사용하려면 MessageSource라는 스프링 빈을 등록해줘야하는데 인터페이스이므로 구현체인 ResourceBundleMessageSource를 빈으로 등록해주면 된다. 

그러나 이또한 스프링부트는 자동으로 등록해준다. 

MessageSource 인터페이스를 보면 코드를 포함한 일부 파라미터로 메시지를 읽어오는 기능을 제공한다. 

 

test 시에는 ms.getMessage(code, args, locale) 순으로 입력하고 locale 정보는 null로 하면 messages.properties파일에서 조회한다. 


국제화 

메시지 개념에 글로벌을 더한 것이다. 접속하는 지역에 따라서 다른 메시지를 보여준다. 

한국에서 접속하면 한글을, 미국에서 접속하면 영어를 제공하는 식이다. 

이를 위해 

messages.properties를 2개 파일로 분류한다. 

messages_en.properties, messages_ko.properties 

 

Accept-Language 는 클라이언트가 서버에 기대하는 언어 정보를 담아서 요청하는 HTTP 요청 헤더이다. 

 

웹 브라우저 언어 설정값을 변경하면 국제화가 제대로 되는지 확인할 수 있다. 

크롬 브라우저 -> 설정 -> 언어 에서 우선순위를 영어로 변경하면 Accept-Language 값이 변경된다. 

스프링은 Accept-Language 헤더 값을 이용해 스프링이 Locale 정보를 파악하기에 Locale에 알맞는 properties 파일에서 메시지를 부른다.