이번 프로젝트는 상용화 서비스를 만들기 위함은 아니었지만, 학습 차원에서 메세지, 국제화 기능을 적용해보았습니다.
또한 제대로 작동하는지 확인을 위해 테스트 코드 작성까지 완료했습니다.
만약에 고객들에게 “안녕~”이라고 인사하던 텍스트가 모두 “안녕하세요”라고 바뀌어야 한다면, “상품명”이라고 적힌 단어들이 모두 “상품이름”으로 바뀌어야 한다면? 🙀 수십, 수백장의 페이지 속에 수천개의 단어들을 바꿔야 하는 상황이 올 수도 있겠죠? 이런 상황을 대비하여 사용하는 것이 메세지 기능입니다.
html 에 사용되는 단어들을 properties 파일에 key, value 형식으로 저장해둔 뒤, 가져와 쓰는 것이죠.
member.username=유저명
member.loginId=아이디
member.password=패스워드
mypage={0}님 안녕하세요!
<label for="username" th:text="#{member.username}">닉네임</label>
또한, Globally 🌐 서비스를 하는 회사 웹사이트의 경우 구글 크롬의 언어 변경에 따라, 언어가 변경되는 것을 경험하신 적이 있을 거에요! 그 기능도 이 메세지 기능을 조금 응용해서 적용할 수가 있는데요.
member.username=Username
member.loginId=ID
member.password=PW
mypage=Hello, {0}!
이런식으로 똑같은 message.properties
파일을 국가적으로 관리하는 것을 국제화라고 합니다.
그리고 이 2가지의 파일 모두를 인식할 수 있도록 application.properties
파일에서 spring.messages.basename=messages,messages_en
을 추가해두었습니다. 이렇게 함으로써 MessageSource 도 스프링 빈으로 등록된다고 합니다. 그래서 이 부분까지 테스트 코드 작성으로 제대로 작동되는지 확인해주었습니다.
@SpringBootTest
public class MessageSourceTest {
@Autowired
MessageSource ms;
@Test
void MessageInKorea() {
String message = ms.getMessage("member.loginId", null, Locale.KOREA);
Assertions.assertThat("아이디").isEqualTo(message);
}
@Test
void MessageInEn() {
String message = ms.getMessage("member.loginId", null, Locale.ENGLISH);
Assertions.assertThat("ID").isEqualTo(message);
}
@Test
void MessageInUnknown() {
String message = ms.getMessage("member.loginId", null, null);
Assertions.assertThat("아이디").isEqualTo(message);
}
@Test
void CodeNotFound() {
Assertions.assertThatThrownBy(()-> ms.getMessage("no_code", null, Locale.KOREA))
.isInstanceOf(NoSuchMessageException.class);
}
}
MessageSource가 Bean으로 등록된 스프링 컨테이너를 가져오기 위해 통합테스트를 실시하였고, Bean은 @Autowired
로 주입 받았습니다.
이렇게 국가별 언어를 브라우저에서 어떻게 인식하는지 확인하기 위해서는 Request Headers에 있는 accept-language 를 확인하면 되고, 테스트에서는 ms.getMessage("member.loginId", null, Locale.ENGLISH)
에서 세번째 인자값 Locale에 국가를 넣어서 확인해주었습니다.