김영한 강사님의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 듣고 정리한 내용입니다. 자세한 내용은 강의를 참고해주세요
이전 프로젝트에서 열심히 html파일을 이용해 추가,수정,상품상세,상품목록 등등 간단한 웹 어플리케이션을 만들었다...
그런데 기획자님이
상품명이라는 단어를 모두상품이름으로 고쳐달라고 하면...?
메시지 기능을 이용해서 다양한 메시지들을 한 곳에서 관리한다!그렇다면 국제화는 뭘까?
MessageSource 를 스프링 빈으로 등록하여야 한다@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = newResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
beanNames:설정 파일의 이름을 지정한다messages.properties 파일을 읽어서 사용한다.messages_en.properties , messages_ko.properties 와 같messages.properties (언어정보가 없는 파일명)를 기본으로 사용한다.defaultEncoding : 인코딩 정보를 지정한다. utf-8 을 사용하면 된다그렇지만 스프링 부트에서는
MessgeSource를 자동으로 스프링 빈으로 등록해준다!!!
1. 스프링 부트를 실행하면 MessageSource를 스프링 빈으로 등록해준다
2. application.properties에spring.messages.basename=messages가 default로 지정되어있다
3. 스프링 부트가 의존성 주입을 통해, defalut로 지정된 message에 스프링 빈을의존성 주입해준다!
4. 그러면 의존성 주입이 되었으므로, 메시지 기능을 이용하면
/resources/아래 경로의properties파일들에 메시지 기능이 적용이된다!!!!
이렇게 /resources/아래에 저장된 메시지 기능에서 국제화까지 같이 일어난다!
뭔말이냐면... 저 경로에
messages.properties :기본 값으로 사용(한글)messages_en.properties : 영어 국제화 사용Locale의 우선순위에 따라서 어떤 언어 메시지 파일을 이용할지 정하게 된다ms.getMessage("hello", null, Locale.KOREA) 이렇게 보내오면... message_ko를 찾는다message.properties 파일의 메시지를 사용한다!ms.getMessage("hello", null, Locale.ENGLISH) 이렇게 오면 Locale의 정보가 Locale.English이므로 messages_en을 찾아서 사용한다!messages.properties 파일에 요렇게 적용해보자!
label.item=상품
label.item.id=상품 ID
label.item.itemName=상품명
label.item.price=가격
label.item.quantity=수량
page.items=상품 목록
page.item=상품 상세
page.addItem=상품 등록
page.updateItem=상품 수정
button.save=저장
button.cancel=취소
"#{}"안에 변수 넣어줬었던 것처럼 넣어주면 된다<div th:text="#{label.item}"></h2>
<div>상품</h2>
우리가 properties에 등록한것 처럼!!!
<h2 th:text="#{page.addItem}">상품 등록</h2>
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<link th:href="@{/css/bootstrap.min.css}"
href="../css/bootstrap.min.css" rel="stylesheet">
<style>
.container {
max-width: 560px;
}
</style>
</head>
<body>
<div class="container">
<div class="py-5 text-center">
<h2 th:text="#{page.addItem}">상품 등록 폼</h2>
</div>
<form action="item.html" th:action th:object="${item}" method="post">
<div>
<label for="itemName" th:text="#{label.item.itemName}">상품명</label>
<input type="text" id="itemName" th:field="*{itemName}" class="form-control" placeholder="이름을 입력하세요">
</div>
<div>
<label for="price" th:text="#{label.item.price}">가격</label>
<input type="text" id="price" th:field="*{price}" class="form-control" placeholder="가격을 입력하세요">
</div>
<div>
<label for="quantity" th:text="#{label.item.quantity}">수량</label>
<input type="text" id="quantity" th:field="*{quantity}" class="form-control" placeholder="수량을 입력하세요">
</div>
<hr class="my-4">
<div class="row">
<div class="col">
<button class="w-100 btn btn-primary btn-lg" type="submit" th:text="#{button.save}">저장</button>
</div>
<div class="col">
<button class="w-100 btn btn-secondary btn-lg"
onclick="location.href='items.html'"
th:onclick="|location.href='@{/message/items}'|"
type="button" th:text="#{button.cancel}">취소</button>
</div>
</div>
</form>
</div> <!-- /container -->
</body>
</html>
#{}으로 다 바꿔준다/resources/부분의 message.properties만 수정해준다면???이제 이렇게 문법 수정한 것을 addForm, editForm, item, items 의 html파일을 모두 수정해준다!!!
국제화는?
message_en.properties
label.item=Item
label.item.id=Item ID
label.item.itemName=Item Name
label.item.price=price
label.item.quantity=quantity
page.items=Item List
page.item=Item Detail
page.addItem=Item Add
page.updateItem=Item Update
button.save=Save
button.cancel=Cancel
/resources/ 경로에 국제화 파일을 만들어준다#{}값을 통해 메시지를 사용하도록 설정만 바꾸면 됨Accept-Language 부분만 변경되면 된다!!!
자주 올게요~