์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[ KB IT's Your Life 7๊ธฐ ] Spring ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ํ›„๊ธฐ

yeye 2026. 6. 23. 15:28

๋ณธ ๊ฒŒ์‹œ๊ธ€ ์ด๋ฏธ์ง€๋“ค์€ 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 #์‹ ์ž…๊ฐœ๋ฐœ์ž #๋ถ€ํŠธ์บ ํ”„ํ›„๊ธฐ