๊ด€๋ฆฌ ๋ฉ”๋‰ด

Coding Planet

Spring JDBC์˜ ์ •์˜์™€ ํŠน์ง• ๋ณธ๋ฌธ

๐ŸŒฑSPRING

Spring JDBC์˜ ์ •์˜์™€ ํŠน์ง•

jhj.sharon 2023. 5. 18. 17:58
๋ฐ˜์‘ํ˜•
Spring Framework์˜ ํŠน์ง•์ค‘ Spring JDBC์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž

 

 

1. Spring JDBC๋ž€

 

  • Spring JDBC๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” JDBC(Java Database Connectivity) ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ธฐ์ˆ ์ด๋‹ค. JDBC๋Š” ์ž๋ฐ” ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๊ณ  ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ API์ด๋‹ค.
  • Spring JDBC๋Š” JDBC๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ณ  ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถ”์ƒํ™”๋œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋ฐ˜๋ณต์ ์ด๊ณ  ๋ฒˆ๊ฑฐ๋กœ์šด JDBC ์ž‘์—…์„ ๊ฐ„์†Œํ™”ํ•˜๊ณ  ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

Spring์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์˜ ๊ฒŒ์‹œํŒ ์‚ฝ์ž… DAO
Spring์—์„œ์˜ ๊ฒŒ์‹œ๊ธ€ ์‚ฝ์ž… . private SqlSessionTemplate sqlSession์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

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 ์ž‘์—…์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ , ์—ฐ๊ฒฐ ๋ฐ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ์ผ๊ด€๋œ ์˜ˆ์™ธ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ์ž์›์˜ ์˜ฌ๋ฐ”๋ฅธ ํ•ด์ œ๋ฅผ ๋ณด์žฅํ•œ๋‹ค.


๋ฐ˜์‘ํ˜•
Comments