# Spring ํŠธ๋žœ์žญ์…˜ AOP - @Transactional ์‚ฌ์šฉ
Study Repository

Spring ํŠธ๋žœ์žญ์…˜ AOP - @Transactional ์‚ฌ์šฉ

by rlaehddnd0422

์ด ์ „ ํฌ์ŠคํŒ…์—์„œ ํŠธ๋žœ์žญ์…˜์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋žœ์žญ์…˜ ์ถ”์ƒํ™”์™€ ํŠธ๋žœ์žญ์…˜ ํ…œํ”Œ๋ฆฟ์„ ๋„์ž…ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์„œ๋น„์Šค ๊ณ„์ธต์— ์ˆœ์ˆ˜ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋งŒ ๋‚จ๊ธฐ๋Š” ๋ชฉํ‘œ์—๋Š” ๋„๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ์–ด์š”.

 

์ด๋Ÿด ๋•Œ ์Šคํ”„๋ง AOP๋ฅผ ํ†ตํ•ด ํ”„๋ก์‹œ๋ฅผ ๋„์ž…ํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 ์Šคํ”„๋ง AOP์™€ ํ”„๋ก์‹œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ถ”ํ›„์— ์ž์„ธํžˆ ๊ณต๋ถ€ํ•˜๊ณ  ๋‚จ๊ธฐ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

ํ”„๋ก์‹œ๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด  

์ด๋ ‡๊ฒŒ ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค ๊ฐ์ฒด๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•์€ ๋งค์šฐ๋งค์šฐ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ณณ์— @Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ง์˜ ํŠธ๋žœ์žญ์…˜ AOP๋Š” ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์ธ์‹ํ•ด์„œ ์ž๋™์œผ๋กœ ํŠธ๋žœ์žญ์…˜ ํ”„๋ก์‹œ๋ฅผ ์ ์šฉํ•ด ์ค๋‹ˆ๋‹ค!


Sol3. ํŠธ๋žœ์žญ์…˜ AOP - @Transactional ์‚ฌ์šฉ

์Šคํ”„๋ง AOP๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด ์–ด๋“œ๋ฐ”์ด์ €, ํฌ์ธํŠธ์ปท, ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ํ•„์š”๋กœํ•˜๋Š”๋ฐ ์Šคํ”„๋ง ๋ถ€ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 
>  ์–ด๋“œ๋ฐ”์ด์ €: BeanFactoryTransactionAttributeSourceAdvisor
>  ํฌ์ธํŠธ์ปท: TransactionAttributeSourcePointcut
>  ์–ด๋“œ๋ฐ”์ด์Šค: TransactionInterceptor
๋ฅผ ๋นˆ์œผ๋กœ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•ด์ค๋‹ˆ๋‹ค.

 

MemberService์— ์ ์šฉ

@Slf4j
@RequiredArgsConstructor
public class MemberServiceV3_3 {

//    private final PlatformTransactionManager transactionManager;
    private final MemberRepositoryV3 memberRepository;

    @Transactional
    public void accountTransfer(String fromId, String toId, int money) throws SQLException {
        buisnesslogic(fromId,toId,money);
    }

์ด๋ ‡๊ฒŒ @Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด ์„œ๋น„์Šค ๊ณ„์ธต์— ์˜ค๋กœ์ง€ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋งŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

+ ํด๋ž˜์Šค ๋ ˆ๋ฒจ์— ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋ฉด ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ public ๋ฉ”์†Œ๋“œ๊ฐ€ AOP ์ ์šฉ ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค.

 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์ ์šฉํ•˜๋ ค๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋ช‡ ๊ฐ€์ง€ ์„ค์ • ํ•„์š”
1. @SpringBootTest : ์Šคํ”„๋ง AOP ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ŠคํŠธ ์‹œ ์Šคํ”„๋ง ๋ถ€ํŠธ๋ฅผ ํ†ตํ•ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑ

2. @TestConfiguration : ํ…Œ์ŠคํŠธ ์•ˆ์—์„œ ๋‚ด๋ถ€์„ค์ • ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ๊ตฌํ˜„์ฒด ์ฃผ์ž… ํ•„์š”

3. ํŠธ๋žœ์žญ์…˜ AOP์—์„œ DataSource, ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ 2๋ฒˆ์— ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

AOP ๋™์ž‘๋ฐฉ์‹์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ 

@SpringBootTest
@Slf4j
class MemberServiceV3_3Test {

    @Autowired
    private MemberServiceV3_3 memberService;
    @Autowired
    private MemberRepositoryV3 memberRepository;

    public static final String MEMBER_A = "memberA";
    public static final String MEMBER_B = "memberB";
    public static final String MEMBER_EX = "ex";

    @TestConfiguration
    static class TestConfig
    {
        @Bean
        DataSource dataSource(){return new DriverManagerDataSource(URL,USERNAME,PASSWORD);}
        @Bean
        PlatformTransactionManager transactionManager()
        {
            return new DataSourceTransactionManager(dataSource());
        }
        @Bean
        MemberRepositoryV3 memberRepository()
        {
            return new MemberRepositoryV3(dataSource());
        }
        @Bean
        MemberServiceV3_3 memberService()
        {
            return new MemberServiceV3_3(memberRepository());
        }
    }
    ...
    // ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์ƒ๋žต 
}
  • ์Šคํ”„๋ง AOP๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ํด๋ž˜์Šค ๋ ˆ๋ฒจ์— @SpringBootTest ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์œ„ memberRepository์™€ memberService๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•˜๊ณ  ํ•„๋“œ์ฃผ์ž…์œผ๋กœ ์˜์กด๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€์ ์œผ๋กœ AOP์—์„œ ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €์™€ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ํ•„์š”๋กœ ํ•˜๋ฏ€๋กœ ์ด ๋˜ํ•œ ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
์ฐธ๊ณ ๋กœ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ œ์™ธํ•œ ๊ฒฝ์šฐ์—๋Š” ํ•„๋“œ ์ฃผ์ž…์ด ์•„๋‹Œ ์ƒ์„ฑ์ž ์ฃผ์ž…๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

https://rlaehddnd0422.tistory.com/25

 

Spring / ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… - ์ƒ์„ฑ์ž, ์ˆ˜์ •์ž, ํ•„๋“œ, ๋ฉ”์†Œ๋“œ

์—ฌ๋Ÿฌ๊ฐ€์ง€ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…๋ฐฉ๋ฒ• ํฌ๊ฒŒ 4๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. 1. ์ƒ์„ฑ์ž ์ฃผ์ž… 2. sertter ์ฃผ์ž… 3. ํ•„๋“œ ์ฃผ์ž… 4. ๋ฉ”์†Œ๋“œ ์ฃผ์ž… 1. ์ƒ์„ฑ์ž ์ฃผ์ž… ์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ์‹์€ ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ•ด์˜จ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ

rlaehddnd0422.tistory.com

 

+ DataSource, ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ € ์ž๋™ ๋“ฑ๋กํ•˜๊ธฐ.

 

์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์œ„์™€ ๊ฐ™์ด ์ง์ ‘ DataSource, ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋ฅผ ์ง์ ‘ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๋ฉด,

๊ธฐ๋ณธ์ ์œผ๋กœ DataSource๋Š” HikariDataSource๋ฅผ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋Š” ํ˜„์žฌ ๋“ฑ๋ก๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณด๊ณ  JDBC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š”DataSourceTransaction๋ฅผ, JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” JpaTransactionManager๋ฅผ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. (๋‘˜ ๋‹ค ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ JpaTransactionManager ๋“ฑ๋ก)

 

์ž๋™ ๋“ฑ๋ก ๋ฐฉ๋ฒ•

  •  application.properties์— datasource์˜ url, username, password ์„ค์ •ํ•˜๋ฉด ์Šคํ”„๋ง์ด ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒ๋‹จํ•ด์„œ ์ž๋™์œผ๋กœ ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €์™€ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. 
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.username=sa
spring.datasource.password=

 

๊ฒฐ๋ก ์ ์œผ๋กœ ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•ด (์˜ˆ์™ธ ๋ˆ„์ˆ˜ ๋ฌธ์ œ๋ฅผ ์ œ์™ธํ•˜๋ฉด) ๊ธฐ์กด ์„œ๋น„์Šค ๊ณ„์ธต์˜ ํŠธ๋žœ์žญ์…˜ ๋ฌธ์ œ๋ฅผ ์•„์ฃผ ๊น”๋”ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง์ด ์ด๋Ÿฐ๊ฒƒ๋„ ์–ด๋…ธํ…Œ์ด์…˜ ํ•˜๋‚˜๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋‹ˆ ์ ์  ์Šคํ”„๋ง์˜ ๋ฉ”๋ฆฌํŠธ๊ฐ€ ๋Š๊ปด์ง€๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‚จ์€ ์˜ˆ์™ธ ๋ˆ„์ˆ˜๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

<์ฐธ๊ณ ์ž๋ฃŒ>

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard

 

์Šคํ”„๋ง DB 1ํŽธ - ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ํ•ต์‹ฌ ์›๋ฆฌ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ DB ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ ์„ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ , ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ ์˜ ์›๋ฆฌ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๊นŠ์ด์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜

www.inflearn.com

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ