100일 챌린지/빅데이터기반 인공지능 융합 서비스 개발자

Day 72 - Annotation을 사용해서 CRUD 프로젝트 만들기

ksyke 2024. 11. 11. 17:29

https://www.thymeleaf.org/doc/tutorials/3.1/usingthymeleaf.html#standard-expression-syntax

 

Tutorial: Using Thymeleaf

1 Introducing Thymeleaf 1.1 What is Thymeleaf? Thymeleaf is a modern server-side Java template engine for both web and standalone environments, capable of processing HTML, XML, JavaScript, CSS and even plain text. The main goal of Thymeleaf is to provide a

www.thymeleaf.org

 

+ thymeleaf

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

application.properties

spring.application.name=sts08anno

spring.h2.console.path=/h2
spring.h2.console.enabled=true

ProjectApplication

@SpringBootApplication
public class Sts08annoApplication implements CommandLineRunner{
	@Autowired
	DataSource dataSource;

	public static void main(String[] args) {
		SpringApplication.run(Sts08annoApplication.class, args);
	}

	@Override
	public void run(String... args) throws Exception {
		try(
				Connection conn=dataSource.getConnection();
				Statement stmt=conn.createStatement();
				){
			stmt.execute("create table dept(deptno int primary key,dname varchar(10),loc varchar(10))");
			stmt.executeUpdate("Insert into dept(deptno,dname,loc) values (1,'%s','%s')".formatted("test1","test2"));
			stmt.executeUpdate("Insert into dept(deptno,dname,loc) values (2,'%s','%s')".formatted("test2","test3"));
			stmt.executeUpdate("Insert into dept(deptno,dname,loc) values (3,'%s','%s')".formatted("test3","test4"));
			stmt.executeUpdate("Insert into dept(deptno,dname,loc) values (4,'%s','%s')".formatted("test4","test5"));
			stmt.executeUpdate("Insert into dept(deptno,dname,loc) values (5,'%s','%s')".formatted("test5","test6"));
		}
	}
}

DeptDao(Impl)

package com.gimhae.sts08.model;

@Mapper
public interface DeptDao {

	@Select("Select * from dept order by deptno")
	List<DeptVo> selectAll();

	@Insert("Insert into dept (deptno,dname,loc) values (#{deptno},#{dname},#{loc})")
	void insertOne(DeptVo bean);

	@Select("Select * from dept where deptno=#{deptno}")
	DeptVo selectOne(int deptno);


}

DaptVo

package com.gimhae.sts08.model;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DeptVo {
	
	int deptno;
	String dname,loc;
}

DeptService

package com.gimhae.sts08.service;

@Service
@RequiredArgsConstructor
public class DeptService {
	final DeptDao deptDao;
	
	public List<DeptVo> getList(){
		return deptDao.selectAll();
	}

	public void add(DeptVo bean) {
		deptDao.insertOne(bean);
		
	}

	public DeptVo getOne(int deptno) {
		return deptDao.selectOne(deptno);
	}
}

DeptController

package com.gimhae.sts08.controller;

@Controller
@RequestMapping("/dept")
@RequiredArgsConstructor
public class DeptController {
	final DeptService deptService;

	@GetMapping("/")
	public String list(Model model) {
		model.addAttribute("alist", deptService.getList());
		return "list";
	}
	
	@PostMapping("/")
	public String add(@ModelAttribute DeptVo bean) {
		deptService.add(bean);
		return "redirect:./";
	}
	
	@GetMapping("/{deptno}")
	public String detail(@PathVariable int deptno,Model model) {
		model.addAttribute("bean", deptService.getOne(deptno));
		return "detail";
	}
}

htmls

static>index.html

<!DOCCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>lists</title>
	<link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css"
</head>
<body>
	<div>
		<a href="/">home</a>
		<a href="/intro">intro</a>
		<a href="/dept/">dept</a>
		<a href="/login/">login</a>
	</div>
	<div class="jumbotron">
		<h1>hello</h1>		
	</div>
</body>
</html>

static>dept>add.html

<!DOCCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>lists</title>
	<link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css"
</head>
<body>
	<div>
		<a href="/">home</a>
		<a href="/intro">intro</a>
		<a href="/dept/">dept</a>
		<a href="/login/">login</a>
	</div>
	<h2 class="page-header">입력 페이지</h2>
	<div class="container">
		<form action="/dept/" method="post">
			<div class="form-group">
				<input name="deptno" placeholder="DEPTNO" class="form-control"/>
			</div>
			<div class="form-group">
				<input name="dname" placeholder="DNAME" class="form-control"/>
			</div class="form-group">
			<div class="form-group">
				<input name="loc" placeholder="LOC" class="form-control"/>
			</div class="form-group">
			<div class="form-group">
				<button class="btn btn-primary btn-block">입력</button>
			</div class="form-group">
		</form>
	</div>
</body>
</html>

templates>list.html

<!DOCCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>lists</title>
	<link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css"
</head>
<body>
	<div>
		<a href="/">home</a>
		<a href="/intro">intro</a>
		<a href="/dept/">homdepte</a>
		<a href="/login/">login</a>
	</div>
	<h2 class="page-header">Dept List</h2>
	<div class="container">
	<table class="table">
		<thead>
		  <tr>
		    <th>DeptNo</th>
		    <th>Dname</th>
		    <th>Loc</th>
		  </tr>
		</thead>
		<tbody>
		  <tr th:each="bean: ${alist}">
		    <td><a href="detail.html" th:href="@{/dept/}+${bean.deptno}" th:text="${bean.dname}"></a></td>
		    <td><a href="detail.html" th:href="@{/dept/}+${bean.deptno}" th:text="${bean.dname}"></a></td>
		    <td><a href="detail.html" th:href="@{/dept/}+${bean.deptno}" th:text="${bean.loc}"></a></td>
		  </tr>
		</tbody>
	</table>	
	<a href="/dept/add.html" class="btn btn-primary btn-block">입력</a>
	</div>
</body>
</html>

template>detail.html

<!DOCCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>lists</title>
	<link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css"
</head>
<body>
	<div>
		<a href="/">home</a>
		<a href="/intro">intro</a>
		<a href="/dept/">dept</a>
		<a href="/login/">login</a>
	</div>
	<h2 class="page-header">상세 페이지</h2>
	<div class="container">
	<form action="/dept/${bean.deptno}">
		<div class="form-group">
			<input name="deptno" th:value="${bean.deptno}" class="form-control"/>
		</div>
		<div class="form-group">
			<input name="dname" th:value="${bean.dname}" class="form-control"/>
		</div class="form-group">
		<div class="form-group">
			<input name="loc" th:value="${bean.loc}" class="form-control"/>
		</div class="form-group">
		<div class="form-group">
			<button class="btn btn-primary btn-block">수정</button>
		</div class="form-group">
	</form>
	</div>
</body>
</html>

template>update.html