본문 바로가기

Study Information Technology

Spring Boot에서 국제화i18n 구현하기

728x90
반응형

Spring Boot에서 국제화(i18n) 구현하기

Overview

Spring Boot에서 국제화(i18n)를 구현하는 방법에 대해 자세히 설명하겠습니다. 국제화는 애플리케이션이 여러 언어를 지원할 수 있도록 하는 과정입니다. 이는 다국적 사용자들이 애플리케이션을 자신의 언어로 사용할 수 있게 해줍니다. 이 과정에서 메시지 리소스 파일을 사용하여 다양한 언어에 대한 번역을 제공하고, 사용자의 로케일에 따라 적절한 메시지를 표시합니다.

국제화의 기본 개념

국제화(i18n)와 지역화(l10n)의 차이를 이해하는 것이 중요합니다. 국제화는 애플리케이션이 다양한 언어와 지역 설정을 지원할 수 있도록 설계하는 것이며, 지역화는 특정 언어와 지역에 맞게 애플리케이션을 변형하는 과정입니다.

Spring Boot에서 i18n 설정하기

Spring Boot에서 국제화를 구현하기 위해 다음과 같은 단계를 따릅니다:

  1. 메시지 리소스 파일 설정

먼저, src/main/resources 디렉토리 내에 메시지 리소스 파일을 생성합니다. 이 파일들은 각 언어별로 번역된 메시지를 포함합니다. 기본적으로 messages.properties 파일을 만들어 기본 언어에 대한 메시지를 설정합니다. 추가적으로 messages_ko.properties, messages_en.properties와 같은 파일을 만들어 각 언어에 대한 번역을 추가합니다.

예를 들어, messages.properties 파일에는 다음과 같은 내용이 있을 수 있습니다:

greeting=Hello
farewell=Goodbye

messages_ko.properties 파일에는 다음과 같은 내용이 있을 수 있습니다:

greeting=안녕하세요
farewell=안녕히 가세요
  1. MessageSource 빈 등록

Spring Boot는 MessageSource 인터페이스를 사용하여 메시지를 읽습니다. 이를 위해 @Configuration 클래스를 생성하여 MessageSource 빈을 등록합니다. ResourceBundleMessageSource를 사용하여 리소스 파일을 로드합니다.

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;

@Configuration
public class InternationalizationConfig {

@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}

여기서 setBasename("messages")messages.properties 파일을 기준으로 하며, UTF-8 인코딩을 사용하여 다양한 문자셋을 지원합니다.

  1. 로케일 설정

사용자의 로케일을 기반으로 적절한 메시지를 제공하려면, LocaleResolver를 설정합니다. SessionLocaleResolver를 사용하여 세션 기반의 로케일을 설정하거나 CookieLocaleResolver를 사용하여 쿠키 기반의 로케일을 설정할 수 있습니다.

다음은 SessionLocaleResolver를 사용하는 예시입니다:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

import java.util.Locale;

@Configuration
public class LocaleConfig {

@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.ENGLISH);
return localeResolver;
}
}

여기서 setDefaultLocale(Locale.ENGLISH)는 기본 로케일을 영어로 설정합니다.

  1. 컨트롤러에서 메시지 사용하기

컨트롤러에서 메시지를 사용하는 방법은 MessageSource를 주입받아 사용하는 것입니다. @Autowired를 사용하여 MessageSource를 주입받고, getMessage() 메서드를 사용하여 메시지를 조회합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import java.util.Locale;

@Controller
public class GreetingController {

@Autowired
private MessageSource messageSource;

@GetMapping("/greeting")
public ModelAndView greeting(@RequestParam(name = "lang", required = false) String lang, Locale locale) {
if (lang != null) {
locale = new Locale(lang);
}
String greetingMessage = messageSource.getMessage("greeting", null, locale);
ModelAndView modelAndView = new ModelAndView("greeting");
modelAndView.addObject("message", greetingMessage);
return modelAndView;
}
}

위 예시에서 greetingMessage는 사용자의 로케일에 맞는 메시지로 설정됩니다.

  1. 에러 처리 및 디버깅

메시지를 찾을 수 없거나, 잘못된 로케일이 제공될 경우, NoSuchMessageException이 발생할 수 있습니다. 이를 처리하기 위해 try-catch 문을 사용할 수 있습니다. 또한, 로케일이 잘못 설정된 경우에는 로케일을 기본값으로 설정하는 것도 고려해볼 수 있습니다.

try {
String greetingMessage = messageSource.getMessage("greeting", null, locale);
} catch (NoSuchMessageException e) {
// Fallback to default locale or handle error
}

또한, Spring Boot의 로깅을 통해 국제화 관련 오류를 추적할 수 있습니다. 로그 레벨을 DEBUG로 설정하여 자세한 정보를 확인할 수 있습니다.

참고문서

이 설명이 Spring Boot에서 국제화를 구현하는 데 도움이 되기를 바랍니다. 질문이 있거나 추가적인 도움이 필요하시면 언제든지 말씀해 주세요!

728x90
반응형