본문 바로가기
개발관련/Spring

alert문구를 하나의 파일로 만들어서 관리하자. springframework.org/tags

by joa-yo 2020. 2. 26.
반응형

 

프로젝트 하나를 완성하고나서, gitHub에서 프로젝트 하나를 다운받아 보던 중, 보지 못했던 기술이 있어서 찾아보았습니다. 

<script>
function fn_formSubmit(){
	if ( ! chkInputValue("#userid", "<s:message code="common.id"/>")) return false;
	if ( ! chkInputValue("#userpw", "<s:message code="common.password"/>")) return false;
	
	$("#form1").submit();
}
</script>

폼을 서브밋 할 때 사용하는 자바스크립트 함수입니다. chkInputValue라는 메소드를 만들어서, 간단하게 공백검사를 하고 있네요. 그런데,  "<s:message code="common.id"/>"는 생소하게 느껴졌습니다. jstl과 비슷한 느낌이라서 검색해보았습니다. 간단한 설정만 해주면 alert문구를 하나의 파일에서 통합하여 관리할 수 있었습니다. 어떻게 가능할 걸까요?

 


0. 세가지 필수 빈 알고가기

  • messageSource
    • 메세지들을 입력해놓을 파일에 대한 설정 (인코딩 방식, 파일경로 등등)
  • messageSourceAccessor
    • 다양한 getMessage 메소드를 제공하여 MessageSource의 메시지에 쉽게 액세스 할 수있는 헬퍼 클래스
  • localeResolver
    • 언어 설정

 

 

 

1. 스프링 빈으로 등록하기

<<application_context.xml>>

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource" >
	<property name="defaultEncoding" value="UTF-8" /> <!-- 인코딩 방식 설정 -->
	<property name="basenames"> <!-- message 파일 경로 설정 -->
		<list>
			<value>classpath:/message/message</value>
		</list>
	</property>
	<property name="fallbackToSystemLocale" value="false" /> <!-- 요청 로케일이 없을 경우, 시스템 로케일로 기본 설정할지 여부 -->
	<property name="cacheSeconds" value="10"/>
</bean>

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" >
	<property name="defaultLocale" value="ko" /> <!-- 기본 로케일 설정 -->
</bean>
<bean id="messageSourceAccessor" class="org.springframework.context.support.MessageSourceAccessor">
    <constructor-arg ref="messageSource"/>
</bean>

 

message폴더 경로

1. message를 입력할 파일을 만들도록 하겠습니다.  src/main/resources 폴더에 message 폴더를 만들고 "message_[lang]"과 같은 형태로 properties파일을 만들어줍니다. 생성된 파일의 경로를  messageSource객체에 지정해줍니다.

 

2. messageSourceAccesor에 방금 설정한 messageSource를 연결시켜줍니다.

3. localResolver를 통해 기본 언어를 설정해줍니다.

 

개발자님의 의도가 궁금해서 찾아본 것 (이 내용과 무관함)

더보기

LocaleMessage 클래스

<bean id="message" class="gu.common.LocaleMessage">
    <property name="messageSourceAccessor" ref="messageSourceAccessor"/>
</bean> 

application_context.xml

프로그램을 만드신 개발자님 께서 message빈을 임의로 생성하여 넣으셨는데, 그 이유가 궁금해서 찾아보았습니다.

import java.util.Locale;

import org.springframework.context.support.MessageSourceAccessor;

public class LocaleMessage {

    private static MessageSourceAccessor msAcc = null;
    
    public static void setMessageSourceAccessor(MessageSourceAccessor msAcc) {
        LocaleMessage.msAcc = msAcc;
    }
    
    public static String getMessage(String key) {
        return msAcc.getMessage(key, Locale.getDefault());
    }
    
    public static String getMessage(String key, Object[] objs) {
        return msAcc.getMessage(key, objs, Locale.getDefault());
    }
}

Static하게 생성하여 다른 클래스에서 MessageSourceAccessor를 손쉽게 사용할 수 있도록 생성해준 것으로 파악이 됩니다. 이 프로그램읆 만드신 개발자님께서, 이 메세지 파일을 properties파일처럼 파일의 경로를 지정해두셨는데, 의미가 다른 데이터가 섞여있어 좋은방법이라고 생각이 들지는 않습니다. 굳이 Static하게 설정할 필요는 없을 것 같네요.

 

2. JSP파일에서 사용하기

<%@ taglib prefix="s" uri="http://www.springframework.org/tags"%>

jstl을 추가해주었을 때와 마찬가지로, 이 기능을 사용할 jsp파일 최상단에 해당 코드를 추가해줍니다. 이때 prefix는 s로 정했으므로, 이 라이브러리를 쓸 때는 "<s:  />"와 같은 형태로 호출하게 됩니다.

 

function chkInputValue(id, msg){
	if ( $.trim($(id).val()) == "") {
		alert("<s:message code="common.id"/>");
		$(id).focus();
		return false;
	}
	return true;
}

javascript에서 message를 불러다 쓸 때는 위처럼 alert문 안에 넣어서 사용하시면 됩니다. jsp파일이 만들어지면서 자동으로 properties파일에 지정되어 있던 값이 들어갑니다.

 

호출 시, code속성 말고도 다른 값들을 지정할 수 있는데요, 아래의 Tistory출처를 보시면 더 자세히 알 수 있습니다.

 

properites파일 작성 예시

common.btnClose=닫기
common.btnDelete=삭제
common.btnCancel=취소

board.boardName=게시판
board.no=No. 
board.title=제목

 

 

 

 

출처https://kooremo.tistory.com/entry/smessage-%ED%83%9C%EA%B7%B8-%EC%84%A4%EB%AA%85

 

 

s:message 태그 설명

해당 태그의 경우 spring태그중 message 태그를 이용해서 정해진 파일의 메시지를 출력 하는데 사용 되어 집니다. 작업중인 프로그램 에서는 아래의 설정을

kooremo.tistory.com

참고자료 : 스프링 API ( 객체들에 자세한 내용을 알고싶다면? )

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/support/MessageSourceAccessor.html

 

MessageSourceAccessor (Spring Framework 5.2.3.RELEASE API)

Return the default locale to use if no explicit locale has been given. The default implementation returns the default locale passed into the corresponding constructor, or LocaleContextHolder's locale as fallback. Can be overridden in subclasses.

docs.spring.io

 

반응형

댓글