๐ ํก๋จ๊ด์ฌ์ฌ์ AOP
ํก๋จ ๊ด์ฌ์ฌ๋ ์ฌ๋ฌ ๋ถ๋ถ์ ๊ณตํต์ ์ผ๋ก ๊ฑธ์ณ์ ธ ์๋ ๊ธฐ๋ฅ๋ค์ ๋งํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ก๊น , ํธ๋์ญ์ , ์ธ์ฆ, ์์ธ ์ฒ๋ฆฌ๊ฐ ํด๋น๋ฉ๋๋ค.

AOP(Aspect Oriented Programming)๋ ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก,
๋ก์ง๋ค์ ํต์ฌ์ ์ธ ๊ด์ , ๋ถ๊ฐ์ ์ธ ๊ด์ (ํก๋จ ๊ด์ฌ์ฌ)์ผ๋ก ๋๋์ด ๊ด์ ์ ๊ธฐ์ค์ผ๋ก ๊ฐ๊ฐ ๋ชจ๋ํํ๋ ๊ฒ์ ๋๋ค.
ํต์ฌ์ ์ธ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ์ฌ๋ฌ ํด๋์ค์ ๊ฑธ์ณ ์กด์ฌํ ์ ์๋ ๋ก์ง์ ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋๋ค.
๊ณตํต์ ์ธ ๊ด์ฌ์ฌ๋ผ๋ฆฌ ๋ชจ๋ํํ์ฌ
- ์ฝ๋ ์ค๋ณต์ ์ค์ด๊ณ ,
- ๊ฐ๋ฐ์๋ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๋ ์ง์คํ๊ณ ,
- ์ ์ง ๋ณด์์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
๐ AOP์ ์ฃผ์ ์ฉ์ด
- Aspect: ๊ณตํต ๊ธฐ๋ฅ์ ๋ชจ๋ํํ ๊ฒ
- ์) ๋ก๊น ๊ธฐ๋ฅ์ Aspect๋ก ์ ์
- Join Point: Aspect๊ฐ ์ ์ฉ๋ ์ ์๋ ์ง์
- ์) ๋ฉ์๋ ํธ์ถ ์ง์
- Advice: ํน์ Join Point์์ ์คํ๋๋ ์ฝ๋
- ์) `@Before` `@After`
- Pointcut: Advice๊ฐ ์ ์ฉ๋ Join Point๋ฅผ ์ง์ ํ๋ ํํ
- A๋ ๋ฉ์๋์ ์ง์ ์์ ์ ํธ์ถํ ๊ฒ๊ณผ ๊ฐ์ด ๋์ฑ ๊ตฌ์ฒด์ ์ผ๋ก Advice๊ฐ ์คํ๋ ์ง์ ์ ์ ํ ์ ์์
๐ Spring์์ AOP
Spring์์ AOP๋ ํ๋ก์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค.
์ด๋ ํ๋ก์๋ ๋ฌด์์ผ๊น์?
'๋๋ฆฌ์ธ'์ด๋ ๋ป์ ๊ฐ์ง๋ฉฐ, ํด๋ผ์ด์ธํธ์ ๋์ ๊ฐ์ฒด ์ฌ์ด์์ ์ค๊ฐ ์ญํ ์ ์ํํ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํฉ๋๋ค.
์ด๋ค ๊ฐ์ฒด(Target Object)์ ์ง์ ์ ๊ทผํ๋ ๋์ , ๋๋ฆฌ ๊ฐ์ฒด(ํ๋ก์ ๊ฐ์ฒด)๋ฅผ ํตํด ์ ๊ทผํ๊ฒ ๋ง๋๋ ํจํด์ ๋๋ค.
- ์ค์ ํธ์ถ ํ๋ฆ: ํด๋ผ์ด์ธํธ → ํ๋ก์ ๊ฐ์ฒด → AOP ๋ก์ง ์คํ → ์ค์ ๊ฐ์ฒด(Target)
ํ๋ก์๋ ์ค์ ๊ฐ์ฒด๋ก ๊ฐ๋ ์์ฒญ์ ๊ฐ๋ก์ฑ์ ์ํ๋ ์์ ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์ฆ, ์คํ๋ง์์ AOP๊ฐ ํ๋ก์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค๋ ๊ฒ์
๋น์ฆ๋์ค ๋ฉ์๋ ์คํ ์ ํ์ ๋ก๊น , ํธ๋์ญ์ , ๋ณด์ ๊ฒ์ฌ ๋ฑ์ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋ฃ๊ณ ์ ํ ๋
์๋ณธ ๊ฐ์ฒด(์ค์ ๋น์ฆ๋์ค ๋ก์ง)๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๊ทธ ์์์ ๋ถ๊ฐ ๋ก์ง์ ์คํํ๋ค๋ ์๋ฏธ์ ๋๋ค.
๊ฐ๋จ ์ค์ต
- ์๋น์ค ํด๋์ค์ ๋ฉ์๋๋ค์ด ์คํ๋ ๋๋ง๋ค
๋ฉ์๋ ์คํ ์ ๋ก๊น ์ ์ฐ์ด๋ณด์.

์คํ๋ง์์ `@Aspect`๋ฅผ ์ด์ฉํด AOP๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
์์ ๊ฐ์ด ํ์ผ ๊ตฌ์กฐ๊ฐ ์์ ๋ ์๋์ ๊ฐ์ ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค.
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class LoggingAspect {
@Before("execution(* com.codeit.weatherwear.domain..*Service.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("๋ฉ์๋ ์คํ ์ : " + joinPoint.getSignature());
}
}
์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ก๊ทธ๊ฐ ์์ฑ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.

์ฃผ์ํ ์
- Spring AOP๋ ์คํ๋ง ๋น์๋ง ์ ์ฉ๋ฉ๋๋ค.
- Spring AOP๋ ๋ฐํ์ ํ๋ก์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค.
- ์คํ๋ง์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ ๋ ๋น๋ค์ด ์์ฑ๋ฉ๋๋ค. AOP ์ ์ฉ ๋์์ด๋ฉด ํ๋ก์ ๊ฐ์ฒด๊ฐ ์ปจํ ์ด๋์ ๋ฑ๋ก๋ฉ๋๋ค.
- ์ดํ ์์กด์ฑ ์ฃผ์ ์ ์ฌ์ค ์ฃผ์ ๋ฐ๋ ๊ฒ์ ์๋ณธ ๊ฐ์ฒด๊ฐ ์๋๋ผ ํ๋ก์ ๊ฐ์ฒด
- ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๋ ๋น์ ๋ํด์๋ง ํ๋ก์๋ฅผ ๋ง๋๋ฏ๋ก Bean์ผ๋ก ๋ฑ๋ก๋ ํด๋์ค์๋ง ์ ์ฉ๋ฉ๋๋ค.
- private/static/final ๋ฉ์๋์๋ ์ ์ฉ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
- public/protected ๋ฉ์๋์๋ง ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
- ๊ฐ์ ํด๋์ค ๋ด๋ถ์์ ํธ์ถํ๋ ๋ฉ์๋์๋ ์ ์ฉ๋์ง ์์ต๋๋ค. (Self Invocation)
- AOP๋ ํ๋ก์๋ฅผ ํตํด ์ธ๋ถ์์ ํธ์ถ๋ ๋๋ง ๋์ํฉ๋๋ค.
- ๊ฐ์ ํด๋์ค ์์์ ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ๋ฉด ํ๋ก์๋ฅผ ๊ฑฐ์น์ง ์์ AOP๊ฐ ์ ์ฉ๋์ง ์์ต๋๋ค.
- ๋ฉ์๋๋ฅผ ๋ณ๋ ๋น์ผ๋ก ๋ถ๋ฆฌํ๋ฉด ๋ฉ๋๋ค.
์ฐธ๊ณ ์๋ฃ
[Spring] ์คํ๋ง AOP (Spring AOP) ์ด์ ๋ฆฌ : ๊ฐ๋
, ํ๋ก์ ๊ธฐ๋ฐ AOP, @AOP
[Java] Spring Boot AOP(Aspect-Oriented Programming) ์ดํดํ๊ณ ์ค์ ํ๊ธฐ
'๐ฟSpring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Spring] AOP ๊ธฐ๋ฐ API ์์ฒญ๋ณ ์ฟผ๋ฆฌ ํ์ / ์คํ ์๊ฐ ์ธก์ ์นด์ดํฐ ๊ตฌํ (0) | 2025.11.02 |
|---|---|
| [Spring] ํํฐ(Filter)์ ์ธํฐ์ ํฐ(Interceptor) ์ฐจ์ด (0) | 2025.09.11 |
| [Spring] DI(Dependency Injection) ์์กด์ฑ ์ฃผ์ (4) | 2025.08.14 |
| [Spring] IoC ์ ์ด์ ์ญ์ (1) | 2025.08.12 |
| Spring์์ ์บ์ ์ฌ์ฉํ๊ธฐ: CaffeineCache, @Cacheable, @CachePut, @CacheEvict (1) | 2025.06.12 |
