1. ํธ๋์ญ์ ๋ค์์คํ์ด์ค ๋ฑ๋ก
ํธ๋์ญ์ ์ ์ํด xmlns:tx๋ฅผ ์ถ๊ฐํ๋ค.
[ applicationContext.xml ]
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<context:component-scan base-package="com.springbook.biz" />
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<!-- DataSource ์ค์ -->
<context:property-placeholder location="classpath:config/database.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- Spring JDBC ์ค์ -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
2. ํธ๋์ญ์ ๊ด๋ฆฌ์ ๋ฑ๋ก
๋ชจ๋ Transaction ๊ด๋ฆฌ์๋ PlatformTransactionManager interface๋ฅผ ๊ตฌํํ ํด๋์ค์ด๋ค.
๋ชจ๋ Transaction ๊ด๋ฆฌ์๋ Transaction ๊ด๋ฆฌ์ ํ์ํ commit(), rollback() ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
public interface PlatformTransactionManager{
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
JDBC๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ DataSourceTranscationManager ํด๋์ค๋ฅผ ์ด์ฉํ๋ค.
JPA๋ฅผ ์ด์ฉํ์ฌ DAO ํด๋์ค๋ฅผ ๊ตฌํํ๋ค๋ฉด JPATransactionManager๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด DataSourceTranscationManager ํด๋์ค๋ฅผ <bean> ๋ฑ๋กํ๋ค.
[ applicationContext.xml ์ค ์ถ๊ฐ ]
<!-- Transaction ์ค์ -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
๋น์ฆ๋์ค ๋ฉ์๋๊ฐ ์คํ๋๋ค๊ฐ "์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ๋ฉ์๋์ ๋ํ ํธ๋์ญ์ ์ ๋กค๋ฐฑ"ํ๊ณ "๋ฌธ์ ์์ด ์ ์์ผ๋ก ์ํ ์ข ๋ฃ๋๋ฉด ํธ๋์ญ์ ์ ์ปค๋ฐ"ํ๋ฉด ๋๋ค.
3. ํธ๋์ญ์ Advice ์ค์
ํธ๋์ญ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ด๋๋ฐ์ด์ค๋ <tx:advice> ์๋ฆฌ๋จผํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ํ๋ค.
ํธ๋์ญ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ด๋๋ฐ์ด์ค ํด๋์ค๋ ์ง์ ๊ตฌํํ์ง ์๋๋ค.
์คํ๋ง ์ปจํ ์ด๋๊ฐ <tx:advice> ์ค์ ์ ์ฐธ์กฐํ์ฌ ์๋์ผ๋ก ์์ฑํ๋ค.
[ applicationContext.xml ์ค ์ถ๊ฐ ]
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
์ด ๋ง์ ํธ๋์ญ์ ๊ด๋ฆฌ ์ด๋๋ฐ์ด์ค ๊ฐ์ฒด์ ํด๋์ค ์ด๋ฆ์ด๋ ๋ฉ์๋๋ฅผ ํ์ธํ ์ ์๋ค๋ ์๋ฏธ์ด๊ธฐ๋ ํ๋ค.
๋จ์ง ์ด๋๋ฐ์ด์ค์ ์์ด๋๋ฅผ id ์์ฑ์ผ๋ก, ์ด๋๋ฐ์ด์ค ๊ฐ์ฒด๊ฐ ์ฌ์ฉํ ํธ๋์ญ์ ๊ด๋ฆฌ์๋ฅผ transaction-manager ์์ฑ์ผ๋ก ์ง์ ํ ๋ฟ์ด๋ค!
์ ์ค์ ์ get์ผ๋ก ์์ํ๋ ๋ชจ๋ ๋ฉ์๋๋ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ฒ๋ฆฌ๋์ด ํธ๋์ญ์ ๊ด๋ฆฌ ๋์์์ ์ ์ธํ๋ค.
๊ทธ ์ธ ๋๋จธ์ง ๋ฉ์๋๋ค์ ํธ๋์ญ์ ๊ด๋ฆฌ์ ํฌํจํ๋ค๋ ๋ป์ด๋ค.
4. <aop:advisor> ํธ๋์ญ์ ์ ์ฉ
<aop:advisor>์ <aop:aspect>๋ ๊ฐ์ ๊ธฐ๋ฅ์ ์๋ฆฌ๋จผํธ์ด๋ค. ํฌ์ธํธ์ปท๊ณผ ์ด๋๋ฐ์ด์ค์ ๊ฒฐํฉ์ ํ๋ ์๋ฆฌ๋จผํธ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ ๋๋ก ๋๋์์๊น?
<aop:aspect> ์๋ฆฌ๋จผํธ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํฌ์ธํธ์ปท๊ณผ ๊ฒฐํฉํ ์ด๋๋ฐ์ด์ค ๊ฐ์ฒด์ ์์ด๋์ ์ด๋๋ฐ์ด์ค ๋ฉ์๋ ์ด๋ฆ์ ์์์ผ ํ๋ค. ํ์ง๋ง ํธ๋์ญ์ ๊ด๋ฆฌ ์ด๋๋ฐ์ด์ค๋ ์์ ๊ฐ์ด ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์๋์ผ๋ก ์์ฑํ๋ฏ๋ก, ์ด๋๋ฐ์ด์ค ๋ฉ์๋ ์ด๋ฆ์ ๋ชฐ๋ผ์ <aop:aspect> ์๋ฆฌ๋จผํธ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋์ <aop:advisor>๋ฅผ ์ฌ์ฉํ๋ค.
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com.springbook.biz..*(..))"/>
<aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/>
</aop:config>
์์ค์ฝ๋ ํ๋ฒ์ ๋ณด๊ธฐ
ํธ๋์ญ์ ์ค์ ์ด ์๋ฃ๋ ์ ์ฒด ์์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.
[ applicationContext.xml ]
<!-- DataSource ์ค์ -->
<context:property-placeholder location="classpath:config/database.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- Spring JDBC ์ค์ -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- Transaction ์ค์ -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com.springbook.biz..*(..))"/>
<aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/>
</aop:config>
์ ๋ฆฌ: ์ด๋ค ์์๋ก ๋์ํ๋๊ฐ?
โ ํด๋ผ์ด์ธํธ๊ฐ BoardServiceImpl ๊ฐ์ฒด์ insert() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด, โก insertBoard() ๋ฉ์๋์ ๋น์ฆ๋์ค ๋ก์ง์ด ์ํ๋๋ค.
๋ง์ฝ insertBoard() ์ํ ์ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด โข txAdvice๋ก ๋ฑ๋กํ ์ด๋๋ฐ์ด์ค๊ฐ ๋์ํ์ฌ โฃ txManager์ rollback() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
๋ง์ฝ ์ ์์ ์ผ๋ก ์ํ๋์๋ค๋ฉด commit() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
'Spring > Spring Quick Start' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
forward์ redirect ์ฐจ์ด (0) | 2021.01.07 |
---|---|
Model 2 ์ํคํ ์ณ๋ก ๊ฒ์ํ ๊ฐ๋ฐ (Controller์ ๋ฑ์ฅ) (0) | 2021.01.07 |
Model 1 ์ํคํ ์ณ๋ก ๊ฒ์ํ ๊ฐ๋ฐ (JSP์ JavaBeans๋ง์ ์ฌ์ฉ) (0) | 2021.01.07 |
ํ๋กํผํฐ ํ์ผ์ ์ด์ฉํ Spring JDBC (0) | 2021.01.07 |
Annotation ๊ธฐ๋ฐ AOP ์ ์ฉ (0) | 2021.01.07 |
JointPoint ๋ฉ์๋ (0) | 2021.01.07 |