목차
- [Create] Controller에 Thymeleaf Form 데이터 전송하기
- [Read] table에서 th:each를 이용하여 반복문 사용하기
- [Update] Get, Post를 모두 사용하여 학생 정보 업데이트하기
- [Delete] 목록에서 Ajax를 이용하여 학생 정보 삭제하기
이번 글에서는 실습을 통해 앞에서 정리한 타임리프 사용법을 익혀보려고 한다.
Student 객체를 생성하고 Spring Controller와 Tymeleaf를 이용하여 학생 정보를 CRUD 하는 간단한 예제를 실습해 볼 예정이다.
Spring Boot와 Thymeleaf 사용법 익히기
- Create : form과 th:field를 이용하여 Controller에 데이터 전송하기
- Read : table과 th:each를 이용하여 List 읽기
- Update : Get, Post 방식으로 데이터 전송하기
- Delete : Ajax를 이용한 학생 정보 삭제 - th:each 내부의 특정 id 전달하기
디렉토리 구조
1. [Create] Controller에 Thymeleaf Form 데이터 전송하기
form에서 학생 정보 Student(“21000004”, “Lauv”, 26, “1994-08-08”)를 입력 후 컨트롤러에서 학생 목록 페이지로 리다이렉트 시켜보았다.
1) Controller - 입력 화면(insertStudentInfo
)으로 이동
// StudentController.java
@RequestMapping("/insertStudentInfo")
ModelAndView insertStudntInfo() {
// templates 폴더 아래 html 경로 입력(확장자 생략)
ModelAndView mav = new ModelAndView("student/insertStudentInfo");
mav.addObject("student", new Student());
return mav;
}
2) 입력 - student/insertStudent.html
입력 후 Controller에서 /student/selectAllStudentInfo
로 리다이렉트
<!-- insertStudentInfo.html -->
<!DOCTYPE html>
<html>
<head>
<title>insertStudentInfo</title>
<style>
span {
display: inline-block;
width: 50px;
margin-top: 15px;
margin-left: 10px;
font-weight: bold;
}
</style>
</head>
<body>
<form action="insertStudentInfoForm" , method="post">
<span>ID</span>
<input type="text" th:field="${student.id}" /> <br />
<span>Name</span>
<input type="text" th:field="${student.name}" /> <br />
<span>Age</span>
<input type="text" th:field="${student.age}" /> <br />
<span>Birth</span>
<input type="date" th:field="${student.birth}" /> <br />
<input type="submit" />
</form>
</body>
</html>
개발자 도구를 이용하여 코드를 살펴보면 th:field
가 id와 name을 자동으로 생성해주는 것을 확인해볼 수 있다 :)
3) Controller - insertStudentForm
결과 - selectAllStudentInfo 리다이렉트
// StudentController.java
@PostMapping("/insertStudentInfoForm")
ModelAndView insertStudentInfoRedirect(@ModelAttribute("student") Student student) {
// 학생 목록 화면으로 리다이렉트
ModelAndView mav = new ModelAndView("redirect:/student/selectAllStudentInfo");
log.info(student.toString());
studentSerivce.insertStudent(student); // DB - Student 테이블에 입력
return mav;
}
2. [Read] table에서 th:each 반복문 사용하기]
thymleaf에서는 th:each
를 사용해서 List, Map 등을 반복 접근할 수 있다.
th:each
를 이용한 객체 접근과 ~~stat
를 이용하여 index, count 접근 방법들을 살펴보려고 한다.
Controller에서 List<Student>
를 넘기고, 타임리프에서 모든 Student 정보를 출력하는 예제를 진행해보았다.
1) StudentController.java
package com.example.spring.controller;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import com.example.spring.model.Student;
import com.example.spring.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Slf4j
@Controller
@RequestMapping("student")
public class StudentController {
@Autowired
StudentService studentSerivce;
@RequestMapping("/selectAllStudentInfo")
ModelAndView selectAllStudentInfo() {
ModelAndView mav = new ModelAndView("student/selectAllStudentInfo");
List<Student> studentList = studentSerivce.selectStudentList();
mav.addObject("title", "selectStudentInfo()");
// 여기서 지정한 이름(studentList)를 이용하여 타임리프에서 데이터에 접근할 수 있다.
mav.addObject("studentList", studentList);
return mav;
}
}
2) student/selectAllStudentInfo.html
<!DOCTYPE html>
<html>
<head>
<title>Student List</title>
</head>
<body>
<div>
<table id="studentTable">
<tr>
<th>순서</th>
<th>ID</th>
<th>Name</th>
<th>Age</th>
<th>Birth</th>
</tr>
<!-- th: each를 이용하면 반복문을 이용할 수 있다. -->
<!-- th:each="student, studentStat: ${studentList}" 와 동일하며
status를 명시하지 않더라도 앞의 "오브젝트명stat" 를 이용하여 접근 가능하다. -->
<tr th:each="student: ${studentList}">
<td th:text="${studentStat.index+1}"></td>
<td th:text="${student.id}"></td>
<td th:text="${student.name}"></td>
<td th:text="${student.age}"></td>
<td th:text="${student.birth}"></td>
</tr>
</table>
</div>
</body>
</html>
결과 화면
3. [Update] Get, Post를 모두 사용하여 학생 정보 업데이트하기
4. [Delete] 목록에서 Ajax를 이용하여 학생 정보 삭제하기
<a href="https://hits.seeyoufarm.com"><img src="https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https://sujinhope.github.io/2021/03/27/Thymeleaf-3.-Spring-Boot-+-Thymeleaf-CRUD-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0.html%2F&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=views&edge_flat=false"/></a>