Spring JDBC [1] DAO ํŒจํ„ด์ด๋ž€?, DataSource, JDBC, jdbcTemplate ํด๋ž˜์Šค

2021. 11. 11. 16:09ใ†Spring

728x90

1. DAO(Data Access Object) ํŒจํ„ด 

๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต์€ DAO ํŒจํ„ด์„ ์ ์šฉํ•˜์—ฌ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์›์น™์ด๋ผ๊ณ  ํ•œ๋‹ค. 

DAO ํŒจํ„ด์€ ์„œ๋น„์Šค ๊ณ„์ธต์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ธฐ์ˆ ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. 

 

 

2. DataSource 

DataSource๋Š” ์ปจ๋„ฅ์…˜ ํ’€๋ง์„ ์ง€์›ํ•œ๋‹ค. 

๋‹ค์ค‘ ์‚ฌ์šฉ์ž๋ฅผ ๊ฐ–๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‹œ์Šคํ…œ์ด๋ผ๋ฉด ๋ฐ˜๋“œ์‹œ DB ์ปค๋„ฅ์…˜ ํ’€๋ง ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” DataSource๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. 

-> Spring ์—์„œ๋Š” DataSource๋ฅผ ๊ณต์œ  ๊ฐ€๋Šฅํ•œ Spring Bean์œผ๋กœ ๋“ฑ๋กํ•ด์ฃผ์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

 

โ— ์ปจ๋„ฅ์…˜ ํ’€๋ง์ด๋ž€?

์ปจ๋„ฅ์…˜ ํ’€๋ง์€ ๋ฏธ๋ฆฌ ์ •ํ•ด์ง„ ๊ฐœ์ˆ˜๋งŒํผ์˜ DB์ปค๋„ฅ์…˜ ํ’€(pool)์— ์ค€๋น„ํ•ด๋‘๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์š”์ฒญํ• ๋•Œ ๋งˆ๋‹ค Pool์—์„œ ๊บผ๋‚ด์„œ ํ•˜๋‚˜์”ฉ ํ• ๋‹นํ•ด์ฃผ๊ณ  ๋‹ค์‹œ ๋Œ๋ ค๋ฐ›์•„์„œ Pool์— ๋„ฃ๋Š” ์‹์˜ ๊ธฐ๋ฒ•์ด๋‹ค. 

 

 

3. DataSource ๊ตฌํ˜„ ํด๋ž˜์Šค ์ข…๋ฅ˜ 

 

- ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์œ„ํ•œ DataSource

1๏ธโƒฃ SimpleDriverDataSource

: Spring์ด ์ œ๊ณตํ•˜๋Š” ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ DataSource ๊ตฌํ˜„ ํด๋ž˜์Šค์ด๋‹ค. 

getConnection()์„ ํ˜ธ์ถœํ•  ๋•Œ ๋งˆ๋‹ค ๋งค๋ฒˆ DB ์ปค๋„ฅ์…˜์„ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ๋”ฐ๋กœ ํ’€(Pool) ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ ์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. 

 

2๏ธโƒฃ SigleConnectionDriverDataSource

: ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰๋˜๋Š” ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. 

์ด DataSource ์—ญ์‹œ ๋งค๋ฒˆ DB์ปค๋„ฅ์…˜์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— SimpleDriverDataSource๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. 

 

 

- ์˜คํ”ˆ์†Œ์Šค DataSource

3๏ธโƒฃ Apache Commons DBCP 

: ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์˜คํ”ˆ์†Œ์Šค DB ์ปค๋„ฅ์…˜ ํ’€(pool) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. 

 

4๏ธโƒฃ c3p0 JDBC/DataSource Resource Pool

: c3p0 JDBC/DataSource Resource Pool์€ Connection๊ณผ Statement ํ’€์„ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. 

 

-> ๋‘๊ฐ€์ง€ ๋ชจ๋‘ setter ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Spring Bean์œผ๋กœ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•˜๋‹ค. 

 

4. JDBC

JDBC๋Š” ๋ชจ๋“  ์ž๋ฐ”์˜ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ธฐ์ˆ ์˜ ๊ทผ๊ฐ„์ด ๋œ๋‹ค. 

์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์™€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜๋Š” ์ตœ์‹  ORM(MyBatis, Hibernate) ๊ธฐ์ˆ ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” DB์™€ ์—ฐ๋™์„ ์œ„ํ•ด JDBC๋ฅผ ์ด์šฉํ•œ๋‹ค. 

-> JDBC๋Š” ์•ˆ์ „ํ•˜๊ณ  ์œ ์—ฐํ•œ ๊ธฐ์ˆ ์ด์ง€๋งŒ ๊ฐ„๋‹จํ•œ sql์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ๋„ ์ค‘๋ณต๋œ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ , Connection๊ณผ ๊ฐ™์€ ๊ณต์œ  ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๋Œ€๋กœ ๋ฆด๋ฆฌ์ฆˆ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์‹œ์Šคํ…œ ์ž์›์ด ๋ฐ”๋‹ฅ๋‚˜๋Š” ๋ฒ„๊ทธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. 

 

 

5. Spring JDBC

Spring JDBC๋Š” JDBC์˜ ์žฅ์ ๊ณผ ๋‹จ์ˆœ์„ฑ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ธฐ์กด์˜ JDBC์˜ ๋‹จ์ ์„ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ,  

๊ฐ„๊ฒฐํ•œ ํ˜•ํƒœ์˜ API ์‚ฌ์šฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ณ , JDBC API์—์„œ ์ง€์›๋˜์ง€ ์•Š๋Š” ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. 

 

Spring JDBC๋Š” ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•ด์•ผํ•˜๋Š” ๋งŽ์€ ์ž‘์—…๋“ค์„ ๋Œ€์‹ ํ•ด์ค€๋‹ค. 

๋”ฐ๋ผ์„œ Spring JDBC๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์‹คํ–‰ํ•  SQL๊ณผ ๋ฐ”์ธ๋”ฉํ•  ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ๋„˜๊ฒจ์ฃผ๊ฑฐ๋‚˜, ์ฟผ๋ฆฌ์˜ ์‹คํ–‰๊ฒฐ๊ณผ๋ฅผ ์–ด๋–ค ๊ฐ์ฒด์—๊ฒŒ ๋„˜๊ฒจ์ค„ ๊ฒƒ์ธ์ง€๋งŒ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

Spring JDBC๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € DB์ปค๋„ฅ์…˜์„ ๊ฐ€์ ธ์˜ค๋Š” DataSource๋ฅผ Bean์œผ๋กœ ๋“ฑ๋กํ•ด์•ผํ•œ๋‹ค. 

 

 

6. Spring JDBC๊ฐ€ ํ•˜๋Š” ์ž‘์—… 

 

1๏ธโƒฃ Connection ์—ด๊ธฐ์™€ ๋‹ซ๊ธฐ 

Connection๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ž‘์—…์„ Spring JDBC๊ฐ€ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. 

 

2๏ธโƒฃ Statement ์ค€๋น„์™€ ๋‹ซ๊ธฐ 

SQL ์ •๋ณด๊ฐ€ ๋‹ด๊ธด Statement ๋˜๋Š” PreparedStatment๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•„์š”ํ•œ ์ค€๋น„ ์ž‘์—…์„ ํ•ด์ฃผ๋Š” ๊ฒƒ ์—ญ์‹œ Spring JDBC๊ฐ€ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

Statment๋„ ์‚ฌ์šฉ์ด ๋๋‚˜๋ฉด Spring JDBC๊ฐ€ ์•Œ์•„์„œ ๊ฐ์ฒด๋ฅผ ๋‹ซ์•„์ค€๋‹ค. 

 

3๏ธโƒฃ Statement ์‹คํ–‰ 

SQL์ด ๋‹ด๊ธด Statement๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๋„ Spring JDBC๊ฐ€ ํ•ด์ค€๋‹ค. 

Statement์˜ ์‹คํ–‰๊ฒฐ๊ณผ๋Š” ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. 

 

4๏ธโƒฃ ResultSet Loop ์‹คํ–‰ 

ResultSet์— ๋‹ด๊ธด ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ํ•œ ๊ฑด ์ด์ƒ์ด๋ฉด ResultSet ๋ฃจํ”„๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜๋ณตํ•ด์ฃผ๋Š” ๊ฒƒ๋„ Spring JDBC๊ฐ€ ํ•ด์ฃผ๋Š” ์ž‘์—…์ด๋‹ค.

 

5๏ธโƒฃ Exception ์ฒ˜๋ฆฌ์™€ ๋ฐ˜ํ™˜ 

JDBC ์ž‘์—… ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์˜ˆ์™ธ๋Š” Spring JDBC ์˜ˆ์™ธ ๋ณ€ํ™˜๊ธฐ๊ฐ€ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. 

 

6๏ธโƒฃ Transaction ์ฒ˜๋ฆฌ 

Spring JDBC๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด transaction๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ž‘์—…์— ๋Œ€ํ•ด์„œ๋Š” ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. 

 

 

8. jdbcTemplate ํด๋ž˜์Šค 

: Spring JDBC๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค ์ค‘ jdbcTemplate๋Š” JDBC์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค. 

 

jdbcTemplate ๋Š” ์‹คํ–‰, ์กฐํšŒ, ๋ฐฐ์น˜์˜ ์„ธ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. 

1๏ธโƒฃ ์‹คํ–‰ : insert๋‚˜ update์™€ ๊ฐ™์ด db์˜ ๋ฐ์ดํ„ฐ์— ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ด๋‹ค. 

2๏ธโƒฃ ์กฐํšŒ : Select๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ž‘์—… 

3๏ธโƒฃ ๋ฐฐ์น˜ : ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฟผ๋ฆฌ๋ฅผ ํ•œ ๋ฒˆ์— ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ์ž‘์—… 

 

์ƒ์„ฑ ๋ฐฉ๋ฒ• 

JdbcTemplate template = new JdbcTemplate(dataSource); 

-> ์ด๋•Œ dataSource๋Š” ๋ณดํ†ต Bean์œผ๋กœ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— jdbcTemplate๋Š” ํ•„์š”ํ•œ dao ํด๋ž˜์Šค์—์„œ Datasource Bean DI(์˜์กด์„ฑ ์ฃผ์ž…) ๋ฐ›์•„์„œ jdbcTemplate์„ ์ƒ์„ฑํ•  ๋•Œ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค. 

 

9. update() 

: INSERT, UPDATE, DELETE์™€ ๊ฐ™์€ SQL์„ ์‹คํ–‰ํ•  ๋•Œ JdbcTemplate ํด๋ž˜์Šค์˜ upate() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

int update (String sql, [Sql ํŒŒ๋ผ๋ฏธํ„ฐ]);

 

update() ๋ฉ”์„œ๋“œ์˜ ๋ฆฌํ„ด๋˜๋Š” ๊ฐ’์€ SQL ์‹คํ–‰์œผ๋กœ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ ˆ์ฝ”๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. 

 

10. queryForObject()

: SELECT SQL์„ ์‹คํ–‰ํ•˜์—ฌ ํ•˜๋‚˜์˜ ROW๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” JdbcTemplate์˜ queryForObject() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

queryForObject(String sql, [SQL ํŒŒ๋ผ๋ฏธํ„ฐ], RowMapper<T> rm)

 

-> sql ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์นผ๋Ÿผ์„ ๊ฐ€์ง„ ํ•˜๋‚˜์˜ ํ–‰ 

-> T๋Š” VO ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ์˜๋ฏธํ•œ๋‹ค. 

-> sql ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ๋Œ์•„์˜จ ์—ฌ๋Ÿฌ๊ฐœ์˜ column ์„ ๊ฐ€์ง„ ํ•œ ๊ฐœ์˜ Row๋ฅผ RowMapper ์ฝœ๋ฐฑ์„ ์ด์šฉํ•ด VO ๊ฐ์ฒด๋กœ ๋งคํ•‘์„ ํ•ด์ค€๋‹ค.

-> ์˜ˆ๋กœ id๊ฐ€ ํ•œ ํšŒ์› ์•„์ด๋””์— ํ•ด๋‹นํ•˜๋Š” ํšŒ์› ์ด๋ฆ„, ๋ฒˆํ˜ธ ๋“ฑ์„ ์กฐํšŒํ•  ๋•Œ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

 

โ— RowMapper ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  

: queryForObject๋ฉ”์„œ๋“œ๋Š” ๋ฐ์ดํ„ฐํ˜•๋งŒ์„ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

 

 

 

11. query() 

: SELECT SQL์„ ์‹คํ–‰ํ•˜์—ฌ ์—ฌ๋Ÿฌ๊ฐœ์˜ Row๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” JdbcTemplate์˜ query() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

query(String sql, [SQL ํŒŒ๋ผ๋ฏธํ„ฐ], RowMapper<T> rm) 

 

-> SQL ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ column์„ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ row๋ฅผ RowMapper ์ฝœ๋ฐฑ์„ ์ด์šฉํ•ด vo ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•ด์ค€๋‹ค. 

-> ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๊ฐ’์€ ๋งคํ•‘ ํ•œ VO ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” List ํ˜•ํƒœ๋กœ ๋ฐ›๋Š”๋‹ค. ์ด๋•Œ List์˜ ๊ฐ ์š”์†Œ๊ฐ€ ํ•˜๋‚˜์˜ Row์— ํ•ด๋‹น๋œ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90