[์Šคํ”„๋ง DB 1ํŽธ] - 10. ํŠธ๋žœ์žญ์…˜ AOP / @Transactional

2023. 3. 25. 17:55ยทSpring/Spring DB

 

ํŠธ๋žœ์žญ์…˜ AOP ์ดํ•ด

 

์ง€๊ธˆ๊นŒ์ง€ ํŠธ๋žœ์žญ์…˜์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ํŠธ๋žœ์žญ์…˜ ์ถ”์ƒํ™”๋„ ๋„์ž…ํ•˜๊ณ ,

 

์ถ”๊ฐ€๋กœ ๋ฐ˜๋ณต์ ์ธ ํŠธ๋žœ์žญ์…˜ ๋กœ์ง์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋žœ์žญ์…˜ ํ…œํ”Œ๋ฆฟ๋„ ๋„์ž…ํ–ˆ๋‹ค.

 


ํŠธ๋žœ์žญ์…˜ ํ…œํ”Œ๋ฆฟ ๋•๋ถ„์— ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ˜๋ณต ์ฝ”๋“œ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

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

 

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

 

 

์ฐธ๊ณ  ) ์ง€๊ธˆ์€ @Transactional ์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํ”„๋ง์ด AOP๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŠธ๋žœ์žญ์…˜์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค ์ •๋„๋กœ ์ดํ•ดํ•ด๋„ ๋œ๋‹ค.

 

 

 

 

ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ

 

ํ”„๋ก์‹œ ๋„์ž… ์ „

 

ํ”„๋ก์‹œ๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์ „์—๋Š” ๊ธฐ์กด์ฒ˜๋Ÿผ ์„œ๋น„์Šค์˜ ๋กœ์ง์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์ง์ ‘ ์‹œ์ž‘ํ•œ๋‹ค.

 

์„œ๋น„์Šค์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋กœ์ง์ด ํ•จ๊ป˜ ์„ž์—ฌ์žˆ๋‹ค.

 

 

ํ”„๋ก์‹œ ๋„์ž… ํ›„

 

ํ”„๋ก์‹œ : ์ผ์ข…์˜ ๋Œ€๋ฆฌ์ธ์ด๋‹ค. ๋Œ€์‹  ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์‚ฌ๋žŒ์ด๋‹ค. 

 

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด์„œ ํ˜ธ์ถœํ•œ๋‹ค. 

 

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

 

 

ํŠธ๋žœ์žญ์…˜ ํ”„๋ก์‹œ๊ฐ€ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ๋ชจ๋‘ ๊ฐ€์ ธ๊ฐ„๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•œ ํ›„์— ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ๋Œ€์‹  ํ˜ธ์ถœํ•œ๋‹ค.

 

ํŠธ๋žœ์žญ์…˜ ํ”„๋ก์‹œ ๋•๋ถ„์— ์„œ๋น„์Šค ๊ณ„์ธต์—๋Š” ์ˆœ์ˆ˜ํ•œ ๋น„์ฆˆ๋‹ˆ์ฆˆ ๋กœ์ง๋งŒ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

 

ํŠธ๋žœ์žญ์…˜ ํ”„๋ก์‹œ ์ฝ”๋“œ

public class TransactionProxy {
    private MemberService target;
    public void logic() { 
        //ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘
        TransactionStatus status = transactionManager.getTransaction(..);
        try {
            //์‹ค์ œ ๋Œ€์ƒ ํ˜ธ์ถœ 
            target.logic();
            transactionManager.commit(status); //์„ฑ๊ณต์‹œ ์ปค๋ฐ‹ 
        } catch (Exception e) {
            transactionManager.rollback(status); //์‹คํŒจ์‹œ ๋กค๋ฐฑ
            throw new IllegalStateException(e);
        }
    } 
}

 

 

ํŠธ๋žœ์žญ์…˜ ํ”„๋ก์‹œ๊ฐ€ ์‹ค์ œ ํ˜ธ์ถœํ•ด์•ผํ•  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(target)์„ ๋‚ด๋ถ€์— ๊ฐ–๊ณ  ์žˆ๋‹ค .

 

ํŠธ๋žœ์žญ์…˜ ํ”„๋ก์‹œ ์ ์šฉ ํ›„ ์„œ๋น„์Šค ์ฝ”๋“œ

public class Service {
    public void logic() {
//ํŠธ๋žœ์žญ์…˜ ๊ด€๋ จ ์ฝ”๋“œ ์ œ๊ฑฐ, ์ˆœ์ˆ˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋งŒ ๋‚จ์Œ
        bizLogic(fromId, toId, money);
    }
}

 

 

์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ํŠธ๋žœ์žญ์…˜ AOP

 

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

 

์Šคํ”„๋ง์˜ ํŠธ๋žœ์žญ์…˜ AOP๋Š” ์ด ์• ๋…ธํ…Œ์ด์…˜์„ ์ธ์‹ํ•ด์„œ ํŠธ๋žœ์žญ์…˜ ํ”„๋ก์‹œ๋ฅผ ์ ์šฉํ•ด์ค€๋‹ค.

 

 

 

@Transactional ์ ์šฉ 

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

 

์ˆœ์ˆ˜ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋งŒ ๋‚จ๊ธฐ๊ณ , ํŠธ๋žœ์žญ์…˜ ๊ด€๋ จ ์ฝ”๋“œ๋Š” ๋ชจ๋‘ ์ œ๊ฑฐํ–ˆ๋‹ค.

 

์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ํŠธ๋žœ์žญ์…˜ AOP๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด @Transactional ์• ๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

 

 

 

 

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

@SpringBootTest
class MemberServiceV3_3Test

 

@SpringBootTest : ์Šคํ”„๋ง AOP๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

์ด ์• ๋…ธํ…Œ์ด์…˜์ด ์žˆ์œผ๋ฉด ํ…Œ์ŠคํŠธ์‹œ ์Šคํ”„๋ง ๋ถ€ํŠธ๋ฅผ ํ†ตํ•ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

@Autowired
MemberRepositoryV3 memberRepository;
@Autowired
MemberServiceV3_3 memberService;

 

๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ์—์„œ @Autowired ๋“ฑ์„ ํ†ตํ•ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋นˆ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

@TestConfiguration
static class TestConfig {
   @Bean
   DataSource dataSource() {
      return new DriverManagerDataSource(URL, USERNAME, PASSWORD);
   }
   @Bean
   PlatformTransactionManager transactionManager() {
      return new DataSourceTransactionManager(dataSource());
   }
   @Bean
   MemberRepositoryV3 memberRepositoryV3() {
      return new MemberRepositoryV3(dataSource());
   }
   @Bean
   MemberServiceV3_3 memberServiceV3_3() {
      return new MemberServiceV3_3(memberRepositoryV3());
   }
}

 

@TestConfiguration : ํ…Œ์ŠคํŠธ ์•ˆ์—์„œ ๋‚ด๋ถ€ ์„ค์ • ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ด ์—๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋ฉด,

 

์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋นˆ๋“ค์— ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•œ ์Šคํ”„๋ง ๋นˆ๋“ค์„ ๋“ฑ๋กํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

DataSource ์Šคํ”„๋ง์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค.

 

์ถ”๊ฐ€๋กœ ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €์—์„œ๋„ ์‚ฌ์šฉํ•œ๋‹ค.


DataSourceTransactionManager ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค.

 

์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ํŠธ๋žœ์žญ์…˜ AOP๋Š” ์Šคํ”„๋ง ๋นˆ์— ๋“ฑ๋ก๋œ ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋ฅผ ์ฐพ์•„์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—

 

ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด๋‘์–ด์•ผ ํ•œ๋‹ค.

 

 

 

 

ํŠธ๋žœ์žญ์…˜ AOP ์ ์šฉ ์ „์ฒด ํ๋ฆ„

 

 

0. AOP ํ”„๋ก์‹œ ์ƒ์„ฑ : @Transactional ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋Š” ์Šคํ”„๋ง์ด ํŠธ๋žœ์žญ์…˜์„ ์ ์šฉํ•˜๋Š” ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ฆ 

 

AOP ํ”„๋ก์‹œ์—์„œ ํŠธ๋žœ์žญ์…˜ ๋กœ์ง์„ ๋‹ค ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. ์‹ค์ œ ์„œ๋น„์Šค๋„ ๋Œ€์‹  ํ˜ธ์ถœํ•ด์ค€๋‹ค. 

 

 

1. ํด๋ผ์ด์–ธํŠธ ์„œ๋น„์Šค ํ˜ธ์ถœ : ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ

 

2. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ € ํš๋“ 

 

3. ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด์„œ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•œ๋‹ค. 

 

4. ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์ปค๋„ฅ์…˜์„ ์ƒ์„ฑ 

 

5. con.setAutoCommit(false) / ์ˆ˜๋™ ์ปค๋ฐ‹ ๋ชจ๋“œ ์„ค์ • 

 

6-7. ์ปค๋„ฅ์…˜ ๋™๊ธฐํ™” : ํŠธ๋žœ์žญ์…˜ ๋™๊ธฐํ™” ๋งค๋‹ˆ์ €์— ์ปค๋„ฅ์…˜์„ ๋ณด๊ด€ 

 

8. ํ”„๋ก์‹œ์—์„œ ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœ 

 

9. ์„œ๋น„์Šค ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ˆ˜ํ–‰ ->  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํ˜ธ์ถœ 

 

๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜ ๋™๊ธฐํ™” ๋งค๋‹ˆ์ €์— ๋ณด๊ด€๋œ ์ปค๋„ฅ์…˜์„ ๊บผ๋‚ด์„œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋กœ์ง์„ ์ˆ˜ํ–‰

 

10. ์„ฑ๊ณต -> commit   /   ์˜ˆ์™ธ -> rollback

 

 

 

 

์ •๋ฆฌ

 

์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋•๋ถ„์— ๋“œ๋””์–ด ํŠธ๋žœ์žญ์…˜ ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์ˆœ์ˆ˜ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


๊ฐœ๋ฐœ์ž๋Š” ํŠธ๋žœ์žญ์…˜์ด ํ•„์š”ํ•œ ๊ณณ์— @Transactional ์• ๋…ธํ…Œ์ด์…˜ ํ•˜๋‚˜๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

 

๋‚˜๋จธ์ง€๋Š” ์Šคํ”„๋ง ํŠธ๋žœ์žญ์…˜ AOP๊ฐ€ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

 

์ „์ฒด ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ์ดˆ์ ์„ ๋งž์ถ”์ž.

 

 

 

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

 

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

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

www.inflearn.com

 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'Spring > Spring DB' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์Šคํ”„๋ง DB 1ํŽธ] - 12. ์˜ˆ์™ธ(Exception)์˜ ์ดํ•ด / ์ฒดํฌ,์–ธ์ฒดํฌ ์˜ˆ์™ธ  (0) 2023.03.29
[์Šคํ”„๋ง DB 1ํŽธ] - 11. ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ ์ž๋™ ๋ฆฌ์†Œ์Šค ๋“ฑ๋ก  (0) 2023.03.25
[์Šคํ”„๋ง DB 1ํŽธ] - 9. ํŠธ๋žœ์žญ์…˜ ํ…œํ”Œ๋ฆฟ  (0) 2023.03.25
[์Šคํ”„๋ง DB 1ํŽธ] - 8. ํŠธ๋žœ์žญ์…˜ ์ถ”์ƒํ™”  (2) 2023.03.24
[์Šคํ”„๋ง DB 1ํŽธ] - 7. ์Šคํ”„๋ง๊ณผ ๋ฌธ์ œ ํ•ด๊ฒฐ - ํŠธ๋žœ์žญ์…˜  (0) 2023.03.21
'Spring/Spring DB' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [์Šคํ”„๋ง DB 1ํŽธ] - 12. ์˜ˆ์™ธ(Exception)์˜ ์ดํ•ด / ์ฒดํฌ,์–ธ์ฒดํฌ ์˜ˆ์™ธ
  • [์Šคํ”„๋ง DB 1ํŽธ] - 11. ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ ์ž๋™ ๋ฆฌ์†Œ์Šค ๋“ฑ๋ก
  • [์Šคํ”„๋ง DB 1ํŽธ] - 9. ํŠธ๋žœ์žญ์…˜ ํ…œํ”Œ๋ฆฟ
  • [์Šคํ”„๋ง DB 1ํŽธ] - 8. ํŠธ๋žœ์žญ์…˜ ์ถ”์ƒํ™”
hello_u
hello_u
  • hello_u
    ๐Ÿ˜œ
    hello_u
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๐Ÿ˜œ (345)
      • Hardware (2)
        • BMC (2)
      • Spring (109)
        • Spring ์ž…๋ฌธ (20)
        • Spring ๊ธฐ๋ณธ (27)
        • Spring MVC (18)
        • Spring DB (22)
        • Spring JPA ๊ธฐ๋ณธ (16)
        • Spring JPA ํ™œ์šฉ (6)
      • Develop (27)
        • DB (8)
        • JAVA (4)
        • Web (2)
        • Python (7)
        • OSS (2)
        • Git (2)
        • API (2)
      • Algorithm (155)
        • CodeUp ๊ธฐ์ดˆ (44)
        • ํŒŒ์ด์ฌ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (64)
        • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (4)
        • SWEA (30)
        • Softeer (10)
        • BOJ (2)
      • CS (9)
        • ์ปดํ“จํ„ฐ์ผ๋ฐ˜ (3)
        • ์šด์˜์ฒด์ œ (3)
        • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (0)
        • ์ •๋ณดํ†ต์‹  (1)
        • ์ž๋ฃŒ๊ตฌ์กฐ (1)
        • ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ (1)
        • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (0)
        • ์ตœ์‹  ๋””์ง€ํ„ธ, ์ผ๋ฐ˜์ƒ์‹ (0)
      • ์ž๊ฒฉ์ฆ (41)
        • ์ •๋ณด๋ณด์•ˆ๊ธฐ์‚ฌ (9)
        • ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ (22)
        • ๋ฆฌ๋ˆ…์Šค๋งˆ์Šคํ„ฐ 1๊ธ‰ (3)
        • SQLD (7)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
hello_u
[์Šคํ”„๋ง DB 1ํŽธ] - 10. ํŠธ๋žœ์žญ์…˜ AOP / @Transactional
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”