본문 바로가기
dev/Spring Boot

Spring Boot 다국어 Message 사용

by NCJ 2023. 7. 20.
728x90
반응형
SMALL

안녕하세요.

오늘은 Spring Boot에서 다국어를 사용하는 방법을 설명하겠습니다. 

Spring boot에 WebMvcConfigurer 를 상속받아서 설정을 하시면 됩니다. 

 

프로젝트를 생성하고 config 클래스 만들어 줍니다. 

기존에 사용하고 있는 프로젝트라면 WebMvcConfigurer 상속받은 클래스에 추가적으로 해당 내용들을 넣어주시면 됩니다. 

이렇게 설정을 하면 API 호출시 헤더에 Accept-Language 값으로 언어를 구분할 수 있습니다. 

추가적인 언어를 추가하기 위해서 CustomLocaleResolver에 en, ko 부분을 추가적으로 넣어주시면 됩니다. 

예제로 만든 부분이여서 해당 데이터는 하드코딩으로 작업되었습니다. 

 

STEP1 다국어 설정 클래스 작성

import lombok.extern.log4j.Log4j2;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.http.HttpHeaders;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;

@Log4j2
@Configuration
@PropertySource("classpath:application.yml")
@ComponentScan("server")
public class ServletConfig implements WebMvcConfigurer {


    @Bean
    public LocaleResolver localeResolver() {
        CustomLocaleResolver customLocaleResolver = new CustomLocaleResolver();
        customLocaleResolver.setDefaultLocale(Locale.KOREA);
        return customLocaleResolver;
    }


    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        lci.setParamName("lang");
        return lci;
    }


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

    @Bean(name = "messageSourceAccessor")
    public MessageSourceAccessor messageSourceAccessor(MessageSource messageSource) {
        return new MessageSourceAccessor(messageSource, Locale.getDefault());
    }


    public static class CustomLocaleResolver extends AcceptHeaderLocaleResolver {

        String[] mLanguageCode = new String[]{"ko", "en"};
        List<Locale> mLocales = Arrays.asList(new Locale("en"), new Locale("es"), new Locale("ko"));

        @Override
        public Locale resolveLocale(HttpServletRequest request) {
            // 언어팩 변경
            String acceptLanguage = request.getHeader(HttpHeaders.ACCEPT_LANGUAGE);
            if (acceptLanguage == null || "".equals(acceptLanguage)) {
                return Locale.getDefault();
            }
            List<Locale.LanguageRange> list = Locale.LanguageRange.parse(request.getHeader("Accept-Language"));

            mLocales = new ArrayList<>();
            for (String code : mLanguageCode) {
                mLocales.add(new Locale(code));
            }
            return Locale.lookup(list, mLocales);
        }
    }

}
반응형

STEP2  국가별 언어 작성 

프로젝트  resources  아래의 국가별 properties를 작성해 줍니다. 

한국어

messages_ko.properties

영어

messages_en.properties

 

ko, en 은 위에서 설정한 en, ko입니다. 

다국어 messages 파일

파일을 만들고 나서 properties에 내용을 작성합니다. 

다국어 설정

messages_ko.properties

RESULT_MSG_SUCCESS=성공

messages_en.properties

RESULT_MSG_SUCCESS=SUCCESS

RESULT_MSG_SUCCESS는 JAVA에서 사용될 KEY 값입니다. 

메시지 내용은 각 언어에 맞게 작성해주시면 됩니다. 

RESULT_MSG_SUCCESS는 편하게 만들어주시면 됩니다. 

이렇게 메시지들을 키-벨류로 모아서 

가지고 있습니다. 

 

STEP3 messageUtils 만들기

사용하기 편하게 유틸클래스를 만들어 줍니다. 

@Comppnet를 넣어 만들어서 

@Autowired를 사용이 가능합니다. 

import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;

/**
 * 메시지 정보를 전달하는 유틸
 * 메시지는 코드로 구분 (다국어)
 */

@Component
public class MessageUtils {
    private MessageSource messageSource;

    public  MessageUtils(MessageSource messageSource) {
        this.messageSource = messageSource;
    }

    /**
     * 언어팩 언어 가져오기
     *
     * @param code 언어팩 코드
     * @return String
     */

    public String getMessage(String code) {
        return messageSource.getMessage(code, null, LocaleContextHolder.getLocale());
    }

    /**
     * 언어팩 언어 가져오기
     *
     * @param code 언어팩 코드
     * @param strs 동적 문자
     * @return String
     */

    public String getMessage(String code, String[] strs) {
        return messageSource.getMessage(code, strs, LocaleContextHolder.getLocale());
    }

}
SMALL

STEP4 사용하기

Controller를 만들고 MessageUtils를 사용해서 아까 만든 키값을 넣어주면 끝입니다. 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import server.application.utils.MessageUtils;

/**
 * 맴버 관련 컨트롤러
 */
@RestController
public class MemberController {


    @Autowired
    MessageUtils messageUtils;


    @RequestMapping(method = RequestMethod.POST, path = "/api/v1/member")
    public @ResponseBody
    String join() {
        return messageUtils.getMessage("RESULT_MSG_SUCCESS");
    }

}

postman을 통해 방금 만든 API를 테스트해 보겠습니다. 

언어설정 후 사용하면 됩니다. 

기본 언어는 한국어 입니다.

 

Accept-Language를 ko로 하면 성공이라는 글자가 나오고 

다국어 확인 한국어

Accept-Language를 en으로 하면 SUCCESS글자가 나오는걸 확인할 수 있습니다.

다국어 확인 영어

해당 게시글은 가단한 사용법만 제공한다는 점 알아두시면 좋겠습니다. 

실제로 사용자에 따라 커스텀 또는 사용방법이 다를 수 있습니다. 

기본적인 구조만 파악하시고 각자 프로젝트 및 본인 스타일에 맞게 사용하시면 될 듯합니다. 

감사합니다. 

728x90
반응형
LIST