[Spring] i18n (SW 국제화)

한호성·2023년 4월 22일

Introduction

Rest API Error Handling 처리를 하는 와중, 언어에 맞게끔 Front-end 에 맞는 Message를 내려주고자, 조사해본 결과 i18n library를 알게 되었습니다. 이번 글은 i18n 의 정의와, spring 에서 제공하는 i18n library 을 활용한 Error Handling 한 내용을 설명하겠습니다.
[목차]

  • i18n 이란?
  • i18n 을 활용한 Error Handling

i18n 이란?

i18n (SW 국제화) 정의

i18n == Internationalization 의 축약형입니다.
어떻게 축약되었나 하니, Internationalization 의 제일 앞글자 i 와 제일 뒷글자 n 사이에 18개의 알파벳이 있다고 하여 i18n이라고 칭합니다.

i18N은 소프트웨어가 특정 지역이나 언어에 종속되지 않고 다양한 지역, 언어에서 작동하도록 개발하는 과정을 말합니다.

국제화에 고려되어야 할 사항은 다음과 같습니다.

  • 유니코드 사용
  • 필요에 따라 문자 인코딩 처리
    등이 있습니다.

i18n 의 개념은 굉장히 넓은 범위를 나타냅니다. i18n 을 진행하기 위해서는 ,Front-end 화면 뿐 아니라, 해당화면에 제공해줄 수 있는 데이터의 DB 관리도 따로 해주어야 할 것으로 판단됩니다. 추후에 좀 더 알아보기로 하고, i18n 어떻게 사용하는지 코드로 넘어가 보도록 하겠습니다.

i18n 을 활용하기

문제상황

Rest API 서버에서, Request를 받았을 때, Request에 따라 에러 메시지를 내주어야 했습니다. 이 때, 사용자에게 알맞은 에러 메시지(알맞은 언어) 를 전달해야 했습니다.
Spring Framework에서 제공하는 LocaleResolver 와 MessageResource를 활용하여 문제를 해결하고자 했습니다.

문제 해결

  1. 요청 Request로 부터, 유저가 사용하고자 하는 언어 정보를 얻는다.
  2. Request Locale에 해당하는 에러메시지 데이터들을 properties로 부터 가져온다.
  3. Request에 대한 맞는 응답을 준다.

위와 같은 흐름으로 해당하는 데이터를 내려주었습니다.

코드를 한번 보도록 하겠습니다.

  1. 필요로하는 개체들의 Bean 등록하였습니다.

LocaleResolver :

클라이언트의 언어 & 국가 정보를 인식하는 인터페이스다. 스프링 MVC는 LocaleResolver를 이용해서 웹 요청과 관련된 Locale을 추출하고, 이 Locale 객체를 이용해서 알맞은 언어의 메시지를 선택하게 된다.

많은 구현체들이 존재합니다.

  • AcceptHeaderResolver :Request-header 기반 locale 설정
  • SessionLocaleResolver : 세션 기반 locale 설정
  • CookieLocalResolver : 쿠키 기반 locale 설정
  • FixedLocaleResolver : 웹 요청 상관없이 특정한 언어 locale 설정

이 중, CookieLocaleResolver를 활용하였습니다.

LocaleChangeInterceptor :

request parmater 값을 활용하여 도중에 locale 값을 변경 가능하도록 해주는 개체이다.

MessageSource :

locale을 통해 messages_{lang}.properties 파일들로부터 데이터를 읽어오는 역할을 하는 개체이다.

**i18n** 관련 Bean 등록
  @Bean
    public LocaleResolver localeResolver() {
        CookieLocaleResolver resolver = new CookieLocaleResolver();
        resolver.setDefaultLocale(Locale.getDefault());
        resolver.setCookieName("lang");
        resolver.setCookieMaxAge(3600);
        return resolver;
    }

    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
        interceptor.setParamName("lang");
        return interceptor;
    }

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource
        = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:/i18n/messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }

2,3

비지니스 로직 중 , locale 바탕으로 데이터를 가져와 exception을 던저줘야 하는 상황에 뿌려주도록 하였습니다.

        if(someting){
            String message = messageSource
            .getMessage
            	(ErrorCodeConstants.BAD_REQUEST_CM_001
                ,null
                ,LocaleContextHolder.getLocale());
            throw new Exception(message);
        }

생각

i18n 을 활용하여, message를 불러오는 것은 크게 어렵지 않은 일입니다. 이것을 ErrorHnadling 할 때, 활용하고 구조를 설계해서 사용할지가 중요한 문제라 생각됩니다.

Reference

https://developer.mozilla.org/en-US/docs/Learn/Getting_started_with_the_web/The_web_and_web_standards
https://terry9611.tistory.com/304
https://miaow-miaow.tistory.com/32

profile
개발자 지망생입니다.

0개의 댓글