일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 타임리프 문법
- 임베디드 타입
- 실무활용
- 검증 애노테이션
- JPA 활용2
- Bean Validation
- 일론머스크
- 컬렉션 조회 최적화
- 페이징
- 김영한
- 스프링
- 벌크 연산
- 타임리프
- JPA 활용 2
- JPA
- API 개발 고급
- 트위터
- 스프링MVC
- Spring Data JPA
- jpa 활용
- 로그인
- QueryDSL
- 예제 도메인 모델
- JPQL
- 프로젝트 환경설정
- 값 타입 컬렉션
- 스프링 mvc
- 기본문법
- 불변 객체
- 스프링 데이터 JPA
- Today
- Total
RE-Heat 개발자 일지
스프링 MVC 2편 - [3] 메시지·국제화 본문
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard
인프런 김영한 님의 스프링 MVC 2편 강의를 토대로 정리한 내용입니다.
[1] 메시지, 국제화 소개
■ 메시지
화면문구를 상품명에서 상품이름으로 바꿔야 할 때 모든 HTML을 일일이 고치면 상당히 번거로운 일이 될 것이다. 그래서 스프링에선 이런 다양한 메시지를 한 곳에서 관리하는 기능을 제공하고 이를 메시지 기능이라 한다.
예를 들어 messages.properties라는 관리용 파일을 만들고 각 HTML에서 해당 데이터를 key 값으로 불러서 사용하는 방법이 있다.
▶ messages.properties
item.itemName=상품명
▶ addFrom.html
<lable for="itemname" th:text="#{item.itemName}"></label>
■ 국제화
message.properties를 각 나라별로 별도로 관리하면 서비스를 국제화할 수 있다. 영어판, 한국판을 따로 제공할 수 있다는 뜻이다.
▶messages_en.properties
item=Item
item.id=Item ID
item.itemName=Item Name
item.price=price
item.quantity=quantity
HTTP accept-language 헤더값이나 사용자가 직접 언어를 선택하도록 하고, 영어를 사용하는 사람이면 message_en.properties를 한국은 message.properties를 사용하게 개발하면 된다.
[2] 스프링 메시지 소스 설정
메시지 관리 기능을 사용하는 방법은 두 가지가 있다.
① 스프링이 제공하는 MessageSource를 스프링 빈으로 등록하기
② 스프링부트가 MessageSource를 자동으로 스프링 빈으로 등록하도록 설정하기
1] 직접 MessageSource를 등록하기
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
- basenames는 설정 파일의 이름을 지정.
messages로 지정하면 message.properties 파일을 읽어서 사용한다.
국제화 기능을 사용하려면 파일명 마지막에 언어 정보(messages_en.properties)를 주면 된다.
파일의 위치는 /resources/messages.properties에 둬야 한다.
여러 파일을 한 번에 지정할 수 있다. 위 코드를 보면 messages, errors 둘을 지정한 것을 볼 수 있다.
- defaultEncoding : 인코딩 정보를 사용한다. 여기선 한글이 깨지지 않도록 utf-8을 사용한다.
2] 스프링 부트 설정
스프링 부트 메시지 소스의 기본값으로 MessageSource를 스프링 빈으로 등록하지 않고, 별도 설정을 하지 않으면 messages라는 이름으로 기본 등록된다. 따라서 message_en.properties, messages_ko.properties, messages.properties 파일만 등록하면 자동으로 인식된다.
참고] application.properties의 추가설정을 알고 싶으면 아래 스프링 부트 공식 문서를 확인하면 된다.
[3] 스프링 메시지 소스 사용
MessageSource 인터페이스
MessageSource 인터페이스를 확인하면 일부 파라미터로 메시지를 읽어오는 기능을 제공하는 것을 확인할 수 있다.
MessageSourceTest
메시지 코드로 hello로 입력하고 나머지 값은 null값을 넣었다. locale 정보가 없는 것을 확인할 수 있는데, 이러면 스프링은 basename에서 설정한 기본 이름 메시지 파일(messages.properties)을 조회한다.
▶ 메시지가 없을 때
메시지가 없을 땐 NoSuchMessageException이 발생한다.
▶ 기본 메시지
메시지가 없을 때를 대비해 defaultMessage를 던져주면 notFoundEmssageCodeDefualtMessage에서 "기본 메시지"를 반환한다.
▶ 매개변수 사용
messages.properties
messages.properties의 {0} 부분을 매개변수(new Object[]{"Spring"})를 전달해 치환할 수 있다.
▶ 국제화 파일 선택
① defaultLang()
1] locale 정보가 없으므로 Locale.getDefault()를 호출해 시스템 기본 로케일을 사용한다.
ex) locale=null → 시스템 기본 locale이 ko_KR이므로 message_ko.properties 조회 → 조회 실패
→ messages.properties 조회
2] locale 정보(Locale.KOREA)가 있지만, message_ko가 없으므로 messages 조회
② enLang()
1] locale 정보가 Locale.ENGLISH이므로 messages_en을 찾아서 사용한다.
[4] 웹 애플리케이션에 메시지 적용하기
messages & messages_en.properties
HTML에 공통적으로 들어갈 메시지를 등록하고 한글판, 영어판으로 나눈다.
■ 타임리프 메시지 적용
타임리프 메시지 표현식 #{...}을 사용해 스프링 메시지를 편리하게 조회한다.
ex) 렌더링 전] <div th:text="#{label.item}"></div>
렌더링 후] <div>상품</div>
th:text="#{page.addItem}"으로 메시지를 불러오니 상품 등록 폼이 message.properties의 page.addItem값인 상품 등록으로 변환된 것을 확인할 수 있다.
이러한 방식으로 addForm.html, editForm.html, item.html, items.html에 적용하면 된다.
■ 파라미터 적용하는 방법
hello.name=안녕 {0}
<p th:text="#{hello.name(${item.itemName})}"></p>
위와 같은 방식으로 사용할 수 있다.
[5] 웹 애플리케이션에 국제화 적용하기
messages_en.properties 추가하면 #{...}를 통해서 알아서 국체화가 적용된다.
브라우저 설정에서 언어를 검색하고 우선순위를 영어로 변경
① 이러면 HTTP 메시지 헤더의 Accept-Language에서 en-Us의 우선순위가 올라가며 아래와 같은 화면을 확인할 수 있다.
② 스프링은 언어 선택 시 기본으로 Accept-Language 헤더의 값을 사용한다.
■ LocaleResolver
사실 사용자가 브라우저의 설정을 일일이 건드릴 일은 잘 없다. 그래서 스프링은 사용자가 자신이 원하는 언어를 직접 선택할 수 있도록 LocaleResolver라는 인터페이스를 제공한다.
스프링부트는 Accept-Language를 활용하는 AcceptheaderLocaleResolver를 사용한다.
'백엔드 > 스프링' 카테고리의 다른 글
스프링 MVC 2편 - [4] 검증 1 - Validation(하편) (1) | 2023.07.16 |
---|---|
스프링 MVC 2편 - [4] 검증 1 - Validation(상편) (0) | 2023.07.14 |
스프링 MVC 2편 - [2] 스프링 통합과 폼 (0) | 2023.07.12 |
스프링 MVC 2편 - [1] 타임리프 - 기본기능(하편) (0) | 2023.07.09 |
스프링 MVC 2편 - [1] 타임리프 - 기본기능(상편) (0) | 2023.07.08 |