챕터 12: 스프링부트와 국제화(I18N)
12.1 메시지 소스 설정
12.1.1 메시지 소스 파일 작성
스프링부트에서 국제화는 메시지 소스를 사용하여 구현됩니다. 메시지 소스 파일은 src/main/resources
폴더에 위치하며, 각 언어별로 작성할 수 있습니다.
예를 들어, 다음과 같은 메시지 소스 파일을 작성할 수 있습니다:
# messages.properties (기본 메시지 파일)
greeting=Hello
# messages_ko.properties (한국어 메시지 파일)
greeting=안녕하세요
12.1.2 설정 방법
스프링부트에서 메시지 소스를 사용하려면 MessageSource
빈을 설정해야 합니다.
package com.example.demo;
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 AppConfig {
// 메시지 소스를 설정하는 메서드
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}
12.2 다국어 지원
12.2.1 다국어 지원의 필요성
다국어 지원은 애플리케이션이 여러 언어를 사용하는 사용자에게 더 나은 경험을 제공할 수 있도록 도와줍니다. 글로벌 시장을 대상으로 하는 애플리케이션이라면 다국어 지원은 필수적입니다.
12.2.2 다국어 지원 예제
다음은 다국어 지원을 위한 예제 코드입니다:
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.Locale;
@Controller
public class GreetingController {
@Autowired
private MessageSource messageSource;
// HTTP GET 요청을 처리하여 다국어 메시지를 반환하는 메서드
@GetMapping("/greeting")
public String greeting(Model model, Locale locale) {
String greetingMessage = messageSource.getMessage("greeting", null, locale);
model.addAttribute("message", greetingMessage);
return "greeting";
}
}
<!-- src/main/resources/templates/greeting.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Greeting</title>
</head>
<body>
<h1 th:text="${message}">Placeholder</h1>
</body>
</html>
위 예제에서 GreetingController
는 Locale
을 받아서 해당 언어에 맞는 인사말을 반환합니다. greeting.html
템플릿은 이 메시지를 화면에 표시합니다.
12.3 LocaleResolver와 인터셉터
12.3.1 LocaleResolver 설정
LocaleResolver
는 사용자의 로케일 정보를 결정하는 데 사용됩니다. LocaleResolver
를 설정하려면 다음과 같이 구성할 수 있습니다:
package com.example.demo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class LocaleConfig implements WebMvcConfigurer {
// 쿠키를 사용하여 로케일을 저장하는 LocaleResolver를 설정
@Bean
public LocaleResolver localeResolver() {
CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
cookieLocaleResolver.setDefaultLocale(Locale.US);
return cookieLocaleResolver;
}
// 로케일 변경을 처리하는 인터셉터를 설정
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("lang");
return localeChangeInterceptor;
}
// 인터셉터를 레지스트리에 추가
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
12.3.2 인터셉터 사용법
위 설정을 통해 로케일 변경을 지원하는 인터셉터를 추가했습니다. 이제 URL에 lang
파라미터를 추가하여 로케일을 변경할 수 있습니다.
<!-- src/main/resources/templates/index.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Home</title>
</head>
<body>
<a th:href="@{/greeting(lang='en')}">English</a>
<a th:href="@{/greeting(lang='ko')}">한국어</a>
</body>
</html>
위 예제에서 링크를 클릭하면 URL의 lang
파라미터가 변경되어 로케일이 변경됩니다. 예를 들어, /greeting?lang=ko
를 통해 한국어로 인사말을 표시할 수 있습니다.
추가 예제 코드
예제 1: 메시지 소스에서 다국어 에러 메시지 제공
다국어 에러 메시지를 제공하기 위한 예제입니다.
# messages.properties (기본 메시지 파일)
error.notfound=Resource not found
# messages_ko.properties (한국어 메시지 파일)
error.notfound=리소스를 찾을 수 없습니다
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import java.util.Locale;
@RestController
public class ErrorController {
@Autowired
private MessageSource messageSource;
// HTTP GET 요청을 처리하여 예외를 발생시키는 메서드
@GetMapping("/error")
public String error() {
throw new ResourceNotFoundException();
}
// ResourceNotFoundException을 처리하여 다국어 에러 메시지를 반환하는 메서드
@ExceptionHandler(ResourceNotFoundException.class)
public ModelAndView handleResourceNotFoundException(Locale locale) {
String errorMessage = messageSource.getMessage("error.notfound", null, locale);
ModelAndView modelAndView = new ModelAndView("error");
modelAndView.addObject("message", errorMessage);
return modelAndView;
}
// 사용자 정의 예외 클래스
static class ResourceNotFoundException extends RuntimeException {
}
}
<!-- src/main/resources/templates/error.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Error</title>
</head>
<body>
<h1 th:text="${message}">Error occurred</h1>
</body>
</html>
위 예제에서 ErrorController
는 예외를 발생시키고, handleResourceNotFoundException
메서드는 다국어 에러 메시지를 반환합니다.
예제 2: 다국어 지원 HTML 페이지
HTML 페이지에서 다국어를 지원하는 예제입니다.
# messages.properties (기본 메시지 파일)
welcome=Welcome to our website
description=This is a sample website using Spring Boot.
# messages_ko.properties (한국어 메시지 파일)
welcome=우리 웹사이트에 오신 것을 환영합니다
description=이것은 Spring Boot를 사용한 샘플 웹사이트입니다.
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.Locale;
@Controller
public class WelcomeController {
@Autowired
private MessageSource messageSource;
// HTTP GET 요청을 처리하여 다국어 메시지를 반환하는 메서드
@GetMapping("/welcome")
public String welcome(Model model, Locale locale) {
String welcomeMessage = messageSource.getMessage("welcome", null, locale);
String descriptionMessage = messageSource.getMessage("description", null, locale);
model.addAttribute("welcome", welcomeMessage);
model.addAttribute("description", descriptionMessage);
return "welcome";
}
}
<!-- src/main/resources/templates/welcome.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Welcome</title>
</head>
<body>
<h1 th:text="${welcome}">Welcome</h1>
<p th:text="${description}">Description</p>
</body>
</html>
위 예제에서 WelcomeController
는 다국어 메시지를 모델에 추가하고 welcome.html
템플릿에 전달합니다. HTML 페이지는 이 메시지를 사용하여 다국어를 지원합니다.
예제 3: URL 매개변수를 사용한 다국어 지원
URL 매개변수를 사용하여 다국어 지원을 구현하는 예제입니다.
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Locale;
@Controller
public class ParamLocaleController {
@Autowired
private MessageSource messageSource;
// HTTP GET 요청을 처리하여 URL 매개변수를 사용하여 다국어 메시지를 반환하는 메서드
@GetMapping("/param-locale")
public String paramLocale(@RequestParam(name = "lang", required = false) String lang, Model model) {
Locale locale = (lang != null) ? new Locale(lang) : Locale.getDefault();
String message = messageSource.getMessage("greeting", null, locale);
model.addAttribute("message", message);
return "param-locale";
}
}
<!-- src/main/resources/templates/param-locale.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Param Locale</title>
</head>
<body>
<h1 th:text="${message}">Placeholder</h1>
<a th:href="@{/param-locale(lang='en')}">English</a>
<a th:href="@{/param-locale(lang='ko')}">한국어</a>
</body>
</html>
위 예제에서 ParamLocaleController
는 URL 매개변수를 사용하여 로케일을 결정하고, 해당 로케일에 맞는 메시지를 반환합니다.
'IT 강좌(IT Lectures) > SpringBoot' 카테고리의 다른 글
14강. 스프링부트 웹 애플리케이션 개발 (0) | 2024.07.27 |
---|---|
13강. 애플리케이션 설정 관리 (0) | 2024.07.26 |
11강. 프론트엔드 통합 (1) | 2024.07.23 |
10강. Spring Boot DevTools (3) | 2024.07.23 |
9강. Spring Boot Actuator (0) | 2024.07.22 |