메시지 국제화를 적용하기 전, 스프링에서 제공하는 메시지소스(MessageSource)를 이해하여야 합니다.
스프링 메시지 소스(MessageSource)란?
메시지 소스를 사용하는 이유는 기존에 문자열 하드코딩으로 사용자 및 프론트 개발자에게 제공되는 결과,오류 메세지를 일종의 템플릿 형태로 제공하여 유지보수의 효율성을 높여주고 일관성을 보장해주는 효과가 있습니다. 이러한 기능을 스프링에서 제공합니다.
Controller
@GetMapping("/literal")
public String literal(Model model){
model.addAttribute("data","Spring!");
return "basic/literal";
}
@GetMapping("/operation")
public String operation(Model model){
model.addAttribute("nullData",null);
model.addAttribute("data","Spring!");
return "basic/operation";
}
예를 들어 위의 Model에 데이터 전송시 data 오브젝트의 값으로 Spring! 이라는 메세지를 리턴해주기로 하였다면, 현재 코드는 하드코딩으로 문자열 "Spring!" 을 리턴해줍니다. 이 문자열 메시지를 수정하려면 /literal과 /operation 2개의 소스를 수정해줘야 합니다. 단순히 2개라면 상관이 없지만, 실무에서 100개 이상의 "Spring!" 문자열을 수정해달라고 하면 유지보수에 상당히 큰 자원을 소모하게 됩니다. 그렇기 때문에 하드코딩이 아닌 메시지소스라는 공통화 된 모듈을 사용한다면 해당 모듈만 수정하면 100개의 "Spring!" 문자열이 아닌 하나의 모듈 안의 메시지를 수정하면 모든 참조되는 소스들도 자연스레 수정이 됩니다. 위의 소스를 스프링 메시지 소스를 적용하여 수정해보겠습니다.
스프링 메시지 소스 설정
스프링의 메시지 설정은 application.properties에 기본적으로 default 설정 되어 있습니다.
메시지 설정 파일의 이름을 messages로 정의한다는 의미로 messages.properties를 읽겠다는 의미입니다. 그렇다면 messages.properties는 어디에 생성해야 할까요?
기본적으로 resources 루트 디렉터리에 messages.properties 파일을 생성해주시면 됩니다.
위 사진에서 messages 프로퍼티가 2개로 나눠진 이유는 기본 설정의 메시지 설정과 언어가 영어로 설정되었을때 읽어오는 설정 파일을 나누기 위해 작성되었습니다. 스프링은 HTTP Request의 accept-language 헤더 값을 읽어 위 설정 중 하나를 읽어와 언어별로 메시지를 다르게 설정해줍니다. 이러한 메시지 소스의 설정을 메시지 국제화라고 합니다.
Encoding 설정
경로 : File-Settings-Editor-File Encodings에서 Encoding 설정을 UTF-8로 맞춰주지 않을 경우 메시지 소스가 적용되지 않을수 있습니다.
위와 같이 Global Encoding, Project Encoding, Properties Files를 모두 UTF-8로 맞춰줘야 합니다.
스프링 메시지 기본 설정 인코딩이 UTF-8로 설정되어 있기 때문입니다.
스프링 메시지 소스 적용
messages-properties
위와 같이 messages.properties에서 메시지를 key-value 형식으로 메시지를 지정합니다.
Controller
MessageSource를 선언해줍니다.
messages.properties에 있는 key 값인 spring-default를 넣어줍니다.
위와 같이 코드를 수정하였을때 요건이 변경되어 메시지를 수정해야 한다고 하였을때 Controller의 소스를 건들일 필요가 없으며, messages.properties의 메시지만 수정해줌으로써 유지보수를 훨씬 쉽게 할수 있으며 의존성을 나누어 외부에서 메시지를 관리하도록 소스가 설계됩니다.
그렇다면 메시지 국제화는 어떻게 쓰일까요? 아래의 테스트 코드를 통해 간략하게 설명할수 있습니다.
messges.properties
messges_en.properties
MessageSourceTest (JUnit 테스트 클래스)
MessageSource 인터페이스 getMessage 함수의 첫번째 인자는 불러올 메시지 key 값, 두번째 인자는 해당 key 메시지의 value에 포함될 파라미터, 세번째 인자는 메시지 설정 언어를 설정하는 부분입니다. Locale이 null이거나 KOREA일때는 messages.properties를 참조하는것을 알 수 있고, Locale.ENGLISH일때는 messages_en.properties를 읽어 영문 메시지 설정을 성공적으로 읽어오는 결과를 볼 수 있었습니다.
CustomException 메시지 설정
실무에서 스프링 메시지 소스 설정을 가장 많이 사용되는 경우는 오류 처리시 message를 반환해주는 경우입니다.
해당 내용은 추후에 상세하게 다뤄보기로 하겠습니다.
'Spring' 카테고리의 다른 글
[Spring] @Transactional 없이 트랜잭션을 보장 받는 방법 - AOP 활용 (4) | 2024.01.03 |
---|---|
[Spring]@Transactional 격리 수준(Isolation Level) 동시성에 대하여 (0) | 2023.09.06 |
[Springframework]JavaMailSender text/html로 안보내질때 해결 방법 (0) | 2023.08.30 |