본문 바로가기
개발/Spring

[Spring] Message 적용해보기

by devhooney 2022. 8. 21.
728x90

개발하다보면 한 화면을 여러 언어로 보여줘야 하는 경우가 있다.

언어마다 같은 HTML을 작성하지 않고, 스프링을 이용하여 편리하게 구현해봤다.

 

- 먼저 Bean 등록을 해준다. LocaleConfig라는 파일을 생성하여 작성했다.

- @Value값 안에 들어가는 내용은 application.properties에 작성했다.

- basename에는 앞으로 여러 언어를 같은 코드로 관리하기 위한 파일인 messages.properties파일의 경로를 넣어주었다.

- 나같은 경우 messages/messages를 넣었다.

- encoding은 UTF-8을 넣어주었다.

- 스프링 부트의 경우 Bean등록을 안해도 된다는 글들이 많았는데, 안해주니 나는 에러가 발생했다.(해주면 이상 없음)

 

    @Bean
    public MessageSource messageSource(
            @Value("${spring.messages.basename}") String basename,
            @Value("${spring.messages.encoding}") String encoding
    ) {
        ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource();
        resourceBundleMessageSource.setBasename(basename);
        resourceBundleMessageSource.setDefaultEncoding(encoding);

        return resourceBundleMessageSource;
    }

 

- application.properties

spring.messages.basename=messages/messages
spring.messages.encoding=UTF-8

 

- messages_ko.properties

member.text.welcome=안녕하세요 스프링입니다.
member.text.title=회원 기능
member.text.join=회원 가입
member.text.list=회원 목록

 

- messages_en.properties

member.text.welcome=Hello Spring.
member.text.title=Member Function
member.text.join=Member Join
member.text.list=Member List

 

- HTML(thymeleaf 사용)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Home</title>
</head>
<body>
<div class="container">
    <div>
        <h1 th:text="#{member.text.welcome}">Hello Spring</h1>
        <p th:text="#{member.text.title}">회원 기능</p>
        <p>
            <a href="/members/new" th:text="#{member.text.join}">회원 가입</a>
            <a href="/members" th:text="#{member.text.list}}">회원 목록</a>
        </p>
    </div>
</div> <!-- /container -->
</body>
</html>

 

- 제대로 된 경우

 

- 화면에서 넘어오는 파라미터에 따라서 messages_ko.properties를 읽어올 것인지, messages_en.properties를 읽어올 것인지 정해진다.

- 컨트롤러의 코드

@GetMapping("/")
public String home(@RequestParam(value = "lang", required = false) String lang, HttpSession session, HttpServletRequest request, HttpServletResponse response) {
    if (Objects.equals(lang, "en") ) {
        Locale locale = new Locale(lang);
        LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
        Objects.requireNonNull(localeResolver).setLocale(request, response, locale);
    } else {
        lang = "ko";
        Locale locale = new Locale(lang);
        LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
        Objects.requireNonNull(localeResolver).setLocale(request, response, locale);
    }
    return "home";
}

 

- 이 방법을 사용하려면 LocaleResolver를 Bean으로 등록해줘야 한다.

- 아까 만든 LocaleConfig파일에 추가해준다.

    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
        sessionLocaleResolver.setDefaultLocale(Locale.KOREA);
        // sessionLocaleResolver.setLocaleAttributeName("sessionLang"); // 세션에 담을 변수명

        return sessionLocaleResolver;
    }

 

- 파라미터로 lang을 넘겨주면

728x90