우리 서비스의 톤&매너가 바뀐다면? 글로벌 서비스가 된다면? (cf. 메세지, 국제화)

Shinny·2022년 8월 16일

이번 프로젝트는 상용화 서비스를 만들기 위함은 아니었지만, 학습 차원에서 메세지, 국제화 기능을 적용해보았습니다.
또한 제대로 작동하는지 확인을 위해 테스트 코드 작성까지 완료했습니다.

만약에 고객들에게 “안녕~”이라고 인사하던 텍스트가 모두 “안녕하세요”라고 바뀌어야 한다면, “상품명”이라고 적힌 단어들이 모두 “상품이름”으로 바뀌어야 한다면? 🙀 수십, 수백장의 페이지 속에 수천개의 단어들을 바꿔야 하는 상황이 올 수도 있겠죠? 이런 상황을 대비하여 사용하는 것이 메세지 기능입니다.

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에 국가를 넣어서 확인해주었습니다.

profile
비즈니스 성장을 함께 고민하는 개발자가 되고 싶습니다.

0개의 댓글