셀렉트박스
여러 가지 선택지 중 단 한가지를 선택하는 경우에 사용하는 HTML 기본 기능 태그이다.
전까지 작성했던 기능과 마찬가지로 이 셀렉트박스의 정보를 가져올 deliveryCodes() 를 생성하는데, 이 메서드에도 @ModelAttribute를 적용하여 해당 컨트롤러들이 호출될 때마다 실행시키도록 하자.
원래라면 공통으로 생성될 코드들은 묶어 한번만 실행시키는게 옳은 방법이다.
@ModelAttribute("deliveryCodes")
public List<DeliveryCode> deliveryCodes() {
List<DeliveryCode> deliveryCodes = new ArrayList<>();
deliveryCodes.add(new DeliveryCode("FAST", "빠른배송"));
deliveryCodes.add(new DeliveryCode("NORMAL", "일반배송"));
deliveryCodes.add(new DeliveryCode("SLOW", "느린배송"));
return deliveryCodes;
}
<!-- SELECT -->
<div>
<div>배송 방식</div>
<select th:field="*{deliveryCode}" class="form-select">
<option value="">==배송 방식 선택==</option>
<option th:each="deliveryCode : ${deliveryCodes}" th:value="${deliveryCode.code}"
th:text="${deliveryCode.displayName}">FAST</option>
</select>
</div>
HTML 태그의 셀렉션에서 option의 내용을 each문을 돌려 내용을 전부 표현한다. deliveryCodes()에서 받아온 객체들을 each문으로 표현한다.
메시지, 국제화 기능
메시지란?
화면의 문구가 마음에 들지 않을 때, "상품명" 이라는 항목들을 전부 "상품이름" 이라고 바꿔야 할 경우는 어떻게 해야할까? 여러 화면에 하드코딩 돼있는 "상품명" 이라는 문구들을 전부 고치기는 쉽지않다.
이런 메시지들을 한 곳에서 관리할 수 있게 해놓은 시스템이다. 예를들어, message.properties라는 메시지 관리용 파일을 만들어 key, value 값을 설정해두어 별도로 관리할 수 있다.
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
예를들어 message.properties 라는 파일에 이렇게 관리용 프로퍼티를 작성해둔 후에 <label for="itemName" th:text="#{item.itemName}"></label>같은 태그로 사용이 가능하다.
국제화란?
메시지에 더해서, 위에서 설명했던 메시지 파일들을 각 나라별로 관리할 수가 있다. 예를들어, message_kr.properties 관리용 파일과 message_en.properties 관리용 파일 두 개 이상을 만들어 HTTP accept-langyage 헤더 값으로 넘어오는 값들을 쿠키로 처리하여 나라별 보여지는 글자들을 변경할 수 있다.
스프링에서는 기본적으로 이런 메시지 관리 기능이 존재한다. MessageSource 라는 인터페이가 존재하는데, 이의 구현체인 ResourceBundleMessageSource 를 스프링빈으로 등록하면 사용할 수 있다.
스프링부트에서는 applications.properties에서 아래와 같은 텍스트를 입력하여 등록할 수 있다.
spring.messages.basename=messages
- ms.getMessage("hello",null,null)
이라는 코드가 존재할때 각각 역할은 아래와 같다.
- code : hello
- args : null
- local : null
local 정보가 없으면 위의 프로퍼티에서 지정한 basename 에서 설정한 기본 이름 메시지 파일을 조회하게 된다. 프로퍼티에서 설정한 basename의 값은 messages를 지정했기 때문에, message.properties에서 데이터를 조회한다.
local = null 일 경우 -> 시스템 기본 local이 ko_KR 이므로, messages_ko.preoperties 조회를 시도 -> 조회 실패 -> messages.preoperties 를 조회
웹 어플리케이션에 메시지 적용하기
hello=안녕
hello.name=안녕 {0}
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=취소
타임리프의 메시지 표현식인 #{...} 을 사용하면 스프링의 메시지 기능을 편리하게 조회가 가능하다. 등록한 상품이라는 이름을 렌더링 시키려면 #{label.item} 이라고 하면 알아서 변환된다.
참고로 파라미터 값은 다음과 같이 사용할 수 있다.
hello.name=안녕 {0} ⇒ th:text=”#{hello.name(${item.itemName})}”
'SpringBoot > Spring 김영한님' 카테고리의 다른 글
SpringBoot - BindingResult (0) | 2023.04.23 |
---|---|
김영한 Spring - 검증,Validation (1) | 2023.04.21 |
김영한 Spring - Thymeleaf (2) (0) | 2023.04.19 |
김영한 Spring - Thymeleaf (1) (0) | 2023.04.18 |
김영한 Spring MVC (7) - 메시지 컨버터, 정적 리소스, JSON (0) | 2023.04.10 |