๐Ÿง  [๊ฐœ๋… ํ™•์ธ ๋ฌธ์ œ]

Q1. AOP๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜๊ณ , Spring์—์„œ ์™œ ํ•„์š”ํ•œ์ง€ 2๋ฌธ์žฅ ์ด๋‚ด๋กœ ์ •๋ฆฌํ•ด๋ด.

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

โœ… [OX ๋ฌธ์ œ]

Q2. O / X

AOP์—์„œ Aspect๋Š” ์‹ค์ œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๋‹ด์€ ํด๋ž˜์Šค์ด๋ฉฐ, Pointcut์€ Advice๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์กฐ๊ฑด์ด๋‹ค.

โ†’ O

Q3. O / X

Spring AOP๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ JDK ๋™์  ํ”„๋ก์‹œ๋‚˜ CGLIB์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

โ†’ O


๐Ÿ” [์ฝ”๋“œ ๊ธฐ๋ฐ˜ ๋ฌธ์ œ]

Q4. ์•„๋ž˜ ์ฝ”๋“œ์—์„œ Pointcut์ด ์ ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ๋Š” ์–ด๋–ค ๊ฒƒ๋“ค์ด ์žˆ๋Š”๊ฐ€?

@Aspect
@Component
public class LogAspect {
 
    @Pointcut("execution(* com.example.service.*.*(..))")
    public void serviceMethods() {}
 
    @Before("serviceMethods()")
    public void logBefore() {
        System.out.println("๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „ ๋กœ๊ทธ");
    }
}

โ†’ com.example.service ํŒจํ‚ค์ง€ ๋ฐ”๋กœ ์•„๋ž˜ ํด๋ž˜์Šค๋“ค์˜ public ๋ฉ”์„œ๋“œ ๋ชจ๋‘


๐Ÿ”„ [์‘์šฉ ๋ฌธ์ œ]

Q5. AOP๋ฅผ ์ด์šฉํ•ด ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ ๋‹ค๊ณ  ํ•  ๋•Œ,

์‚ฌ์šฉํ•ด์•ผ ํ•  Advice ์ข…๋ฅ˜๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์‹œ๊ฐ„ ์ธก์ •์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด์ค˜.

โ†’ Around Advice ์‚ฌ์šฉ

@Around("execution(* com.example.controller..*(..))")
public Object measureTime(ProceedingJoinPoint joinPoint) throws Throwable {
    long start = System.currentTimeMillis();
    Object result = joinPoint.proceed();
    long end = System.currentTimeMillis();
    System.out.println("์‹คํ–‰ ์‹œ๊ฐ„: " + (end - start) + "ms");
    return result;
}

๐ŸŽค ๋ฉด์ ‘ ๋Œ€๋น„ ์งˆ๋ฌธ ์ถ”์ฒœ (AOP ๊ด€๋ จ)

  1. Spring AOP์™€ Interceptor, Filter๋Š” ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋‚˜์š”? : Spring AOP, Interceptor, Filter ๋Š” ๋ชจ๋‘ ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋˜์ง€๋งŒ, ๋™์ž‘ ์‹œ์ ๊ณผ ์ ์šฉ ๋Œ€์ƒ์— ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋จผ์ € Filter ๋Š” Servlet ์ˆ˜์ค€์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, DispatcherServlet ์ด์ „์— ์š”์ฒญ/์‘๋‹ต ์ „์ฒด๋ฅผ ๊ฐ€๋กœ์ฑ„์–ด ์ธ์ฝ”๋”ฉ, CORS ์ฒ˜๋ฆฌ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • Interceptor๋Š” Spring MVC ์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, ์ปจํŠธ๋กค๋Ÿฌ์˜ ํ˜ธ์ถœ ์ „/ํ›„์— ์ฃผ๋กœ ์ธ์ฆ/์„ธ์…˜ ์ฒดํฌ ๋“ฑ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • Spring AOP ๋Š” ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜์œผ๋กœ Spring Bean ๋ฉ”์„œ๋“œ ์ „/ํ›„์— ๋™์ž‘ํ•˜๋ฉฐ, ๋กœ๊น…, ํŠธ๋žœ์žญ์…˜ ๊ฐ™์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ด€์ ์—์„œ์˜ ๋ถ€๊ฐ€๊ธฐ๋Šฅ ๋ถ„๋ฆฌ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  2. AOP์—์„œ JoinPoint์™€ Pointcut์€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๋ฉฐ, ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ ์€?

    • JoinPoint๋Š” AOP๊ฐ€ ์ ์šฉ๊ฐ€๋Šฅํ•œ ์ง€์ ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์Šคํ”„๋ง์—์„œ๋Š” ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ง€์ ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • Pointcut์€ JoinPoint ์ค‘์—์„œ AOP๋ฅผ ์ ์šฉํ•  ๋Œ€์ƒ์„ ํ‘œํ˜„์‹์œผ๋กœ ์ง€์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  3. Around Advice๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹๊ณ , ProceedingJoinPoint๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜์š”?

    • Around Advice๋Š” ๋ฉ”์„œ๋“œ์˜ ์‹คํ–‰ ์ „/ํ›„ ๋ฅผ ๋ชจ๋‘ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ Advice์ด๋ฉฐ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ • ๋“ฑ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
    • ProceedingJoinPoint๋Š” ์›๋ณธ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋กœ, proceed() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ์‹ค์ œ ๋Œ€์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    • ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ๋Œ€์ƒ ๋กœ์ง์€ ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํ๋ฆ„ ์ œ์–ด์— ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.