๐ง [๊ฐ๋ ํ์ธ ๋ฌธ์ ]
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 ๊ด๋ จ)
-
Spring AOP์ Interceptor, Filter๋ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์? : Spring AOP, Interceptor, Filter ๋ ๋ชจ๋ ๊ณตํต ๊ด์ฌ์ฌ ์ฒ๋ฆฌ์ ์ฌ์ฉ๋์ง๋ง, ๋์ ์์ ๊ณผ ์ ์ฉ ๋์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
- ๋จผ์ Filter ๋ Servlet ์์ค์์ ๋์ํ๋ฉฐ, DispatcherServlet ์ด์ ์ ์์ฒญ/์๋ต ์ ์ฒด๋ฅผ ๊ฐ๋ก์ฑ์ด ์ธ์ฝ๋ฉ, CORS ์ฒ๋ฆฌ ๋ฑ์ ์ํํฉ๋๋ค.
- Interceptor๋ Spring MVC ์์ ๋์ํ๋ฉฐ, ์ปจํธ๋กค๋ฌ์ ํธ์ถ ์ /ํ์ ์ฃผ๋ก ์ธ์ฆ/์ธ์ ์ฒดํฌ ๋ฑ์ ์ญํ ์ ์ํํฉ๋๋ค.
- Spring AOP ๋ ํ๋ก์ ๊ธฐ๋ฐ์ผ๋ก Spring Bean ๋ฉ์๋ ์ /ํ์ ๋์ํ๋ฉฐ, ๋ก๊น , ํธ๋์ญ์ ๊ฐ์ ๋น์ฆ๋์ค ๋ก์ง ๊ด์ ์์์ ๋ถ๊ฐ๊ธฐ๋ฅ ๋ถ๋ฆฌ์ ์ฌ์ฉ๋ฉ๋๋ค.
-
AOP์์ JoinPoint์ Pointcut์ ์ด๋ป๊ฒ ๋ค๋ฅด๋ฉฐ, ์ฌ์ฉ ์ ์ฃผ์ํ ์ ์?
- JoinPoint๋ AOP๊ฐ ์ ์ฉ๊ฐ๋ฅํ ์ง์ ์ ์๋ฏธํ๋ฉฐ, ์คํ๋ง์์๋ ๋ฉ์๋ ์คํ ์ง์ ๋ง ์ง์ํฉ๋๋ค.
- Pointcut์ JoinPoint ์ค์์ AOP๋ฅผ ์ ์ฉํ ๋์์ ํํ์์ผ๋ก ์ง์ ํ๋ ์ญํ ์ ํฉ๋๋ค.
-
Around Advice๋ ์ธ์ ์ฌ์ฉํ๋ ๊ฒ ์ข๊ณ , ProceedingJoinPoint๋ ์ด๋ป๊ฒ ๋์ํ๋์?
- Around Advice๋ ๋ฉ์๋์ ์คํ ์ /ํ ๋ฅผ ๋ชจ๋ ์ ์ดํ ์ ์๋ ์ ์ผํ Advice์ด๋ฉฐ, ์์ธ ์ฒ๋ฆฌ, ์คํ ์๊ฐ ์ธก์ ๋ฑ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ํฉํฉ๋๋ค.
- ProceedingJoinPoint๋ ์๋ณธ ๋ฉ์๋์ ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด๋ก,
proceed()
๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ์ค์ ๋์ ๋ฉ์๋๊ฐ ์คํ๋ฉ๋๋ค. - ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉด ๋์ ๋ก์ง์ ์คํ๋์ง ์๊ธฐ ๋๋ฌธ์, ํ๋ฆ ์ ์ด์ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.