๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Backend/Spring AOP

[Spring] AOP(Aspect-Oriented Programming)๋ž€?

by persi0815 2024. 12. 14.

https://tecoble.techcourse.co.kr/post/2022-11-07-transaction-aop-fact-and-misconception/

 

๐ŸŒŠ AOP๋ž€? 

Aspect-Oriented Programming, ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
์†Œ์Šค ์ฝ”๋“œ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ€๊ฐ€์ ์ธ ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ, ๊ด€์ ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ๊ฐ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ์ฝ”๋“œ์˜ ๋ชจ๋“ˆ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„.

* ’๊ด€์ ’์ด๋ผ๋Š” ๋ง์ด ๋„ˆ๋ฌด ์–ด์ƒ‰ํ•ด์„œ ์•Œ์•„๋ดค๋”๋‹ˆ, ‘์ดˆ๋ณด ์›น ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์Šคํ”„๋ง 5 ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…๋ฌธ 158p’์—์„œ ‘๊ด€์ ’์ด๋ผ๋Š” ๋ง ๋Œ€์‹  ‘๊ธฐ๋Šฅ’ ๋‚ด์ง€ ‘๊ด€์‹ฌ’์ด๋ผ๊ณ  ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋” ์•Œ๋งž๋‹ค๊ณ  ํ•œ๋‹ค.
* ๋ชจ๋“ˆํ™”: ์–ด๋–ค ๊ณตํ†ต๋œ ๋กœ์ง์ด๋‚˜ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ฌถ๋Š” ๊ฒƒ

 

์ฆ‰, ์—ฌ๋Ÿฌ ๊ฐ์ฒด์— ๊ณตํ†ต์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•ด์„œ Aspect๋กœ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ๊ณตํ†ต ๊ธฐ๋Šฅ(ํฉ์–ด์ง„ ๊ด€์‹ฌ์‚ฌ)์˜ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์˜ ์ˆ˜์ • ์—†์ด ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

  • ํฉ์–ด์ง„ ๊ด€์‹ฌ์‚ฌ(Crosscutting Concerns): ์†Œ์Šค ์ฝ”๋“œ ์ƒ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ๊ณ„์† ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋“ค

 

ํ•ต์‹ฌ ๊ธฐ๋Šฅ์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•

1. ์ปดํŒŒ์ผ ์‹œ์ ์— ์ฝ”๋“œ์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•

: AOP ๊ฐœ๋ฐœ ๋„๊ตฌ๊ฐ€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ ํ•˜๊ธฐ ์ „์— ๊ณตํ†ต ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์†Œ์Šค์— ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘

 

2. ํด๋ž˜์Šค ๋กœ๋”ฉ ์‹œ์ ์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•

: ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•  ๋•Œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ํด๋ž˜์Šค์— ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘

 

3. ๋Ÿฐํƒ€์ž„์— ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•

: ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹

 

1,2๋ฒˆ์€ ์Šคํ”„๋ง AOP์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉฐ, AspectJ์™€ ๊ฐ™์ด aop ์ „์šฉ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐ŸŒฟ Spring AOP

Spring AOP๋Š” Aspect ํด๋ž˜์Šค์™€ Target Object๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑ”ํ•˜์—ฌ ์›๋ž˜์˜ ๋Œ€์ƒ ๊ฐ์ฒด๋ฅผ ๊ฐ์‹ธ๊ณ , ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ํ”„๋ก์‹œ๊ฐ€ ๊ฐ€๋กœ์ฑ„์„œ ๋ถ€๊ฐ€์ ์ธ ๋กœ์ง์„ ์‹คํ–‰ํ•œ๋‹ค. (๊ด€๋ฆฌ๋„ ์•Œ์•„์„œ ํ•ด์คŒ)
→ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜์˜ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค.
→ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†๋‹ค๋ฉด, ๊ตฌ์ฒด ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์˜ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค.

⇒ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋งŒ ์•Œ๋งž๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๊ณ , ํ”„๋ก์‹œ ํด๋ž˜์Šค๋Š” ์ง์ ‘ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
๊ทธ์ €, ๊ณตํ†ต๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•œ ๋’ค, AOP์˜ Aspect๋กœ ๋“ฑ๋ก๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

 

์Šคํ”„๋ง์€ ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•ด์„œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ์ ์— Aspect๋ฅผ ์ ์šฉํ•œ๋‹ค.

  • Proxy ๊ฐ์ฒด: ํ•ต์‹ฌ ๊ธฐ๋Šฅ์˜ ์‹คํ–‰์€ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์œ„์ž„ํ•˜๊ณ , ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด (๋Œ€์ƒ ๊ฐ์ฒด์˜ ๋Œ€๋ฆฌ์ธ. ๋Œ€์ƒ ๊ฐ์ฒด์˜ ๋™์ž‘์„ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ)
    • proxy ๊ฐ์ฒด: ์ ‘๊ทผ ์ œ์–ด ๊ด€์ ์— ์ดˆ์ .
    • decorator ๊ฐ์ฒด: ๊ธฐ๋Šฅ ์ถ”๊ฐ€์™€ ํ™•์žฅ์— ์ดˆ์ 
  • Target ๊ฐ์ฒด: ์‹ค์ œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฐ์ฒด

 

๐Ÿ“Œ ์ฃผ์š” ๊ฐœ๋…

  • Aspect: ๊ณตํ†ต์ ์œผ๋กœ ์ ์šฉ๋˜๋Š” ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ(์˜ˆ: ๋กœ๊น…, ๊ถŒํ•œ ๊ฒ€์‚ฌ). ์‹ค์ œ๋กœ ๊ตฌํ˜„๋œ ์ฝ”๋“œ
  • Advice: ์–ธ์ œ ๊ณตํ†ต ๊ด€์‹ฌ ๋กœ์ง์„ ํ•ต์‹ฌ ๋กœ์ง์— ์ ์šฉํ• ์ง€๋ฅผ ์ •์˜
    • Before: ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „์— ์‹คํ–‰
    • After: ๋ฉ”์„œ๋“œ ์‹คํ–‰ ํ›„์— ์‹คํ–‰
    • AfterReturning: ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋œ ํ›„ ์‹คํ–‰
    • AfterThrowing: ๋ฉ”์„œ๋“œ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ํ›„ ์‹คํ–‰
    • Around: ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „ํ›„์— ์‹คํ–‰ (๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋จ)
      • ๋Œ€์ƒ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „/ํ›„, ์ต์…‰์…˜ ๋ฐœ์ƒ ์‹œ์  ๋“ฑ ๋‹ค์–‘ํ•œ ์‹œ์ ์— ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฝ์ž… ๊ฐ€๋Šฅ
  • Join Point: Advice๊ฐ€ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์ง€์ (์˜ˆ: ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ, ํ•„๋“œ ์ ‘๊ทผ ๋“ฑ)
    • ์Šคํ”„๋ง์€ ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•ด์„œ AOP๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ Join point๋งŒ ์ง€์›
    • AspectJ๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ๋™์ž‘ํ•˜๋Š” ์™„์ „ํ•œ aop ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, join point์˜ ๋ฒ”์œ„๊ฐ€ ํ›จ์”ฌ ๋„“์Œ
  • Pointcut: Join Point๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š” ํ‘œํ˜„์‹. ์‹ค์ œ advice๊ฐ€ ์ ์šฉ๋˜๋Š” join point๋ฅผ ๋‚˜ํƒ€๋ƒ„
  • Weaving: Advice๋ฅผ ํ•ต์‹ฌ ๋กœ์ง ์ฝ”๋“œ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ

 

execution ๋ช…์‹œ์ž

: Advice๋ฅผ ์ ์šฉํ•  ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉ

@Pointcut("execution(* LuckyVicky.backend..*.controller.*.*(..)) || "
        + "execution(* LuckyVicky.backend..*.service.*.*(..)) ||"
        + " execution(* LuckyVicky.backend..*.repository.*.*(..))")
public void applicationLayerPointcut() {
}

 

execution(์ˆ˜์‹์–ดํŒจํ„ด ? ๋ฆฌํ„ดํƒ€์ž…ํŒจํ„ด ํด๋ž˜์Šค์ด๋ฆ„ํŒจํ„ด?๋ฉ”์„œ๋“œ์ด๋ฆ„ํŒจํ„ด(ํŒŒ๋ผ๋ฏธํ„ฐํŒจํ„ด)

- ์ˆ˜์‹์–ดํŒจํ„ด: ์ƒ๋žต ๊ฐ€๋Šฅ. public, protected๊ฐ€ ์˜ด. spring์—์„œ๋Š” public ๋ฉ”์„œ๋“œ์—๋งŒ ์ ์šฉ ๊ฐ€๋Šฅ.
- ๋ฆฌํ„ดํƒ€์ž…ํŒจํ„ด: ๋ฆฌํ„ดํƒ€์ž… ๋ช…์‹œ.
- ํด๋ž˜์Šค ์ด๋ฆ„ํŒจํ„ด, ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ํŒจํ„ด: ํด๋ž˜์Šค ์ด๋ฆ„ ๋ฐ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ํŒจํ„ด์œผ๋กœ ๋ช…์‹œ
- ํŒŒ๋ผ๋ฏธํ„ฐํŒจํ„ด: ๋งค์นญ๋  ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•ด ๋ช…์‹œ

 

@Pointcut ์• ๋…ธํ…Œ์ด์…˜์ด ์•„๋‹Œ @Around ์• ๋…ธํ…Œ์ด์…˜์— execution ๋ช…์‹œ์ž๋ฅผ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

@Around("execution(* LuckyVicky.backend..*.controller.*.*(..)) || "
        + "execution(* LuckyVicky.backend..*.service.*.*(..)) ||"
        + " execution(* LuckyVicky.backend..*.repository.*.*(..))")
public Object logError(ProceedingJoinPoint joinPoint) throws Throwable {

 

๋งŒ์•ฝ, ๊ฐ™์€ Pointcut์„ ์—ฌ๋Ÿฌ Advice๊ฐ€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๊ณตํ†ต pointcut์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

์•„๋ž˜ ์ฝ”๋“œ ์ฒ˜๋Ÿผ pointcut ์• ๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ public์œผ๋กœ ์ •์˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค!

@Aspect
@Component
public class ErrorLoggingAspect {

    private static final Logger logger = LoggerFactory.getLogger(ErrorLoggingAspect.class);

    @Pointcut("execution(* LuckyVicky.backend..*.controller.*.*(..)) || "
            + "execution(* LuckyVicky.backend..*.service.*.*(..)) ||"
            + " execution(* LuckyVicky.backend..*.repository.*.*(..))")
    public void applicationLayerPointcut() { 
    }
    // public์ด๋ผ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์œ„ํ•œ Advice์—์„œ๋„ ํ•ด๋‹น pointcut ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ!

    @AfterThrowing(pointcut = "applicationLayerPointcut()", throwing = "exception")
    public void logError(JoinPoint joinPoint, Throwable exception) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        String methodName = signature.getMethod().getName();
        String className = joinPoint.getTarget().getClass().getSimpleName();
        Object[] args = joinPoint.getArgs();

        logger.error("!! [ERROR] Exception in {}.{}() with arguments: {}", className, methodName, args);
        logger.error("Exception: {}", exception.getMessage(), exception);
    }
}

 

๐Ÿ“Œ Aspect๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋ฉด?

์–ด๋–ค Aspect๊ฐ€ ๋จผ์ € ์ ์šฉ๋ ์ง€๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ์ž๋ฐ” ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ์— ์ ์šฉ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๋ฉด, ์ง์ ‘ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ @Order๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

  • @Order(_) ๊ฐ’์ด ์ž‘์œผ๋ฉด ๋จผ์ € ์ ์šฉํ•˜๊ณ , ํฌ๋ฉด ๋‚˜์ค‘์— ์ ์šฉํ•œ๋‹ค.

 

๐Ÿ“Œ @Aspect์™€ ์ปดํฌ๋„ŒํŠธ ์Šค์บ”

@Aspect๊ฐ€ ์ปดํฌ๋„ŒํŠธ ์Šค์บ” ๋Œ€์ƒ์ด๊ธฐ์— @Aspect๊ฐ€ ๋ถ™๊ธฐ๋งŒ ํ•˜๋ฉด, ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์ค€๋‹ค.

๊ทธ๋ž˜์„œ, Spring AOP๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ @Aspect ์• ๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ ํด๋ž˜์Šค๋Š” ์ž๋™์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ์Šค์บ” ๋Œ€์ƒ์ด ๋˜์ง€๋งŒ, @EnableAspectJAutoProxy ์• ๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด AOP ์„ค์ •์ด ํ™œ์„ฑํ™”๊ฐ€ ๋œ ๊ฒฝ์šฐ์— ์ž‘๋™์ด ๋œ๋‹ค.

 

๋‹ค๋งŒ, Spring Boot์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ธฐ์— ๋”ฐ๋กœ ์‹ ๊ฒฝ ์จ์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ํ•˜์ง€๋งŒ, Spring Boot๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ˆœ์ˆ˜ Spring Framework ํ”„๋กœ์ ํŠธ์—์„œ๋Š” @EnableAspectJAutoProxy๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•ด์•ผ AOP ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋œ๋‹ค.

@EnableAspectJAutoProxy ์• ๋…ธํ…Œ์ด์…˜
- Spring AOP๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ์• ๋…ธํ…Œ์ด์…˜
- @Aspect ํด๋ž˜์Šค๊ฐ€ ์Šค์บ”๋˜๊ณ  ํ”„๋ก์‹œ๊ฐ€ ์ƒ์„ฑ 

 

@Aspect๋งŒ์œผ๋กœ๋„ Spring AOP๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์˜ ๋Œ€์ƒ์ด ๋˜์ง€๋งŒ, ๋ช…์‹œ์ ์œผ๋กœ ๋นˆ ๋“ฑ๋ก์„ ๋ณด์žฅํ•˜๊ฑฐ๋‚˜ ํ˜ผ๋™์„ ์ค„์ด๊ธฐ ์œ„ํ•ด @Component๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

์ด์— ๋Œ€ํ•œ ์žฅ์ ์ด..

1. AOP ์„ค์ •์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด๋„ ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜๊ณ , AOP๊ฐ€ ์•„๋‹Œ, ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ๋„ ์ด ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

2. @Aspect ํด๋ž˜์Šค๋„ ์ผ๋ฐ˜์ ์ธ ์Šคํ”„๋ง ๋นˆ์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ ์Šค์บ” ๋Œ€์ƒ์ž„์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด @Component๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ด€๋ก€๋ผ๊ณ  ํ•œ๋‹ค.

* @Controller, @Service, @Repository, @Configuration์€ ๋ชจ๋‘ @Component์˜ ํŠน์ˆ˜ ์• ๋…ธํ…Œ์ด์…˜์ด๋‹ค. ๊ทธ๋ž˜์„œ @Component๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๋ช…์‹œ์ ์œผ๋กœ ์Šค์บ” ๋Œ€์ƒ์ž„์„ ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“Œ AOP ์‚ฌ์šฉ ์‚ฌ๋ก€

  1. ๋กœ๊น…(Logging)
    ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋ฐ ์‘๋‹ต ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•˜๊ฑฐ๋‚˜, ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•ด๋‹น ์ •๋ณด๋ฅผ ๋กœ๊ทธ๋กœ ๋‚จ๊ธฐ๋Š” ๋ฐ ํ™œ์šฉ๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋””๋ฒ„๊น…์ด๋‚˜ ๋ฌธ์ œ ๋ถ„์„ ์‹œ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์†์‰ฝ๊ฒŒ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ(Transaction Management)
    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜์˜ ์‹œ์ž‘, ์ปค๋ฐ‹, ๋กค๋ฐฑ๊ณผ ๊ฐ™์€ ์ฒ˜๋ฆฌ๋ฅผ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „ํ›„์— ์ž๋™์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ์ค‘๋ณต์„ ์ค„์ด๊ณ  ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋กœ์ง์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ๊ถŒํ•œ ๊ฒ€์‚ฌ(Authorization)
    ํŠน์ • ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „์— ์‚ฌ์šฉ์ž ๊ถŒํ•œ์„ ํ™•์ธํ•˜์—ฌ, ๊ถŒํ•œ์ด ์—†๋Š” ์‚ฌ์šฉ์ž์˜ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•˜๋Š” ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ณด์•ˆ ๋กœ์ง์„ ์ค‘์•™ ์ง‘์ค‘ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง(Performance Monitoring)
    ๋ฉ”์„œ๋“œ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜์—ฌ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ์ง€์ ์„ ํŒŒ์•…ํ•˜๊ฑฐ๋‚˜ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฃผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

์ด๋Ÿฌํ•œ ์‚ฌ๋ก€๋“ค์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ ๋กœ์ง์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ๋„, ๋ถ€๊ฐ€์ ์ธ ๋กœ์ง์„ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. AOP๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

AOP๋ฅผ ์ด์šฉํ•œ "๋กœ๊น…" ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ ค๋ฉด ์•„๋ž˜ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•˜์ž!

https://persi0815.tistory.com/118

 

์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ์ž๋ฃŒ

https://tecoble.techcourse.co.kr/post/2022-11-07-transaction-aop-fact-and-misconception/

 

AOP์— ๋Œ€ํ•œ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด ๊ทธ๋Ÿฐ๋ฐ ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์•Œ์ง ๊ณ๋“ค์ธ..

๋“ค์–ด๊ฐ€๋ฉฐ ํŠธ๋žœ์žญ์…˜์„ ๊ณต๋ถ€ํ•˜๋‹ค๋ณด๋ฉด์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ AOP์— ๋Œ€ํ•ด ์ ‘ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. AOP๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด์„œ ์ง์ ‘ ๊ฒฝํ—˜ํ–ˆ๋˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด์— ๋Œ€ํ•ด์„œ ๊ณต์œ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์‚ฌ์‹ค: public์ด์™ธ์˜ ๋ฉ”์„œ

tecoble.techcourse.co.kr