2021. 11. 11. 16:09ใSpring
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์ ํด๋น๋๋ค.