본문 바로가기

Programming/개인 프로젝트

[중고거래장터 - Study&Refactoring] locale 변경

반응형

로컬 환경에서 구현한 서비스를 AWS 환경에 배포하고 구동했습니다.

로그인 시 아이디/비밀번호가 일치하지 않으면 다음과 같은 메시지가 출력되도록 구현했습니다.

 

 

그런데 아래와 같은 메시지가 출력되었습니다.

 

No message found under code 'error.BadCredentials' for locale 'en_US'

 

아이디/비밀번호 관련 오류 발생 시 security_ko_KR.properties 파일의 error.BadCredentials의 문구가 출력되어야 합니다.

.properties 이름에 있는 locale 정보(ko_KR)를 인식해서 properties 파일을 열고, 내부의 메시지를 출력합니다. 그런데 ko_KR 파일이 아닌 en_US 파일을 찾고 있습니다. 문제는 en_US 파일을 생성한 적이 없다는 것입니다.

 

security_ko_KR.properties

error.BadCredentials=아이디나 비밀번호가 맞지 않습니다. 다시 확인해주세요.
error.Disaled=계정이 비활성화되었습니다. 관리자에게 문의하세요.
error.CredentialsExpired=비밀번호 유효기간이 만료 되었습니다. 관리자에게 문의하세요.
error.Locked=계정이 잠겨있습니다. 관리자에게 문의하세요.
error.AccountExpired=계정이 만료되었습니다. 관리자에게 문의하세요.

 

해결의 실마리를 찾기 위해 메시지 출력 설정 XML 파일을 확인합니다.

 

message-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
  
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <!-- Encoding 설정 -->
        <property name="defaultEncoding" value="UTF-8"/> 
        <!-- Reload Cache 설정 -->
        <property name="cacheSeconds" value="5"/>
        <!-- basenames 설정: 아래처럼 하면 WEB-INF 밑의 message 폴더 아래의 security로 시작하는 모든 Property-->
        <property name="basenames">
            <list>
                <value>/WEB-INF/message/security</value>
                <value>/WEB-INF/message/email</value>
            </list>
        </property>       
    </bean>
     
    <!-- MessageSource를 사용하기 위한 Accessor 설정 -->
    <bean id="messageSourceAccessor" class="org.springframework.context.support.MessageSourceAccessor">
        <constructor-arg ref="messageSource"/>
    </bean>
    
    <!-- MessageSource를 사용하기위한 MessageUtils 매핑 -->
    <bean id="message" class="com.board.util.MessageUtils">
        <property name="messageSourceAccessor" ref="messageSourceAccessor"/>
    </bean>
      
    <!-- Default Location 설정 -->
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
        <property name="defaultLocale" value="ko"></property>
    </bean>
</beans>

 

위 코드를 보면 messageSource 설정 내용을 찾는 messageSourceAccessor 클래스가 빈으로 등록되어 있고, 실제로 messageSource에 접근하기 위한 util 클래스인 MessageUtils.java 클래스가 messageSourceAccessor를 프로퍼티 값으로 가지고 있는 것을 알 수 있습니다. 이제 MessageUtils.java 클래스로 이동합니다.

 

MessageUtils.java

import java.util.Locale;

import org.springframework.context.support.MessageSourceAccessor;

public class MessageUtils {
	private static MessageSourceAccessor msAcc = null;

	public void setMessageSourceAccessor(MessageSourceAccessor msAcc) {
		MessageUtils.msAcc = msAcc;
	}

	public static String getMessage(String code) {
		return msAcc.getMessage(code, Locale.getDefault());
	}

	public static String getMessage(String code, Object[] objs) {
		return msAcc.getMessage(code, objs, Locale.getDefault());
	}
}

 

MessageUtils.java 클래스는 message-servlet.xml 파일의 설정에 따라 .properties 파일의 위치에 접근해서 locale 값이 일치하는 .properties 파일의 메시지 내용을 가져오는 메소드를 제공합니다. 그 메소드가 getMessage 메소드입니다.

 

getMessage 메소드를 살펴보면 Locale.getDefault() 메소드가 있습니다. 이름을 보니 locale 값을 가져오는 것 같습니다.

getDefault() 메소드는 JVM에 적용된 디폴트 세팅값을 출력합니다. 로컬 환경이라면 로컬 환경의 운영체제(OS)의 기본 정보를 토대로 locale 값이 출력되는 것 같습니다. 그렇다면 AWS 환경은 기본 locale 값이 en_US이기 때문에 ko_KR 파일을 찾지 못하고 en_US 파일을 요구하는 것이 아닐까요?

 

그래서 확인해봅니다. 서버에 접속 후 locale 확인 명령어를 입력했더니 en_US.UTF8로 설정된 것을 확인할 수 있었습니다.

 

[ec2-user@joonggo-market ~]$ locale

 

저는 Amazon Linux 2를 이용하고 있고, 이는 CentOS를 기반으로 하기 때문에 CentOS와 거의 유사합니다. 그래서 CentOS 관련 레퍼런스가 더 많기 때문에 CentOS에서 locale 변경 방법을 검색합니다. 참고로 Amazon Linux 2는 CentOS 7 버전과 동일합니다. 따라서 CentOS 7 버전에서 사용되는 방법을 검색해야 합니다.

 

CentOS 7 버전에서는 다음과 같이 locale 설정을 변경합니다.

 

sudo vi /etc/locale.conf

 

변경 후 리부트 합니다.

 

sudo reboot

 

리부트 후 locale 변경 내용을 확인합니다.

 

 

그리고 다시 서비스를 실행해서 ko_KR 파일을 잘 찾아가는지 확인합니다.

로컬 환경과 동일하게 출력되는 것을 확인했습니다.

 

 

요약

  • 만약 로컬 환경과 동일하게 locale 값을 인식하지 못한다면 현재 구동중인 서버 환경의 locale 값을 확인해보자.

참고

반응형