Rest API Error Handling 처리를 하는 와중, 언어에 맞게끔 Front-end 에 맞는 Message를 내려주고자, 조사해본 결과 i18n library를 알게 되었습니다. 이번 글은 i18n 의 정의와, spring 에서 제공하는 i18n library 을 활용한 Error Handling 한 내용을 설명하겠습니다.
[목차]
- i18n 이란?
- i18n 을 활용한 Error Handling
i18n == Internationalization 의 축약형입니다.
어떻게 축약되었나 하니, Internationalization 의 제일 앞글자 i 와 제일 뒷글자 n 사이에 18개의 알파벳이 있다고 하여 i18n이라고 칭합니다.
i18N은 소프트웨어가 특정 지역이나 언어에 종속되지 않고 다양한 지역, 언어에서 작동하도록 개발하는 과정을 말합니다.
국제화에 고려되어야 할 사항은 다음과 같습니다.
i18n 의 개념은 굉장히 넓은 범위를 나타냅니다. i18n 을 진행하기 위해서는 ,Front-end 화면 뿐 아니라, 해당화면에 제공해줄 수 있는 데이터의 DB 관리도 따로 해주어야 할 것으로 판단됩니다. 추후에 좀 더 알아보기로 하고, i18n 어떻게 사용하는지 코드로 넘어가 보도록 하겠습니다.
Rest API 서버에서, Request를 받았을 때, Request에 따라 에러 메시지를 내주어야 했습니다. 이 때, 사용자에게 알맞은 에러 메시지(알맞은 언어) 를 전달해야 했습니다.
Spring Framework에서 제공하는 LocaleResolver 와 MessageResource를 활용하여 문제를 해결하고자 했습니다.
위와 같은 흐름으로 해당하는 데이터를 내려주었습니다.
코드를 한번 보도록 하겠습니다.
LocaleResolver :
클라이언트의 언어 & 국가 정보를 인식하는 인터페이스다. 스프링 MVC는 LocaleResolver를 이용해서 웹 요청과 관련된 Locale을 추출하고, 이 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 할 때, 활용하고 구조를 설계해서 사용할지가 중요한 문제라 생각됩니다.
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