티스토리 뷰

반응형

(참고: Spring Boot와 Thymeleaf를 기준으로 작성된 글입니다)

 

상품 페이지 등을 작성하면 공통된 단어들을 사용하는 경우가 빈번하다 (상품명, 상품 가격, 상품 수량 등등의)

만약 이런 요소들이 각각의 페이지에 작성되어 있는데 이를 하나하나 수정하려면 고된 반복 작업이 필요하다

스프링은 이런 작업을 편리하게 하고자 스프링 메시지라는 기능을 제공한다

이번글에서는 스프링 메시지가 무엇인지 어떻게 사용하는 것인지 살펴보고자 한다

 

Spring Message

스프링은 다양한 메시지를 한 곳에 관리하도록 MessageSource라는 인터페이스를 통하여 메시지 기능을 지원한다

이 기능을 사용하기 위해서는 구현체인 ResourceBundleMessageSource를 아래와 같이 스프링 빈을 등록해야 한다

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasenames("messages", "errors");
    messageSource.setDefaultEncoding("utf-8");
    return messageSource;
}

하. 지. 만 스프링 부트를 사용하면 이러한 작업을 자동으로 알아서 해준다

스프링 부트가 정하는 기본값은 아래와 같이 설정되는데

spring.messages.basename=messages

별도의 설정을 하지 않는다면 resource폴더에 message.properties라고 파일을 만들면 스프링이 자동으로 메시지를 인식한다

 

Spring Message : #{. . . }

messages.properties에 아래와 같이 공통으로 사용할 단어들을 정의했다고 해보자

item.add=상품 등록
item.id=상품ID
item.itemName=상품명
item.quantity=수량

타임리프의 메시지 표현식 #{. . .}을 사용하면 굉장히 편리하게 위의 스프링 메시지를 조회할 수 있다

<div th:text="#{item.add}">product</div> //상품등록 출력

<form action="/example" method="post">
  <div>
    <label for="itemName" th:text="#{item.itemName}">name</label>//상품명 출력
    <input type="text" id="itemName">
  </div>

  <div>
    <label for="itemPrice" th:text="#{item.price}">price</label> //상품가격 출력
    <input type="text" id="itemPrice">
  </div>

  <div>
    <label for="itemQuantity" th:text="#{item.quantity}">quantity</label>//상품수량 출력
    <input type="text" id="itemQuantity">
  </div>
</form>

th:text에 #{...} 메시지 표현식으로 기존에 스프링 메시지 소스에 입력했던 값들의 key값들만 입력해주면 해당 value들이 출력된다

이렇게 스프링 메시지를 이용하면 해당 페이지가 100개 혹은 200개더라도 스프링 메시지 소스의 값만 바꿔주면 된다

 

Message with Parameter

사전에 정의한 정적인 값뿐만 아니라 파라미터 값을 대입하여 동적으로 문구를 생성할 수 있다

messages.properties에 아래와 같이 작성하여 파라미터값을 받을 수 있게 해 준다

paramter.name=Welcome {0}

그다음 아래와 같이 model 담겨온 값을 담아주게 되면 동적으로 문구를 생성할 수 있다

// model에 user.name으로 클라이언트 이름이 담겨온다

// message 파라미터 적용
<p th:text="#{paramter.name(${user.name})}">result</p> // Welcome Kim 출력

 

Locale

만약 글로벌 서비스를 하거나 다양한 언어를 구사하는 클라이언트들에게 서비스를 제공해야 한다면, 똑같은 단어이지만 다른 언어로 작성하여 클라이언트에게 제공해야 할 것이다. 스프링은 LocaleResolver라는 것을 통하여 클라이언트가 선호하는 언어를 구분하여 해당 언어에 맞게 언어를 제공할 수 있도록 지원한다, 이때 스프링 메시지 기능을 사용하면 매우 편리하게 작성할 수 있다

 

우선 스프링 메시지를 어떻게 작성해야 하는지 살펴보자

매우 간단하다 기존에 messages.properties에 해당 언어를 구분해주는 글자만 더해주면 된다 "messages_en.properties"

이렇게 되면 영어를 우선하는 사용자가 접근할 시 알아서 아래와 같이 영어로 작성된 메시지를 출력한다 

item.add=AddItem
item.id=ProdID
item.itemName=ProdName
item.quantity=ProdQuantity

그렇다면 스프링은 사용자가 어떠한 언어를 선호하는지 어떻게 아는가?

가장 단순하게는 웹브라우저의 Accept-Language 요청 헤더를 보고 알아맞힌다

위의 예시는 실제로 본인이 네이버에 요청을 했을 때 나온 요청 메시지이다

스프링은 해당 accept-language를 보고 en = 영어, ko = 한국어등으로 구분하여 messages_en or messages_ko 등의 메시지 소스 파일을 찾아 해당 파일에서 단어들을 뽑아오는 것이다

 

만약 개발자가 messages.properties , messages_en.properties 두 가지 파일만 만들어 놓았는데 갑자기 인도어 같은 언어가 accept-language로 온다면 아무 언어도 붙어있지 않은, 즉 기본값인 messages.properties의 내용이 출력이 된다

 

 

//LocaleResolver 코드
public interface LocaleResolver {
    Locale resolveLocale(HttpServletRequest request);
    void setLocale(HttpServletRequest request, 
    @Nullable HttpServletResponse response, 
    @Nullable Locale locale);
}

LocaleResolver 또한 결국 인터페이스이기 때문에 임의대로 수정해서 사용할 수도 있다

보통 사용자가 해당 언어를 선택하고, 그 값을 쿠키나 세션에 저장시켜 해당 언어를 계속 서비스할 수 있게끔 수정해서 사용한다고 한다

 

핵심정리

스프링 메시지를 사용하면 서비스에서 공통적으로 사용되는 문구를 하나의 파일로 만들어 관리할 수 있다

이로써 수많은 페이지에 노출되는 문구들을 한 번에 수정할 수 있고, Locale을 통하여 클라이언트가 선호하는 언어로 노출되게 할 수도 있다

 

더보기

개인 학습을 위해 작성되는 글입니다.

제가 잘못 알고 있는 점에 대한 지적 / 더 나은 방향에 대한 댓글을 환영합니다.

 

참조 링크:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard

 

반응형
댓글