MyBatis Plus ์๊ฐ
๊ธฐ๋ณธ CRUD, ์๋ ๋งคํ, ์ฟผ๋ฆฌ ๋น๋ ๋ฑ, SQL ์ฟผ๋ฆฌ ๋ฐ ์ค์ ์์ด๋ MyBatis ํ๋ ์์ํฌ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ MyBatis ํ์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ฃผ์ ๊ธฐ๋ฅ
โข
CRUD ์๋ ์์ฑ
โข
ํ์ด์ง ์ฒ๋ฆฌ
โข
์กฐ๊ฑด ๋น๋
์ฃผ์ ํน์ง
โข
CRUD ๋ฉ์๋ ์ ๊ณต
: BaseMapper๋ก ๊ธฐ๋ณธ์ ์ธ CRUD ๊ธฐ๋ฅ (selectById, insert, deleteById ๋ฑ) ์ง์.
โข
์กฐ๊ฑด ๋น๋ ์ง์
: QueryWrapper, LambdaQueryWrapper ๋ฑ์ผ๋ก ๋์ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ๋จํ ์์ฑ ๊ฐ๋ฅ.
โข
์ฝ๋ ์์ฑ๊ธฐ ์ ๊ณต
: ์ํฐํฐ, ๋งคํผ, XML, ์๋น์ค ๋ฑ์ ์๋ ์์ฑํ์ฌ ์ด๊ธฐ ๊ฐ๋ฐ ์๊ฐ ๋จ์ถ.
โข
ํ์ด์ง ๊ธฐ๋ฅ ๋ด์ฅ
: Page ๊ฐ์ฒด๋ฅผ ํตํด ๊ฐ๋จํ ํ์ด์ง ์ฒ๋ฆฌ ๊ฐ๋ฅ.
โข
ํ๋ฌ๊ทธ์ธ ์์คํ
: ํ์ด์ง, SQL ๋ถ์, ๋ค์ค ํ
๋ํธ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ ํ์ฅ ๊ฐ๋ฅ.
โข
Lambda ํํ์ ์ง์
: ํ๋๋ช
์ ์์ ํ๊ฒ ์ฌ์ฉํด ์ ์ง๋ณด์์ฑ์ ๋์ธ ์ฟผ๋ฆฌ ์์ฑ ๊ฐ๋ฅ.
โข
๋ค์ค ํ
๋ํธ ์ง์
: ๋ค์ค ์ฌ์ฉ์ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ๊ฒฉ๋ฆฌ ์๋ ์ฒ๋ฆฌ.
โข
SQL ์๋ ์์ฑ
: XML ์์ด Java ์ฝ๋๋ง์ผ๋ก ๋์ SQL ์์ฑ ๊ฐ๋ฅ.
โข
์๋น์ค ๊ณ์ธต ํตํฉ
: Service์ ServiceImpl๋ก ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ฐ์ดํฐ ๊ณ์ธต์ ์ฝ๊ฒ ๊ด๋ฆฌ.
โข
๊ฐ๋ ฅํ ์ปค๋ฎค๋ํฐ
: ํ๋ถํ ๋ฌธ์์ ์ํ ์ฝ๋๋ก ํ์ต๊ณผ ๋ฌธ์ ํด๊ฒฐ ์ง์.
์ฃผ์ ๊ธฐ๋ฅ
โข
CRUD ์๋ ์์ฑ
โข
ํ์ด์ง ์ฒ๋ฆฌ
โข
์กฐ๊ฑด ๋น๋
CRUD ์๋ ์์ฑ
MyBatis Plus ์์ ์ ๊ณตํ๋ ServiceImpl<M extends BaseMapper<T>, T> ํด๋์ค์
CRUD์ ๊ด๋ จ๋ ๊ณตํต ๋ก์ง์ ๊ตฌํ์ด ์ด๋ฏธ ๊ตฌํ๋์ด์์ด ์ด๋ฏธ ๊ตฌํ๋ ๋ฉ์๋ ํธ์ถ๋ง์ผ๋ก CRUD ๋ฑ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค์ด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.
CRUD ์๋ ์์ฑ ์ค์
MyBatis Plus ๊ฐ CRUD ๋ฑ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ก์ง์ ์๋์ผ๋ก ์์ฑํ๋ ค๋ฉด,
์๋์ ๊ฐ์ด ์ค์ ์ ํด์ฃผ์ด์ผํฉ๋๋ค.
1.
ํ
์ด๋ธ ์ด๋ฆ ์ค์
2.
ํ
์ด๋ธ์ ๊ธฐ๋ณธํค(PK) ์ค์
3.
ServiceImpl ํด๋์ค ์์
์์ ํ ์ด๋ธ
DROP TABLE IF EXISTS `board`;
CREATE TABLE `board` (
`no` int NOT NULL AUTO_INCREMENT PRIMARY KEY, -- โก PK (๊ธฐ๋ณธํค)
`id` varchar(100) NOT NULL,
`title` varchar(100) NOT NULL,
`writer` varchar(100) NOT NULL,
`content` text,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`views` int NOT NULL DEFAULT '0'
) COMMENT='๊ฒ์ํ';
SQL
๋ณต์ฌ
์์ ํ
์ด๋ธ board์์, no ์ปฌ๋ผ์ด PK (๊ธฐ๋ณธํค)๋ก ์ง์ ๋์ด ์์ต๋๋ค.
ํ ์ด๋ธ ์ด๋ฆ ์ค์
ํ
์ด๋ธ ์ด๋ฆ ์ค์ ์ ๋๋ฉ์ธ(์ํฐํฐ) ๊ฐ์ฒด์ @TableName("ํ
์ด๋ธ๋ช
") ์ด๋
ธํ
์ด์
์ ์์ฑํ์ฌ ์ ์ฉํ ์ ์์ต๋๋ค.
@Data
@TableName("board") // ํ
์ด๋ธ๋ช
(๐ฆ๏ธ๐ Mybatis plus)
@Alias("Board") // typealias ๋ณ์นญ (๐ฆ๏ธ๐ Mybatis)
public class Board {
...
}
Java
๋ณต์ฌ
@TableName ์ด๋
ธํ
์ด์
์ผ๋ก ํ
์ด๋ธ ๋ช
board ๋ฅผ ์ง์ ํฉ๋๋ค.
ํ ์ด๋ธ์ ๊ธฐ๋ณธํค(PK) ์ค์
๋ฑ๋ก, ์กฐํ, ์์ , ์ญ์ (C.R.U.D) ๊ธฐ๋ฅ์ด ์ ์ฉ๋๋ ค๋ฉด, ์ด๋ค ํ
์ด๋ธ์์ ์ด๋ค ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ์ฒ๋ฆฌํ ์ง ๊ธฐ๋ณธํค ์ปฌ๋ผ(PK)๋ฅผ ์์์ผํฉ๋๋ค.
MyBatis Plus ์๊ฒ ๋๋ฉ์ธ(์ํฐํฐ) ๊ฐ์ฒด์ ์ด๋ค ๋ณ์๊ฐ ๊ธฐ๋ณธํค์ ๋งคํ๋๋ ๋ณ์์ธ์ง ์ง์ ํด์ฃผ๋ฉด PK ๋ฅผ ์ธ์ํ์ฌ ์๋์ผ๋ก C.R.U.D ๊ฐ ๋์๋๋๋ก ์ง์ ํฉ๋๋ค.
@Data
@TableName("board") // ํ
์ด๋ธ๋ช
(๐ฆ๏ธ๐ Mybatis plus)
@Alias("Board") // typealias ๋ณ์นญ (๐ฆ๏ธ๐ Mybatis)
public class Board {
@TableId(type = IdType.AUTO) // PK ์ค์ ๋ฐ ์๋์ฆ๊ฐ (๐ฆ๏ธ๐ Mybatis plus - CRUD ์ ์ฌ์ฉ)
private int no;
private String id;
private String title;
private String writer;
private String content;
private Date createdAt;
private Date updatedAt;
private int views;
public Board() {
this.id = UUID.randomUUID().toString();
}
}
Java
๋ณต์ฌ
@TableId(type = IdType.AUTO) // PK ์ค์ ๋ฐ ์๋์ฆ๊ฐ (๐ฆ๏ธ๐ Mybatis plus - CRUD ์ ์ฌ์ฉ)
private int no;
Java
๋ณต์ฌ
@TableId ์ด๋
ธํ
์ด์
์ผ๋ก no ๋ณ์(์ปฌ๋ผ)์ PK(๊ธฐ๋ณธํค)๋ก ์ง์ ํ๊ณ ,
type = IdType.AUTO ์์ฑ์ ํตํด์ AUTO_INCREMENT ์ต์
์ ์ ์ฉํฉ๋๋ค.
ServiceImpl ํด๋์ค ์์
MyBatis Plus ์ ๊ธฐ๋ณธ CRUD ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ServiceImpl ํด๋์ค์ ์ ์๋์ด ์์ต๋๋ค. ์ด ํด๋์ค๋ฅผ ์์๋ฐ์ ํด๋์ค์์ CRUD ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@Service
public class BoardServiceImpl extends ServiceImpl<BoardMapper, Board> implements BoardService {
@Autowired private BoardMapper boardMapper;
/* โญ ์ด๋ฏธ ๊ธฐ๋ณธ CRUD ๊ฐ ๋์ด ์์ผ๋, ๊ธฐ๋ณธ์ ์ธ CRUD ๋ ์ฝ๋ฉํ์ง ์์๋ ๋๋ค๐ */
}
Java
๋ณต์ฌ
ServiceImpl
MyBatis Plus์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์๋น์ค ๊ตฌํ ํด๋์ค์
๋๋ค. ์ด๋ฅผ ํตํด CRUD์ ๊ด๋ จ๋ ๊ณตํต ๋ก์ง์ ๊ตฌํํ ์ ์์ผ๋ฉฐ, ๊ฐ๋ฐ์๋ ๋น์ฆ๋์ค ๋ก์ง์๋ง ์ง์คํ ์ ์์ต๋๋ค.
ServiceImpl์ ์ฃผ์ ๋ฉ์๋
์๋๋ MyBatis Plus์ ServiceImpl์์ ์ ๊ณตํ๋ ์ฃผ์ ๋ฉ์๋๋ฅผ ํ๋ก ์ ๋ฆฌํ ๋ด์ฉ์
๋๋ค.
๋ฉ์๋ | ์ค๋ช
|
getById(Serializable id) | ID๋ก ์ํฐํฐ ์กฐํ (id PK ์ปฌ๋ผ) |
list() | ์กฐ๊ฑด ์์ด ์ ์ฒด ์ํฐํฐ ์กฐํ |
save(T entity) | ๋จ์ผ ์ํฐํฐ ์ ์ฅ |
saveBatch(Collection<T> entityList) | ์ํฐํฐ ๋ฐฐ์น ์ ์ฅ |
updateById(T entity) | ID๋ก ์ํฐํฐ ์
๋ฐ์ดํธ (id PK ์ปฌ๋ผ) |
removeById(Serializable id) | ID๋ก ์ํฐํฐ ์ญ์ (id PK ์ปฌ๋ผ) |
count() | ์ ์ฒด ๋ฐ์ดํฐ ๊ฐ์ ์กฐํ |
์์์ฝ๋
1.
???.sql
2.
???.java
a.
@TableName("???")
b.
@TableId(type = IdType.AUTO)
3.
???Mapper.xml
4.
???Mapper.java
a.
@Mapper
5.
???Service.java
6.
???SeviceImpl.java
a.
extends ServiceImpl<???Mapper, ???>
7.
???Controller.java
8.
views
a.
???
i.
list.html
ii.
insert.html
iii.
read.html
iv.
update.html
b.
index.html
???.sql
DROP TABLE IF EXISTS `board`;
CREATE TABLE `board` (
`no` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`id` varchar(100) NOT NULL,
`title` varchar(100) NOT NULL,
`writer` varchar(100) NOT NULL,
`content` text,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`views` int NOT NULL DEFAULT '0'
) COMMENT='๊ฒ์ํ';
SQL
๋ณต์ฌ
???.java
1.
@TableName("???")
2.
@TableId(type = IdType.AUTO)
/**
* Board
* - ๊ฒ์๊ธ ์ ๋ณด
*/
@Data
@TableName("board") // ํ
์ด๋ธ๋ช
(๐ฆ๏ธ๐ Mybatis plus)
@Alias("Board") // typealias ๋ณ์นญ (๐ฆ๏ธ๐ Mybatis)
public class Board {
@TableId(type = IdType.AUTO) // PK ์ค์ ๋ฐ ์๋์ฆ๊ฐ (๐ฆ๏ธ๐ Mybatis plus - CRUD ์ ์ฌ์ฉ)
private int no;
private String id;
private String title;
private String writer;
private String content;
private Date createdAt;
private Date updatedAt;
private int views;
public Board() {
this.id = UUID.randomUUID().toString();
}
}
Java
๋ณต์ฌ
???Mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace="๋งคํผ ์ธํฐํ์ด์ค ๊ฒฝ๋ก" -->
<mapper namespace="com.aloha.mybatis_plus.mapper.BoardMapper">
<!-- โญ ๊ธฐ๋ณธ CRUD ์ด๋ฏธ ๊ตฌํ๋์ด ์์ -->
<!-- โก ServiceImpl<BoardMapper, Board> -->
</mapper>
XML
๋ณต์ฌ
???Mapper.java
1.
@Mapper
@Mapper
public interface BoardMapper extends BaseMapper<Board> {
}
Java
๋ณต์ฌ
???Service.java
public interface BoardService {
}
Java
๋ณต์ฌ
???SeviceImpl.java
1.
extends ServiceImpl<???Mapper, ???>
@Service
public class BoardServiceImpl extends ServiceImpl<BoardMapper, Board> implements BoardService {
@Autowired private BoardMapper boardMapper;
}
Java
๋ณต์ฌ
???Controller.java
/**
* /board ๊ฒฝ๋ก๋ก ์์ฒญ ์์ ๋ ์ฒ๋ฆฌ
* [GET] - /board/list : ๊ฒ์๊ธ ๋ชฉ๋ก ํ๋ฉด
* [GET] - /board/read : ๊ฒ์๊ธ ์กฐํ ํ๋ฉด
* [GET] - /board/insert : ๊ฒ์๊ธ ๋ฑ๋ก ํ๋ฉด
* [POST] - /board/insert : ๊ฒ์๊ธ ๋ฑ๋ก ์ฒ๋ฆฌ
* [GET] - /board/update : ๊ฒ์๊ธ ์์ ํ๋ฉด
* [POST] - /board/update : ๊ฒ์๊ธ ์์ ์ฒ๋ฆฌ
* [POST] - /board/delete : ๊ฒ์๊ธ ์ญ์ ์ฒ๋ฆฌ
*/
@Slf4j // ๋ก๊ทธ ์ด๋
ธํ
์ด์
@Controller // ์ปจํธ๋กค๋ฌ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก
@RequestMapping("/board") // ํด๋ ์ค ๋ ๋ฒจ ์์ฒญ ๊ฒฝ๋ก ๋งคํ
// - /board/~ ๊ฒฝ๋ก์ ์์ฒญ์ ์ด ์ปจํธ๋กค๋ฌ์์ ์ฒ๋ฆฌ
public class BoardController {
// โญ๋ฐ์ดํฐ ์์ฒญ๊ณผ ํ๋ฉด ์ถ๋ ฅ
// Controller --> Service (๋ฐ์ดํฐ ์์ฒญ)
// Controller <-- Service (๋ฐ์ดํฐ ์ ๋ฌ)
// Controller --> Model (๋ชจ๋ธ ๋ฑ๋ก)
// View <-- Model (๋ฐ์ดํฐ ์ถ๋ ฅ)
@Autowired // ์์กด์ฑ ์๋ ์ฃผ์
// private BoardService boardService; // @Service๋ฅผ --Impl ์ ๋ฑ๋ก
private BoardServiceImpl boardService; // @Service๋ฅผ --Impl ์ ๋ฑ๋ก
/**
* ๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ ํ๋ฉด
* @return
* @throws Exception
*/
@GetMapping("/list")
public String list(Model model) throws Exception {
// ๋ฐ์ดํฐ ์์ฒญ
List<Board> boardList = boardService.list();
// ๋ชจ๋ธ ๋ฑ๋ก
model.addAttribute("boardList", boardList);
// ๋ทฐ ํ์ด์ง ์ง์
return "/board/list"; // resources/templates/board/list.html
}
/**
* ๊ฒ์๊ธ ์กฐํ ํ๋ฉด
* - /board/read?no=๐
* @param no
* @return
* @throws Exception
*/
// @RequestParam("ํ๋ผ๋ฏธํฐ๋ช
")
// - ์คํ๋ง ๋ถํธ 3.2๋ฒ์ ์ดํ, ์๋ตํด๋ ์๋ ๋งคํ๋๋ค.
// - ์คํ๋ง ๋ถํธ 3.2๋ฒ์ ์ด์, ํ์๋ก ๋ช
์ํด์ผ ๋งคํ๋๋ค.
@GetMapping("/read")
public String read(@RequestParam("no") int no, Model model) throws Exception {
// ๋ฐ์ดํฐ ์์ฒญ
// Board board = boardService.select(no);
Board board = boardService.getById(no);
// ๋ชจ๋ธ ๋ฑ๋ก
model.addAttribute("board", board);
// ๋ทฐํ์ด์ง ์ง์
return "/board/read";
}
/**
* ๊ฒ์๊ธ ๋ฑ๋ก ํ๋ฉด
* @return
*/
@GetMapping("/insert")
public String insert() {
return "/board/insert";
}
/**
* ๊ฒ์๊ธ ๋ฑ๋ก ์ฒ๋ฆฌ
* @param board
* @return
* @throws Exception
*/
@PostMapping("/insert")
public String insertPro(Board board) throws Exception {
// ๋ฐ์ดํฐ ์์ฒญ
// int result = boardService.insert(board);
boolean result = boardService.save(board);
// ๋ฆฌ๋ค์ด๋ ํธ
// โญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ฑ๊ณต
// if( result > 0 ) {
if( result ) {
return "redirect:/board/list";
}
// โ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์คํจ
return "redirect:/board/insert?error";
}
/**
* ๊ฒ์๊ธ ์์ ํ๋ฉด
* @param no
* @param model
* @return
* @throws Exception
*/
@GetMapping("/update")
public String update(@RequestParam("no") int no, Model model) throws Exception {
// Board board = boardService.select(no);
Board board = boardService.getById(no);
model.addAttribute("board", board);
return "/board/update";
}
/**
* ๊ฒ์๊ธ ์์ ์ฒ๋ฆฌ
* @param board
* @return
* @throws Exception
*/
@PostMapping("/update")
public String updatePro(Board board) throws Exception {
// int result = boardService.update(board);
boolean result = boardService.updateById(board);
// if( result > 0 ) {
if( result ) {
return "redirect:/board/list";
}
int no = board.getNo();
return "redirect:/board/update?no="+ no + "&error";
}
/**
* ๊ฒ์๊ธ ์ญ์ ์ฒ๋ฆฌ
* @param no
* @return
* @throws Exception
*/
@PostMapping("/delete")
public String delete(@RequestParam("no") int no) throws Exception {
// int result = boardService.delete(no);
boolean result = boardService.removeById(no);
// if( result > 0 ) {
if( result ) {
return "redirect:/board/list";
}
return "redirect:/board/update?no=" + no + "&error";
}
}
Java
๋ณต์ฌ
views
1.
???
a.
list.html
b.
insert.html
c.
read.html
d.
update.html
2.
index.html
???
1.
list.html
2.
insert.html
3.
read.html
4.
update.html
list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>๊ฒ์๊ธ ๋ชฉ๋ก</title>
</head>
<body>
<h1>๊ฒ์๊ธ ๋ชฉ๋ก</h1>
<a href="/board/insert">๊ธ์ฐ๊ธฐ</a>
<table border="1">
<tr>
<th width="50">๋ฒํธ</th>
<th width="300">์ ๋ชฉ</th>
<th width="100">์์ฑ์</th>
<th width="200">๋ฑ๋ก์ผ์</th>
<th width="200">์์ ์ผ์</th>
<th widht="100">์กฐํ์</th>
</tr>
<th:block th:if="${boardList == null or boardList.isEmpty()}">
<tr>
<td colspan="6" align="center">์กฐํ๋ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.</td>
</tr>
</th:block>
<th:block th:each="board : ${boardList}">
<tr>
<td align="center" th:text="${board.no}"></td>
<td>
<!-- th:???="|๋ฌธ์์ด+${ํํ์}|" -->
<a th:href="|/board/read?no=${board.no}|"
th:text="${board.title}"></a>
</td>
<td align="center" th:text="${board.writer}"></td>
<!--
์ ํธ๋ฆฌํฐ๊ฐ์ฒด.๋ฉ์๋()
#dates.format( ๋ ์ง๊ฐ์ฒด๋ช
, '๋ ์งํฌ๋งท' )
- #dates.format( board.regDate, 'yyyy-MM-dd HH:mm:ss' )
-->
<td align="center">
<span th:text="${ #dates.format( board.createdAt, 'yyyy-MM-dd HH:mm:ss' ) }"></span>
</td>
<td align="center">
<span th:text="${ #dates.format( board.updatedAt, 'yyyy-MM-dd HH:mm:ss' ) }"></span>
</td>
<td align="center" th:text="${board.views}"></td>
</tr>
</th:block>
</table>
</body>
</html>
HTML
๋ณต์ฌ
insert.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>๊ฒ์๊ธ ๋ฑ๋ก</title>
</head>
<body>
<h1>๊ฒ์๊ธ ๋ฑ๋ก</h1>
<form action="/board/insert" method="post">
<input type="text" name="title" id="title">
<input type="text" name="writer" id="writer">
<input type="text" name="content" id="content">
<input type="submit" value="๋ฑ๋ก">
</form>
</body>
</html>
HTML
๋ณต์ฌ
read.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>๊ฒ์๊ธ ์กฐํ</title>
</head>
<body>
<h1>๊ฒ์๊ธ ์กฐํ</h1>
<form action="/board/delete" method="post">
<input type="hidden" name="no" th:value="${board.no}">
<table>
<tr>
<td>์ ๋ชฉ</td>
<td>
<input type="text" name="title" th:value="${board.title}">
</td>
</tr>
<tr>
<td>์์ฑ์</td>
<td>
<input type="text" name="writer" th:value="${board.writer}">
</td>
</tr>
<tr>
<td colspan="2">
<textarea name="content" id="content" cols="40" rows="5"
th:text="${board.content}"></textarea>
</td>
</tr>
</table>
<div>
<button type="button" onclick="moveUpdate()">์์ </button>
<button type="button" onclick="moveList()">๋ชฉ๋ก</button>
</div>
</form>
<script>
// ๐ฉโ๐ป ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ
let no = "[[${board.no}]]"
// ์์ ํ๋ฉด ์ด๋
function moveUpdate() {
location.href = '/board/update?no=' + no
}
// ๋ชฉ๋ก ํ๋ฉด ์ด๋
function moveList() {
location.href = '/board/list'
}
</script>
</body>
</html>
HTML
๋ณต์ฌ
update.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>๊ฒ์๊ธ ์์ </title>
</head>
<body>
<h1>๊ฒ์๊ธ ์์ </h1>
<form id="form" action="/board/update" method="post">
<input type="hidden" name="no" th:value="${board.no}">
<table>
<tr>
<td>์ ๋ชฉ</td>
<td>
<input type="text" name="title" th:value="${board.title}">
</td>
</tr>
<tr>
<td>์์ฑ์</td>
<td>
<input type="text" name="writer" th:value="${board.writer}">
</td>
</tr>
<tr>
<td colspan="2">
<textarea name="content" id="content" cols="40" rows="5"
th:text="${board.content}"></textarea>
</td>
</tr>
</table>
<div>
<button type="submit">์์ </button>
<button type="button" onclick="actionDelete()">์ญ์ </button>
<button type="button" onclick="moveList()">๋ชฉ๋ก</button>
</div>
</form>
<script>
let form = document.getElementById('form')
// ๐ฉโ๐ป ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ
let no = "[[${board.no}]]"
// ์์ ํ๋ฉด ์ด๋
function moveUpdate() {
location.href = '/board/update?no=' + no
}
// ์ญ์ ์์ฒญ
function actionDelete() {
let check = confirm('์ ๋ง๋ก ์ญ์ ํ์๊ฒ ์ต๋๊น?')
if( check ) {
form.action = '/board/delete'
form.submit()
}
}
// ๋ชฉ๋ก ํ๋ฉด ์ด๋
function moveList() {
location.href = '/board/list'
}
</script>
</body>
</html>
HTML
๋ณต์ฌ
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>๋ฉ์ธ ํ๋ฉด</title>
</head>
<body>
<h1>SpringBoot x MyBatis</h1>
<h3>๊ฒ์ํ ํ๋ก์ ํธ</h3>
<ul>
<li>Spring Boot 3.x</li>
<li>Thymeleaf</li>
<li>MySQL 8.x</li>
<li>MyBatis 3.0</li>
</ul>
<div>
<a href="/board/list">๊ฒ์ํ</a>
</div>
</body>
</html>
HTML
๋ณต์ฌ