스프링 #7 메시지 소스

함형주·2022년 10월 16일
0

spring

목록 보기
7/12

질문, 피드백 등 모든 댓글 환영합니다.

웹 페이지를 만들다 보면 문구를 바꿔야 할 일이 발생할 수 있습니다.
ex) 사용자 -> 회원, 별명 -> 닉네임
또는 서비스하는 국가에 따라 다른 언어로 페이지를 렌더링해야 할 경우도 있을 것입니다.
(한국어, 영어, 일본어 등)

만약 이러한 부분이 모든 html에 하드코딩 되어 있다면(단순 텍스트로 사용자, 별명 사용) 수정이 필요한 시점에 모든 html을 뒤져가며 수정을 하거나 Locale 정보에 맞는 별도의 html을 생성해야 할 것입니다.
또한 이런 부분을 직접 작성하다 보면 오타가 발생할 수 있고 여러명이서 개발하기 위해 규칙을 정하고 공유하기 위한 별도의 파일이 필요할 수 있습니다.

스프링은 이러한 메시지 소스를 설정할 수 있는 기능을 제공합니다.

단순 스프링에선 MessageSource를 스프링 빈에 직접 등록하여 사용합니다.(더 자세히는 그 구현체인ResourceBundleMessageSource)

하지만 스프링부트를 사용하면 properties 파일로 메시지 소스를 쉽게 관리할 수 있습니다.
이 블로그에선 스프링부트 + 타임리프에서 메시지 소스를 사용하는 방식을 정리하겠습니다.

messages.properties

src/main/resources 경로에 messages.properties 파일을 생성하면 스프링부트가 해당 파일을 메시지 소스로 자동 등록합니다.

application.properties에서 메시지 소스를 여러 파일로 관리하거나 이름 변경이 가능합니다. 기본 설정 messages

spring.messages.basename=messages,errors

메시지 소스 사용법

먼저 MessagesSource 인터페이스를 살펴보겠습니다.

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;
}

메시지 소스는 code, args, defaultMessage, locale로 구성됩니다.

codemessages.propertieskey, args는 매개변수, locale은 지역 정보, defaultMessagecode가 없는 메시지 소스에 접근할 경우 defaultMessage가 사용됩니다.

messages.properties

hello=안녕하세요
hello.name=안녕하세요 {0}

label.user=회원
label.user.name=이름

위 처럼 메시지 소스를 작성할 수 있습니다. 정적 메시지 뿐만 아니라 arguments를 이용하여 동적인 메시지를 사용할 수도 있습니다.

html

<p th:text="#{hello}"></p>
<p th:text="#{hello.name('userA')}"></p>
<p th:text="#{hello.name(${user.name})}"></p> <!-- 모델에 담긴 객체일 경우 username이라고 가정-->
<p th:text="#{label.user}"></p>
<p th:text="#{label.user.name}"></p>

결과

안녕하세요
안녕하세요 userA
안녕하세요 username
회원
이름

만약 타임리프를 사용한다면 # 문법을 이용하여 메시지 소스에 접근할 수 있습니다.

국제화

Locale 정보를 활용하여 메시지 소스를 국제화(locale 정보 기반으로 다른 언어 사용) 할 수 있습니다.

스프링부트에선 message_en.properties 처럼 메시지 소스 파일명 형식으로 Locale 정보에 따른 메시지 소스 지정이 가능합니다.

아래와 같이 국제화 메시지 소스를 작성하여 사용합니다.

messages_en.properties

hello=hello
hello.name=hello {0}

label.user=user
label.user.name=name

위에서 메시지 소스를 기반으로 html을 작성했기에 별도의 수정 없이도 국제화를 적용할 수 있습니다. HTTP 요청 헤더의 Accept-Languageen-US 라면 아래의 결과가 표시됩니다.

hello
hello userA
hello username
user
name

만약 HTTP 요청 헤더의 Accept-Language가 정보를 만족하는 메시지 소스가 없다면 기본 메시지 소스(messages.properties)를 사용합니다.

profile
평범한 대학생의 공부 일기?

0개의 댓글