AOP, Spring AOP
π AOPλ?
AOP(Aspect-Oriented Programming)
μ μ¬λ¬ λͺ¨λμμ λ°λ³΅λλ κ³΅ν΅ κΈ°λ₯μ νλμ λͺ¨λλ‘ λΆλ¦¬νμ¬ μ¬μ¬μ©μ΄ κ°λ₯ν λͺ¨λλ‘ λ§λλ νλ‘κ·Έλλ° ν¨λ¬λ€μμ λ§νλ€. κ΄μ μ§ν₯ νλ‘κ·Έλλ°μ΄λΌκ³ λΆλ₯Έλ€.
λΉμ¦λμ€ λ‘μ§μ μμ±νλ€ λ³΄λ©΄, μ¬λ¬ λͺ¨λμ κ±Έμ³ κ³΅ν΅μΌλ‘ νμν κΈ°λ₯λ€μ΄ μ€λ³΅μΌλ‘ ꡬνλλ κ²½μ°κ° λ§λ€. μ΄λ κ² μ½λμ μ€λ³΅μ±μ΄ μ¦κ°νλ©΄ μ μ§λ³΄μ μ ν° μ΄λ €μμ΄ μλ€. AOPλ₯Ό ν΅ν΄ λ‘μ§μ Core Concern
(ν΅μ¬ κΈ°λ₯)κ³Ό Cross-cutting Concerns
(λΆκ° κΈ°λ₯)μΌλ‘ λΆλ¦¬νμ¬ μ½λμ μ¬μ¬μ©μ±κ³Ό μ μ°μ±μ λμΈλ€.
π μ©μ΄
Join Point
μ‘°μΈ ν¬μΈνΈλ AOPλ₯Ό μ μ©ν μ μλ μ§μ μ΄λ€. λ©μλ μ€ν, μμ±μ νΈμΆ, νλ κ° μ κ·Ό λ±μ μ§μ μ΄ λ μ μλ€. Spring AOP
λ νλ‘μ λ°©μμ μ¬μ©νλ―λ‘ μ‘°μΈ ν¬μΈνΈλ νμ λ©μλ μ€ν μμ μΌλ‘ μ νλλ€. νλ‘μ νΉμ± μ λ©μλ νΈμΆμ κ°λ‘μ± μλ μμ§λ§ μμ±μ νΈμΆμ΄λ νλ κ° λ³κ²½μ κ°λ‘μ± μλ μκΈ° λλ¬Έμ΄λ€.
Advice
νΉμ μ‘°μΈ ν¬μΈνΈμμ μ€νλλ μ½λλ‘ μ€μ λΆκ° κΈ°λ₯μ λ΄μ ꡬν체μ΄λ€. μΈμ , μ΄λ€ μμ
μ μνν μ§ κ²°μ νλ€. μ΄λλ°μ΄μ€λ μ¬λ¬ μ’
λ₯κ° μλλ°, Before
μ λ©μλ μ€ν μ , After
λ λ©μλ μ€ν ν λμνλ€. After-returning
μ λ©μλκ° μ μ μ€ν ν, After-throwing
μ μμΈκ° λ°μν ν λμνλ€. Around
λͺ¨λ μμ μμ λμνλ€.
Target
νκ²μ λΆκ° κΈ°λ₯μ λΆμ¬ν λμμ΄λ€. μ¦, μ΄λλ°μ΄μ€λ₯Ό λ°λ κ°μ²΄λ‘, ν¬μΈνΈμ»·μΌλ‘ μ΄λ νκ²μ λ€μ΄κ°μ§ κ²°μ λλ€.
Pointcut
ν¬μΈνΈμ»·μ μ΄λλ°μ΄μ€λ₯Ό μ μ©ν νκ²μ λ©μλλ₯Ό κ²°μ νλ λ°©λ²μ΄λ€.
Aspect
μ μ€ννΈλ AOPμ κΈ°λ³Έ λͺ¨λλ‘, μ΄λλ°μ΄μ€μ ν¬μΈνΈμ»·μ ν©μΉ κ°λ μ΄λ€.
Weaving
μλΉμ ν¬μΈνΈμ»·μ μν΄ κ²°μ λ νκ²μ μ‘°μΈ ν¬μΈνΈμ μ΄λλ°μ΄μ€λ₯Ό μ½μ νλ κ³Όμ μ΄λ€. μλΉμ ν΅ν΄ νκ²μ μ½λμ μν₯μ μ£Όμ§ μμΌλ©΄μ μ΄λλ°μ΄μ€λ₯Ό μΆκ°ν μ μλ€. μλΉ μμ μ λ°λΌ μ»΄νμΌ νμ μλΉ, λ‘λ νμ μλΉ, λ°νμ μλΉμ΄ μ‘΄μ¬νλ€.
Advisor
μ΄λλ°μ΄μ λ νλμ μ΄λλ°μ΄μ€μ νλμ ν¬μΈνΈμ»·μΌλ‘ ꡬμ±λλ©° μ€νλ§ AOPμμλ§ μ¬μ©λλ μ©μ΄μ΄λ€.
AOP Proxy
AOP νλ‘μλ AOPλ₯Ό ꡬννκΈ° μν νλ‘μ κ°μ²΄λ‘ μ€νλ§ AOPμμλ JDK νλ‘μ λλ CGLIB νλ‘μλ₯Ό μ¬μ©νλ€. JDK νλ‘μλ μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μ, CGLIB νλ‘μλ μΌλ° ν΄λμ€μ μ μ©λλ€.
π Spring AOP ꡬν λ°©λ²
μ΄λ Έν μ΄μ μ ν΅ν΄ AOPλ₯Ό ꡬνν΄λ³΄μ.
1
implementation 'org.springframework.boot:spring-boot-starter-aop'
Spring AOP μμ‘΄μ±μ μΆκ°νλ€.
1
2
3
4
5
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
// ...
}
AOPλ₯Ό νμ±ννκΈ° μν΄ @EnableAspectJAutoProxy
λ₯Ό μΆκ°νλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
@Aspect
@Component
public class LoggingAspect {
@Pointcut("execution(* com.example.service.*.*(..))")
private void serviceLayer() {}
@Before("serviceLayer()")
public void beforeAdvice(JoinPoint joinPoint) {
// ...
}
}
@Aspect
μ΄λ
Έν
μ΄μ
μ ν΅ν΄ Aspectλ₯Ό μ μνλ€. ν¬μΈν°μ»·μ @Pointcut
μ΄λ
Έν
μ΄μ
μΌλ‘ μ μνλ©°, μ΄λλ°μ΄μ€λ μ νμ λ°λ₯Έ μ΄λ
Έν
μ΄μ
μΌλ‘ μ μνλ€.
π μ°Έκ³
https://dev-coco.tistory.com/81
https://engkimbs.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81AOP
https://sharonprogress.tistory.com/195