๋ณธ ๊ฒ์๊ธ ์ด๋ฏธ์ง๋ค์ AI๋ฅผ ํ์ฉํ์ฌ ์์ฑ๋์์ต๋๋ค.
์๋ ํ์ธ์!
์ด๋ฒ์ ํฐ์คํ ๋ฆฌ์ ๊ฐ๋ณ๊ฒ ์ ๋ฆฌํด๋๋ Spring ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋ ํ๊ธฐ ๋ค๊ณ ์์ด์.
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ์ ๋ฐฑ์๋ ํ๊ธฐ๋ ๋ฐ๋ก ๊ธธ๊ฒ ์จ๋๊ณ ,
๋๋์ด MyBatis๊ฐ ๋ฑ์ฅํ๋๋ฐ ํ๋ฒ ์ ๋ฆฌํด๋ณผ๊ฒ์! .
JDBC๋ ์๋ฆฌ๋ง, ์ค์ ์ MyBatis
๊ฐ์ฌ๋์ด ์ฒ์์ ์ด๋ ๊ฒ ์ ๋ฆฌํด์ฃผ์ จ์ด์.
JDBC๋ ์๋ฆฌ๋ง ์ดํดํ๋ฉด ๋๊ณ , ๋ชป ์จ๋ ํฌ๊ฒ ๋ฌธ์ ์๋ค๊ณ ์.
์๋ ๊ท์ฐฎ์ ์์ ์ด ๋ง์์
์ค์ ์์๋ ๋ค ์์ ๋ ๋ฒจ ํ๋ ์์ํฌ๋ฅผ ์ด๋ค๊ณ ํ์ จ์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ธ ๊ฑด MyBatis์ธ๋ฐ
์คํ๋ง์ด ์ฐ๋์ ์๋ ๊น๋ํ๊ฒ ์ง์ํด์ค์
์ ์ ์ฐ๋ฆฌ๊ฐ ์ ๊ฒฝ ์ธ ๊ฑด XML ์ฟผ๋ฆฌ๋ฟ์ด๋ผ๊ณ ํ์ จ์ด์.

์ปค๋ฅ์ ํ์ ํ์ค, ํ์นด๋ฆฌCP
๋ฐ์ดํฐ ์์ค ์๊ธฐ๊ฐ ๋์์ด์.
์ฐ๊ฒฐ๋ DB ์ปค๋ฅ์ ์ ๋ถ๋ฅด๋ ์ผ๋ฐ ์ฉ์ด์ด๊ณ ,
์ฃผ๋ก ์ปค๋ฅ์ ํ๋ก ๊ด๋ฆฌ๋๋ค๊ณ ํฉ๋๋ค.
์ปค๋ฅ์ ๋งบ๋ ์์ ์์ฒด๊ฐ ์ค๋ฒํค๋๊ฐ ํฐ ์์ ์ด๋ผ,
์ค๋ ๋ ํ์ฒ๋ผ ์ปค๋ฅ์ ๋ ๋ฏธ๋ฆฌ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ด๋๊ณ
ํ์ํ ๋๋ง๋ค ๊บผ๋ด ์ด๋ค๋ ๊ฑฐ์์.
์คํ๋ง์์ ๊ฑฐ์ ํ์ค์ฒ๋ผ ์ฐ์ด๋ ๊ฒ ํ์นด๋ฆฌCP๋ผ๊ณ ํ์ จ์ต๋๋ค.
์คํ ์์ ์์ ๋ ์๋ฟ๊ฒ ์ค๋ช ํด์ฃผ์ จ๋๋ฐ,
maximumPoolSize๋ฅผ 10์ผ๋ก ์ฃผ๋ฉด ์ปค๋ฅ์
์ ๋ฏธ๋ฆฌ 10๊ฐ ๋ง๋ค์ด๋๋ค๋ ๋ป์ด๊ณ
๊ทธ 10๊ฐ๊ฐ ์ด๋ฏธ DB์ ์ธ์ ์ฐ๊ฒฐ์ด ๋์ด ์๋ ์ํ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค๊ณ ํ์ จ์ด์.

์ ์ ์ ๋ณด๋ application.properties์ ๋ฐ๋ก ๋นผ์ ๊ด๋ฆฌํ์ด์.
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/scoladb
spring.datasource.username=scola
spring.datasource.password=****
์ค์ ํ์ผ์ด ์ ์๋ฐ ํด๋์ค์ผ๊น
์คํ ๊ฐ์ฌ๋์ด ์ด ๋ถ๋ถ์ ์ ์ผ ์ธ์ ๊น๊ฒ ์ค๋ช ํด์ฃผ์ จ์ด์.
ํฐ ํ๋ก์ ํธ์ผ์๋ก ๊ฐ๋ฐ(Dev)๊ณผ ์ด์(Ops)์ด ๋๋์ด ์๊ณ ,
์์ ํ๋ก์ ํธ๋ ๋ง์ดํฌ๋ก์๋น์ค์ ์ ํฉํ ๊ฒ DevOps๋ผ๊ณ ์.
๊ฐ๋ฐ์๊ฐ ๊ฐ๋ฐ๋ ํ๊ณ ์ ์ง๋ณด์๋ ํ๋ฉด
XML๋ ๋ค๋ฃจ๊ณ Java๋ ๋ค๋ค์ผ ํด์ ๋ถํธํ๋๊น,
๊ด๋ฆฌ๋ ํธํ๊ฒ ์ค์ ํ์ผ์กฐ์ฐจ Java๋ก ํ๋ ๊ฒ๋ฟ์ด๋ผ๊ณ ํ์ จ์ต๋๋ค.
(๊ฐ์ฌ๋ ํํ: "์ด๊ฒ ๋ญ ๋ ์ข๊ณ ๋์จ์ด ์๋์์")
๊ทธ๋์ RootConfig.java๊ฐ ์์ ์ XML ์ค์ ์ ๋์ ํ๋ ํด๋์ค์์.
๋น์ฆ๋์ค ๋ก์ง์ฉ ๋น(์๋น์ค, DAO, ๋งตํผ)์ RootConfig์์,
์น ๊ด๋ จ ๋น์ ServletConfig์์ ๊ด๋ฆฌํ๋ค๊ณ ์ ๋ฆฌํด์ฃผ์ จ์ด์.

@PropertySource๋ก properties ํ์ผ์ ์ฝ๊ณ
@Value("${jdbc.driver}") ๊ฐ์ ์์ผ๋ก ๊ฐ์ ์ฃผ์
๋ฐ๋ ํ๋ฆ๋ ๋ค์ ์ง์์ด์.
์ด ๋ ์ด๋ ธํ ์ด์ ์ด ์ง๊ฟ์ด๋ผ๋ ๊ฒ ํต์ฌ์ด์์ต๋๋ค.
๋งตํผ๋ ์ธํฐํ์ด์ค๋ง, ๊ตฌํ์ฒด๋ ์๋
DAO ๋์ MyBatis์์๋ Mapper๋ผ๋ ์ฉ์ด๋ฅผ ์ด๋ค๊ณ ํ์ จ์ด์.
์ ๊ธฐํ๋ ๊ฑด ์ธํฐํ์ด์ค๋ง ์ ์ํ๋ฉด
๊ตฌํ์ฒด๊ฐ ์๋์ผ๋ก ๋ง๋ค์ด์ง๋ค๋ ์ ์ด์์ต๋๋ค.
์ค์ ๋ก ํด๋์ค๋ช ์ ์ฐ์ด๋ณด๋ ํ๋ก์ ํํ๋ก ๋ง๋ค์ด์ ธ ์์์ด์.
๊ฐ๋จํ ์ฟผ๋ฆฌ๋ ์ด๋ ธํ ์ด์ ์ผ๋ก,
@Mapper
public interface TimeMapper {
@Select("SELECT NOW()")
String getTime();
}
๋ณต์กํ๊ฑฐ๋ ํ๋ผ๋ฏธํฐ๊ฐ ์๋ ์ฟผ๋ฆฌ๋ XML๋ก ๋ถ๋ฆฌํ๋ ๊ฒ ์ข๋ค๊ณ ํ์ จ์ด์.
์ด๋ ธํ ์ด์ ์ ๋ฌธ์์ด ์์ ์์ด์ ์ฒดํฌ๊ฐ ์ ์ ๋๋ค๋ ์ด์ ์์ต๋๋ค.

@MapperScan๊ณผ @Mapper, ํท๊ฐ๋ฆฌ์ง ๋ง๊ธฐ
์คํ์ ๊ฐ์ฌ๋์ด "์ด๊ฑฐ ์ค์ํด์" ํ๊ณ ๊ฐ์กฐํ์ ๋ถ๋ถ์ด์์.
@MapperScan์ ์ง์ ํ ํจํค์ง์ ๋ชจ๋ ์ธํฐํ์ด์ค๋ฅผ
์คํ๋ง ๋น์ผ๋ก ๊ด๋ฆฌํ๋ ค ํ๋ค๊ณ ํฉ๋๋ค.
๊ทธ๋์ ๋งตํผ์ ๊ด๋ จ ์๋ ์ผ๋ฐ ์ธํฐํ์ด์ค๊น์ง
๋งตํผ๋ก ๊ฐ์ฃผํด๋ฒ๋ฆฌ๋ ์ํ์ด ์๋ค๊ณ ์.
๊ทธ๋์ annotationClass = Mapper.class๋ฅผ ๊ฐ์ด ์ค์
@Mapper๊ฐ ๋ถ์ ์ธํฐํ์ด์ค๋ง ๊ด๋ฆฌํ๋๋ก ํ๋ ๊ฑธ ๊ถ์ฅํ๋ค๊ณ ํ์
จ์ด์.
ํ์ฅ์ฑ์ด ์ข์์ง๋ค๋ ์ด์ ์์ต๋๋ค.

๊ฒ์ํ ํ ์ด๋ธ๊ณผ VO ๋ง๋ค๊ธฐ
๋ง์ง๋ง์ ์ค์ ๊ฒ์ํ ํ ์ด๋ธ์ ๋ง๋ค์์ด์.
PK๋ number ํ์ ์ auto increment๋ฅผ ์คฌ์ต๋๋ค.
๊ฐ์ฌ๋์ด ์ ๋ ฌ ์๊ธฐ๋ฅผ ํ๋ฉด์ ํ ์ ์ง์ด์ฃผ์ จ๋๋ฐ,
ORDER BY reg_date DESC๋ณด๋ค
์ด๋ฏธ ์ธ๋ฑ์ค๋ก ์ ๋ ฌ๋ PK๋ก ์ ๋ ฌํ๋ ๊ฒ ํจ์ฌ ๋ซ๋ค๊ณ ํ์ จ์ด์.
๋ฐ์ดํฐ๊ฐ ๋ง์์ง๋ฉด ๋งค๋ฒ ์ ๋ ฌํ๋ ๋น์ฉ์ด ํฌ๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์.
CREATE TABLE tbl_board (
bno INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(200) NOT NULL,
content TEXT,
writer VARCHAR(50),
reg_date DATETIME DEFAULT CURRENT_TIMESTAMP,
update_date DATETIME DEFAULT CURRENT_TIMESTAMP
);

ํ ์ด๋ธ์ ๋ง๋ค๊ณ ๋๋ฉด
๊ทธ ํ ์ด๋ธ์ ํํํ๋ VO ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ ๋ค์ ์์์์.
๊ฐ์ฌ๋์ด ์ซ์ ํ์ ์ ๋ํผ ํด๋์ค๋ก ํ๋ ๊ฒ ์ข๋ค๊ณ ํ์ จ๋๋ฐ
ํ ์ด๋ธ์ ๋ค์ด๊ฐ๊ธฐ ์ ๊น์ง๋ ๊ฐ์ด 0์ด ์๋๋ผ
null๋ก ํํ๋ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋์
๋ ์ปฌ๋ผ๋ช ์ ์ธ๋๋ฐ๋ ์นด๋ฉ์ผ์ด์ค๋ก ๋ง์ถฐ์ฃผ๋ฉด์
MyBatis์ ์นด๋ฉ์ผ์ด์ค ๋งคํ ์ค์ ์ ๋ ์ฌ๋ฆฌ๋ฉด ์ข๋ค๊ณ ์ง์ด์ฃผ์ จ์ด์!

๋ง๋ฌด๋ฆฌ
์ด๋ฒ ์ฃผ๋ ์ง์ ํ๋ฉด์ ๋ญ๊ฐ๋ฅผ ๋์ฐ๊ธฐ๋ณด๋ค๋,
๊ฒ์ํ์ ๋ง๋ค๊ธฐ ์ํ ๋ฐ๋ฅ์ ๋ค์ง๋ ์๊ฐ์ด์์ด์.
ํฐ์คํ ๋ฆฌ์๋ ์ด๋ ๊ฒ ํต์ฌ๋ง ๊ฐ๋ณ๊ฒ ๋จ๊ฒจ๋๊ฒ์.
๋ ์์ธํ ์ฝ๋์ ๊ณผ์ ์ ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ ํ๊ธฐ์ ์ ๋ฆฌํด๋์ต๋๋ค.
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ถ๊ธํ ์ ์ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์!

#KBIT๊ต์ก #KBITSYOURLIFE #KB๊ตญ๋ฏผ์ํ๋ถํธ์บ ํ #๋ฉํฐ์บ ํผ์ค๋ถํธ์บ ํ #KB๋ถํธ์บ ํ #Spring #MyBatis #ํ์นด๋ฆฌCP #๋ฐ์ดํฐ๋ฒ ์ด์ค์ฐ๋ #๊ฐ๋ฐ์ํฌํธํด๋ฆฌ์ค #IT์ทจ์ค #TIL #์ ์ ๊ฐ๋ฐ์ #๋ถํธ์บ ํํ๊ธฐ