์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[์Šคํ”„๋ง] AOP์™€ @Transactional

๐Ÿ˜Ž ์ง€์‹ in Action/Spring ๐ŸŒฑ

by :ํ•ดํ”ผ๋ž˜๋น—๐Ÿพ 2024. 11. 27. 20:04

๋ณธ๋ฌธ

728x90

 

 
 

AOP

ํ•ต์‹ฌ๋กœ์ง๊ณผ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ
๋กœ๊น…, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ์ธ์ฆ์„ ๊ณตํ†ต ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์ธ Aspect์œผ๋กœ ์ •์˜ํ•˜๊ณ , Advice๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์‹œ์ ์— ์ฃผ์ž…
 
Spring AOP ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Before method: " + joinPoint.getSignature().getName());
    }

    @AfterReturning(value = "execution(* com.example.service.*.*(..))", returning = "result")
    public void logAfterReturning(JoinPoint joinPoint, Object result) {
        System.out.println("After method: " + joinPoint.getSignature().getName() + " returned " + result);
    }
}

Aspect : ๊ด€์‹ฌ์‚ฌ ๋ชจ๋“ˆํ™”ํ•œ๊ฒƒ
JoinPoint : Aspect ์ ์šฉ ์ง€์ 
Pointcut : ์‹ค์ œ๋กœ Aspect์„ ์ ์šฉํ•  ์ง€์ ์„ ์ •์˜ํ•˜๋Š” ํ‘œํ˜„์‹
 
Advice : Aspect๊ฐ€ JoinPoint์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…
Weaving : Aspect๋ฅผ ์‹ค์ œ ์ฝ”๋“œ์— ์ ์šฉํ•˜๋Š” ๊ณผ์ • (์ปดํŒŒ์ผ, ๋กœ๋“œ, ๋Ÿฐํƒ€์ž„ ์ค‘ ํ•˜๋‚˜์˜ ์‹œ์ )
@Before, @After, @AfterReturning @AfterThrowing @Around => ChainOfResponsibility ํŒจํ„ด
 
 
AOP๋Š” ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•จ
์Šคํ”„๋ง ๋นˆ ๋Œ€์ƒ์œผ๋กœ ๋™์  ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ AOP ๊ตฌํ˜„
JDK ๋™์  ํ”„๋ก์‹œ : ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ํ”„๋ก์‹œ ์ƒ์„ฑ
CGLIB : ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ํ”„๋ก์‹œ ์ƒ์„ฑ
์›๋ณธ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ ์ถ”๊ฐ€ !!
 
 
๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด
Wrapping ํ•ด์ฃผ๋Š” ์—ญํ•  
 
์˜ต์ €๋ฒ„ ํŒจํ„ด
 
 

@Transactional

ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•จ
ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ ๋‹จ์œ„์— ์„ ์–ธ๋˜๊ณ  ์ด๊ฒŒ ์ ์šฉ๋œ ํ”„๋ก์‹œ ๊ฐ์ฒด ์ƒ์„ฑํ•จ
Commit or Rollback ์ˆ˜ํ–‰
 
@Transacional๋„ proxy์™€ aspectJ ๋ชจ๋“œ๊ฐ€ ์žˆ๋‹ค 
public ๋ฉ”์„œ๋“œ์— ์ ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค 
์ƒ์† -> protected ๋ถ™์ผ ์ˆ˜ ์žˆ์Œ
์กฐํ•ฉ -> public๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
 
์ฃผ์˜ํ• ์ 
1) ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•จ
๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ @Transactional์ด ์ ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค 
ํŠธ๋žœ์žญ์…˜ ๋กœ์ง์„ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „์— ์ž๋™์œผ๋กœ ์‚ฝ์ž…ํ•œ๋‹ค
๋‹ค๋ฅธ ๋นˆ์„ ํ†ตํ•ด ํ˜ธ์ถœํ•จ 
 
2) ๋กค๋ฐฑ๋˜์ง€ ์•Š๋Š” ์˜ˆ์™ธ
@Transactional์€ RuntimeException์—๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋กค๋ฐฑํ•จ
์ฒดํฌ ์˜ˆ์™ธ๋Š” ํŠธ๋žœ์žญ์…˜์„ ๋กค๋ฐฑํ•˜์ง€ ์•Š์Œ
 


 

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ