CH02 AOP
Last updated
Last updated
cross cutting μ΄λΌλ μ©μ΄κ° 'ν‘λ¨μ μΈ'μ μλ―Έλ₯Ό κ°μ§λ€. AOP μμμ cross cutting concern μ κ²°κ΅ μ κ·Έλ¦Όμμ λ³Ό μ μλ―μ΄ μ¬λ¬ Class λ€μ λκ³ 'ν‘λ¨μΌλ‘ λ΄€μλμ (곡ν΅λ) κ΄μ¬μ¬' λ₯Ό λ§νλ€. μ¬λ¬ λͺ¨λ νΉμ κ°μ²΄λ₯Ό κ°λ‘μ§λ₯΄λ 곡ν΅λ κ΄μ¬μ¬μ΄λ©° μ΄κ²μ λν μ²λ¦¬λ₯Ό λΆμ°μμΌ λμ κ²μ΄ μλλΌ ν κ³³μμ λͺ¨λνν΄μ μ²λ¦¬νλλ‘ νλ κ²μ΄ AOP λΌκ³ ν μ μλ€.
보ν΅μ λ‘μ§μ΄λ ν΄λμ€λ₯Ό 'μ’ λ¨'μΌλ‘ 보기 λλ¬Έμ΄λ€. μΌλ°μ μΌλ‘ μ½λκ° μμμ μλλ‘ μμ°¨μ μΌλ‘ μ§νλκΈ° λλ¬Έμ μ΄λμλ 곡ν΅μ μΌλ‘ μ μ© λλ(=μ μ© μν€κ³ μΆμ) κ΄μ¬μ¬λ 'ν‘λ¨'κ΄μ¬μ¬ λΌκ³ λ§νλ κ²μ΄ ν©λ¦¬μ μ΄λ€.
μλ JVM κ΅¬μ± λ° νλ¦μ 보면μ AOP μ μ© νμμ λ μ μΈμ§νμ.
μ»΄νμΌ νμμ λ°μ΄νΈμ½λ μ체μ μνλ μ²λ¦¬κ° λ°μλλ€. μ»΄νμΌλ¬κ° μ»΄νμΌ λ¨κ³μμ AOP λ₯Ό μΈμνμ¬ μλμ λ§κ² μ΄λ₯Ό λ°μν λ°μ΄νΈμ½λλ₯Ό λ§λ€μ΄λΈλ€.
λ°μ΄νΈμ½λ μ체μ μ΄λ―Έ λ°μμ΄ λμκΈ° λλ¬Έμ μ€ν μμ μ μΆκ°μ μΈ λΆνκ° λ°μνμ§ μλλ€. νμ§λ§ μ»΄νμΌ λ¨κ³μ μΆκ°μ μΈ μμ μ΄ νμνλ€.
ν΄λμ€ λ‘λ© μμ μ AOPλ₯Ό μ μ©νλ λ°©μμ΄λ€. ν΄λμ€ λ‘λ© μ€μ λ°μ΄νΈ μ½λλ₯Ό μμ ν΄μ AOP λ₯Ό μ μ©μν¨λ€. λ‘λ νμ μλΉ(Load-time Weaving) κΈ°λ₯μ΄ μ¬μ©λλ€. λ‘λ νμμ 'λΌμλ£λ' κ²μ΄λ€. μ»΄νμΌ μ΄νμλ μ μ©λ μ μμ§λ§ μ€ν μ μ€λ²ν€λκ° μλ€.
λ‘λ νμ μλΉ μ¬μ©μμλ ν΄λμ€ νμΌ μ체μλ λ³κ²½μ΄ μκΈ°λ κ²μ΄ μλκ³ , ν΄λμ€ λ‘λκ° ν΄λμ€λ₯Ό μ½μ΄μ λ©λͺ¨λ¦¬μ λ‘λν λμ λ°μ΄νΈ μ½λλ₯Ό μ‘°μνμ¬μ λ©λͺ¨λ¦¬μ μ μ¬νλ κ²μ΄λ€.
μ€νλ§ νλ μμν¬κ° μ¬μ©νλ λ°©μμ΄λ€. Beanμ μμ±ν λ νλ‘μ λ°©μμΌλ‘ κ°μ²΄λ₯Ό κ°μΈμ νλ‘μ κ°μ²΄λ₯Ό λ§λ λ€. μ΄κΈ°μ Bean μ μμ±ν λ μ½κ°μ λΆνκ° λ°μνμ§λ§ μ€ν μμ μλ μ€λ²ν€λκ° μλ€.
μλ₯Ό λ€μ΄ ClassA κ° μμλ, μ΄κ²μ λ°μ΄νΈμ½λλ‘ λ§λ€λμ ν΄λμ€ λ‘λνλ μμ μ λͺ¨λ μ무 νμλ νμ§ μμ§λ§ μ΄κΈ°μ Bean μ μμ±νμ¬ μ»¨ν μ΄λμ λ΄μλ νλ‘μ λ°©μμΌλ‘ κ°μ²΄λ₯Ό κ°μΈμ μνλ μλκ° λ°μλ νλ‘μ κ°μ²΄λ₯Ό λ§λ€μ΄μ Bean μ μμ±νλ€.
μμμ μ΄ν΄λ³Έ κ²μ²λΌ λ°νμ λ°©μμ νλ‘μ κ°μ²΄λ₯Ό λ§λ€μ΄μ bean μ μμ±νλ€.
AbstractAutoProxyCreator κ° μ΄ μν μ λ΄λΉνλ€.
μ£Όμμ 보면 μλμ κ°μ΄ μ νμλ€.
μ΄ κ³Όμ μ λν΄μ λ μμΈνλ ν λΉμ μ€νλ§μμ λ€λ£¨κ³ μλ€κ³ νλλ° λμ€μ ν λΉμ μ€νλ§ μ 리ν λ μμΈν λ΄μΌκ² λ€.
μ 리νμλ©΄ (Factory hook that allows for custom modification of new bean instances) μ ꡬνμ²΄μΈ AbstractAutoProxyCreator κ° Bean μμ± νμ²λ¦¬μ κ΄μ¬νμ¬ μ΄λ₯Ό modify ν΄μ νλ‘μ κ°μ²΄ μμ±μ νλ©΄μ λΆκ° κΈ°λ₯μ μλμ λ§κ² λ£μ΄μ£Όλ κ²μ΄λ€.