Coding Planet
Spring JDBC์ ์ ์์ ํน์ง ๋ณธ๋ฌธ
Spring Framework์ ํน์ง์ค Spring JDBC์ ๋ํด์ ์์๋ณด์
1. Spring JDBC๋
- Spring JDBC๋ ์คํ๋ง ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ JDBC(Java Database Connectivity) ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ธฐ์ ์ด๋ค. JDBC๋ ์๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ณ ์กฐ์ํ๊ธฐ ์ํ ํ์ค API์ด๋ค.
- Spring JDBC๋ JDBC๋ฅผ ๋ณด๋ค ์ฝ๊ณ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ์ถ์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ฐ, ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋ฐ๋ณต์ ์ด๊ณ ๋ฒ๊ฑฐ๋ก์ด JDBC ์์ ์ ๊ฐ์ํํ๊ณ ์์ฐ์ฑ์ ํฅ์์ํฌ ์ ์๋ค.
2. Spring JDBC์ ํน์ง
1) DataSource ์ถ์ํ
- Spring JDBC๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํ์ ๊ด๋ฆฌํ๊ธฐ ์ํ DataSource ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
- DataSource๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฐ ํธ๋์ญ์ ๊ด๋ฆฌ๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
2) ์์ธ ์ฒ๋ฆฌ ๋ฐ ์์ ๊ด๋ฆฌ
- Spring JDBC๋ JDBC ์์ ์์ ๋ฐ์ํ๋ ์์ธ๋ฅผ ์ผ๊ด๋๊ฒ ์ฒ๋ฆฌํ๊ณ , ์ฐ๊ฒฐ ๋ฐ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋ช ์์ ์ผ๋ก ๊ด๋ฆฌํด์ผ ํ๋ ๋ถ๋ถ์ ๊ฐ์ํํ๋ค.
3) SQL ๋ฌธ ์คํ ๋ฐ ๋งคํ
- Spring JDBC๋ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ธ ๋ฐฉ์์ผ๋ก SQL ๋ฌธ์ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์๋ฐ ๊ฐ์ฒด๋ก ๋งคํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ResultSet์ ์๋์ผ๋ก ๊ฐ์ฒด๋ก ๋ณํํ๊ณ , PreparedStatement ๋ฐ CallableStatement๋ฅผ ์ฌ์ฉํ์ฌ SQL ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ ์ ์๋ค.
4) ํธ๋์ญ์
๊ด๋ฆฌ
- Spring JDBC๋ ์คํ๋ง์ ํธ๋์ญ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ๊ณผ ํตํฉ๋๋ค. ๊ธฐ์กด์๋ Service์์ ์ปค๋ฐ๊ณผ ๋กค๋ฐฑ์ ์ค์ ํ์๋ค๋ฉด Spring์์๋ ์๋์ผ๋ก ๊ด๋ฆฌํด์ค๋ค.
- ํธ๋์ญ์ ๊ฒฝ๊ณ ์ค์ , ๋กค๋ฐฑ, ์ปค๋ฐ ๋ฑ์ ์์ ์ ํธ๋ฆฌํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
5) ๋ค์ํ Callback ๋ฐ ํ
ํ๋ฆฟ
- Spring JDBC๋ JdbcTemplate, NamedParameterJdbcTemplate, SimpleJdbcTemplate ๋ฑ์ ๋ค์ํ ํ ํ๋ฆฟ๊ณผ ์ฝ๋ฐฑ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ์ด๋ฅผ ํตํด ๋ฐ๋ณต์ ์ธ JDBC ์ฝ๋ ์์ฑ์ ๊ฐ์ํํ๊ณ , ์ผ๊ด์ฑ ์๋ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ก์ธ์ค ์์
์ ์ํํ ์ ์๋ค.
3. Spring JDBC์ ํ์ฉ
- ์๋์ฝ๋๋ root-context.xml์ ํ์ผ์์ Spring ํ๋ ์์ํฌ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ก์ธ์ค๋ฅผ ์ํด DBCP๋ฅผ ์ฌ์ฉํ๋ DataSource๋ฅผ bean์ผ๋ก ๋ฑ๋กํ๋ ์ค์ ์ด๋ค.
- ์ฌ๊ธฐ์ DataSource๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๊ณ ์ปค๋ฅ์ ํ์ ์ง์ํ๊ธฐ ์ํ ์ธํฐํ์ด์ค์ด๋ค.
- ์ด๋ ๊ฒ ๋ฑ๋ก๋ DataSource๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ฃผ์ ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๊ฒฐ์ ํธ๋ฆฌํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค. ์์์ ์ธ๊ธํ Spring์ ์ฌ์ฉํ๊ธฐ ์ ๊ณผ ํ์ DAO๋ฅผ ๋น๊ตํ ๋ด์ฉ์์ ํ์ธํ ์ ์๋ค.
?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<!--
root-context.xml ํ์ผ
- web.xml ํ์ผ์์ ๊ฐ์ฅ ๋จผ์ ์ฝ์ด๋ค์ด๋ ์ค์ ํ์ผ
- ํ๋ก์ ํธ ์ ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์์์ ์์ฑํ๊ณ ์ค์ ํ๋ ํ์ผ
- db ์ฐ๊ฒฐ ๊ด๋ จ ์ ๋ณด, ํธ๋์ญ์
์ฒ๋ฆฌ, ํ์ผ ์
๋ก๋ ๋ฑ์ ์์ฑ
-->
<!-- 1.DBCP ์ฌ์ฉ์ ์ํ DataSource๋ฅผ bean ๋ฑ๋ก -->
<!-- DataSource: java์์ Connection pool์ ์ง์ํ๊ธฐ ์ํ ์ธํฐํ์ด์ค(์ปค๋ฅ์
์ ์์๋ฒ์ ) -->
<!-- destroy-method="close" : ์ฃผ์ด์ง ์ธ์
์ ์๋์ผ๋ก ๋ฐํํ๋ ์ค์ -->
<bean id="realDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="community"/>
<property name="password" value="1234"/>
<!-- SQL์ด ์ํ๋ ํ ์๋์ผ๋ก Commit ๋๋๊ฒ์ ์ง์ -->
<property name="defaultAutoCommit" value="false"/>
<!-- ์ปค๋ฅ์
ํ ์ค์ -->
<property name="initialSize" value="10" /> <!-- ์ด๊ธฐ ์ปค๋ฅ์
์, ๊ธฐ๋ณธ 0 -->
<property name="maxTotal" value="50" /> <!-- ์ต๋ ์ปค๋ฅ์
์, ๊ธฐ๋ณธ 8 -->
<property name="maxIdle" value="20" /> <!-- ์ ํด ์ํ๋ก ์กด์ฌํ ์ ์๋ ์ปค๋ฅ์
์ต๋ ์, ๊ธฐ๋ณธ 8 -->
<property name="minIdle" value="10" /> <!-- ์ ํด ์ํ๋ก ์กด์ฌํ ์ ์๋ ์ปค๋ฅ์
์ต์ ์, ๊ธฐ๋ณธ 0 -->
<property name="maxWaitMillis" value="-1" /> <!-- ์์ธ ๋ฐ์ ์ ์ปค๋ฅ์
์ด ๋ฐํ ๋ ๋ ๊น์ง ๋๊ธฐํ๋ ์ต๋ ์๊ฐ(ms), ๊ธฐ๋ณธ -1(๋ฌด๊ธฐํ) -->
</bean>
4. JdbcTemplate์ ๊ธฐ๋ฅ
1) SQL ์คํ
JdbcTemplate์ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก SQL ๋ฌธ์ ์คํํ ์ ์์ต๋๋ค. execute() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ INSERT, UPDATE, DELETE ๋ฑ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์์
์ ์คํํ ์ ์๊ณ , query() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ SELECT ๋ฌธ์ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์๋ค.
2) PreparedStatement ์๋ ์ฒ๋ฆฌ
JdbcTemplate์ PreparedStatement๋ฅผ ์ฌ์ฉํ์ฌ SQL ๋ฌธ์ ์คํํ๋ค. SQL ํ๋ผ๋ฏธํฐ ๊ฐ์ ์ค์ ํ๊ธฐ ์ํด ?(placeholder)๋ฅผ ์ฌ์ฉํ๊ณ , JdbcTemplate์ด ์๋์ผ๋ก PreparedStatement๋ฅผ ์์ฑํ๊ณ ํ๋ผ๋ฏธํฐ ๊ฐ์ ์ค์ ํ๋ค. ์ด๋ฅผ ํตํด SQL ์ธ์ ์
๊ณต๊ฒฉ์ ๋ฐฉ์งํ ์ ์๋ค.
3) ResultSet ๋งคํ
JdbcTemplate์ ResultSet์ ์๋์ผ๋ก ์๋ฐ ๊ฐ์ฒด๋ก ๋งคํํฉ๋๋ค.
RowMapper ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ResultSet์ ๊ฐ ํ์ ๊ฐ์ฒด๋ก ๋ณํํ ์ ์๋ค.
BeanPropertyRowMapper์ ๊ฐ์ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฐ ๊ฐ์ฒด์ ํ๋กํผํฐ์ ResultSet์ ์ปฌ๋ผ์ ์๋์ผ๋ก ๋งคํํ ์๋ ์๋ค.
4) ํธ๋์ญ์
๊ด๋ฆฌ
ํธ๋์ญ์ ๊ฒฝ๊ณ ์ค์ , ๋กค๋ฐฑ, ์ปค๋ฐ ๋ฑ์ ์์ ์ ํธ๋ฆฌํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
@Transactional ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ ๋ฉ์๋ ๋ ๋ฒจ์์ ํธ๋์ญ์
์ ์ ์ธํ ์๋ ์๋ค.
5) ์์ธ ์ฒ๋ฆฌ ๋ฐ ์์ ๊ด๋ฆฌ
JdbcTemplate์ JDBC ์์ ์์ ๋ฐ์ํ๋ ์์ธ๋ฅผ ์ผ๊ด๋๊ฒ ์ฒ๋ฆฌํ๊ณ , ์ฐ๊ฒฐ ๋ฐ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ค.
์์ธ ๋ฐ์ ์ ์ผ๊ด๋ ์์ธ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ณ , ์์์ ์ฌ๋ฐ๋ฅธ ํด์ ๋ฅผ ๋ณด์ฅํ๋ค.
'๐ฑSPRING' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Handler Mapping๊ณผ Request Mapping์ด๋? (0) | 2023.05.18 |
---|---|
AOP(Aspect-Oriented Programming)๋? ์์ ํฌํจ (0) | 2023.05.18 |
Maven์ด๋? POM.XML์์ ์์กด์ฑ ๊ด๋ฆฌ, Maven ์ฌ์ฉํ์ฌ POM.XML์ DI ์ถ๊ฐํ๊ธฐ (0) | 2023.05.18 |
Spring root-context.xml ๋ฏ์ด๋ณด๊ธฐ (0) | 2023.05.03 |
Mybatis-confing.xml ๋ฏ์ด๋ณด๊ธฐ (0) | 2023.05.03 |