Written by
Sunwoo Han
on
on
타임리프 - 스프링 통합과 폼
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 공부하고 정리하는 포스트입니다.
타임리프 스프링 통합
- 타임리프는 크게 2가지 메뉴얼을 제공.
- 기본 메뉴얼: https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html
- 스프링 통합 메뉴얼: https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html
- 타임리프는 스프링 없이도 동작하지만, 스프링과 통합을 위한 다양한 기능을 편리하게 제공
-> 스프링으로 백엔드를 개발하는 개발자 입장에서 타임리프를 선택하는 하나의 이유
스프링 통합으로 추가되는 기능들
- 스프링의 SpringEL 문법 통합
${@myBean.doSomething()}
처럼 스프링 빈 호출 지원- 편리한 폼 관리를 위한 추가 속성
th:object
(기능 강화, 폼 커맨드 객체 선택)th:field
,th:errors
,th:errorclass
- 폼 컴포넌트 기능
- checkbox, radio button, List 등을 편리하게 사용할 수 있는 기능 지원
- 스프링의 메시지, 국제화 기능의 편리한 통합
- 스프링의 검증, 오류 처리 통합
- 스프링의 변환 서비스 통합(ConversionService)
설정 방법
- 타임리프 템플릿 엔진을 스프링 빈에 등록 -> 타임리프용 뷰 리졸버를 스프링 빈으로 등록
- https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html#the-springstandarddialect
- https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html#views-and-viewresolvers
build.gradle
에implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
을 넣어주면
-> Gradle은 타임리프와 관련된 라이브러리를 다운로드 받고, 스프링 부트는 앞서 설명한 타임리프와 관련된 설정용 스프링 빈을 자동으로 등록
입력 폼 처리
th:object
: 커맨드 객체를 지정*{...}
: 선택 변수 식.th:object
에서 선택한 객체에 접근th:field
- HTML 태그의
id
,name
,value
속성을 자동으로 처리 id
:th:field
에서 지정한 변수 이름과 동일name
:th:field
에서 지정한 변수 이름과 동일value
:th:field
에서 지정한 변수의 값을 사용
- HTML 태그의
요구사항 추가
- 판매 여부
- 판매 오픈 여부
- 체크 박스
- 등록 지역
- 서울, 부산, 제주
- 체크 박스로 다중 선택
- 상품 종류
- 도서, 식품, 기타
- 라디오 버튼으로 하나만 선택
- 배송 방식
- 빠른 배송
- 일반 배송
- 느린 배송
- 셀렉트 박스로 하나만 선택
체크박스
- 체크 박스를 체크하면
HTML Form
에서open=on
이라는 값이 넘어감 -> 스프링은on
이라는 문자를true
타입으로 변환 - 체크 박스를 선택하지 않고 전송하면
open
이라는 필드 자체가 서버로 전송되지 않음- 히든 필드를 하나 만들어서,
_open
처럼 기존 체크 박스 이름 앞에 언더 스코어(_
)를 붙여서 전송하면 체크를 해제했다고 인식 <input type="hidden" name="_open" value="on"/>
- 히든 필드는 항상 전송
- 체크를 해제한 경우
open
은 전송되지 않고,_open
만 전송되는데, 이 경우 스프링 MVC는 체크를 해제했다고 판단
- 히든 필드를 하나 만들어서,
- 타임리프에서 폼 기능을 제공 -> 히든 필드를 추가하지 않아도 됨
<input type="checkbox" id="open" th:field="*{open}" class="form-check-input">
th:field="*{open}"
를 사용
th:field
를 사용하면, 값이 true인 경우 체크를 자동으로 처리 -> 체크가 안된 상태를 원하면disabled
를 사용하면 됨
체크박스 - 멀티
th:for="${#ids.prev('regions')}"
ids.prev(...)
,ids.next(...)
- 멀티 체크 박스가 생성될 때 서로 다른 id를 가지도록 임의의 숫자가 붙게 만듬
라디오 버튼
- 체크 박스는 수정 시 체크를 해제하면 아무 값도 넘어가지 않음 -> 별도의 히든 필드로 이런 문제를 해결.
-
라디오 버튼은 이미 선택이 되어 있다면, 수정 시에도 항상 하나를 선택하도록 되어 있음 -> 체크 박스와 달리 별도의 히든 필드를 사용할 필요가 없음.
<div th:each="type : ${T(hello.itemservice.domain.item.ItemType).values()}">
- 타임리프에서 ENUM에 직접 접근할 수 있음
- 스프링EL 문법으로 ENUM의
values()
를 호출하면 모든 정보가 배열로 반환됨
셀렉트 박스
<select th:field="*{deliveryCode}" class="form-select">
Comments
SPRING 의 다른 글
-
스프링 타입 컨터버 24 Jun 2022
-
API 예외 처리 17 Jun 2022
-
예외 처리와 오류 페이지 12 Jun 2022
-
로그인 처리 - 인터셉터 08 Jun 2022
-
로그인 처리 - 필터 06 Jun 2022
-
로그인 처리 - 쿠키, 세션 31 May 2022
-
Bean Validation 22 May 2022
-
검증 22 May 2022
-
메시지, 국제화 21 May 2022
-
타임리프 - 스프링 통합과 폼 19 May 2022
-
타임리프 - 기본 기능 10 May 2022
-
스프링 MVC 기본 기능 - 웹 페이지 만들기 02 May 2022
-
스프링 MVC 기본 기능 - HTTP 응답 30 Apr 2022
-
스프링 MVC 기본 기능 - HTTP 요청 24 Apr 2022
-
스프링 MVC 기본 기능 - 요청 매핑 19 Apr 2022
-
스프링 MVC 기본 기능 19 Apr 2022
-
스프링 MVC 구조 이해 14 Apr 2022
-
MVC 프레임워크 만들기 - V4, V5 12 Apr 2022
-
MVC 프레임워크 만들기 - V1, V2, V3 09 Apr 2022
-
서블릿, JSP, MVC 패턴 05 Apr 2022
-
서블릿 29 Mar 2022
-
웹 애플리케이션 이해 24 Mar 2022
-
스프링 웹 계층이란? 05 Nov 2021
-
스프링 시큐리티 공식문서 번역 27 Sep 2021
-
스프링 AOP 총정리 : 개념, 프록시 기반 AOP, @AOP 27 Apr 2021
-
SpEL (스프링 Expression Language) 25 Apr 2021
-
데이터 바인딩 추상화 : Converter와 Formatter 21 Apr 2021
-
데이터 바인딩 추상화 : PropertyEditor 12 Apr 2021
-
Validation 추상화 10 Apr 2021
-
Resource 추상화 08 Apr 2021
-
IoC 컨테이너 9부 07 Apr 2021
-
IoC 컨테이너 8부 06 Apr 2021
-
IoC 컨테이너 7부 02 Apr 2021
-
IoC 컨테이너 6부 29 Mar 2021
-
IoC 컨테이너 5부 27 Mar 2021
-
IoC 컨테이너 4부 23 Mar 2021
-
IoC 컨테이너 3부 20 Mar 2021
-
IoC 컨테이너 2부 18 Mar 2021
-
IoC 컨테이너 1부 12 Mar 2021
-
스프링 PSA 07 Jan 2021
-
스프링 @AOP 실습 07 Jan 2021
-
프록시 패턴 06 Jan 2021
-
스프링 AOP 04 Jan 2021
-
의존성 주입(Dependency Injection) 04 Jan 2021
-
스프링 빈(Bean) 02 Jan 2021
-
스프링 IoC 컨테이너 01 Jan 2021
-
스프링 IoC 01 Jan 2021