IT 강좌(IT Lectures)/SpringBoot

12강. 스프링부트와 국제화(I18N)

소울입니다 2024. 7. 25. 08:49
728x90
반응형

 

챕터 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>

위 예제에서 GreetingControllerLocale을 받아서 해당 언어에 맞는 인사말을 반환합니다. 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 매개변수를 사용하여 로케일을 결정하고, 해당 로케일에 맞는 메시지를 반환합니다.

반응형