스프링 Properties파일 Message로 등록하고 사용하기 예제
저번에 자바에서 Properties파일에 대해서 알아보았다.
프로그램 사용 중 영원히 바뀌지않을 자료를
.properties파일에 저장해서 사용했다
이를 Message로 등록한다면 JSP파일에서도 사용이 가능하다.
그리고 Message는 다국어처리가 가능해서
영어,한국어 등 원하는 언어에 맞게 설정하도록 하자.
properties파일을 message로 사용하기 위해서는
MessageSource객체를 controller에서 @Autowired해서 사용해야 한다.
그러기위해서
@Bean을 이용해서 ServletAppContext에 MessageSource객체를 만들어주자.
MessageSource의 객체의 종류로는 ReloadableResourceBundleMessageSource, MessageSource 등이있다.
이번에는 ReloadableResourceBundleMessageSource를 사용해서 Bean을 등록해볼것이다.
// Properties 파일을 Message로 등록법(JSP에서 사용하기위해)
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
// res.setBasename("/WEB-INF/properties/data1");
//경로지정시 파일의 확장자인 .properties는 생략해야 된다.
res.setBasenames("/WEB-INF/properties/data1", "/WEB-INF/properties/data2");
//여러개 지정시에는 setBasenames 를 사용함
return res;
}
이런식으로 Bean을 등록해주자.(message로 사용하기 위해서)
그 다음에 java에서 @Autowired MessageSource를 한 후 사용하면 된다.
//MessageSource주입
@Autowired
ReloadableResourceBundleMessageSource res;
컨트롤러 코드
@Controller
public class TestController {
//MessageSource주입
@Autowired
ReloadableResourceBundleMessageSource res;
@GetMapping("/test1")
public String test1() {
String a1 = res.getMessage("aaa.a1", null, null);
String b1 = res.getMessage("bbb.b1", null, null);
System.out.println("aaa.a1 : "+a1);
System.out.println("bbb.b1 : "+b1);
return "test1";
}
}
이러면 바로 콘솔에 출력가능
jsp에서 사용시 그냥은 사용하지 못하고
spring에서 제공해주는 스프링커스텀태그를 사용하도록 하자.
(jsp상단에 정의하는 <%@ taglib ~ %>이 태그 라이브러리를 뜻함)
<!--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'/> </h3>
<h3>bbb.b1 : <spring:message code='bbb.b1'/> </h3>
</body>
</html>
이렇게 jsp에서는 스프링 태그 사용후
<spring:message code='내가 .properties파일에서 지정한 이름'/>
을 하면 출력이 가능하다.
이제는 다시 컨트롤러로 돌아와서
String a1 = res.getMessage("aaa.a1", null, null);
String b1 = res.getMessage("bbb.b1", null, null);
이 코드들에 대해서 살펴보자.
중간과 마지막에 둘다 null값을 넣었는데 이걸 언제 사용하는지에 대해 알아보자.
이것은 먼저 가운데것은 문자열 일부분이 바뀔경우 사용한다.
예를 들어 30살 홍길동님 반갑습니다 or 40살 이병건님 반갑습니다.
할때 일부분만 바뀐다. 그럴경우 res.getMessage("aaa.a1", null, null); 의
가운데 null이 사용된다.
.properties파일에 일단 이런식으로 ${ }를 이용해서 적어주면 된다.
aaa.a2 = 나이는 {0}이고 이름은 {1}입니다
그리고 controller에
@GetMapping("test1"
public String test1(Model model) {
//res.getMessage의 2번째 null
//.properties파일의 {}부분에 셋팅할 값 배열
Object [] args = {30, "홍길동"}; //정수or문자열 등 가능하므로 Object타입으로 배열을 생성해준다.
String a2 = res.getMessage("aaa.a2", args, null);
//res.getMessage의 2번째 null을 jsp에서 출력시에는 model를 이용해서
//정보를 jsp로 보내주어야 출력이 가능하다.
model.addAttribute("args", args);
return "test1"
}
이렇게 Object배열에 원하는 값을 넣어주고 (내가지정한 ${0}, ${1}에)
model을 이용하면
jsp에서도 출력이 가능하다.
<h3>bbb.b1 : <spring:message code='aaa.a2' arguments="${args }"/> </h3>
jsp에서는 이렇게 arguments=${~}를 이용하자
마지막으로
String b1 = res.getMessage("bbb.b1", null, null); 의 3번째 null에 대해 알아보자면
이것은 다국어처리에 사용된다.
그리고 파라미터에 Locale객체를 넣어줘야한다.
@GetMapping("/test1")
public String test1(Model model, Locale locale) {
String a3 = res.getMessage("aaa.a3", null, locale);
return "test1";
}
}
(중간null은 위에서 본것처럼 .properties에 ${}값이 있으면 넣어주고 아니면 null을 넣자)
중요한것은 properties파일 작성법이다.
나는 data1.properties 라고 properties파일을 만들었는데
다국어 Locale을 사용하기 위해서는
data1_en.properties
data1_ko.properties 이렇게 뒤에 _국가코드 를 지정해주면
크롬에 지정상태에 맞게 알아서 출력이 된다.
(크롬이 영문버전이면 en이 나오고 한국어면 ko정보가 나온다)
그래서
<h3>aaa.a3 : <spring:message code='aaa.a3'/> </h3>
사용시에는 내가 지정한 크롬이 한국어면 ko에 내가 지정한값이 나오고
영어면 en파일에 내가 지정한 값이 나오게 된다.
난 한국어로 크롬을 지정해서 마지막에 한국어임(_ko에 내가 지정한값)이 나오게 된다.