2022. 6. 5. 20:18γBackend/πΏ Spring
μ΄μ ν¬μ€ν μ ν΅ν΄, μ€νλ§μμλ μλ νλ‘μ μμ±κΈ° κΈ°λ₯μ μ¬μ©νλ©΄ νλ‘μλ₯Ό λ³λμ μ€μ μμ΄ μμ±ν μ μμλ€. μ΄ λ μλ νλ‘μ μμ±κΈ°λ μ΄λλ°μ΄μ λ₯Ό λͺ¨λ μ°Ύμ μλμΌλ‘ νλ‘μ κ°μ²΄λ₯Ό μ€νλ§ λΉμΌλ‘ λ±λ‘νλ€.
μ΄λ² ν¬μ€ν
μμλ, μ§κΈκΉμ§ μ§μ Advisorλ₯Ό λ§λ€μλ κ²μ @Aspect
μ΄λ
Έν
μ΄μ
μ λμ μ¬μ©νμ¬ λ§λ€μ΄λ³΄κ³ , μ΄ @Aspect κ° μ€νλ§ AOP
κ°λ
μ μ΄λ»κ² μ μ©λλμ§λ μμλ³΄κ² λ€.
@Aspect Proxy
μλ νλ‘μ μμ±κΈ°(AnnotationAwareAspectJAutoProxyCreator
) λ Advisor λ₯Ό μλμΌλ‘ μ°Ύμμ(Advisor Type νμ) νμν κ³³μ νλ‘μλ₯Ό μμ±νμ¬ μ μ©νλ€. μλ νλ‘μ μμ±κΈ°λ μΆκ°μ μΈ μν λ‘ @Aspect μ΄λ
Έν
μΈμ
μ μ°Ύκ³ , μ΄κ²μ Advisor λ‘ λ§λ€μ΄μ€λ€. κ·Έλ κΈ° λλ¬Έμ μ΄λ¦ μμ AnnotationAware
κ° λΆμ΄μλ κ²μ΄λ€.
μλ νλ‘μ μμ±κΈ°λ 2κ°μ§ μΌμ νλ€.
1. μ°μ @Aspect μ΄λ
Έν
μ΄μ
μ΄ λΆμ ν΄λμ€λ₯Ό μ΄λλ°μ΄μ λ‘ λ³ννμ¬ μ μ₯νλ€.
2. μ΄λλ°μ΄μ λ₯Ό κΈ°λ°μΌλ‘ νλ‘μλ₯Ό μμ±νλ€. μ΄λλ°μ΄μ κΈ°λ°μ μλ―Έλ, μ΄λλ°μ΄μ κ° ν¬ν¨ν ν¬μΈνΈμ»·μ μ¬μ©ν΄ νλ‘μ μμ± λμμ κ²°μ νλ€λ κ²μ΄λ€.
@Aspect
λ₯Ό μ΄λλ°μ΄μ λ‘ λ³νν΄μ μ μ₯νλ κ³Όμ μ μμ보μ.
1. μ€ν : μ€νλ§ μ΄ν리μΌμ΄μ
λ‘λ© μμ μ μλ νλ‘μ μμ±κΈ°λ₯Ό νΈμΆνλ€.
2. λͺ¨λ @Aspect λΉ μ‘°ν : μ€νλ§ μ»¨ν
μ΄λμμ @Aspect μ λ
Έν
μ΄μ
μ΄ λΆμ μ€νλ§ λΉμ λͺ¨λ μ‘°ννλ€.
3. μ΄λλ°μ΄μ μμ± : @Aspect μ΄λλ°μ΄μ λΉλ
λ₯Ό ν΅ν΄ @Aspect μ΄λ
Έν
μ΄μ
μ 보λ₯Ό κΈ°λ°μΌλ‘ μ΄λλ°μ΄μ λ₯Ό μμ±νλ€.
4. @Aspect κΈ°λ° μ΄λλ°μ΄μ μ μ₯ : μμ±ν μ΄λλ°μ΄μ λ₯Ό @Aspect μ΄λλ°μ΄μ λΉλ λ΄λΆμ μ μ₯νλ€.
@Asepct μ΄λλ°μ΄μ λΉλ
BeanFactoryAspectAdvisorsBuilder ν΄λμ€λ‘, @Aspect μ 보λ₯Ό κΈ°λ°μΌλ‘ ν¬μΈνΈμ»·, μ΄λλ°μ΄μ€, μ΄λλ°μ΄μ λ₯Ό μμ±νκ³ λ³΄κ΄νλ κ²μ λ΄λΉνλ€. @Aspect μ μ 보λ₯Ό κΈ°λ°μΌλ‘ μ΄λλ°μ΄μ λ₯Ό λ§λ€κ³ , @Aspect μ΄λλ°μ΄μ λΉλ λ΄λΆ μ μ₯μμ μΊμνκ³ , μΊμμ μ΄λλ°μ΄μ κ° μ΄λ―Έ λ§λ€μ΄μ Έ μλ κ²½μ° μΊμμ μ μ₯λ μ΄λλ°μ΄μ λ₯Ό λ°ννλ€.
μλ νλ‘μ μμ±κΈ° λμ κ³Όμ
1. μμ± : μ€νλ§ λΉ λμ κ°μ²΄ μμ±
2. μ λ¬ : κ°μ²΄λ₯Ό μ€νλ§ μ»¨ν
μ΄λμ λ±λ‘νκΈ° μ§μ , λΉ νμ²λ¦¬κΈ°μ μ λ¬
3-1. Advisor λΉ μ‘°ν : @Bean μ΄λ
Έν
μ΄μ
μ΄ λΆμ Advisor κ°μ²΄λ₯Ό λͺ¨λ μ‘°ννλ€.
3-2. @Aspect Advisor μ‘°ν : @Aspect μ΄λλ°μ΄μ λΉλ λ΄λΆμ μ μ₯λ Advisor λ₯Ό λͺ¨λ μ‘°ννλ€.
4. νλ‘μ μ μ© λμ μ²΄ν¬ : μ‘°νν Advisor μ ν¬μΈνΈμ»·μ μ¬μ©ν΄, ν΄λΉ κ°μ²΄κ° νλ‘μ μ μ© λμμΈμ§ λͺ¨λ 체ν¬νλ€.
5. νλ‘μ μμ± λ° λΉ λ±λ‘ : νλ‘μ μ μ© λμμ΄λ©΄ νλ‘μλ₯Ό μμ±νμ¬ μ»¨ν
μ΄λμ λ±λ‘νλ€. κ·Έλ μ§ μμΌλ©΄ μλ³Έ κ°μ²΄λ₯Ό λ°ννμ¬ μ€νλ§ λΉμΌλ‘ λ±λ‘νλ€.
AOP λ?
μ¬μ μ μ μλ κ΄μ μ§ν₯ νλ‘κ·Έλλ°(Aspect Orient Programming)
μ μλ―Ένμ§λ§ ν¬κ² μλΏμ§ μλλ€. μμλ‘ AOP λ₯Ό μ΄ν΄ν΄λ³΄μ.
μ€νλ§μμλ μ£Όλ‘ Service λ μ΄μ΄μ λΉμ¦λμ€ λ‘μ§μ λνλ΄λ©°, λΉμ¦λμ€ λ‘μ§μ μ ν리μΌμ΄μ μ ν΅μ¬ κΈ°λ₯μ΄λΌ μΉν μ μλ€. μ΄ λ Service λ μ΄μ΄μ κ° λ©μλλ§λ€ λ‘κ·Έλ₯Ό μ°κ³ μΆλ€λ©΄, κ° λ©μλλ§λ€ λ‘κ·Έ μ½μ λ‘μ§μ λ£κ±°λ, λ‘κΉ μ νΈλ¦¬ν° ν¨μλ₯Ό λ§λ€μ΄ ν΄λΉ ν¨μλ₯Ό κ° λ©μλμμ νΈμΆν μ μλ€. μ΄λ° λ‘κ·Έ μΆμ λ‘μ§μ λΆκ° κΈ°λ₯μ΄λΌ λΆλ₯Ό μ μλ€.
κ·Έλ°λ° μλΉμ€ λ μ΄μ΄λ₯Ό λμ΄, 컨νΈλ‘€λ¬ λ μ΄μ΄μ λ ν¬μ§ν 리 λ μ΄μ΄μμλ λ‘κ·Έλ₯Ό μ°κ³ μΆλ€λ©΄? μ½λ κ³³κ³³μμ λ‘κ·Έ νΈμΆ λ‘μ§μ μ½μ
ν΄μΌνκ³ , μ΄λ μ½λμ κ°λ
μ±λ λ¨μ΄μ§ λΏλλ¬ SRPλ μ§ν€μ§ λͺ»νλ κ²°κ³Όλ₯Ό μ΄λνλ€.
μ¦ λΆκ° κΈ°λ₯μ μ μ©νλ €λ©΄ μλμ κ°μ λ¬Έμ κ° μ‘΄μ¬ν μ μλ€.
- λΆκ° κΈ°λ₯μ μ μ©ν λ μμ£Ό λ§μ λ°λ³΅μ΄ νμνλ€.
- λΆκ° κΈ°λ₯μ΄ μ¬λ¬ κ³³μ νΌμ Έμ μ€λ³΅ μ½λλ₯Ό λ§λ€μ΄λΈλ€.
- λΆκ° κΈ°λ₯μ λ³κ²½ν λ μ€λ³΅ λλ¬Έμ λ§μ μμ μ΄ νμνλ€.
- λΆκ° κΈ°λ₯μ μ μ© λμμ λ³κ²½ν λ λ§μ μμ μ΄ νμνλ€.
μ΄μ κ΄μ μ§ν₯ νλ‘κ·Έλλ°μΈ AOP κ° μ΄λ»κ² μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλμ§ μμ보μ.
AOP μκ° - Aspect (κ΄μ )
ν΅μ¬ λ‘μ§ κ³³κ³³μ λΌμ¬μλ λΆκ° κΈ°λ₯μ μ΄λμ μ μ©ν μ§, κ·Έλ¦¬κ³ λΆκ° κΈ°λ₯ μ체λ₯Ό μ μνλ μ½λλ₯Ό νλλ‘ ν©μ³ λͺ¨λμ λ§λ€μλλ°, κ·Έκ²μ Aspect
λΌ νλ€. μ½κ² μκΈ°ν΄μ λΆκ° κΈ°λ₯ μ체μ, λΆκ° κΈ°λ₯μ μ΄λμ μ μ©ν μ§ μ μ(=Aspect)ν κ²μ μλ―Ένλ€. μμ μ€λͺ
ν @Aspect
κ° λ°λ‘ κ·Έκ²μ΄λ©°, μ€νλ§μ΄ μ 곡νλ μ΄λλ°μ΄μ
λ μ΄λλ°μ΄μ€(λΆκ° κΈ°λ₯)κ³Ό ν¬μΈνΈμ»·(μ μ© λμ μμΉ)μ κ°μ§κΈ°μ κ°λ
μ νλμ Aspect λΌ ν μ μλ€.
Aspectλ κ΄μ μ΄λΌλ λ»μΌλ‘, μ ν리μΌμ΄μ
μ λ°λΌλ³΄λ κ΄μ μ νλμ κ°μ²΄κ° μλ, ν‘λ¨ κ΄μ¬μ¬λ‘ 보λ κ²μ΄λ€.
AspectJ νλ μμν¬
AOP μ λνμ μΈ κ΅¬ν νλ μμν¬λ‘, μ€νλ§ AOP λ λλΆλΆ AspectJμ λ¬Έλ²μ μ°¨μ©νλ€. λͺ
νν μ§μ΄μΌ ν μ μ, μ€νλ§ AOP μ AspectJ λ λ³λμ ꡬνμ΄λ©°, μ€νλ§ AOPλ AspectJ κ° μ 곡νλ μΌλΆ κΈ°λ₯λ§ μ 곡ν λΏμ΄λ€.
AspectJ λ₯Ό μ¬μ©νλ©΄ ν‘λ¨ κ΄μ¬μ¬μ κΉλν λͺ¨λνκ° κ°λ₯ν΄μ§λ€.
- μ€λ₯ κ²μ¬ λ° μ²λ¦¬
- λκΈ°ν
- μ±λ₯ μ΅μ ν(μΊμ±)
- λͺ¨λν°λ§ λ° λ‘κΉ
AOP μ μ© λ°©μ
μ κ·Έλ¦Όμμλ λ΄€λ―μ΄, AOP λ₯Ό μ¬μ©νλ©΄ ν΅μ¬ λ‘μ§μ λ
Ήμμ Έ μλ λΆκ° κΈ°λ₯μ μμ ν λΆλ¦¬ν΄λΌ μ μλ€.
κ·Έλ λ€λ©΄ AOP λ₯Ό μ¬μ©ν λ λΆκ° κΈ°λ₯ λ‘μ§μ μ΄λ€ λ°©μμΌλ‘ μ€μ λ‘μ§μ μΆκ° λ μ μμκΉ?
3κ°μ§ λ°©λ²μ΄ μλ€.
μ»΄νμΌ μμ
νΉμ§ : .java μμ€ μ½λλ₯Ό μ»΄νμΌλ¬λ₯Ό ν΅ν΄ .class νμΌλ‘ λ§λλ μμ μ λΆκ° κΈ°λ₯ λ‘μ§μ μΆκ°νλ λ°©μμ΄λ€. μ΄λλ AspectJκ° μ 곡νλ νΉλ³ν μ»΄νμΌλ¬λ₯Ό μ¬μ©ν΄μΌνλ€. μ΄λ° μμ λΆκ° κΈ°λ₯ λ‘μ§μ΄ μΆκ° λλ κ²μ μλΉ(weaving) μ΄λΌ νλ€.
λ¨μ : μ»΄νμΌ μμ μ λΆκ° κΈ°λ₯μ μ μ©νλ €λ©΄ νΉλ³ν μ»΄νμΌλ¬λ νμνκ³ λ³΅μ‘ -> μ μ¬μ©νμ§ μλ λ°©μν΄λμ€ λ‘λ© μμ
νΉμ§ : μλ°λ₯Ό μ€ννλ©΄ .class νμΌμ JVM λ΄λΆμ ν΄λμ€ λ‘λμ 보κ΄νλ€. μ΄λ μ€κ°μμ .class νμΌμ μ‘°μν ν JVMμ μ¬λ¦¬λ λ°©μμ΄ ν΄λμ€ λ‘λ© μμ μ λΆκ° κΈ°λ₯μ μ μ©νλ κ²μ΄λ€. μ΄λ₯Ό λ‘λ νμ μλΉ μ΄λΌ λΆλ₯Έλ€.
λ¨μ : μλ°λ₯Ό μ€νν λ νΉλ³ν μ΅μ (Java -javaagent)μ ν΅ν΄ ν΄λμ€ λ‘λ μ‘°μκΈ°λ₯Ό μ§μ ν΄μΌ νλλ°, μ΄ λΆλΆμ΄ λ²κ±°λ‘κ³ μ΄μνκΈ° μ΄λ ΅λ€. -> μ μ¬μ©νμ§ μλ λ°©μλ°νμ μμ νΉμ§
νΉμ§ : μ»΄νμΌκ³Ό ν΄λμ€ λ‘λ©λ λ€ λλ ν μ΄λ―Έ μλ°κ° μ€νλκ³ μλ μμ μ μλ―Ένλ€. (μλ°μ main λ©μλκ° μ€νλ λ€μμ μλ―Έ) μ¦ μλ° μΈμ΄κ° μ 곡νλ λ²μ λ΄μμ λΆκ° κΈ°λ₯μ μ μ©ν΄μΌ νλ©°, μ§κΈκΉμ§ μμλ³Έ νλ‘μ λ°©μμ AOP κ° λ°νμ μμ μ λΆκ° κΈ°λ₯μ μ μ©νλ λ°©λ²μ΄λ€.
νλ‘μλ₯Ό μ¬μ©νκΈ° λλ¬Έμ AOP κΈ°λ₯μ μΌλΆ μ μ½μ΄ μμ§λ§, νΉλ³ν μ»΄νμΌλ¬λ 볡μ‘ν μ΅μ , ν΄λμ€ λ‘λ μ‘°μκΈ°λ₯Ό μ€μ νμ§ μμλ λλ€. μ¦ Spring λ§ μμΌλ©΄ AOP λ₯Ό μ μ©ν μ μλ€. (Spring μ΄ λ³΅μ‘ν μ€μ μ λͺ¨λ ν΄μ£ΌκΈ° λλ¬Έ)
AOP μ©μ΄ μ 리
μ‘°μΈ ν¬μΈνΈ : μ΄λλ°μ΄μ€κ° μ μ©λ μ μλ μμΉ. μ‘°μΈ ν¬μΈνΈλ μΆμμ μΈ κ°λ
μ΄λΌ, AOP λ₯Ό μ μ©ν μ μλ λͺ¨λ μ§μ μ΄λΌ μκ°νλ©΄ λλ€. μ€νλ§ AOP λ νλ‘μ λ°©μμ μ¬μ©νκΈ°μ μ‘°μΈ ν¬μΈνΈλ νμ λ©μλ μ€ν μ§μ μΌλ‘ μ νλλ€.
ν¬μΈνΈμ»· : μ‘°μΈ ν¬μΈνΈ μ€μμ μ΄λλ°μ΄μ€κ° μ μ©λ μμΉλ₯Ό μ λ³νλ κΈ°λ₯. νν°λ§ μ΄λΌ μκ°ν μ μλ€. μ£Όλ‘ AspectJ ννμμ μ¬μ©ν΄μ μ§μ νλ€.
νκ² : μ΄λλ°μ΄μ€κ° μ μ©λλ κ°μ²΄, ν¬μΈνΈμ»·μΌλ‘ κ²°μ λλ€.
μ΄λλ°μ΄μ€ : λΆκ° κΈ°λ₯. νΉμ μ‘°μΈ ν¬μΈνΈμμ Aspect μ μν΄ μ·¨ν΄μ§λ μ‘°μΉ(λ‘μ§) μ΄λΌ λ³Ό μ μλ€. Around, Before, After λ±μ λ€μν μ΄λλ°μ΄μ€κ° μ‘΄μ¬νλ€.
μ μ€ννΈ : μ΄λλ°μ΄μ€μ ν¬μΈνΈμ»·μ λͺ¨λν ν κ°λ
μΌλ‘, @Aspect λ₯Ό μκ°νλ©΄ λλ€. μ¬λ¬ μ΄λλ°μ΄μ€μ ν¬μΈνΈμ»·μ΄ ν¨κ» μ‘΄μ¬νλ€. μ΄λλ°μ΄μ λ νλμ μ΄λλ°μ΄μ€μ ν¬μΈνΈμ»·μ΄ μ‘΄μ¬νλ€ (μ°¨μ΄μ ).
μ΄λλ°μ΄μ : νλμ μ΄λλ°μ΄μ€μ ν¬μΈνΈμ»·μΌλ‘ ꡬμ±μΌλ‘, μ€νλ§ AOP μμλ§ μ¬μ©λλ νΉλ³ν μ©μ΄λ€.
AOP νλ‘μ : AOP κΈ°λ₯μ ꡬννκΈ° μν΄ λ§λ νλ‘μ κ°μ²΄. JDK λμ νλ‘μμ CGLIB νλ‘μκ° ν΄λΉλλ€.
μ½λ λ° μλ£ μΆμ²
'Backend > πΏ Spring' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
κ°λ°νλ©΄μ λ°°μ΄ Map vs DTO λ°©μμ μ°¨μ΄μ (0) | 2022.07.31 |
---|---|
[JPA] API κ°λ° - μ§μ°λ‘λ©κ³Ό μ±λ₯ μ΅μ ν (feat.Fetch μ‘°μΈ) (0) | 2022.06.16 |
[Spring] λΉ νμ²λ¦¬κΈ°, Bean Postprocessor (0) | 2022.06.04 |
[Spring] Pointcut, Advise, Advisor κΈ°λ³Έ κ°λ μ μμ보μ (0) | 2022.06.03 |
[Spring] ProxyFactory (0) | 2022.06.03 |