MyBatis
MyBatis ๋ํด์ ์์๋ณด๊ณ ๊ฐ๋จํ๊ฒ ๊ฒ์ํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ์ค์ต๊น์ง ์งํํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
โข
Mybatis
โข
ํ๋ก์ ํธ ๊ตฌ์กฐ
โข
์คํ๋ง ๋ถํธ์์ MyBatis ์ฌ์ฉ
โข
์์กด์ฑ ์ถ๊ฐ
โฆ
build.gradle
โฆ
pom.xml
โข
๋ง์ด๋ฐํฐ์ค ์ค์ ํ์ผ - mybatis-config.xml
โข
ํ๋ก์ ํธ ์ค์ - application.properties
โข
DB ๊ตฌ์ถ
โข
๋ก์ง ์์ฑ
โฆ
DTO ์์ฑ
โฆ
SQL Mapper ์์ฑ
โฆ
Mapper ์ธํฐํ์ด์ค ์์ฑ
โฆ
Service ์์ฑ
โฆ
Controller ์์ฑ
โฆ
View ์์ฑ
MyBatis
๋ง์ด๋ฐํฐ์ค๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ํ SQL, ์ ์ฅํ๋ก์์ ๊ทธ๋ฆฌ๊ณ ๋ช๊ฐ์ง ๊ณ ๊ธ ๋งคํ์ ์ง์ํ๋ ํผ์์คํด์ค ํ๋ ์์ํฌ์ด๋ค.
์๋ฐ ํ๋ก๊ทธ๋จ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋์ ์ํด์, JDBC ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ๋ฉด, Java ์ฝ๋์ SQL ์ฝ๋๊ฐ ๊ฐ์ด ์ฌ์ฉ๋๋๊น, ์ ์ง๋ณด์์ฑ์ด ์ ํ๋ฉ๋๋ค.
๊ทธ๋์ Mybatis ๋ฅผ ์ฌ์ฉํ๋ฉด, Java ์ฝ๋์์ SQL ์ ๋ถ๋ฆฌํด์ XML ๊ด๋ฆฌ๋ฅผ ํ๊ณ , ์๋ฐ์ ์ธํฐํ์ด์ค ํธ์ถ์ ๋ฐ๋ผ์ XML ์ ํน์ id ์ ํด๋นํ๋ ์ฟผ๋ฆฌ๋ฅผ ์คํ์ํฐ SQL Mapper ๋ฐฉ์์ผ๋ก DB ์ฐ๋์ ํ ์ ์์ต๋๋ค.
ํ๋ก์ ํธ ๊ตฌ์กฐ
๐ฆย spring-mybatis
โ
โโโโ๐java
โ โโโโ๐com.aloha.springmybatis
โ โ
โ โโโโ๐controller
โ โ โโโโ๐BoardController.java
โ โ
โ โโโโ๐dto
โ โ โโโโ๐Board.java
โ โ
โ โโโโ๐service
โ โ โ
โ โ โโโโ๐BoardService.java
โ โ โโโโ๐BoardServiceImpl.java
โ โ
โ โโโโ๐mapper
โ โโโโ๐BoardMapper.java
โ
โโโโ๐resources
โ ๐application.properties
โ ๐mybatis-config.xml
โ
โโโโ๐com.aloha.springmybatis.mapper
โโโโโ๐BoardMapper.xml
Plain Text
๋ณต์ฌ
์คํ๋ง ๋ถํธ์์ MyBatis ์ฌ์ฉ
SpringBoot ์์ MyBatis๋ฅผ ์ฌ์ฉํ ๋์๋
์ฃผ๋ก Gradle ๋น๋๋๊ตฌ์ ์ค์ ํ์ผ์ build.gradle ๋๋
Maven ๋น๋๋๊ตฌ์ ์ค์ ํ์ผ์ธ pom.xml ์ ์์กด์ฑ์ ์ถ๊ฐํ์ฌ ์ฌ์ฉํฉ๋๋ค
์์กด์ฑ ์ถ๊ฐ
โข
build.gradle
โข
pom.xml
build.gradle
โข
mysql ๋๋ผ์ด๋ฒ ์์กด์ฑ
โข
MyBatis ์์กด์ฑ
โข
build.gradle ์ ์ฒด์ฝ๋
mysql ๋๋ผ์ด๋ฒ ์์กด์ฑ
runtimeOnly 'com.mysql:mysql-connector-j'
Java
๋ณต์ฌ
MyBatis ์์กด์ฑ
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.3'
Java
๋ณต์ฌ
springboot v3 ๋ฒ์ ์ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉํ ์์กด์ฑ์
๋๋ค.
build.gradle
plugins {
id 'java'
id 'war'
id 'org.springframework.boot' version '3.3.5'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'com.aloha'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.3'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
Java
๋ณต์ฌ
pom.xml
โข
mysql ๋๋ผ์ด๋ฒ ์์กด์ฑ
โข
MyBatis ์์กด์ฑ
โข
build.gradle ์ ์ฒด์ฝ๋
mysql ๋๋ผ์ด๋ฒ ์์กด์ฑ
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
<scope>runtime</scope>
</dependency>
XML
๋ณต์ฌ
MyBatis ์์กด์ฑ
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>3.0.3</version>
<scope>test</scope>
</dependency>
XML
๋ณต์ฌ
springboot v3 ๋ฒ์ ์ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉํ ์์กด์ฑ์
๋๋ค.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>mybatis</name>
<description>Demo project for Spring Boot</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>3.0.3</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
XML
๋ณต์ฌ
๋ง์ด๋ฐํฐ์ค ์ค์ ํ์ผ - mybatis-config.xml
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- ์ค์ -->
<settings>
<!-- ์ธ๋์ค์ฝ์ด ์ผ์ด์ค์ธ ์ปฌ๋ผ์ ์นด๋ฉ ์ผ์ด์ค๋ก ๋ณํํ๋ ์ค์ -->
<!-- board_no - boardNo -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- ํ์
๋ณ์นญ ์ค์ -->
<typeAliases>
<!-- ํ
์ด๋ธ๊ณผ ๋งคํํ DTO๊ฐ ์๋ ํจํค์ง ๊ฒฝ๋ก ์ง์ -->
<package name="com.aloha.mybatis.dto"/>
</typeAliases>
</configuration>
XML
๋ณต์ฌ
mapUnderscoreToCamelCase
<settings>
<!-- ์ธ๋์ค์ฝ์ด ์ผ์ด์ค์ธ ์ปฌ๋ผ์ ์นด๋ฉ ์ผ์ด์ค๋ก ๋ณํํ๋ ์ค์ -->
<!-- board_no - boardNo -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
XML
๋ณต์ฌ
์ธ๋์ค์ฝ์ด ์ผ์ด์ค(์ค๋ค์ดํฌ ์ผ์ด์ค)๋ฅผ ์นด๋ฉ ์ผ์ด์ค๋ก ์๋ ๋ณํํด์ฃผ๋ ๊ธฐ๋ฅ ํ์ฑํ
์ด๋ ๊ฒ ์์ฑํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ธ๋์ค์ฝ์ด ์ผ์ด์ค๋ฅผ ๋ณ๋๋ก ์๋ฐ์ ์นด๋ฉ ์ผ์ด์ค๋ก ๋ณํํ์ง ์์๋ ์๋์ผ๋ก ํ
์ด๋ธ์ ์ปฌ๋ผ๋ช
์ ๊ฐ์ฒด์ ๋ณ์๋ก ๋งคํ ํ ์ ์๊ฒ ๋ณํํด์ค๋๋ค.
typeAliases - package
<typeAliases>
<!-- ํ
์ด๋ธ๊ณผ ๋งคํํ DTO๊ฐ ์๋ ํจํค์ง ๊ฒฝ๋ก ์ง์ -->
<package name="com.aloha.mybatis.dto"/>
</typeAliases>
XML
๋ณต์ฌ
resultType ์์ฑ์์ dto ๊ฐ์ฒด (ํจํค์ง.ํด๋์ค๋ช
) (ํด๋์ค๋ช
)
์ด ์ค์ ์ ๊ตฌ์ฑํ๋ฉด Mapper ํ์ผ์์ resultType ์์ฑ์ด ํจํค์ง๋ถํฐ ํด๋์ค๊น์ง ๋ค ์ง์ ํ์ง ์์๋, ๋งคํํ ๊ฐ์ฒด๊ฐ ์๋ ํจํค์ง๋ฅผ ์ฌ๊ธฐ ์ค์ ํจ์ผ๋ก์จ, ๊ฐ์ฒด ์ด๋ฆ๋ง ์์ฑํด๋ ์กฐํ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด์ ๋ฐ๋ก ๋งคํํ ์ ์์ต๋๋ค.
<!-- ๊ฒ์๊ธ ์กฐํ -->
<select id="select" resultType="com.aloha.mybatis.dto.Board">
XML
๋ณต์ฌ
์ด ์ค์ ์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ย ๋ค์๊ณผ ๊ฐ์ด ํจํค์ง๋ถํฐ ํด๋์ค๋ช
๊น์ง resultType ์์ฑ์ ๋ค ์์ฑํด์ผ ๋์ง๋ง, ์ด ์ค์ ์ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด๋ช
๋ง ์์ฑํด๋ ๋ฉ๋๋ค.
<!-- ๊ฒ์๊ธ ์กฐํ -->
<select id="select" resultType="Board">
XML
๋ณต์ฌ
๋ฐ๋ผ์ ์กฐํ ๊ฒฐ๊ณผ๋ฅผ ๋งคํํ ๊ฐ์ฒด๋ค์ด ์๋ ํจํค์ง๋ค์ ๋ฏธ๋ฆฌ ์ง์ ํด ๋์ผ๋ฉด . ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๊ฒฐํ๊ฒ ์์ฑ ๊ฐ์ ์์ฑํ ์ ์์ต๋๋ค .
ํ๋ก์ ํธ ์ค์ - application.properties
DB ๋๋ผ์ด๋ฒ์ MyBatis์ ์ค์ ์ ํ๋ก์ ํธ์ ์๋ ค์ฃผ๊ธฐ ์ํด์๋ ย application.properties ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ ์์ค์ Mybatis ๊ด๋ จ ์ค์ ์ ์์ฑํด์ผ ํฉ๋๋ค.
application.properties ๋ ์คํ๋ง ๋ถํธ์ ํ๋ก์ ํธ ์ค์ ํ์ผ์
๋๋ค.
โข
๋ฐ์ดํฐ ์์ค ์ค์
โข
mybatis-config.xml ์ค์
๋ฐ์ดํฐ ์์ค ์ค์
# ๋ฐ์ดํฐ ์์ค - MySQL
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/aloha?serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true&useSSL=false&autoReconnection=true&autoReconnection=true
spring.datasource.username=aloha
spring.datasource.password=123456
Plain Text
๋ณต์ฌ
mybatis-config.xml ์ค์
# Mybatis ์ค์
# Mybatis ์ค์ ๊ฒฝ๋ก : ~/resources/mybatis-config.xml
mybatis.config-location=classpath:mybatis-config.xml
# Mybatis ๋งคํผ ํ์ผ ๊ฒฝ๋ก : ~/๋ฉ์ธํจํค์ง/mapper/**Mapper.xml
mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml
Plain Text
๋ณต์ฌ
โข
classpath: ๋ผ๊ณ ์ง์ ํ๋ฉด, ~/resources ๊ฒฝ๋ก ํ์๋ถํฐ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ ์ ์๋ค.
โข
classpath:mybatis/mapper/**/**.xml ๋ผ๊ณ ์ง์ ํ๋ฉด, ~/resources ๊ฒฝ๋ก๋ถํฐ ๋ชจ๋ ๊ฒฝ๋ก์ ๋ชจ๋ ํ์ ํ์ผ์ ํ์ฅ์๊ฐ .xml ์ด๋ฉด ๋ง์ด๋ฐํฐ์ค ๋งคํผ(SQL) ํ์ผ๋ก ์ธ์ํ๋๋ก ์ง์ ํ๋ค.
mybatis-config.xml ์ค์ ํ์ผ ์์ด ์ ์ฉํ๊ธฐ
# ์ปฌ๋ผ๋ช
์ ๋ณ์๋ช
์ผ๋ก ์๋๋งคํ : board_no โก boardNo
mybatis.configuration.map-underscore-to-camel-case=true
# resultType ์์ฑ์์ dto ๊ฐ์ฒด (ํจํค์ง.ํด๋์ค๋ช
) โก (ํด๋์ค๋ช
)
mybatis.type-aliases-package=com.aloha.mybatis.dto
# Mybatis ๋งคํผ ํ์ผ ๊ฒฝ๋ก : ~/๋ฉ์ธํจํค์ง/mapper/**Mapper.xml
mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml
Plain Text
๋ณต์ฌ
MyBatis์ ์ค์ ํ์ผ์ ์ฌ์ฉํด์ ๋ง์ด๋ฐํฐ์ค์ ์ค์ ์ ๊ด๋ฆฌํ ์๋ ์์ง๋ง . ๊ธฐ๋ณธ์ ์ธ ์ค์ ๋ค์ ์ดํ๋ฆฌ์ผ์ด์
ํ๋กํฌํฐ์ค์์ ๋ฐ๋ก ์ค์ ์ ํ ์๋ ์์ต๋๋ค.
application.properties
spring.application.name=spring-mybatis
# ๋ฐ์ดํฐ ์์ค - MySQL
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/aloha?serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true&useSSL=false&autoReconnection=true&autoReconnection=true
spring.datasource.username=aloha
spring.datasource.password=123456
# Mybatis ์ค์
# Mybatis ์ค์ ๊ฒฝ๋ก : ~/resources/mybatis-config.xml
# mybatis.config-location=classpath:mybatis-config.xml
# ์ปฌ๋ผ๋ช
์ ๋ณ์๋ช
์ผ๋ก ์๋๋งคํ : board_no โก boardNo
mybatis.configuration.map-underscore-to-camel-case=true
# resultType ์์ฑ์์ dto ๊ฐ์ฒด (ํจํค์ง.ํด๋์ค๋ช
) โก (ํด๋์ค๋ช
)
mybatis.type-aliases-package=com.aloha.mybatis.dto
# Mybatis ๋งคํผ ํ์ผ ๊ฒฝ๋ก : ~/๋ฉ์ธํจํค์ง/mapper/**Mapper.xml
mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml
Plain Text
๋ณต์ฌ
DB ๊ตฌ์ถ
์ด๋ฒ ์ค์ต์์๋ MySQL์ ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํฉ๋๋ค . MySQL์ ์ค์น๊ฐ ํ์ํ๊ฑฐ๋ . ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์๊ณ ์ถ๋ค๋ฉด ์์ ํ์ด์ง๋ฅผ ์ฐธ์กฐํด ์ฃผ์ธ์ .
โข
์คํค๋ง : aloha
โข
ํ
์ด๋ธ ์์ฑ
โฆ
board
board
CREATE TABLE `board` (
`no` int NOT NULL AUTO_INCREMENT,
`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',
PRIMARY KEY (`no`)
) COMMENT='๊ฒ์ํ';
SQL
๋ณต์ฌ
๋ก์ง ์์ฑ
โข
DTO ์์ฑ
โข
SQL Mapper ์์ฑ
โข
Mapper ์ธํฐํ์ด์ค ์์ฑ
โข
Service ์์ฑ
โข
Controller ์์ฑ
โข
View ์์ฑ
DTO ์์ฑ
โข
Board.java
Board.java
Board dto๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ board ํ
์ด๋ธ๊ณผ ๋งคํํ๊ธฐ ์ํ ๋ฐ์ดํฐ ์ ์ก ๊ฐ์ฒด์
๋๋ค
/**
* Board
* - ๊ฒ์๊ธ ์ ๋ณด
*/
@Data
public class Board {
private int no;
private String title;
private String writer;
private String content;
private Date createdAt;
private Date updatedAt;
private int views;
}
Java
๋ณต์ฌ
SQL Mapper ์์ฑ
SQL Mapper์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ํ SQL ์ฟผ๋ฆฌ๋ค์ xml ํ๊ทธ ํ์์ผ๋ก ์ ์ํฉ๋๋ค
โข
๊ธฐ๋ณธ Mapper ํ์ผ ํ์
โข
๊ธฐ๋ณธ CRUD Mapper ํ์ผ ์ฝ๋
โข
BoardMapper.xml
๊ธฐ๋ณธ Mapper ํ์ผ ํ์
Mybatis Mapper ํ์ผ์๋ ์ต์์ ํ๊ทธ๋ก <mapper> ํ๊ทธ๋ฅผ ์์ฑํ๊ณ ๋ค์์คํ์ด์ค ์์ฑ์ ์์ฑํด์ ๋ํผ ์ธํฐํ์ด์ค์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค.
namespace="๋งคํผ ์ธํฐํ์ด์ค ๊ฒฝ๋ก"
namespace์ ์์ฑํ Mapper ์ธํฐํ์ด์ค์ ๊ฒฝ๋ก๊ฐ ์ธํฐํ์ด์ค ํ์ผ์ ๊ฒฝ๋ก์ ์ผ์น ํด์ผํฉ๋๋ค.
<?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.mapper.XXXMapper">
</mapper>
XML
๋ณต์ฌ
๊ธฐ๋ณธ CRUD Mapper ํ์ผ ์ฝ๋
SQL ํ๊ทธ
<select id="select" resultType="base">
Mapper ์ธํฐํ์ด์ค ๋ฉ์๋
public Base select(int baseNo) throws Exception;
๊ฐ SQL ํ๊ทธ์ id ์์ฑ๊ฐ์ด Mapper ์ธํฐํ์ด์ค์ ๋ฉ์๋ ๋ช
๊ณผ ์ผ์นํด์ผํฉ๋๋ค.
๋ก์ง์ ํตํด์ Mapper ์ธํฐํ์ด์ค์ ๋ฉ์๋๊ฐ ํธ์ถ์ด ๋๋ฉด, ์ด์ ๋งคํ๋์ด ์๋ SQL mapper ํ์ผ์ ํด๋น ๋ฉ์๋๋ช
๊ณผ ์ผ์นํ๋ ์์ด๋๋ฅผ ๊ฐ์ง SQL ํ๊ทธ๊ฐ ์คํ๋ฉ๋๋ค
<?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.mapper.BaseMapper">
<!-- ๊ธฐ๋ณธ ๋ฑ๋ก -->
<insert id="insert">
INSERT INTO base( base_id, base_name )
VALUES ( #{baseId}, #{baseName} )
</insert>
<!-- ๊ธฐ๋ณธ ์กฐํ -->
<select id="select" resultType="base">
SELECT *
FROM base
WHERE base_no = #{baseNo}
</select>
<!-- ๊ธฐ๋ณธ ์์ -->
<update id="update">
UPDATE base
SET base_id = #{baseId}
,base_name = #{baseName}
WHERE base_no = #{baseNo}
</update>
<!-- ๊ธฐ๋ณธ ์์ -->
<delete id="delete">
DELETE FROM base
WHERE base_no = #{baseNo}
</delete>
</mapper>
XML
๋ณต์ฌ
BoardMapper.xml
์ด๋ฒ ์ค์ต์์๋ ๊ฒ์๊ธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฑ๋ก ์กฐํ ์์ ์ญ์ ํ๋ ์ฟผ๋ฆฌ๋ค์ ๋ค์๊ณผ ๊ฐ์ด SQL ํ๊ทธ๋ก ์์ฑํด ๋ด
๋๋ค.
<?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.mapper.BoardMapper">
<!-- ๊ฒ์๊ธ ๋ชฉ๋ก -->
<select id="list" resultType="Board">
SELECT *
FROM board
ORDER BY created_at DESC
</select>
<!-- ๊ฒ์๊ธ ์กฐํ -->
<select id="select" resultType="Board">
SELECT *
FROM board
WHERE no = #{no}
</select>
<!-- ๊ฒ์๊ธ ๋ฑ๋ก -->
<insert id="insert">
INSERT INTO board( title, writer, content)
VALUES ( #{title}, #{writer}, #{content} )
</insert>
<!-- ๊ฒ์๊ธ ์์ -->
<update id="update">
UPDATE board
SET title = #{title}
,writer = #{writer}
,content = #{content}
WHERE no = #{no}
</update>
<!-- ๊ฒ์๊ธ ์ญ์ -->
<delete id="delete">
DELETE FROM board
WHERE no = #{no}
</delete>
<!-- ๊ฒ์๊ธ ๋ฒํธ ์ต๋๊ฐ -->
<select id="maxPk" resultType="int">
SELECT MAX(no)
FROM board
</select>
</mapper>
XML
๋ณต์ฌ
Mapper ์ธํฐํ์ด์ค ์์ฑ
๋ง์ด๋ฐํฐ์ค ๋งคํผ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ช
์ ๋งคํผ ํ์ผ์ id ์์ฑ๊ฐ๊ณผ ์ผ์นํด์ผํ๋ค.
- ํด๋น ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด, ๋งคํผ XML ํ์ผ์ SQL๋ฅผ ์คํํ๋ค.
โข
BoardMapper.java
BoardMapper.java
@Mapper
public interface BoardMapper {
// ๊ฒ์๊ธ ๋ชฉ๋ก
public List<Board> list() throws Exception;
// ๊ฒ์๊ธ ์กฐํ
public Board select(int no) throws Exception;
// ๊ฒ์๊ธ ๋ฑ๋ก
public int insert(Board board) throws Exception;
// ๊ฒ์๊ธ ์์
public int update(Board board) throws Exception;
// ๊ฒ์๊ธ ์ญ์
public int delete(int no) throws Exception;
// ๊ฒ์๊ธ ๋ฒํธ(๊ธฐ๋ณธํค) ์ต๋๊ฐ
public int maxPk() throws Exception;
}
Java
๋ณต์ฌ
๋งคํผ ํ์ผ์ id์ ์ผ์นํ๋ ๋ฉ์๋๋ช
์ ์์ฑํ๊ณ , ๋งคํผ ํ์ผ์ SQL ํ๊ทธ์ ์ ๋ฌํด ์ค ํ๋ผ๋ฏธํฐ๋ค์ ๋งค๊ฐ๋ณ์๋ก ์์ฑํฉ๋๋ค.
๋ํ ์กฐํ ์ฟผ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ์กฐํ ๊ฒฐ๊ณผ๋ฅผ ๋งคํ ๋ฐ์ ๊ฐ์ฒด ํน์ ์ปฌ๋ ์
์ ๋ฐํ ํ์
์ผ๋ก ์์ฑํ๊ณ , ๋ฑ๋ก, ์์ , ์ญ์ , ์ฟผ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฒ๋ฆฌ๋ ํ์ ์๋ฅผ ๋ฐํ๋ฐ๊ธฐ ์ํ์ฌ int ํ์
์ผ๋ก ์์ฑํฉ๋๋ค
Service ์์ฑ
์ด์ ์๋น์ค ์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค.
โข
BoardService.java
โข
BoardServiceImpl.java
BoardService.java
์๋น์ค ์ธํฐํ์ด์ค๋ฅผ ํตํด์ ๋น์ฆ๋์ค ๋ก์ง์์ ์ฌ์ฉํ ๊ธฐ๋ฅ์ ๋ํ ๋ฉ์๋์ ํํ๋ฅผ ์ ์ํฉ๋๋ค. ์ด๋ ๊ฒ ์ธํฐํ์ด์ค๋ก ๋ฉ์๋ ํํ๋ฅผ ์ ์ํจ์ผ๋ก์จ, ์ค์ ๋ก ๊ตฌํํ ์ฝ๋์ ๋ํด์ ๋คํ์ฑ๊ณผ ํ์ฅ์ฑ์ ์ ๊ณตํฉ๋๋ค.
public interface BoardService {
// ๊ฒ์๊ธ ๋ชฉ๋ก
public List<Board> list() throws Exception;
// ๊ฒ์๊ธ ์กฐํ
public Board select(int no) throws Exception;
// ๊ฒ์๊ธ ๋ฑ๋ก
public int insert(Board board) throws Exception;
// ๊ฒ์๊ธ ์์
public int update(Board board) throws Exception;
// ๊ฒ์๊ธ ์ญ์
public int delete(int no) throws Exception;
}
Java
๋ณต์ฌ
BoardServiceImpl.java
๊ตฌํ ํด๋์ค์์๋ ๋งคํผ ์ธํฐํ์ด์ค์ ์ ์ ํ ๋ฉ์๋๋ก ํธ์ถํจ์ผ๋ก์จ ๋ฐ์ดํฐ์ ๋ํ์ฌ ์กฐํ, ๋ฑ๋ก, ์์ , ์ญ์ ์์ฒญ์ ๋ณด๋ผ ์ ์๋๋ก ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ๋ํ ๊ฐ ๋ฉ์๋์์๋ ์๋น์ค์ ๊ฐ ๊ธฐ๋ฅ์ ๋ํ ์ถ๊ฐ ๋ก์ง์ ํ์ฅํ๊ฑฐ๋ ๊ด๋ จ๋ ๋ก๊ทธ ๋ฐ ์ฒ๋ฆฌ๋ค์ ํ ์ ์์ต๋๋ค.
@Service // ์๋น์ค ์ญํ ์ ์คํ๋ง ๋น
public class BoardServiceImpl implements BoardService {
@Autowired
private BoardMapper boardMapper;
/**
* ๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ
*/
@Override
public List<Board> list() throws Exception {
// TODO : boardMapper ๋ก list() ํธ์ถ
/*
* โก List<Board> boardList ๋ก ๋ฐ์์ด
* โก return boardList
*/
List<Board> boardList = boardMapper.list();
return boardList;
}
/**
* ๊ฒ์๊ธ ์กฐํ
* - no ๋งค๊ฐ๋ณ์๋ก ๊ฒ์๊ธ ๋ฒํธ๋ฅผ ์ ๋ฌ๋ฐ์์
* ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กฐํ ์์ฒญ
*/
@Override
public Board select(int no) throws Exception {
// TODO : boardMapper ๋ก select(no) ํธ์ถ
/*
* โก Board board ๋ก ๋ฐ์์ด
* โก return board
*/
Board board = boardMapper.select(no);
return board;
}
/**
* ๊ฒ์๊ธ ๋ฑ๋ก
*/
@Override
public int insert(Board board) throws Exception {
// TODO : boardMapper ๋ก insert(Board) ํธ์ถ
/*
* โก int result ๋ก ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ(๊ฐ์) ๋ฐ์์ด
* โก return result
*/
int result = boardMapper.insert(board);
return result;
}
/**
* ๊ฒ์๊ธ ์์
*/
@Override
public int update(Board board) throws Exception {
// TODO : boardMapper ๋ก update(Board) ํธ์ถ
/*
* โก int result ๋ก ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ(๊ฐ์) ๋ฐ์์ด
* โก return result
*/
int result = boardMapper.update(board);
return result;
}
/**
* ๊ฒ์๊ธ ์ญ์
*/
@Override
public int delete(int no) throws Exception {
// TODO : boardMapper ๋ก delete(no) ํธ์ถ
/*
* โก int result ๋ก ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ(๊ฐ์) ๋ฐ์์ด
* โก return result
*/
int result = boardMapper.delete(no);
return result;
}
}
Java
๋ณต์ฌ
Controller ์์ฑ
์ปจํธ๋กค๋ฌ์์๋ ์์ฒญ ๊ฒฝ๋ก๋ฅผ ๋งคํํ์ฌ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํ์ฌ ์ ์ ํ ์๋น์ค ๋ก์ง ๋ฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํ ๋ทฐ ํ์ด์ง๋ฅผ ์ง์ ํฉ๋๋ค.
์์ฒญ ๊ฒฝ๋ก ๋งคํ
๋ฐ์ดํฐ ์์ฒญ
๋ทฐ ํ์ด์ง ์ง์
BoardController.java
package com.aloha.mybatis.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.aloha.springmybatis.dto.Board;
import com.aloha.springmybatis.service.BoardService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestBody;
/**
* /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 ์ ๋ฑ๋ก
/**
* ๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ ํ๋ฉด
* @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);
// ๋ชจ๋ธ ๋ฑ๋ก
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);
// ๋ฆฌ๋ค์ด๋ ํธ
// โญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ฑ๊ณต
if( result > 0 ) {
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);
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);
if( result > 0 ) {
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);
if( result > 0 ) {
return "redirect:/board/list";
}
return "redirect:/board/update?no=" + no + "&error";
}
}
Java
๋ณต์ฌ
View ์์ฑ
โข
board
โฆ
list.html
โฆ
insert.html
โฆ
read.html
โฆ
update.html
โข
index.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
๋ณต์ฌ
โข
board
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: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
๋ณต์ฌ
๊ธฐ๋ฅ ๋ช
์ธ์
โข
๊ฒ์๊ธ ๋ฑ๋ก
โข
๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ
โข
๊ฒ์๊ธ ์กฐํ
โข
๊ฒ์๊ธ ์์
โข
๊ฒ์๊ธ ์ญ์
๊ฒ์๊ธ ๋ฑ๋ก
๊ฒ์๊ธ ๋ฑ๋ก ์, ์ฌ์ฉ์๊ฐ /board/insert.html ์์ ๊ฒ์๊ธ ์ ๋ณด (์ ๋ชฉ, ์์ฑ์, ๋ด์ฉ)๋ฅผ ์
๋ ฅํ๊ณ , ์ฌ๋ฌ ํ์ผ์ ์ฒจ๋ถํ์ฌ ์์ฒญํ๋ค.
โข
๊ฒ์๊ธ ์ ๋ณด ๋ฑ๋ก
โข
ํ์ผ ์
๋ก๋
๊ฒ์๊ธ ์ ๋ณด ๋ฑ๋ก
โข
Model
โฆ
BoardService.java
โช
insert(Board)
โฆ
BoardServiceImpl.java
โช
insert(Board)
โข
๊ฒ์๊ธ ์ ๋ณด ๋ฑ๋ก
โฆ
BoardMapper ์ insert(Board) ํธ์ถ
โข
ํ์ผ ์
๋ก๋
โฆ
FileService ์ upload(List<Files>) ํธ์ถ
โฆ
BoardMapper.java
โช
insert(Board)
โข
BoardMapper.xml ์ id=โinsertโ ์ฟผ๋ฆฌ์ ์ฐ๊ฒฐ
โฆ
BoardMapper.xml
โช
<insert id=โinsertโ โฆ >
โข
์ ์ฉ๋ ๋ฐ์ดํฐ ํ์ ์๋ฅผ ๋ฐํ ( 0 ๋๋ 1 )
โข
View
โฆ
~/board/insert.html
โช
[POST] ๋ฐฉ์์ผ๋ก FORM ์์ฒญ
โข
ํ๋ผ๋ฏธํฐ
โฆ
์ ๋ชฉ : title
โฆ
์์ฑ์ : writer
โฆ
๋ด์ฉ : content
โฆ
ํ์ผ : file
โข
Controller
โฆ
BoardController.java
โช
@GetMapping(โ/board/insertโ)
โข
์๋ต
โฆ
/board/insert
โช
@PostMapping(โ/board/insertโ)
โข
@RequestBody Board board
โข
BoardService ์ insert() ๋ฉ์๋ ์์ฒญ
โข
์๋ต
โฆ
์์ฒญ ์ฑ๊ณต : (redirect) /board/list
โฆ
์์ฒญ ์คํจ : (redirect) /board/insert?error
๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ
๊ฒ์๊ธ ์ ์ ์ฒด ๋ชฉ๋ก์ ์กฐํํฉ๋๋ค.
โข
๊ฒ์๊ธ ๋ชฉ๋ก ์ ์ฒด ์กฐํ
๊ฒ์๊ธ ๋ชฉ๋ก - MVC
โข
Model : BoardService
โข
View : /board/list.html
โข
Controller : BoardController.java
๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ
โข
Model
โฆ
BoardService.java
โช
list()
โฆ
BoardServiceImpl.java
โช
list()
โฆ
BoardMapper.java
โช
list()
โข
BoardMapper.xml ์ id=โlistโ ์ฟผ๋ฆฌ์ ์ฐ๊ฒฐ
โฆ
BoardMapper.xml
โช
<seledct id=โlistโ resultType=โBoardโ โฆ >
โข
resultType=โBoardโ
โฆ
์กฐํ๋ board ํ
์ด๋ธ์ Board ๊ฐ์ฒด๋ก ๋งคํ
โข
View
โฆ
~/board/list.html
โข
Controller
โฆ
BoardController.java
โช
@GetMapping(โ/board/listโ)
โข
Model boardList
โข
์๋ต
โฆ
/board/list
๊ฒ์๊ธ ์กฐํ
๊ฒ์๊ธ ์ ๋ณด ํ ๊ฑด์ ์กฐํํฉ๋๋ค.
โข
๊ฒ์๊ธ ์ ๋ณด ์กฐํ
โข
์ฒจ๋ถ ํ์ผ ๋ชฉ๋ก ์กฐํ
๊ฒ์๊ธ ์ ๋ณด ์กฐํ
โข
Model
โฆ
BoardService.java
โช
select(no)
โฆ
BoardServiceImpl.java
โช
select(no)
โฆ
BoardMapper.java
โช
select(no)
โข
BoardMapper.xml ์ id=โselectโ ์ฟผ๋ฆฌ์ ์ฐ๊ฒฐ
โฆ
BoardMapper.xml
โช
<seledct id=โselectโ resultType=โBoardโ โฆ >
โข
resultType=โBoardโ
โฆ
์กฐํ๋ board ํ
์ด๋ธ์ Board ๊ฐ์ฒด๋ก ๋งคํ
โข
View
โฆ
~/board/read.html
โข
Controller
โฆ
BoardController.java
โช
@GetMapping(โ/board/readโ)
โข
Model board
โข
์๋ต
โฆ
/board/read
๊ฒ์๊ธ ์์
๊ฒ์๊ธ ์ ๋ณด ํ ๊ฑด์ ์์ ํฉ๋๋ค.
โข
๊ฒ์๊ธ ์ ๋ณด ์์
โข
ํ์ผ ์ญ์ (AJAX)
๊ฒ์๊ธ ์ ๋ณด ์์
โข
Model
โฆ
BoardService.java
โช
update(board)
โฆ
BoardServiceImpl.java
โช
update(board)
โฆ
BoardMapper.java
โช
update(board)
โข
BoardMapper.xml ์ id=โupdateโ ์ฟผ๋ฆฌ์ ์ฐ๊ฒฐ
โฆ
BoardMapper.xml
โช
<update id=โupdateโ โฆ >
โข
์ ์ฉ๋ ๋ฐ์ดํฐ ํ์ ์๋ฅผ ๋ฐํ ( 0 ๋๋ 1 )
โข
View
โฆ
~/board/update.html
โข
Controller
โฆ
BoardController.java
โช
@GetMapping(โ/board/updateโ)
โข
Model board
โข
์๋ต
โฆ
/board/update
โช
@PostMapping(โ/board/updateโ)
โข
@RequestBody Board board
โข
BoardService ์ update() ๋ฉ์๋ ์์ฒญ
โข
์๋ต
โฆ
์์ฒญ ์ฑ๊ณต : (redirect) /board/list
โฆ
์์ฒญ ์คํจ : (redirect) /board/update?error
๊ฒ์๊ธ ์ญ์
๊ฒ์๊ธ ์ ๋ณด ํ ๊ฑด์ ์ญ์ ํฉ๋๋ค.
โข
๊ฒ์๊ธ ์ญ์
โข
์ฒจ๋ถ ํ์ผ ์ญ์
๊ฒ์๊ธ ์ญ์
โข
Model
โฆ
BoardService.java
โช
delete(no)
โฆ
BoardServiceImpl.java
โช
delete(no)
โฆ
BoardMapper.java
โช
delete(no)
โข
BoardMapper.xml ์ id=โdeleteโ ์ฟผ๋ฆฌ์ ์ฐ๊ฒฐ
โฆ
BoardMapper.xml
โช
<delete id=โdeleteโ โฆ >
โข
์ ์ฉ๋ ๋ฐ์ดํฐ ํ์ ์๋ฅผ ๋ฐํ ( 0 ๋๋ 1 )
โข
View
โฆ
~/board/update.html ์์ [์ญ์ ] ๋ฒํผ์ผ๋ก ์์ฒญ
โข
Controller
โฆ
BoardController.java
โช
@GetMapping
โข
โช
@PostMapping(โ/board/deleteโ)
โข
@RequestBody Board board
โข
BoardService ์ delete() ๋ฉ์๋ ์์ฒญ
โข
์๋ต
โฆ
์์ฒญ ์ฑ๊ณต : (redirect) /board/list
โฆ
์์ฒญ ์คํจ : (redirect) /board/update?error