[스프링] 메시지, 국제화

2025. 9. 19. 15:48·스프링

악덕(?) 기획자가 갑자기 “상품명이라는 단어가 마음에 들지 않으니 전부 상품이름으로 고쳐라”라고 요구한다고 가정해보자.


이 경우 화면에 보이는 HTML 파일을 하나하나 열어 모두 수정해야 한다. 화면 수가 몇 개 안 되면 그럭저럭 할 수 있겠지만, 수십 개 이상이라면 일일이 찾아 바꾸는 일은 불편하고 버그의 원인이 되기 쉽다.

 

이러한 문제를 해결하기 위해 메시지와 국제화(i18n) 기능이 존재한다.
오늘은 이 기능을 어떻게 활용해 화면 문구를 효율적으로 관리할 수 있는지 살펴본다.

 

1. 메시지 관리란 무엇인가

메시지 관리는 화면에 표시되는 텍스트를 한 곳에서 정의하고, 필요할 때 불러서 사용하는 방식이다.
예를 들어 messages.properties 파일을 두고 다음과 같이 정의한다.

item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량

 

이제 HTML에서는 메시지 키를 불러와 사용한다.

<label for="itemName" th:text="#{item.itemName}"></label>

이 방식을 적용하면 문구를 수정할 때 HTML 파일을 고칠 필요가 없다. 메시지 파일만 변경하면 전체 화면에 반영된다.

 

2. 국제화(i18n) 확장

메시지를 언어별로 분리하면 자연스럽게 다국어(국제화) 지원이 가능하다.
즉, 같은 화면이라도 사용자의 언어 설정에 따라 다른 문구를 보여줄 수 있다.

 

예를 들어 다음과 같이 두 개의 메시지 파일을 만든다고 해보자

 

messages_en.properties 

item=Item
item.id=Item ID
item.itemName=Item Name
item.price=Price
item.quantity=Quantity

 

messages_ko.properties

item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
  • 영어권 사용자가 접속하면 messages_en.properties 파일이 적용되어 Item, Price 같은 문구가 보인다.
  • 한국어 사용자가 접속하면 messages_ko.properties 파일이 적용되어 상품, 가격 같은 문구가 보인다.

 

이렇게 어떤 언어 파일을 선택할지는 크게 두 가지 방식으로 결정할 수 있다.

  1. HTTP 요청 헤더의 Accept-Language 값 활용
    → 브라우저나 OS에서 설정된 언어를 읽어 자동으로 적용한다.
  2. 사용자가 직접 언어를 선택하게 만들기
    → 예를 들어 화면에서 "English / 한국어" 버튼을 누르면 언어가 바뀌도록 하고, 선택값을 쿠키나 세션에 저장해 둔다.

즉, 한 번 화면을 만들면 메시지 파일만 다르게 준비해서 전 세계 사용자에게 맞는 언어를 보여줄 수 있다는 장점이 있다.

 

3. 타임리프와 메시지 표현식

타임리프는 스프링의 메시지 기능과 통합되어 있어, 특별한 설정 없이도 메시지를 바로 불러 쓸 수 있다.
방법은 #{...} 문법을 사용하는 것이다.

예시:

<div th:text="#{item}"></div>

 

이 한 줄만 작성하면 실행 환경에 따라 자동으로 언어가 바뀐다.

 

한국어 환경일 때:

<div>상품</div>

 

영어 환경일 때:

<div>Item</div>

 

즉, 개발자는 오직 메시지 키(item)만 쓰면 되고, 실제 표시되는 값은 메시지 파일과 사용자의 언어 설정에 따라 자동으로 선택된다.

 

 

마무리하며:

오늘은 메시지와 국제화(i18n) 기능에 대해 알아보았다.


이 기능은 화면 문구를 하드코딩했을 때 생기는 유지보수 문제를 해결해주고, 언어별 메시지 파일을 통해 다국어 서비스까지 손쉽게 지원할 수 있도록 도와준다.

 

특히 타임리프의 #{...} 표현식을 사용하면 개발자가 직접 히든 처리나 언어 분기를 신경 쓸 필요 없이, 메시지 파일만 관리하면 된다.
덕분에 화면에 보이는 문구를 한 곳에서 통합적으로 관리할 수 있고, 기획자의 요청이나 해외 서비스 확장 같은 상황에도 빠르고 유연하게 대응할 수 있다.

 

결국 메시지와 국제화 기능은 유지보수성과 확장성을 동시에 확보할 수 있는 중요한 도구라고 할 수 있다.

 

 

감사합니다.

'스프링' 카테고리의 다른 글

[스프링] 로그인 처리 1- 쿠키, 세션  (0) 2025.09.28
[스프링] Validation에 대하여  (0) 2025.09.27
[스프링] 스프링 MVC - 기본기능 (마지막) HTTP 요청 메시지: text와 JSON  (1) 2025.09.03
[스프링] 스프링 MVC - 기본기능 (2) 요청 파라미터  (0) 2025.09.03
[스프링] 스프링 MVC - 기본기능 (1) 로깅  (0) 2025.09.03
'스프링' 카테고리의 다른 글
  • [스프링] 로그인 처리 1- 쿠키, 세션
  • [스프링] Validation에 대하여
  • [스프링] 스프링 MVC - 기본기능 (마지막) HTTP 요청 메시지: text와 JSON
  • [스프링] 스프링 MVC - 기본기능 (2) 요청 파라미터
0kingki_
0kingki_
자바 + 스프링 웹 개발
  • 0kingki_
    0kingki_
    0kingki_
  • 전체
    오늘
    어제
    • 분류 전체보기 (134)
      • 코딩 테스트 (54)
      • 자바 (21)
      • 스프링 (27)
      • 타임리프 (16)
      • 스프링 데이터 JPA (8)
      • 최적화 (2)
      • QueryDSL (4)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    재귀
    스프링 데이터 JPA
    다형성
    BFS
    Java
    스프링 컨테이너
    dfs
    객체지향
    컬렉션
    최적화
    스프링
    QueryDSL
    백준
    LocalDateTime
    코딩 테스트
    예외처리
    쿼리
    mvc
    fetch join
    코딩테스트
    쿼리dsl
    thymeleaf
    타임리프
    자바
    JPA
    spring
    SpringDataJpa
    불변객체
    예외 처리
    SOLID
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
0kingki_
[스프링] 메시지, 국제화
상단으로

티스토리툴바