티스토리 뷰

메시지

개요

다음과 같이 화면을 구성하였는데 기획자분께서 문구가 마음에 안 든다고 책 목록을 도서 목록으로, 제목을 타이틀로, 작가를 저자로, 요약을 한줄평으로 바꾸자는 요청을 합니다. 저런 문구들이 HTML에 하드 코딩되어 있다면 일일이 바꿔야 하는 참사가 발생합니다. 화면이 적다면 일일이 바꾸는 것도 나쁘지 않습니다. 하지만 비슷한 맥락을 가진 화면들이 무수히 많이 존재한다면...

 

이런 다양한 메시지를 한 곳에서 관리하도록 하는 기능이 메시지 기능입니다. 메시지에 대한 파일을 작성 후 가져와서 사용한다면 변경과 관리에서 유연함을 가질 수 있습니다.

스프링에서는 messages.properties에 위에 보이는 형식처럼 key, value 형태로 작성하여 메시지를 관리할 수 있습니다.

// messages.properties
list=책 목록
title=제목
author=작가
content=요약

스프링에서는 기본적으로 MessageSource라는 인터페이스를 통해 메시지 관리 기능을 제공합니다. 사용하기 위해서는 구현체인 ResourceBundleMessageSource를 빈으로 등록하면 됩니다.

 

스프링 부트는 더욱 편리합니다. 스프링 부트가 MessageSource를 자동으로 스프링 빈으로 등록하기 때문에 별다른 등록이 필요하지 않습니다. 디폴트로 application.properties 파일에 spring.messages.basename=messages로 지정되어 있습니다.

 

basename은 설정 파일의 이름을 등록하는 것으로 messages라고 지정한다면 resources/messages.properties 파일을 자동으로 인식합니다. 필요로 별도의 파일을 사용하고 싶다면 basename을 변경하면 원하는 파일의 사용이 가능합니다.

실습

MessageSource 인터페이스를 확인해보면 getMessage 메서드가 정의되어 있습니다.

  • code : 사용하고자 하는 메시지 key 값
  • args : 메시지에 사용되는 매개변수
  • defaultMessage : 해당 key가 존재하지 않으면 출력하는 메시지
  • locale : 메시지 언어 설정

위 매개변수를 적절히 입력하면 key에 해당하는 메시지의 value를 결과로 반환합니다. 위의 messages.properties를 바탕으로 MessageSource 테스트를 진행해보았습니다.

@SpringBootTest
public class MyMessageSourceTest {

    @Autowired
    MessageSource messageSource;

    @Test
    void getMessage() {
        assertThat(messageSource.getMessage("list", null, null)).isEqualTo("책 목록");
    }

}

테스트의 성공을 정상적으로 확인할 수 있었습니다.

국제화

개요

국제화는 메시지 개념을 확장해서 언어별로 다른 메시지를 보이게 한다는 의미입니다. 국제화 또한 스프링 부트에서 알아서 관리해주기에 별도의 설정이 필요 없습니다. 해당 언어에 해당하는 properties 파일만 작성해서 사용하면 됩니다. 예를 들면 영어 메시지 설정 파일이라면 messages_en.properties 파일을 작성합니다.

 

basename에 해당 설정 파일을 추가해야 하지 않을까 하는 의문이 들 수 있는데 언더바(_)로 구분된 파일은 인식할 수 있습니다.

그렇다면 어떻게 언어를 인식하게 되는 것일까요? 인식하는 방법에는 여러 가지가 존재합니다.

  • HTTP Accept-Language 헤더 값을 사용
  • 사용자가 직접 언어를 선택
  • 쿠키의 사용

방법을 선택하는 것은 LocaleResolver에 의해 결정됩니다. LocalResolver 또한 인터페이스로 되어 있기에 구현체를 변경하는 것으로 인식 방법을 변경할 수 있습니다.

스프링 부트는 기본적으로 AcceptHeaderLocaleResolver를 사용하는데 해당 구현체는 HTTP Accept-Language 헤더 값을 사용합니다.

실습

messages_en.properties 파일에 다음과 같이 메시지를 작성합니다.

Locale이 English로 설정되었을 때 해당 메시지를 알맞게 출력하는지 테스트 코드를 작성해 보았습니다.

@SpringBootTest
public class MyMessageSourceTest {

    @Autowired
    MessageSource messageSource;

    @Test
    void getEnglishMessage() {
        assertThat(messageSource.getMessage("list", null, Locale.ENGLISH)).isEqualTo("Book List");
    }

}

테스트의 성공을 정상적으로 확인할 수 있었습니다.

마치며

코드가 한번 작성된 채로 멈춰있다면 하드 코딩하는 것이 문제가 되지 않습니다. 하지만 코드는 끊임없이 변화하고 유동적이어야 합니다. 그렇기에 처음 작성할 때 깨끗하고 유연하고 확장성 있는 코드를 작성하도록 해야 합니다. 메시지와 국제화를 잘 사용하는 것 또한 이러한 확장성에 열려 있다고 볼 수 있습니다. 이번 학습을 통해 메시지, 국제화에 대한 이해가 올라갔고 유연한 코드 작성에 한 발짝 다가갔다고 생각합니다.

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Total
Today
Yesterday