728x90
๐ฑ Spring AOP (๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ) ๊ฐ๋
๋ชฉ์ฐจ
1. AOP๋? (Aspect-Oriented Programming)
AOP๋ ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก, ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ํก๋จ ๊ด์ฌ์ฌ(Cross-Cutting Concerns)๋ฅผ ๋ถ๋ฆฌํ์ฌ ๋ชจ๋์ฑ์ ๋์ด๋ ํจ๋ฌ๋ค์์ ๋๋ค.
ํก๋จ ๊ด์ฌ์ฌ ์์
- ๋ก๊น (Logging), ํธ๋์ญ์ ๊ด๋ฆฌ, ๋ณด์, ์ฑ๋ฅ ์ธก์ , ์์ธ ์ฒ๋ฆฌ ๋ฑ
AOP๊ฐ ํ์ํ ์ด์
- ์ค๋ณต ์ ๊ฑฐ: ์ฌ๋ฌ ๋ฉ์๋์ ํฉ์ด์ง ๊ณตํต ๋ก์ง์ ํ ๊ณณ์์ ๊ด๋ฆฌํฉ๋๋ค.
- ๋ณ๊ฒฝ ์ง์ ๋จ์ผํ: ๊ณตํต ๋ก์ง ์์ ์ Advice ํ๋๋ง ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค.
- ํต์ฌ ๋ก์ง ์ง์ค: ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ ์ฑ์ ๋์ ๋๋ค.
2. ์ฃผ์ ์ฉ์ด ๋ฐ Advice ์ข ๋ฅ
- Aspect: Advice + Pointcut์ ํฉ์น ๋ชจ๋์ ๋๋ค.
- Advice: ์ค์ ์ํ๋ ๋ถ๊ฐ ๊ธฐ๋ฅ ๋ก์ง์ ๋๋ค.
- Pointcut: Advice๋ฅผ ์ด๋์ ์ ์ฉํ ์ง ๊ฒฐ์ ํ๋ ์ง์ ์ ๋๋ค.
- JoinPoint: Advice๊ฐ ์ ์ฉ ๊ฐ๋ฅํ ์์ (์ฃผ๋ก ๋ฉ์๋ ์คํ ์์ )์ ๋๋ค.
- Target: ํต์ฌ ๋ก์ง์ ๊ฐ์ง ์ค์ ๊ฐ์ฒด์ ๋๋ค.
Advice ์คํ ์์
@Before: ๋ฉ์๋ ์คํ ์ @After: ๋ฉ์๋ ์คํ ํ (์ ์/์์ธ ๋ฌด๊ด)@AfterReturning: ๋ฉ์๋๊ฐ ์ ์์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ ๋@AfterThrowing: ๋ฉ์๋ ์คํ ์ค ์์ธ๊ฐ ๋ฐ์ํ์ ๋@Around: ๋ฉ์๋ ์คํ ์ ํ๋ฅผ ๋ชจ๋ ์ ์ด (๊ฐ์ฅ ๊ฐ๋ ฅํจ)
3. ์ฝ๋ ์์ (@Aspect)
@Aspect
@Component
public class LoggingAspect {
// com.example.service ํจํค์ง ํ์์ ๋ชจ๋ ๋ฉ์๋์ ์ ์ฉ
@Around("execution(* com.example.service.*.*(..))")
public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("[Before] ๋ฉ์๋ ์คํ ์ ");
Object result = joinPoint.proceed(); // ์ค์ ๋น์ฆ๋์ค ๋ก์ง ํธ์ถ
log.info("[After] ๋ฉ์๋ ์คํ ํ");
return result;
}
}
4. Spring AOP์ ์๋ฆฌ
ํ๋ก์ ํจํด (Proxy Pattern)
์คํ๋ง์ ์ค์ ํ๊ฒ ๊ฐ์ฒด ๋์ ํ๋ก์(๊ฐ์ง) ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋น์ผ๋ก ๋ฑ๋กํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ๋น์ ํธ์ถํ๋ฉด ํ๋ก์๊ฐ ๋จผ์ ์์ฒญ์ ๊ฐ๋ก์ฑ๋๋ค.
- ํ๋ก์๊ฐ Advice(๋ถ๊ฐ ๊ธฐ๋ฅ)๋ฅผ ์คํํ ๋ค, ์ค์ Target(ํต์ฌ ๋ก์ง)์ ํธ์ถํฉ๋๋ค.
๋ฐํ์ ์๋น (Runtime Weaving)
- ์๋น: Advice์ ํต์ฌ ๋ก์ง์ ์ฐ๊ฒฐํ๋ ์์ ์ ๋๋ค.
- ์คํ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ (๋ฐํ์)์ ํ๋ก์๋ฅผ ํตํด ์๋น์ ์ํํฉ๋๋ค.
- ์ธํฐํ์ด์ค๊ฐ ์์ผ๋ฉด JDK Dynamic Proxy, ํด๋์ค๋ง ์์ผ๋ฉด CGLIB ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.

ํต์ฌ ์์ฝ ๐ก
AOP๋ ํ๋ก์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ฃผ์ ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋์ ์ค๋ณต์ ์ค์ด๊ณ ์ ์ง๋ณด์์ฑ์ ๊ทน๋ํํ ์ ์์ต๋๋ค.
728x90
'โ Backend > Spring, Spring Boot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Spring] @Transactional (0) | 2026.03.31 |
|---|---|
| [์คํ๋ง] ํ๋กํ(Profile)์ด๋? (1) | 2025.07.08 |
| [์คํ๋ง] @RequestParam ์ด๋ ธํ ์ด์ (0) | 2025.07.03 |
| [์คํ๋ง] ์์ฒญ ๋งคํ ์ด๋ ธํ ์ด์ (0) | 2025.07.03 |
| [์คํ๋ง] @ResponseBody, ResponseEntity (1) | 2025.07.03 |