1. 메세지 필요성
1) HTML에 기록되어 있는 “상품명”을 고치고 싶은데 수 백가지를 반복 작업 하면서 수정해야된다. 이럴 때 HTML에 바로 상품명을 등록시키지 않고 특정 properties를 만든 뒤 불러다 쓰는 것을 메시지라 한다.
2. 국제화 필요성
1) 국제화 필요성 : 각 나라별 언어를 지원하기 위해 사용한다.
Spring은 기본적인 메세지 기능을 제공한다. 또한 타임리프도 스프링이 제공하는 메시지와 국제화 기능을 통합해서 사용할 수 있다.
3. 메세지와 국제화 사용을 위한 MessageSource 등록
1. 자동 등록 (default)
1) MessageSource 를 스프링 빈으로 등록하지 않고, 스프링 부트와 관련된 별도의 설정을 하지 않으면 messages 라는 이름으로 빈이 기본 등록된다.
2) messages_en.properties , messages_ko.properties , messages.properties 파일만 등록하면 자동으로 인식된다.2. application.properties로 등록
1) 이럴 경우 스프링 부트가 MessageSource 를 자동으로 스프링 빈으로 등록
2) application.properties에서 spring.messages.basename=을 설정한다. 그러면 basetname.properties를 스프링 부트에서 자동으로 읽어들인다.3. 빈 직접 등록
1) @BaseNames와 DefaultEncoding을 설정해서 직접 등록한다.
@Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasenames("messages", "errors"); messageSource.setDefaultEncoding("utf-8"); return messageSource; }2) 이럴 경우 "messages", "errors"이름으로한 메세지와 국제화 기능을 사용할 수 있다.
해당 resource에 basename.properties로 등록 시 자동으로 설정된다.
내부에 key와 value를 설정해서 thymleaf에서 사용 가능하다.
1. 사용처 - testcase 작성 (MessageSource.getMessage())
@Test void enLang() { assertThat(ms.getMessage("hello", null,"dddd", Locale.ENGLISH)).isEqualTo("hello"); }1) 메세지가 없을 경우
메시지가 없는 경우에는 NoSuchMessageException 이 발생한다.
메시지가 없어도 기본 메시지(defaultMessage)를 사용하면 기본 메시지가 반환된다.2. 사용처 - thymleaf
1) 타임리프에서 사용 #{} 표현식으로 사용
2) 타임리프에서 매개변수를 넣을 시 #{lable.name(매개변수)}와 같이 사용<label for="itemName" th:text="#{label.item.itemName}">상품명</label>