
메시지 기능이란?
만약 아래 HTML코드에서 label태그에 명시되어있는 '상품명', '가격', '수량'등을 수정해야한다면 하나씩 일일이 파일을 찾아가며 변경하거나 IDE의 replace기능사용해서 수정해야 할 것이다.
이렇게 수정할 경우 너무 번거로울뿐만아니라 repalce방식으로 수정을 할 경우 잘 못 수정되는 경우도있을 것 이다.
<div>
<label for="itemName">상품명</label>
<input type="text" id="itemName" th:field="*{itemName}" class="form-control" placeholder="이름을 입력하세요">
</div>
<div>
<label for="price">가격</label>
<input type="text" id="price" th:field="*{price}" class="form-control" placeholder="가격을 입력하세요">
</div>
<div>
<label for="quantity">수량</label>
<input type="text" id="quantity" th:field="*{quantity}" class="form-control" placeholder="수량을 입력하세요">
</div>
이런 불편함을 해결해주기위해 '메시지'라는 기능이 사용된다.
Spring에서는 이 메시지기능을 어떻게 제공하고 어떻게 사용하게하는지 알아보자
HTTP 메시지에 담긴 accept-language헤더의 값을 서버에서 인지하고 해당 국가에 맞는 메시지 언어를 제공한다.
국가에 맞는 언어 메시지를 제공하기위해 아래와 같이 properties파일을 생성한다.
이 때 messages.properties가 default값으로 _en,_jp등의 형식이 들어오지 않을 경우 디폴트 메시지로 제공한다.
즉 아래의 예시로는 일본어를 제공하지않는 서비스에서 HTTP accept-language가 일본어일 경우 한국어를 제공하는 것이다.
//message_en.properties
hello=hello
hello.name=hello{0}
//messages.properties
hello=안녕
hello.name=안녕{0}
messages.properties IDE주의 또는 아래에서 테스트 코드 실행시 한글깨짐 발생시 읽어야하는 글
만약 message.properties파일내부에 한글에 아래와 같은 주의 문장이 나올수있다.
Unsupported characters for the charset 'ISO-8859-1' : 인코딩 방식이 한글을 인코딩하지 못한다는 의미
이 때는 java의 propeties인코딩방식을 수동으로 바꿔주어야한다
인텔리제이 -> settings -> Editor -> File Encodings -> Default encoding for propeties files를 UTF-8로 설정

작성자의 경우에는 위의 설정을 하고도 한글이깨져서 나와서 다른 해결방법을 찾느라 고생했는데, propeties파일의 한글이 ??로 바뀌어 있어서 계속 한글이 깨져있던 것이다. 설정을 변경한 뒤, propeties파일의 한글이 옳바르게 작성되어있는지도 확인하자.
위의 properties파일을 Spring에 등록하기위해서는 아래와 같이 Bean을 통해 등록하는 코드가 필요하다
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
이렇게 Bean을 등록해주기만 하면 HTTP accept-language를 확인한 뒤 'messages_jp.properties', 'messages_en.properties', 'messages_ko.properties'의 형태로 Spring에서 알아서 매핑하여 properties파일을 적용한다.
메시지 설정을 매핑하는 Bean등록도 Spring boot에서는 알아서 처리해주기 때문에 번거롭게 직접 등록할 필요는 없다.
위와 같이 properties파일을 모두 작성해주었다면 propeties파일에 대한 테스트 코드를 작성해보자
@SpringBootTest
public class MessageSourceTest {
@Autowired
MessageSource messageSource;
@Test
void helloMessage() {
String result = messageSource.getMessage("hello", null, null);//default properties
System.out.println("result = " + result);
Assertions.assertThat(result).isEqualTo("안녕");
}
@SpringBootTest는 SpringBoot가 이 테스트 코드를 돌려주는 클래스임을 의미한다.
getMessage()의 파라미터는 순서대로 메시지 코드, 메시지 코드 파라미터, locale(나라 정보)이다.
messageSource변수에 @Autowired를 사용하여 Spring 컨테이너로부터 의존성을 주입받는다. (테스트 코드이므로 필드 주입OK)

만약 테스트 실행결과가 위와같이 한글이 깨져서 나온다면 위에 있는 더보기 글을 읽고오자
HTML에 적용하기
HTML에 메시지 기능을 적용하기위해서는 타임리프의 '#{}' 표현식을 사용하면 된다.
파일의 경로는 resources로 들어가야하며 properties파일의 이름은 반드시 messages.properties여야한다.
//messages.properties
test.h1=테스트 에이치1
test.h2=테스트 에이치2
<h1 th:text="#{test.h1}"></h1>
<h2 th:text="#{test.h2}"></h2>
//실행결과
<h1>테스트 에이치1</h1>
<h2>테스트 에이치2</h2>
이렇게 메시지 기능을 사용하면 유지보수가 매우 편리해진다.
국제화 기능사용
국제화란 HTTP 헤더정보를 활용하여 클라이언트가 요청한 지역에 맞는 언어 서비스를 제공하는 것이다.
messages.properties를 이용하여 국제화를 적용할 수 있는데 아래 코드를 살펴보면 이해할 수 있을것이다.
//messages_en.properties
test.h1=TEST H1
test.h2=TEST H2
messages.properties가 한국어를 지원한다면 messages_en.properties는 영어를 지원하는 메시지 기능을 설정하는 것이다.
서버는 요청클라이언트의 헤더정보를 확인하여 만약 영어권 헤더정보를 요청할 시 messages_en.properties파일이 매핑되어 영어로 되어있는 서비스를 제공하는 것이다.
이렇게 메시지기능을 통해서 코드의 변화없이 설정파일 하나를 추가해줌으로써 다국어 서비스를 제공한다.
위 정리한 내용들은 모두 인프런에서 김영한님의 강의를 듣고 학습한 내용을 스스로 정리한 것임을 밝힙니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1#
'Framework > Spring' 카테고리의 다른 글
[Spring] 서블릿 필터와 스프링 인터셉터 비교하기! (0) | 2024.08.07 |
---|---|
[Spring] JdbcTemplate (0) | 2024.06.16 |
Spring MVC - @RequestMapping (0) | 2024.04.16 |
Spring MVC - 프레임워크 사용 전과 후 & @Controller (0) | 2024.04.15 |
Spring MVC - Dispatcher Servlet과 View Resolver (0) | 2024.04.15 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!