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

Shinny·2022년 8월 16일
0

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

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

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개의 댓글