[Spring MVC] [2] 3. 메시지, 국제화

윤경·2021년 9월 16일
0

Spring MVC

목록 보기
17/26
post-thumbnail

[1] 프로젝트 설정


[2] 메시지, 국제화 소개

👽(악덕 기획자): 순개씨, 이게 뭡니까? @@@ 이거 너무 이름이 구리지 않아요? ###로 다 변경 해주세요.
😸(순진 개발자): 네? 처음엔 분명 @@@로 해달라고 하셨잖아요.
👽(악덕 기획자): 됐고. ###로 해오라고.

우리는 HTML 파일에 메시지가 하드코딩 되어있기 때문에 @@@가 999개 있으면 999번 수정해야 한다.

한 번에 해결할 수 있는 방법은 없을까?

우선, message.properteis라는 메세지 관리용 파일을 만들고 (key-value)형태로 해당 데이터를 key 값으로 불러 사용할 수 있다.

👽(악덕 기획자): 순개씨 당장 미국에서 접속하면 영어로, 한국에서 접속하면 한국어로 뜨게 해주세요.
😸(순진 개발자): 또 엿 먹이네 그래봤자 스프링이 이미 지원하는뎅 ㅋㅋ (넵!)

어디서 접근했는지 인식하는 방법은 HTTP accept-language 헤더 값을 사용하거나 사용자가 직접 언어를 선택하도록 하여 쿠키 등을 사용해 처리하면 된다.

물론, 이를 직접 구현하는 방법도 있지만 스프링은 메시지, 국제화 기능을 모두 제공한다.
타임리프도 스프링이 제공하는 메시지와 국제화 기능을 편리하게 통합해 제공한다.


[3] 스프링 메시지 소스 설정

스프링은 기본적인 메시지 관리 기능을 제공한다.

📌 직접 등록하는 방법
스프링이 제공하는 MessageSource(인터페이스)를 스프링 빈으로 등록. 인터페이스이므로 구현체인 ResourceBundleMessageSource를 스프링 빈으로 등록하기.

📌 스프링 부트를 사용
스프링 부트가 자동으로 MessageSource를 자동으로 스프링 빈으로 등록.
MessageSource를 스프링 빈으로 등록하지 않고, 스프링 부트와 관련된 별도의 설정을 하지 않으면 message라는 이름으로 기본 등록됨. 따라서 messages_en.propertie(영어 사용), message_ko.properties(한국어 사용), message.properties(뭘 사용해야할지 모를 때)파일만 등록하면 자동으로 인식됨.


[4] 스프링 메시지 소스 사용

ms.getMessage("hello", null, null) : code: hello / args: null / locale: null

locale정보가 없으면 basename에서 설정한 기본 이름 메시지 파일을 조회한다. basename으로 message를 지정했으므로 messages.properties 파일에서 데이터를 조회한다.

메시지가 없는 경우에는 NoSuchMessageException이 발생한다.
메시지가 없어도 기본 메시지(defaultMessage)를 사용하면 기본 메시지가 반환된다.

{0} 부분은 매개변수를 전달해 치환할 수 있다.
예제) hello.name=안녕 {0} → 안녕 Spring

locale 정보를 기반으로 국제화 파일을 선택할 수 있다.
예를 들어 en_US인 경우 message_en_US → message_en → messages 순서로 찾아간다.
(구체적인 것부터!)

나는 인코딩이 안 된다,, 나랑 같은 오류를 겪고 계시는 분이 있당,, 해결 방법을 알려주셨는데 안된다,, 개념만 익히고 넘어가자,, 그래도 실습은 다 따라한다,,


[5] 웹 애플리케이션에 메시지 적용하기

하나를 바꾸면 모든게 바뀔 수 있도록 코드를 수정해보자.

📌 타임리프에서 메시지 적용하기
타임리프 메시지 표현식 #{ }를 사용하면 편리하게 조회 가능.


[6] 웹 애플리케이션에 국제화 적용하기

properties 파일을 수정한 뒤 크롬 설정에서 언어 순위를 영어를 가장 위로 두면 이러한 결과를 얻을 수 있다.

Accept-Language: 클라이언트가 서버에 기대하는 언어 정보를 담아 요청하는 http 요청 헤더
스프링은 언어 선택시 기본으로 이 헤더 값을 사용

📌 LocaleResolver
스프링은 Locale 선택 방식을 변경할 수 있도록 LocaleResolver라는 인터페이스를 제공하는데 스프링부트는 기본으로 Accept-Language를 활용하는 AcceptHeaderLocaleResolver를 사용한다.


보바 딩코

profile
개발 바보 이사 중

0개의 댓글