ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC - Message
    Spring/Spring MVC 2022. 1. 2. 23:44
    반응형

    Message

    • properties 파일을 Message로 등록하면 properties 파일 안에 저장된 데이터를 서버뿐만 아니라
      JSP에서도 사용할 수 있다.
    • Properties 파일을 Message로 등록하면 다국어 처리가 가능해진다.

    MessageSource

    • MessageSource 객체를 이용해 properties 파일을 Message로 등록할 수 있다.

     

     

     사용할 properties 파일 생성

    data1.properties               (/WEB-INF/properties/)

    aaa.a1 = 문자열1
    aaa.a2 = 나이는 {0}이고 이름은 {1}입니다

     data2.properties               (/WEB-INF/properties/)

    bbb.b1 = 문자열2

     


    방법 1 - Java

     

    ServletAppContext.java 에 Message 등록

     propertie 파일을 Message로 등록해  Controller와 JSP에서 사용해보자.

     

    ServletAppContext.java

    // Spring MVC 프로젝트에 관련된 설정을 하는 클래스
    @Configuration
    // Controller 어노테이션이 셋팅되어 있는 클래스를 Controller로 등록한다.
    @EnableWebMvc
    // 스캔할 패키지를 지정한다.
    @ComponentScan("kr.co.controller")
    public class ServletAppContext implements WebMvcConfigurer{
    	// Controller의 메서드가 반환하는 jsp의 이름 앞뒤에 경로와 확장자를 붙혀주도록 설정한다.
    	@Override
    	public void configureViewResolvers(ViewResolverRegistry registry) {
    		...
    	}
    	
    	// 정적 파일의 경로를 매핑한다.
    	@Override
    	public void addResourceHandlers(ResourceHandlerRegistry registry) {
    		...
    	}
        
    	//properties 파일을 message로 등록한다.
    	@Bean
    	public ReloadableResourceBundleMessageSource messageSource() {
    		ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
    
    		res.setBasenames("/WEB-INF/properties/data1","/WEB-INF/properties/data2");
    		
    		return res;
    
    	}
    }
    @Bean
     - Bean 등록을 해줘야 한다. (Bean 등록 안 해서 한참 헤맸다..)

    ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
     - messageSource 객체를 이용해 properties 파일을 등록해주면 Message로 사용할 수 있다.
     - 일정 시간마다 한 번씩 갱신되는 ReloadableResourceBundleMessageSource를 사용하였다.

    properties 파일 등록
     1. 1개 등록        - res.setBasename("/WEB-INF/properties/data1");
     2. 2개 이상 등록 - res.setBasenames("/WEB-INF/properties/data1","/WEB-INF/properties/data2");
                           - res.setBasenames 메서드는 매개 변수를 가변 인자로 받는다.

     

    MessageSource를 Controller에서 주입받아 Message 사용

     등록한 Message를 Controller에서 사용

     

    Controller

    @Controller
    public class testController {
    	
    //	MessageSource를 주입받는다
    	@Autowired
    	ReloadableResourceBundleMessageSource res;
    	
    	
    	@GetMapping("/test1")
    	public String test1(Model model, Locale locale){
        
    		System.out.println("locale = " + locale);
    		
            // Message에서 { } 가 없는 일반 데이터 가져오기
    		String a1 = res.getMessage("aaa.a1", null, null);
    		String b1 = res.getMessage("bbb.b1", null, null);
    		System.out.println(a1);
    		System.out.println(b1);
    		
    		// Message에에 { } 부분에 셋팅할 배열
    		Object [] args = {30, "홍길동"};
    		// Message에서 { } 가 있는 데이터 가져오기
    		String a2 = res.getMessage("aaa.a2", args, null);
    		
    		System.out.println(a2);
    		
    		model.addAttribute("args", args);
    		
    		
    //		다국어 처리
    		String a3 = res.getMessage("aaa.a3", null, locale);
    		System.out.println(a3);
    		
    		return "test1";
    	}
    }
    @Autowired
    ReloadableResourceBundleMessageSource res;
     - MessageSource를 주입받는다.

    public String test1(Model model, Locale locale){
     - '나이는 {0}이고 이름은 {1}입니다'의 데이터를 JSP에서 사용하기 위해  {0}, {1}에 들어갈
       값을 Model 객체에  저장하기 위해 Model을 주입 받음. 
     - Locale은 브라우저에 설정되어있는 언어 값을 알려준다

    Object [] args = {30, "홍길동"};
    String a2 = res.getMessage("aaa.a2", args, null);
     - 저장되어있는 데이터를 가져온다.
     - getMessage(property의 key, 메시지 출력 시 전달 인자, Locale) 

    String a3 = res.getMessage("aaa.a3", null, locale);
     - 브라우저의 언어 값을 가져와서 각 언어에 따른 properties를 선택하여 데이터 값을 가져온다.
     - ex) data1_en.properties, data1_ko.properties, data1_ja.properties
     - 해당 언어가 없을 시 data1.properties에 저장된 데이터를 가져온다.
     - data1.properties를 Message로 등록했으면 나머지 언어 properties는 등록 안 해줘도 된다.

     

     

    JSP에서 Message 사용

     이제 등록한 Message를 JSP에서 사용해보자.

     

    JSP

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<h1>test1</h1>
    	<h3>aaa.a1 = <spring:message code='aaa.a1'></spring:message></h3>
    	<h3>bbb.b1 = <spring:message code='bbb.b1'></spring:message></h3>
    	<h3>aaa.a2 = <spring:message code='aaa.a2' arguments="${args }"></spring:message></h3>
    </body>
    </html>
    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
     - Message를 사용하기 위해 태그 라이브러리를 가져와야 한다. 

    <h3>aaa.a1 = <spring:message code='aaa.a1'></spring:message></h3>
    <h3>bbb.b1 = <spring:message code='bbb.b1'></spring:message></h3>
    <h3>aaa.a2 = <spring:message code='aaa.a2' arguments="${args }"></spring:message></h3>
     - Message에 저장된 데이터 사용

     

     

     


     

    방법 2 - XML

     

     servlet_context.xml 에 Message 등록

     propertie 파일을 Message로 등록해  Controller와 JSP에서 사용해보자.

     

     

     servlet_context.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans:beans xmlns="http://www.springframework.org/schema/mvc"
    			.....
                >
    			 					 
    	<!-- 스캔한 패지키 내부의 클래스 중 Controller 어노테이션을 가지고 있는 클래스들을 Controller로 로딩하도록 한다 -->
    	<annotation-driven/>
    	
    	<!-- 스캔할 bean들이 모여있는 패키지를 지정한다. -->
    	<context:component-scan base-package="kr.co.softcampus.controller"/>
    	
    	<!-- Controller의 메서드에서 반환하는 문자열 앞 뒤에 붙힐 경로 정보를 셋팅한다. -->
    	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    		...
    	</beans:bean>
    	
    	<!-- 정적파일(이미지, 사운드, 동영상, JS, CSS 등등) 경로 셋팅 -->
    	<resources mapping="/**" location="/resources/"/>
    	
    	<!--  MessageSource를 등록한다. -->
    	<beans:bean class='org.springframework.context.support.ReloadableResourceBundleMessageSource' id='messageSource'>
    		<beans:property name="basenames">
    			<beans:list>
    				<beans:value>/WEB-INF/properties/data1</beans:value>
    				<beans:value>/WEB-INF/properties/data2</beans:value>
    			</beans:list>
    		</beans:property>
    	</beans:bean>
    	
    	<!-- MessageSource를 사용하기 위한 Accessor 등록 -->
    	<beans:bean id='messageSourceAccessor' class='org.springframework.context.support.MessageSourceAccessor'>
    		<beans:constructor-arg ref='messageSource'/>
    	</beans:bean>
    			 
    </beans:beans>
    <beans:bean class='org.springframework.context.support.ReloadableResourceBundleMessageSource' id='messageSource'>
     - MessageSource를 등록
     - id 값을 준 이유는 Message Accessor를 등록해주기 위해서이다.

    propertie 등록
     1. 1개만 등록
        <beans:property name='basename' value='/WEB-INF/properties/data1'></beans:property>
     2. 1개 이상 등록
        <beans:property name="basenames">
               <beans:list>
                      <beans:value>/WEB-INF/properties/data1</beans:value>
                      <beans:value>/WEB-INF/properties/data2</beans:value>
               </beans:list>
        </beans:property>

    <beans:bean id='messageSourceAccessor' class='org.springframework.context.support.MessageSourceAccessor'>
            <beans:constructor-arg ref='messageSource'/>
    </beans:bean>
     - MessageSource를 사용하기 위한 Accessor 등록
     - 이 설정을 안 해주면 properties에 접근을 못한다.

     

     Contoller와 JSP에서 사용 방법은 위 Java방식과 같으므로 생략하겠다.

    반응형

    댓글

Designed by Tistory.