AOP (Aspect-Oriented Programming)
μ€λͺ
μ¬λ¬ λ‘μ§λ¨μ μ μ©λμ΄μΌ ν νΉμ μ€λ³΅ λ‘μ§μ μ¬λ¬ μ½λλ₯Ό μμ νμ§ μκ³ μ μ©νλ κ²
ν©μ΄μ§ μ½λλ₯Ό νκ³³μΌλ‘ λͺ¨μΌμ!
ν‘λ¨ κ΄μ¬μ λ°λΌ νλ‘κ·Έλλ° νλκ²
β» ν‘λ¨
λμ λ°©ν₯μΌλ‘ κ°λ‘μ§λ¬ κ°λκ²
β» ν‘λ¨ κ΄μ¬μ¬ (Cross cutting concern)
λ€μμ λͺ¨λμ 곡ν΅μ μΌλ‘ λνλλ λΆλΆμ΄ μ‘΄μ¬
λͺ¨λλ³λ‘ λ°λ³΅λμ΄ μ€λ³΅ν΄μ λνλλ λΆλΆλ°λ³΅κ³Ό μ€λ³΅μ λΆλ¦¬νμ¬ νκ³³μμ ννν΄μΌ νλ€λΌλκ²μ νμ μΈμ§ν΄μΌ ν¨.
νΉμ§
Aspect μΌλ‘ νν
λ‘μ§(Code) μ£Όμ
λ‘κΉ
, 보μ, νΈλμμ
κΈ°λ₯μ΄ λ°λ³΅μ μΌλ‘ λνλ¨
AOPλ νλ‘μ κΈ°λ°, μΈν°νμ΄μ€ κΈ°λ°, λ°νμ κΈ°λ° μ΄λ€.
λ©μλμ μ£Όμ ν μ μλ μμ
@Before: λμ λ©μλ μμ μ
@After: λμ λ©μλ μμ ν
@AfterReturning: λμ λ©μλ μ μ μ’
λ£ ν
@AfterThrowing: λμ λ©μλ μμΈ λ°μ → μ’
λ£ ν
AOP μ©μ΄
Aspect | μ¬λ¬κ°μ Advice, μ¬λ¬κ°μ Pointcutμ κ²°ν©μ²΄λ₯Ό μλ―Ένλ μ©μ΄ |
Advisor | νκ°μ Advice, νκ°μ Pointcut |
Advice | pointcutμ μ μ©ν λ‘μ§, μ¦ λ©μλλ₯Ό μλ―Έ @Before("execution( * runSomething())") public void before(JoinPoint joinPoint) { ... } |
JoinPoint | μ°κ²°μ . μ°κ²° κ°λ₯ν μ§μ . Aspect μ μ© κ°λ₯ μ§μ . μ€νλ§ νλ μμν¬κ° κ΄λ¦¬νλ λΉμ λͺ¨λ λ©μλ public void before(JoinPoint joinPoint) { ... } |
Pointcut | μλ₯΄λ μ§μ , Aspect μ μ© μμΉ μ§μ μ. ν‘λ¨ κ΄μ¬μ¬λ₯Ό μ μ©ν νκΉ λ©μλλ₯Ό μ ννλ μ§μμ. @Before("execution( * runSomething())") → runSomething() μ€ν μ AOPμ μ€ννλΌλ λ» |
Pointcut μ§μ μ κ΄λ ¨
execution
μΌμΉνλ λ©μλ μ€ν μ‘°μΈ ν¬μΈνΈμ μ¬μ©λ©λλ€. μ΄κ²μ Spring AOPλ‘ μμ
ν λ μ¬μ©νλ μ£Όμ ν¬μΈνΈ μ»· μ§μ μμ
λλ€.
within
νΉμ μ ν λ΄ κ²°ν© μ μ λν 맀μΉμ μ νν©λλ€ (Spring AOP μ¬μ©μ λ§€μΉ μ ν λ΄μμ μ μΈ λ λ©μλ μ€ν).
this
λΉ μ°Έμ‘° (Spring AOP νλ‘μ)κ° μ£Όμ΄μ§ μ νμ μΈμ€ν΄μ€ μΈ μ‘°μΈ ν¬μΈνΈ (Spring AOP μ¬μ©μ λ©μλ μ€ν)μ λν 맀μΉμ μ νν©λλ€.
target
λμ κ°μ²΄ (νλ‘μλλ μ ν리μΌμ΄μ
κ°μ²΄)κ° μ£Όμ΄μ§ μ νμ μΈμ€ν΄μ€ μΈ μ‘°μΈ ν¬μΈνΈ (Spring AOP μ¬μ©μ λ©μλ μ€ν)μ λν 맀μΉμ μ νν©λλ€.
args
μΈμκ° μ£Όμ΄μ§ μ νμ μΈμ€ν΄μ€ μΈ μ‘°μΈ ν¬μΈνΈ (Spring AOP μ¬μ©μ λ©μλ μ€ν)μ λν 맀μΉμ μ νν©λλ€.
@target
μ€ν κ°μ²΄μ ν΄λμ€κ° μ£Όμ΄μ§ νμ
μ μ΄λ
Έν
μ΄μ
μ κ°μ§κ³ μλ join point (Spring AOP μ¬μ©μ λ©μλ μ€ν)λ‘ λ§€μΉμ μ νν©λλ€.
@args
μ λ¬ λ μ€μ μΈμμ λ°νμ μ νμ΄ μ£Όμ΄μ§ μ νμ μ΄λ
Έν
μ΄μ
μ κ°λ κ²°ν© μ§μ (Spring AOP μ¬μ©μ λ©μλ μ€ν)μ λν μΌμΉλ₯Ό μ νν©λλ€.
@within
μ£Όμ΄μ§ μ΄λ
Έν
μ΄μ
(Spring AOPλ₯Ό μ¬μ©ν λ μ£Όμ΄μ§ μ΄λ
Έν
μ΄μ
μ΄μλ νμ
μμ μ μΈ λ λ©μλμ μ€ν)μ΄μλ νμ
λ΄μμ μ‘°μΈ ν¬μΈνΈμ λν 맀μΉμ μ νν©λλ€.
@annotation
Join pointμ μ£Όμ (Spring AOPμμ μ€νλλ λ©μλ)κ° μ£Όμ΄μ§ μ΄λ
Έν
μ΄μ
μ κ°μ§κ³ μλ join pointλ‘ λ§€μΉμ μ νν©λλ€.
Pointcut ννμ μμ
λͺ¨λ κ³΅μ© λ©μλ μ€ν
execution(public * * (..))
λ€μμΌλ‘ μμνλ μ΄λ¦μ κ°μ§ λͺ¨λ λ©μλμ μ€ν
setexecution(* set * (..))
AccountServiceμΈν°νμ΄μ€μ μν΄ μ μ λ λͺ¨λ λ©μλμ μ€ν
execution(* com.xyz.service.AccountService. * (..))
serviceν¨ν€μ§μ μ μ λ λͺ¨λ λ©μλ μ€ν
execution(* com.xyz.service. *. * (..))
μλΉμ€ ν¨ν€μ§ λλ νμ ν¨ν€μ§ μ€ νλμ μ μ λ λͺ¨λ λ©μλ μ€ν
execution(* com.xyz.service .. *. * (..))
μλΉμ€ ν¨ν€μ§ λ΄μ λͺ¨λ μ‘°μΈ ν¬μΈνΈ (Spring AOPμμλ§ λ©μλ μ€ν)
within(com.xyz.service. *)
μλΉμ€ ν¨ν€μ§ λλ νμ ν¨ν€μ§ μ€ νλ λ΄μ λͺ¨λ μ‘°μΈ μ§μ (Spring AOPμμλ§ λ©μλ μ€ν)
within(com.xyz.service .. *)
νλ‘μκ° AccountServiceμΈν°νμ΄μ€λ₯Ό ꡬννλ λͺ¨λ μ‘°μΈ ν¬μΈνΈ (Spring AOPμμλ§ λ©μλ μ€ν)
this(com.xyz.service.AccountService)
μ°Έκ³
https://wikibook.co.kr/java-oop-for-spring/ (μ±
: μ€νλ§ μ
λ¬Έμ μν μλ° κ°μ²΄μ§ν₯μ μ리μ μ΄ν΄)
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop
'κ°λ° > spring' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
νΈλμμ (0) | 2021.11.25 |
---|---|
Spring - μ€νλ§ MVC κ°λ¨ μ 리 (0) | 2021.06.05 |
Spring - DI (Dependency Injection) (0) | 2021.06.01 |
IOC/DI, DIμμ© (0) | 2017.11.20 |
spring μμ, maven μ€μΉ (0) | 2017.11.12 |