- [ 배경 ]
- Spring에서 다국어를 처리하기 위해 찾아보는 중 i18n 설정을 지원하고 있었습니다. i18n의 i는 Internationalization의 약자입니다. i와 n사이에 18개의 알파벳이라는 뜻입니다.
즉 해당 세팅을 통해 한국어를 영문권에서도 표시할 수 있도록 할 수 있습니다. 해당 방법을 이용해 예외 처리 메시지를 다국어를 적용시켜보겠습니다.
- Spring에서 다국어를 처리하기 위해 찾아보는 중 i18n 설정을 지원하고 있었습니다. i18n의 i는 Internationalization의 약자입니다. i와 n사이에 18개의 알파벳이라는 뜻입니다.
- [ 과정 ]
- pom.xml 에 yaml-rsource-bundle 을 추가합니다. 해당 의존성은 YamlResourceBundle클래스를 사용할 수 있고
그로 인해 실제 언어 정보가 담겨있는 exception_ko.yml, exception_en.yml 파일을 사용할 수 있습니다. - MessageConfiguration 파일 생성
- com.market.server.config 패키지 하위에 클래스를 생성 후 @Configuration 어노테이션을 통해 환경 구성을 합니다. 설정한 내용으로는 아래와 같습니다.
- 세션에 Default 지역 정보를 설정
- 요청 시 파라미터에 lang 정보를 지정하여 LocalechangeInterceptor를 통해 언어가 변경 되게 설정
- yml 파일을 참조하는 MessageSource를 설정
- locale 정보에 따른 다른 yml파일을 읽도록 처리
- 인터셉터를 시스템 레지스트리에 등록
- (참고) @Configuration 어노테이션은 @Bean 메서드를 제공하고 스프링 컨테이너가 Bean정의를 생성하고 런타임 시 Bean들이 요청을 처리할 수 있게 해주는 어노테이션입니다.
- 스프링에서는 LocaleChangeInterceptor를 사용하여 lang이라는 RequestParameter가 요청에 있으면 해당 값을 읽어 로케일 정보를 변경합니다. 중고거래 프로젝트에서는 Session에서 읽어오고 저장하도록 SessionLocaleResolver를 사용하였습니다.
- Session 말고도 Http요청 시 헤더에 기본 로케일 설정, 쿠기를 사용하는 방식 등을 사용하는 Resolver 도 있습니다. 다른 Resolver 내용이 궁금하신 분은 아래 사이트를 참조 부탁드립니다.
- com.market.server.config 패키지 하위에 클래스를 생성 후 @Configuration 어노테이션을 통해 환경 구성을 합니다. 설정한 내용으로는 아래와 같습니다.
- application.properties에 다국어 처리 yml i18n 경로와 인코딩 정보를 추가합니다.
- 다국어 처리 message yml을 형식에 맞게 작성합니다. exception_en.yml, exception_ko.yml 파일을
생성 후 code, 국가 언어에 맞는 msg 정보를 아래와 같이 추가합니다. - ResposeService에서 서버가 클라이언트에게 응답할 때 response 패킷을 정의합니다.
성공, 실패 처리 시에 해당하는 code, msg를 response패킷에 설정합니다. - @RestControllerAdvice 어노테이션을 사용하는 ExceptionAdvice 클래스를 통해 Controller에서 발생하는 예외를 ExceptionHandler를 통해 Response에 code값과 msg값을 연결합니다.
- findUserById API에서 파라미터에 lang값을 통해 국가명을 입력하게 설정합니다.
- 아래 내용은 Swagger API에 en설정을 통해 ResponseBody에
msg값이 영어로 출력되는 걸 확인할 수 있습니다.
- pom.xml 에 yaml-rsource-bundle 을 추가합니다. 해당 의존성은 YamlResourceBundle클래스를 사용할 수 있고
- [ 결과 ]
- 중고거래 서비스가 해외 국가에서도 배포가 가능하게 예외 메시지를 다국어 처리를 하였습니다.
- Spring에서 i18n세팅 후 MessageSource를 이용하여 국가에 해당하는 언어로 출력되도록 개 발하였습니다.
- LocaleChangeInterceptor를 사용하여 lang이라는 RequestParameter가 요청에 있으면 해당 값을 로케일 정보로 변경하게 했습니다.
- 로케일 정보는 기본으로 Session에서 읽어 오고 저장하도록 SessionLocaleResolver를 사용하였습니다.
- Spring의 i18n 라이브러리에서는 각 종 리졸버를 제공함으로써 특정 상황에 맞게 활용할 수 있음을 알았습니다.
- 결과적으로 다국어 환경에서도 요구사항에 맞게 개발이 가능해졌습니다.
- [ 성과 ]
- Spring i18n 다국어 지원을 통해 국가별 언어를 설정 방법을 학습하였습니다.
- MessageConfig를 설정하면서 @Configuration을 통해 스프링 컨테이너가 bean을 정의하고
런타임 시 정의한 Bean들이 요청을 처리하는 spring의 IOC컨테이너의 개념과 생성원리를 학습하였습니다. - LocaleChangeInterceptor, SessionLocaleResolver를 이용해 세션정보에 지역정보를 설정하면서
인터셉터, 리졸버의 동작원리에 대해 학습하였습니다.
- used-market-server 중고거래 프로젝트 코드는 아래에서 확인하실 수 있습니다.
- [ 참고 ]
- https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/i18n/package-summary.html
- https://daddyprogrammer.org/post/499/springboot2-exception-handling-with-messagesource/
- http://www.i18nguy.com/origini18n.html
- https://medium.com/plustv/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EC%9D%98-%EA%B5%AD%EC%A0%9C%ED%99%94-software-i18n-cf40f199ab77
'used-market-server Project' 카테고리의 다른 글
REST API 정의와 중고거래 프로젝트에 적용하기 (0) | 2020.09.09 |
---|---|
swagger 연동을 통한 자동 API 문서 생성하기 (0) | 2020.09.09 |
로그인 확인 코드 AOP 적용하기 (0) | 2020.09.09 |
Log4j2 Logback Log4j 차이 및 적용 (0) | 2020.09.09 |
젠킨스 CI 적용하기 (ubuntu linux 18.04) (0) | 2020.09.09 |