오봉이와 함께하는 개발 블로그
스프링 MVC 2 - 스프링 메시지 소스 사용 본문
스프링 메시지 소스 사용
MessageSource 인터페이스
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;
MessageSource
인터페이스를 보면 코드를 포함한 일부 파라미터로 메시지를 읽어오는 기능을 제공한다.
스프링이 제공하는 메시지 소스를 어떻게 사용하는지 테스트 코드를 보자
코드
package hello.itemservice.message;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.MessageSource;
@SpringBootTest
public class MessageSourceTest {
@Autowired
MessageSource ms;
@Test
void helloMessage() {
String result = ms.getMessage("hello", null, null);
Assertions.assertThat(result).isEqualTo("안녕");
}
}
- ms.getMessage("hello", null, null)
- code : hello
- args : null
- locale : null
메시지 코드로 hello
를 입력하고 나머지 값은 null
을 입력했다.locale
정보가 없으면 basename
에서 설정한 기본 이름 메시지 파일을 조회한다.
MessageSourceTest 추가 - 메시지가 없는 경우, 기본 메시지
@Test
void notFoundMessageCode() {
Assertions.assertThatThrownBy(() -> ms.getMessage("no_code", null, null))
.isInstanceOf(NoSuchMessageException.class);
}
@Test
void notFoundMessageCodeDefaultMessage() {
String result = ms.getMessage("no_code", null, "기본 메시지", null);
Assertions.assertThat(result).isEqualTo("기본 메시지");
}
메시지가 없는 경우에는 NoSuchMessageException
이 발생한다.
메시지가 없어도 기본 메시지(defaultMessage
)를 사용하면 기본 메시지가 반환된다.
-> notFoundMessageCodeDefaultMessage
에서 3번째 "기본 메시지"
MessageSourceTest 추가 - 매개변수 사용
@Test
void argumentMessage() {
String result = ms.getMessage("hello.name", new Object[]{"Spring"}, null);
Assertions.assertThat(result).isEqualTo("안녕 Spring");
}
다음 메시지의 {0}
부분은 매개변수를 전달해서 치환할 수 있다.hello.name=안녕 {0}
-> Spring을 매개변수로 전달 -> 안녕 Spring
MessageSourceTest 추가 - 국제화 파일 선택1
@Test
void defaultLang() {
Assertions.assertThat(ms.getMessage("hello", null, null)).isEqualTo("안녕");
Assertions.assertThat(ms.getMessage("hello", null, Locale.KOREA)).isEqualTo("안녕");
}
ms.getMessage("hello", null, null)
: locale 정보가 없으므로 Locale.getDefault()
을 호출해서 시스템의 기본 로케일을 사용
-> 시스템 기본이 ko_KR이므로 messages_ko.properties
조회 시도
-> 조회 실패했기 때문에 messages.properties
를 사용
ms.getMessage("hello", null, Locale.KOREA)
: locale 정보가 있지만, message_ko
가 없으므로 messages
를 사용
MessageSourceTest 추가 - 국제화 파일 선택2
@Test
void enLang() {
Assertions.assertThat(ms.getMessage("hello", null, Locale.ENGLISH)).isEqualTo("hello");
}
ms.getMessage("hello", null, Locale.ENGLISH)
: locale정보가 Locale.ENGLISH
이므로 messages_en
을 찾아서 사용
출처 : 인프런 김영한 지식공유자님 강의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
'BE > Spring' 카테고리의 다른 글
스프링 MVC 2 - 검증 직접 처리 (0) | 2022.08.19 |
---|---|
스프링 MVC 2 - 검증(Validation) 요구사항 (0) | 2022.08.18 |
스프링 MVC 2 - 스프링 메시지 소스 설정 (0) | 2022.08.18 |
스프링 MVC 2 - 메시지, 국제화 (0) | 2022.08.18 |
스프링 MVC 1 - PRG(Post/Redirect/Get), RedirectAttribute (0) | 2022.08.15 |