김영한의 스프링 MVC 2편 - 메세지, 국제화

2025. 2. 26. 22:39·김영한의 스프링 MVC 2편

Question

  • 스프링 부트의 기본 메시지 관리 파일이름은?
  • 스프링 부트의 기본 국제화 메시지 관리 파일 이름은?
  • 스프링 부트의 메시지 관리 파일의 기본 위치는?

 

국제화

  • 여러 언어를 지원해야 하는 경우 메세지들을 언어에 따라 별도의 파일로 관리
  • 어떤 언어를 사용하는지 HTTP accept-language 헤더 값 등을 기반으로 판단해 언어맞는 메시지 전달

 

스프링의 MessageSource

@Bean
public MessageSource messageSource() {
	ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
 	messageSource.setBasenames("messages", "errors");
 	messageSource.setDefaultEncoding("utf-8");
 	return messageSource;
}
  • 스프링이 제공하는 메시지 관리 기능은 MessageSource
  • MessageSource를 bean으로 등록해서 사용해야 함
  • Basename을 "messages"로 지정하면 messages.properties 파일을 읽어서 사용함
  • 추가로 국제화 기능을 적용하려면 messages_en.properties, messages_ko.peroperties와 같이 사용하면 됨
  • 만약, 국제화 파일이 없다면 messages.properties를 기본으로 사용함
  • 파일의 위치는 /resources/messages.properties에 두면 됨
  • 파일명 "messages"에 뒤에 s를 조심해야 함
  • 여러 파일을 한 번에 지정할 수 있으며 이 케이스에서는 "messages", "errors" 두 개를 지정 했음

 

스프링 부트의 MessageSource

application.properties
spring.messages.basename=messages,config.i18n.messages
  • 스프링 부트에서는 application.properteis에 위와 같이 등록 가능
  • 스프링 부트에서는 MessageSource를 스프링 빈으로 등록하지 않아도 Basename을 messages라고 기본 등록해줌
  • 따라서 messages_en.properteis, messages_ko.properties 등은 자동 인식됨

 

 

스프링 메시지 소스 사용

@SpringBootTest
public class MessageSourceTest {

    @Autowired
    MessageSource ms;
    
    @Test
    void helloMessage() {
        String result = ms.getMessage("hello", null, null);
        assertThat(result).isEqualTo("안녕");
    }
}


public interface MessageSource {
    String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);
    String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;
}
  • MessageSource 빈을 주입받아 사용
  • 메시지를 조회해서 나오지 않으면 defaultMessage를 적용할 수 있음
  • locale을 넣지 않으면 국제화 파일이 아닌 기본 메시지 파일인 messages.properties를 조회

 

 

스프링의 국제화 메시지 선택

  • 스프링은 언어 선택시 기본으로 Accept-Language 헤더의 값을 사용함
  • 스프링은 Local 선택 방식을 변경할 수 있도록 LocalResolver 라는 인터페이스르 제공하며, 스프링 부트는 기본으로 Accept-Language를 활용하는 AcceptHeaderLocaleResolver를 사용
  • 원한다면 LocaleResolver 구현체를 별도로 만들어 원하는대로 사용 가능

'김영한의 스프링 MVC 2편' 카테고리의 다른 글

김영한의 스프링 MVC 2편 -  (0) 2025.02.28
김영한의 스프링 MVC 2편 - 필터, 인터셉터  (0) 2025.02.26
'김영한의 스프링 MVC 2편' 카테고리의 다른 글
  • 김영한의 스프링 MVC 2편 -
  • 김영한의 스프링 MVC 2편 - 필터, 인터셉터
5jyan5
5jyan5
  • 5jyan5
    jyan
    5jyan5
  • 전체
    오늘
    어제
    • 분류 전체보기 (242)
      • 김영한의 스프링 핵심 원리(기본편) (8)
      • 김영한의 스프링 핵심 원리 - 고급편 (11)
      • 김영한의 스프링 MVC 1편 (1)
      • 김영한의 스프링 DB 1편 (3)
      • 김영한의 스프링 MVC 2편 (3)
      • 김영한의 ORM 표준 JPA 프로그래밍(기본편) (9)
      • 김영한의 스프링 부트와 JPA 활용2 (2)
      • 김영한의 실전 자바 - 중급 1편 (1)
      • 김영한의 실전 자바 - 고급 1편 (9)
      • 김영한의 실전 자바 - 고급 2편 (9)
      • Readable Code: 읽기 좋은 코드를 작성.. (2)
      • 김영한의 실전 자바 - 고급 3편 (9)
      • CKA (118)
      • 개발 (37)
      • 경제 (4)
      • 리뷰 (1)
      • 정보 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      조회 성능 최적화
      JPQL
      reentarantlock
      락
      @discriminatorcolumn
      jpq
      고급
      페치 조인
      자바
      gesingleresult
      스레드
      Thread
      Target
      빈 후처리기
      requset scope
      양방향 맵핑
      @within
      log trace
      @args
      @discriminatorvalue
      typequery
      hibernate5module
      김영한
      버퍼
      프록시 팩토리
      WAS
      cglib
      단방향 맵핑
      프록시
      jdk 동적 프록시
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    5jyan5
    김영한의 스프링 MVC 2편 - 메세지, 국제화
    상단으로

    티스토리툴바