프로젝트 하나를 완성하고나서, 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>
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
참고자료 : 스프링 API ( 객체들에 자세한 내용을 알고싶다면? )
'개발관련 > Spring' 카테고리의 다른 글
java 개발을 더 간편하게 / lombok (0) | 2020.07.08 |
---|---|
spring boot(스프링 부트) - 프로젝트 구조 및 사용 방법 (0) | 2020.06.18 |
[spring] 파일다운로드 구현 (3) | 2020.02.02 |
[Spring] 파일 업로드 구현 (0) | 2020.01.30 |
[Spring] 스프링은 어떻게 동작할까? (2) : 의존성 주입[xml방식] (0) | 2019.09.27 |
댓글