โœ… Spring_

๐Ÿ”’ Spring ํŠธ๋žœ์žญ์…˜ : ์‹ค๋ฌด์—์„œ ์“ฐ๋Š” ์ง„์งœ ๊ฐœ๋…๋งŒ ์ •๋ฆฌ

CodeLoge 2025. 5. 3. 12:26

๐Ÿ”ธ ํŠธ๋žœ์žญ์…˜(Transaction)์ด๋ž€?

 

• ํ•˜๋‚˜์˜ ์ž‘์—… ๋‹จ์œ„๋ฅผ ๋ฌถ๋Š” ๊ฐœ๋…

• ์ „๋ถ€ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜, ์ „๋ถ€ ์‹คํŒจํ•ด์•ผ ํ•จ (์›์ž์„ฑ)

• ์˜ˆ : ๊ณ„์ขŒ ์ด์ฒด → ์ถœ๊ธˆ๊ณผ ์ž…๊ธˆ์ด ๋ชจ๋‘ ์„ฑ๊ณตํ•ด์•ผ ํ•จ

 

๐Ÿ”ธ ํŠธ๋žœ์žญ์…˜์ด ํ•„์š”ํ•œ ์ด์œ 

• ๋‹จ์ˆœ CRUD ์ž‘์—…์€ ๋ฌธ์ œ๊ฐ€ ์—†์Œ

• ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ DAO, ์—ฌ๋Ÿฌ ์ž‘์—…์ด ์—ฎ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ๋Š” ์‹คํŒจ ์‹œ ์ „์ฒด ์ทจ์†Œ๊ฐ€ ๋˜์–ด์•ผ ํ•จ

• ์ด๋ฅผ AOP ๋ฐฉ์‹์œผ๋กœ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•จ

 

๐Ÿ”ธ ํŠธ๋žœ์žญ์…˜ ์ ์šฉ ์œ„์น˜

• DAO X (๋‹จ๊ฑด ๋‹จ์œ„)

• Service ๊ณ„์ธต (๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง) O

• ์˜ˆ : ์—ฌ๋Ÿฌ DAO์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์„œ๋น„์Šค ๋ฉ”์„œ๋“œ

 

๐Ÿ”ธ ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ € ์ข…๋ฅ˜

 

ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋Š” ์‚ฌ์šฉํ•˜๋Š” DAO ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋“ฑ๋ก

DAO ๋ฐฉ์‹ ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ € Bean ID
JdbcTemplate DataSourceTransactionManager
MyBatis DataSourceTransactionManager
JPA/Hibernate JpaTransactionManager ๋˜๋Š” HibernateTransactionManager

 

<!-- JdbcTemplate ๋˜๋Š” MyBatis์šฉ ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ € -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

 

๐Ÿ”ธ ํŠธ๋žœ์žญ์…˜ AOP ์ ์šฉ

<!-- AOP ํŠธ๋žœ์žญ์…˜ Advice ์ •์˜ -->
<tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
        <tx:method name="insert*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="delete*" propagation="REQUIRED"/>
        <tx:method name="*" read-only="true"/>
    </tx:attributes>
</tx:advice>

 

 

• name="*": ํ•ด๋‹น ์ด๋ฆ„ ํŒจํ„ด์„ ๊ฐ€์ง„ ๋ฉ”์„œ๋“œ์— ํŠธ๋žœ์žญ์…˜ ์ ์šฉ

• propagation="REQUIRED": ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์ด ์žˆ์œผ๋ฉด ์ฐธ์—ฌ, ์—†์œผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑ

• read-only="true": ์ฝ๊ธฐ ์ „์šฉ ์ฟผ๋ฆฌ์—๋งŒ ํ—ˆ์šฉ

 

๐Ÿ”ธ ํŠธ๋žœ์žญ์…˜ AOP ์—ฐ๊ฒฐ

<aop:config>
    <aop:pointcut id="txPointcut" expression="execution(* com.example.service..*Impl.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>

 

๐Ÿ”ธ ํ•ต์‹ฌ

• ํŠธ๋žœ์žญ์…˜์€ CRUD์— ๋ถ™์ด๋Š” ๊ฒŒ ์•„๋‹˜!

• ํŠธ๋žœ์žญ์…˜์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋ถ™์ด๋Š” ๊ฒƒ

• ๋‹จ์ผ SQL์€ DB ๋ ˆ๋ฒจ์—์„œ ์ž๋™ ์ปค๋ฐ‹/๋กค๋ฐฑ์ด ๋˜์ง€๋งŒ์—ฌ๋Ÿฌ ์ž‘์—…์€ ๋ฌถ์–ด์•ผ ํ•จ

• ์šฐ๋ฆฌ๊ฐ€ AOP๋กœ ๋กœ๊น…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ, ํŠธ๋žœ์žญ์…˜๋„ AOP๋กœ ๋ฌถ์Œ

 

๐Ÿง  ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

 ํŠธ๋žœ์žญ์…˜์€ CRUD ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ, ๋น„์ฆˆ๋‹ˆ์Šค ๋ฉ”์„œ๋“œ ๋‹จ์œ„์—์„œ ์ „์ฒด๋ฅผ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐœ๋…

DAO๊ฐ€ ์•„๋‹ˆ๋ผ Service์—์„œ, @Transactional ๋˜๋Š” <tx:advice>๋กœ ์ฒ˜๋ฆฌ