์‹œํ๋ฆฌํ‹ฐ์ง€ํ˜ธ 2024. 2. 8. 16:00

 

//๋กœ๊น… xml ๊นŒ์ง€ ์‹น ๋‹ค ์ •๋ฆฌํ•˜๊ธฐ

package dev.syntax.aop.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

// Logging์— ๋Œ€ํ•œ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ณ„๋„์˜ ๋ชจ๋“ˆ์ธ ํ•˜๋‚˜์˜ Aspect๋กœ ์ง€์ •
@Aspect // ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ AOP์˜ ์• ์ŠคํŽ™ํŠธ๋ผ๊ณ  ๋ช…์‹œ
@Component // ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ LoggingAspect๋ฅผ ํ•˜๋‚˜์˜ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์„œ ์Šคํ”„๋ง AOP ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ด Aspect๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋„๋ก
@Slf4j // ๋กœ๊น…์„ ์œ„ํ•œ ๋กฌ๋ณต Annotation
public class LoggingAspect {

    /*
     * Advice: ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” Aspect์˜ ๋ฉ”์„œ๋“œ, ์ด ์ฝ”๋“œ์—์„œ๋Š” logBefore()
     * JoinPoint: ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ ์šฉํ•  ๋ฉ”์„œ๋“œ
     * Pointcut: ๊ฐ ์–ด๋“œ๋ฐ”์ด์Šค์—์„œ ๊ทธ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ ์šฉํ•  ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌ๋ณ„์‹œ์ผœ์ฃผ๋Š” ๊ตฌ๋ณ„์ž(ํ‘œํ˜„์‹)
     */

    // ํฌ์ธํŠธ์ปท ์‹ ↓
    // execution: ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค
    // execution( *(Asterisk) ~ : ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์€ ๋ฌด์—‡์„ ์‚ฌ์šฉํ•˜๋“  ์ƒ๊ด€์—†์Œ
    // dev.syntax.aop.controller : ํ•ด๋‹น ํŒจํ‚ค์ง€ ํ•˜์œ„์— ์†ํ•ด์•ผํ•จ
    // *Controller : ํด๋ž˜์Šค ์ด๋ฆ„์ด ~Controller๋กœ ๋๋‚˜์•ผํ•จ
    // *( ) : ๋ฉ”์„œ๋“œ๋กœ ์ „๋‹ฌ๋˜๋Š” ์ธ์ˆ˜๋„ ์ƒ๊ด€์—†์Œ
    // (..) : ๋Œ€์ƒ ๋ฉ” ์„œ๋“œ๊ฐ€ ์ธ์ˆ˜๋ฅผ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ๊ณ , ํ•˜๋‚˜ ์ด์ƒ์˜ ์ธ์ˆ˜๋ฅผ ๋ฐ›์•„๋„ ์ƒ๊ด€์—†์Œ
    @Before(value = "execution(* dev.syntax.aop.controller.*Controller.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        // ํ˜ธ์ถœ๋œ ํด๋ž˜์Šค ๋ฐ ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„ ๋กœ๊น…
        log.info("-- "
                + joinPoint.getTarget().getClass().getSimpleName() + "'s "
                + joinPoint.getSignature().getName()
        );

        // ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ์˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’ ๋กœ๊น…

        Object[] args = joinPoint.getArgs(); // getArgs()  : ๋Œ€์ƒ(Target) ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋œ ์ธ์ˆ˜๋ฅผ ์–ป๋Š”๋‹ค.

        for (int i = 0; i < args.length; i++) {
            log.info("args[" + i + "] -->" + args[i]);

        }
    }

    @After(value = "execution(* dev.syntax.aop.controller.*Controller.*(..))")
    public void logafter(JoinPoint joinPoint) {
        log.info("-- "
                + joinPoint.getTarget().getClass().getSimpleName() + "'s "
                + joinPoint.getSignature().getName()
        );

        Object[] args = joinPoint.getArgs();

        for (int i = 0; i < args.length; i++) {
            log.info("args[" + i + "] -->" + args[i]);

        }
    }
}