[spring] 메시지 (국제화 약간)

GuruneLee·2023년 1월 1일
0

Let's Study 공부해요~

목록 보기
26/36
post-thumbnail

ref: inflearn 김영한 - 스프링 mvc 2

메시지 기능이란?

  • 메시지 기능 = 화면상에 드러나는 다양한 텍스트를 한 곳에서 관리하는 기능
  • 예를 들어 다음과 같은 메시지 관리 파일을 만들어놓고, 각 html에 key 값으로 원하는 메시지를 불러올 수 있다
// messages.properties
...
item = 상품
item.id = 상품id
item.name = 상품 이름
...
<label th:text="${item.name}"/>

+ 국제화란?
국제화 = 메시지를 모아놓은 파일을 각 언어별로 분리해서 저장해놓고, 클라이언트의 locale 에 따라 다른 메시지를 보여주게 하는 것

messages_en.properties
messages_ko.properties

HTTP accept-language 헤더값을 사용할 수도 있고, 리퀘스트 바디에 담아서 선택할 수도 있다
스프링의 localeResolver을 이용하면 국제화를 쉽게 구현할 수 있다. 에 관한 간략한 내용은 LocaleResolver 개요 내용을 확인하자

스프링 메시지

설정하기 (직접 등록, 자동 등록[부트])

  • 메시지와 국제화 기능을 직접 구현할 수 있지만, 스프링에서 제공하는 기능을 사용해보도록 하자
  • 스프링에선 MessageSource 인터페이스로 메시지 기능을 제공한다
    • 인터페이스 이므로, 그 기본 구현체인 ResourceBundleMessage 을 사용한다

1_스프링

직접 빈으로 등록해야 한다

// 직접 등록
@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBumndleMessageSource();
    messageSource.setBasenames("messages", "errors");
    messageSrouce.setDefaultEncoding("utf-8");
    return messageSource;
}

2_스프링부트

auto config에 의해 등록이 되어있다

설정을 위해선 application.properties 에 다음과 같은 Path에 값을 할당한다

// application.properties
// basename 기본값은 'messages'
spring.messages.basename = blah blah

basename의 기본값이 messages 이므로, messages_en.properties, messages_ko.properties 등의 파일만 잘 등록해도 메시지가 잘 작동한다.

메시지 파일 만들기

  • 어플리케이션에서 메시지를 읽을때, resources 하위 폴더/파일 을 읽게된다
  • 따라서, basename 을 'messages' 라고 했다면, messages라고 시작하는 파일을 resources 밑에 만들면 된다.
/resources
ㄴ messages.properties
ㄴ /static
ㄴ /templates
ㄴ etc...
  • messages.properties 를 만들어보자
hello=안녕
hello.name=안녕 {0}
  • messages_en.properties 도 만들어보자
hello=hello
hello.name=hello {0}

* Trouble Shooting

: 메시지를 포함시키지 않더라도 __basename__.properties 파일 (locale이 없는 기본 파일)을 꼭 만들어야 한다. 만들지 않으면 MessageSource 객체가 아예 생성이 안됨

메시지를 사용해보자

  • 스프링빈에 MessageSource가 등록되어 있기 때문에, 이를 불러와서 사용하면 된다
  • MessageSource 에는 getMessage 메서드가 선언되어있다.
String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;

( locale 은 Null 을 넣으면 Locale.getDefault 값이 나간다 / 참고로 내 컴퓨터는 en_KR (영어를 쓰는데, 지역은 한국) )
( args는 {0} {1} 등으로 받아올 수 있다 )

간단한MessageServiceMessageController 코드를 확인하자

// MessageService.java
@Component
class MessageService{
    private MessageSource messageSource;
    String getMessage(
        messageId: String,
        supportLang: SupportLang,
        args: Array<Any>? = null
    ) {
        return messageSource.getMessage(messageId, args, supportLang.locale);
    }
}

// MessageController.java
@RestController
class MessageController {
    private MessageService service;
 
    @GetMapping("/message/{messageId}")
    String getMessage(RequestLocale requestLocale, @PathVariable String messageId) {
        return service.getMessage(messageId, SupportLang.from(requestLocale.locale));
    };
}

  • 이런식으로 결과가 잘 나오는 것을 확인할 수 있다.

원하는 메시지가 없을때, 디폴트 메시지를 출력하는 방식도 있다. 필요하면 찾아서 사용하자.

profile
Today, I Shoveled AGAIN....

0개의 댓글