Spring Boot + MyBatis + MySQL
Spring Boot ํ๋ก์ ํธ์์ MyBatis๋ฅผ ์ด์ฉํ MySQL ์ฐ๋ ๋ฐฉ๋ฒ์ด๋ค.
* Spring Boot ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ณ ๊ธฐ๋ณธ์ ์ธ ์ธํ ์ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ๊ธฐ์
1. ์์กด์ฑ ์ถ๊ฐ
mybatis ๋ฐ mysql์ ์ฌ์ฉํ๊ธฐ ์ํด ํด๋น ์์กด์ฑ์ ์ถ๊ฐํ๋ค.
maven์ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์ ์ค์ ํ์ผ์ธ pom.xml์์ ์์กด์ฑ์ ์ถ๊ฐํ๋ฉด ๊ธ๋ก๋ฒ ์ ์ฅ์์์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก์ปฌ ์ ์ฅ์๋ก ๋ค์ด๋ก๋ํ๊ณ ํด๋์ค ํจ์ค๋ฅผ ์ง์ ํ์ฌ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค.
์๋ ๋งํฌ์ MVN Repository์์ ์ํ๋ ์์กด์ฑ์ ๊ฒ์ํ์ฌ ์ถ๊ฐํ ์ ์๋ค. ๋ณดํต ๋ณดํธ์ ์ธ ๋ฒ์ ์ด๋ ์ต์ ๋ฒ์ ์ ์ฌ์ฉํ๋ค.
https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.28
* Duplicating managed version 8.0.28 for mysql-connector-java ๊ฒฝ๊ณ
์์กด์ฑ์ ์ถ๊ฐํ๋๋ฐ ์๋์ ๊ฐ์ด ๋ ธ๋์ ๊ฒฝ๊ณ (Duplicating managed version 8.0.28 for mysql-connector-java)๊ฐ ๋จ๋ ๊ฒฝ์ฐ๋ ์ฌ์ฉํ๋ ค๋ ๋ฒ์ ์ด Spring Boot ๋ฒ์ ๊ณผ ๋ง์ง ์์์ ๋ฐ์ํ๋ ๊ฒฝ๊ณ ์ด๋ค. ๊ผญ ๊ทธ ๋ฒ์ ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ๋ฒ์ ์ ๋ง์ถฐ์ฃผ๋ฉด ๋๋ค.
Spring Boot์์๋ ์์กด์ฑ์ ์ ์ํ ๋ ๋ฒ์ ์ ๋ช ์ํ์ง ์์๋ ์์์ ์ ์ ํ ๋ฒ์ ์ ๊ฐ์ ธ์์ฃผ๋ ์์กด์ฑ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ด ์๋ค.
- mysql-connector-java: mysql๊ณผ ํต์ ํ ์ ์๋๋ก ํ๋ ๋๋ผ์ด๋ฒ
- mybatis-spring-boot-starter: spring boot์ฉ mybatis
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
mysql์ ๊ตณ์ด ๋ฒ์ ์ ๋ช ์ํ์ง ์์๋ ์๋์ผ๋ก ๋ฒ์ ์ด ๋งคํ๋์ง๋ง mybatis ๊ฐ์ ์ธ๋ถ ์์กด์ฑ์ ๋ฒ์ ์ ์ง์ ์ ์ด์ฃผ๋ ๊ฒ์ด ์ข๋ค.
2. database ๋ฐ mybatis ์ธํ
application.properties์ ์๋์ ๊ฐ์ด ์ค์ ํด์ค๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ์ค์ ์ url, ์ฌ์ฉ์ ๊ณ์ ์ ๋ณด, ๋๋ผ์ด๋ฒ ํด๋์ค๋ฅผ ์ ์ด์ค๋ค.
๋ง์ด๋ฐํฐ์ค ๊ด๋ จ ์ค์ ์ ๋งคํผ์ฉ ํด๋์ค๊ฐ ์์นํ ๊ฒฝ๋ก, xml ํ์ผ์ด ์์นํ ๊ฒฝ๋ก๋ฅผ ์ ์ด ํด๋น ๊ฒฝ๋ก์ ํ์ผ์ ์ฝ์ด๋ค์ด๋๋ก ํ๋ฉด ๋๋ค.
# database
spring.datasource.url=jdbc:mysql://localhost:3306/๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช
?characterEncoding=utf8
spring.datasource.username=๊ณ์ ID
spring.datasource.password=๊ณ์ PW
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# mybatis
mybatis.type-aliases-package=com.plus.tistory.dao
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
3. mybatis-config.xml ํ์ผ ์์ฑ
resources ๋ด์ mybatis-config.xml ํ์ผ์ ๋ง๋ค๊ณ ์๋์ ๊ฐ์ด ์ ์ด์ค๋ค.
๋ง์ฝ ์ค์ ํ์ผ์ ์ฐพ์ง ๋ชปํด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด application.properties์ mybatis.config=mybatis-config.xml ์ ๊ฐ์ด ์ค์ ํ์ผ๋ช ์ ์ง์ ์ง์ ํด์ฃผ์ด๋ ๋๋ค.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true" />
<setting name="callSettersOnNulls" value="true"/>
</settings>
</configuration>
์ฌ๊ธฐ๊น์ง๊ฐ ์ธํ ์ ๋์ด๋ค. ์ด์ mybatis๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ mvc ํจํด์ผ๋ก db์ ์ ๊ทผํด๋ณด์.
4. Controller / Service / Vo / Dao ์์ฑ
- Controller
package com.plus.tistory.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.plus.tistory.service.TestService;
import com.plus.tistory.vo.User;
@RestController
public class TestController {
@Autowired
private TestService testService;
@RequestMapping("/")
public String hello() {
return "Hello Test Page!";
}
@GetMapping("/test")
public List<User> test() {
return testService.getUserList();
}
}
- Service
package com.plus.tistory.service;
import java.util.List;
import com.plus.tistory.vo.User;
public interface TestService {
public List<User> getUserList();
}
package com.plus.tistory.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.plus.tistory.dao.TestMapper;
import com.plus.tistory.vo.User;
@Service
public class TestServiceImpl implements TestService {
@Autowired
private TestMapper testMapper;
@Override
public List<User> getUserList() {
return testMapper.getUserList();
}
}
- Vo
package com.plus.tistory.vo;
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- Dao
@Mapper ์ด๋ ธํ ์ด์ ์ผ๋ก mapper.xml ์ ์ฐ๊ฒฐํด์ฃผ๋ฏ๋ก ๊ผญ ์ ์ด์ฃผ์ด์ผ ํ๋ค.
package com.plus.tistory.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import com.plus.tistory.vo.User;
@Repository
@Mapper
public interface TestMapper {
List<User> getUserList();
}
<?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">
<mapper namespace="com.plus.tistory.dao.TestMapper">
<select id="getUserList" resultType="com.plus.tistory.vo.User">
SELECT * FROM USER;
</select>
</mapper>
- ํ ์คํธ์ฉ ํ ์ด๋ธ ์์ฑ ๋ฐ ๋ฐ์ดํฐ ์ฝ์
create table USER (
name varchar(20),
age integer
);
insert into USER(name, age) values ('eric', 10);
์ด๋ ๊ฒ ์์ฑํ๋ฉด ์ฐ๋์ ๋๋๋ค.
* org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) ์ค๋ฅ
ํด๋น ์ค๋ฅ ๋ฐ์ ์ Mapper ์ธํฐํ์ด์ค์ Mapper xml์์ ์ ์ id๊ฐ ์ผ์นํ๋์ง ํ์ธํด๋ด์ผ ํ๋ค. ์ผ์นํ๋๋ฐ ์ด์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ Mapper xml์ ์์น๋ฅผ ์ง์ ํด์ฃผ๋ ์ค์ ํ์ผ ๋ด mybatis.mapper-locations ์ค์ ๊ฒฝ๋ก๋ฅผ ํ์ธํด๋ณด์.
์๋ฒ ๊ธฐ๋ ํ /test ๊ฒฝ๋ก๋ก ์์ฒญํด๋ณด๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค. RestController๋ก ๋ง๋ค์ด๋จ๊ธฐ ๋๋ฌธ์ List<User>์ ๊ฐ์ ๋ฐํํ๋ค.
'๊ฐ๋ฐ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring Security ์ค๋ณต ๋ก๊ทธ์ธ ๋ฐฉ์ง ์ค์ (0) | 2022.03.15 |
---|---|
Spring Boot ํ๋ก์ ํธ git ์ฐ๋ (0) | 2022.03.09 |
Spring Boot ํ๋ก์ ํธ ์์ฑํ๊ธฐ (0) | 2022.03.08 |
JPA, Hibernate (0) | 2022.03.08 |
Spring Security (0) | 2022.03.07 |
๋๊ธ