AOP(Aspect-Oriented Programming)
μ ν리μΌμ΄μ
μ ν΅μ¬ λΉμ¦λμ€ λ‘μ§κ³Ό κ΄λ ¨ μλ λΆκ°μ μΈ κΈ°λ₯λ€μ λͺ¨λννμ¬ μ½λμ μ€λ³΅μ μ€μ΄κ³ μ μ§λ³΄μμ±μ ν₯μμν€λλ° μ£Όλ‘ νμ©
- μ€λ³΅λλ κ³΅ν΅ μ½λ λΆλΆμ λ³λμ μμμΌλ‘ λΆλ¦¬
- μ½λκ° μν λκΈ° μ μ΄λ μ΄ νμ μμ μ ν΄λΉ μ½λλ₯Ό λΆμ¬ λ£μ
μμ€ μ½λμ μ€λ³΅μ μ€μ΄κ³ νμν λλ§λ€ κ°μ Έλ€ μΈ μ μκ² κ°μ²΄ν νλ κΈ°μ
λΆκ° κΈ°λ₯(ex: λ‘κΉ
, 보μ, νΈλμμ
)μ ν΅μ¬ κΈ°λ₯μμ λΆλ¦¬ν΄ ν κ³³μΌλ‘ κ΄λ¦¬νλλ‘ νκ³ μ΄ λΆκ° κΈ°λ₯μ μ΄λμ μ μ©ν μ§ μ ννλ κΈ°λ₯μ ν©ν νλμ λͺ¨λ
μλ‘ λ€λ₯Έ ν΄λμ€λΌκ³ νλλΌλ λΉμ·ν κΈ°λ₯μ νλ λΆλΆ(Concern)μ΄ μλ€.
- Cross-Cutting-Corncern
λ§μ½ λ
Έλμ κΈ°λ₯μ μμ ν΄μΌνλ©΄ κ°κ° ν΄λμ€μ λ
Έλμ κΈ°λ₯μ μΌμΌμ΄ μμ ν΄μ€μΌνλλ° μ μ§λ³΄μλ©΄μμ λΆλ¦¬
AOPλ₯Ό μ΄μ©ν λ°©λ²
AOP νΉμ§
- νλ‘μ ν¨ν΄ κΈ°λ°
- νλ‘μ κ°μ²΄λ₯Ό μ°λ μ΄μ λ μ κ·Ό μ μ΄ λ° λΆκ°κΈ°λ₯μ μΆκ°νκΈ° μν¨
- νλ‘μκ° νΈμΆμ κ°λ‘μ± (Intercept)
- νκ² κ°μ²΄μ λν νΈμΆμ κ°λ‘μ± λ€μ λΆκ°κΈ°λ₯ λ‘μ§μ μννκ³ λ νμ νκ²μ ν΅μ¬κΈ°λ₯
How to implement AOP
- μ»΄νμΌ νμ μλΉ
- ν΄λμ€ λ‘λ© νμ μλΉ
- λ°νμ μλΉ(νλ‘μ)
- μ»΄νμΌ νμ μλΉμ μ»΄νμΌ μμ μ μ½λλ₯Ό λ§λΆμ¬μ£Όλ λ°©λ²
- ν΄λμ€ λ‘λ© μλΉμ ν΄λμ€ νμΌ λ‘λ© νμμ μ½λλ₯Ό λ§λΆμ¬μ£Όλ λ°©λ²
- λ°νμ μλΉμ νλ‘μλ₯Ό νμ©ν λ°©λ²
Weaving
λͺ¨λνν λΆκ° κΈ°λ₯μ νκ²μ μ μ©ν΄ ν΅μ¬ κΈ°λ₯κ³Ό μ°κ²°νλ κ³Όμ
Runtime Weaving
Proxy κ°μ²΄λ₯Ό μμ±ν΄ μ€μ νκ² μ€λΈμ νΈμ λ³νμμ΄ λ°νμ μ€ λ©μλ νΈμΆμ΄ μΌμ΄λλ μμ μ μλΉμ μν
Proxy
ν΄λΌμ΄μΈνΈ-μλ² λ±μ κ΄κ³μμ μ€κ°μ λΌμ΄ λλ¦¬μΈ μν μ νλ κ°μ²΄
- νλ‘μμ μ€μ κ°μ²΄κ° 곡μ νλ μΈν°νμ΄μ€κ° μκ³ ν΄λΌμ΄μΈνΈλ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ νλ‘μλ₯Ό μ¬μ©
- ν΄λΌμ΄μΈνΈλ μ€μ κ°μ²΄λ₯Ό μ¬μ©νλ κ²μ²λΌ λμνμ§λ§ μ€μ λ‘λ νλ‘μλ₯Ό ν΅ν΄μ μ κ·Όνκ² λλ€
- μ€κ°μ νλ‘μλ₯Ό μ¬μ©ν¨μΌλ‘μ μ κ·Όκ΄λ¦¬(보μ), μΊμ±(μ±λ₯), νν° λ±μ λΆκ°κΈ°λ₯λ€μ μ 곡ν μ μλ€
- μ€μ κ°μ²΄λ μμ μ΄ ν΄μΌν μΌ(λ¨μΌ μ± μ μμΉ)λ§ μ§μ€νλ©΄μ λΆκ°μ μΈ κΈ°λ₯(λ‘κΉ , νΈλμμ μ²λ¦¬λ±)μ νλ‘μ κ°μ²΄μκ² λ겨 κ°μ²΄μ§ν₯μ μΈ νλ‘κ·Έλλ°μ ν μ μκ² λλ€
IoC(Inversion of Control)
- μ ν리μΌμ΄μ μ νλ¦ μ μ΄λ₯Ό κ°λ°μκ° μλ νλ μμν¬ λλ 컨ν μ΄λκ° λ΄λΉνλ κ²
- κ°μ²΄μ μμ± λ° κ°μ²΄ κ°μ μμ‘΄μ±μ μλμΌλ‘ μ²λ¦¬νμ§ μκ³ νλ μμν¬ λλ 컨ν μ΄λκ° λμ κ΄λ¦¬ν΄μ£Όλ κ²
- κ°μ²΄μ μμ±κ³Ό κ΄λ¦¬, κ°μ²΄ κ°μ μμ‘΄μ± μ²λ¦¬ λ±μ νλ μμν¬μμ λμ μ²λ¦¬ν΄μ£Όλ κ²
IoC Container
IoCλ₯Ό ꡬνν ꡬ체μ μΈ νλ μμν¬
μ ν΅μ μΈ μ μ°¨μ νλ‘κ·Έλλ°μμ μμ μ μ½λκ° μ§μ μ¬μ©ν μ€λΈμ νΈλ₯Ό κ²°μ νκ³ , κ²°μ ν μ€λΈμ νΈλ₯Ό μμ±νκ³ μμ±ν μ€λΈμ νΈμ λ©μλλ₯Ό νΈμΆνλ μμ΄μ§λ§ IoCλ₯Ό μ μ©νλ©΄ λͺ¨λ μ μ΄ κΆνμ μμ μ΄ μλ λ€λ₯Έ λμμκ² μμν©λλ€.
- Injection Configuration : μ€μ μ£Όμ
- Inject Dependencies : μμ‘΄μ± μ£Όμ
- Manage Lifecycle : λΌμ΄νμ¬μ΄ν΄ κ΄λ¦¬
DI(Dependency Injection)
κ°μ²΄ κ°μ μμ‘΄μ±μ νλ μμν¬κ° μ£Όμ
νλ κ°λ
- κ°μ²΄κ° μ§μ μμ‘΄νλ κ°μ²΄λ₯Ό μμ±νκ±°λ μ°Έμ‘°νλ λμ μ΄λ¬ν μμ‘΄μ±μ μΈλΆμμ μ£Όμ λ°λλ‘ νλ€.
Denpendency Injectionμ μ¬μ©νμ§ μμ κ²½μ°
public class UserService { private UserRepository userRepository; public UserService() { this.userRepository = new UserRepository(); // μ§μ μμ± } }
Dependency Injectionμ μ¬μ©ν κ²½μ°
- Constructor Injection
- μμ±μλ₯Ό ν΅ν΄ μμ‘΄μ±μ μ£Όμ νλ λ°©μ
- ν΄λμ€μ μμ±μλ₯Ό μ μνκ³ μμ‘΄νλ κ°μ²΄λ₯Ό 맀κ°λ³μλ‘ λ°μ νλμ ν λΉ
public class UserService { private UserRepository userRepository; @Autowired public UserService(UserRepository userRepository) { this.userRepository = userRepository; } }
- Setter Injection
- Setter λ©μλλ₯Ό ν΅ν΄ μμ‘΄μ±μ μ£Όμ νλ λ°©μ
- Setter λ©μλλ₯Ό μ μνκ³ ν΄λΉ λ©μλλ₯Ό ν΅ν΄ μμ‘΄νλ κ°μ²΄λ₯Ό μ£Όμ
public class OrderService { private PaymentGateway paymentGateway; @Autowired public void setPaymentGateway(PaymentGateway paymentGateway) { this.paymentGateway = paymentGateway; } }
- Method Injection
- λ©μλμ 맀κ°λ³μλ‘ μμ‘΄μ±μ μ£Όμ νλ λ°©μ
@Component public class ReportGenerator { private EmailService emailService; @Autowired public void setEmailService(EmailService emailService) { this.emailService = emailService; } public void generateReport() { } }
S.O.L.I.D
κ°μ²΄μ§ν₯ μ€κ³μμ μ§μΌμ€μΌ ν 5κ°μ μννΈμ¨μ΄ κ°λ° μμΉ
- SRP (Single Responsibilty Principle) : λ¨μΌ μ± μ μμΉ
- OCP (Open Closed Principle) : κ°λ°© νμ μμΉ
- LSP (Listov Subsititution Principle) : 리μ€μ½ν μΉν μμΉ
- ISP (Interface Segregation Principle) : μΈν°νμ΄μ€ λΆλ¦¬ μμΉ
- DIP (Dependency Inversion Principle) : μμ‘΄ μμ μμΉ
λ¨μΌ μ± μ μμΉ
- ν΄λμ€(κ°μ²΄)λ λ¨ νλμ μ± μλ§ κ°μ ΈμΌ νλ€
- νλμ ν΄λμ€λ νλμ κΈ°λ₯μ λ΄λΉνμ¬ νλμ μ± μμ μν
κ°λ°© νμ μμΉ
- νμ₯μλ μ΄λ €μμ΄μΌ νλ©° μμ μλ λ«νμμ΄μΌ νλ€
- μΆμν μ¬μ©μ ν΅ν κ΄κ³ ꡬμΆμ κΆμ₯
리μ€μ½ν μΉν μμΉ
- μλΈ νμ μ μΈμ λ κΈ°λ°(λΆλͺ¨) νμ μΌλ‘ κ΅μ²΄ν μ μμ΄μΌ νλ€
- μμ ν΄λμ€ νμ μΌλ‘ κ°μ²΄λ₯Ό μ μΈνμ¬ νμ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ°μΌλ©΄ μ μΊμ€ν λ μνμμ λΆλͺ¨μ λ©μλλ₯Ό μ¬μ©ν΄λ λμμ΄ μλλλ‘ νλ¬κ°μΌ νλ κ²
μΈν°νμ΄μ€ λΆλ¦¬ μμΉ
- μΈν°νμ΄μ€λ₯Ό κ°κ° μ¬μ©μ λ§κ² λ μκ² λΆλ¦¬ν΄μΌνλ€
- ν΄λΌμ΄μΈνΈμ λͺ©μ κ³Ό μ©λμ μ ν©ν μΈν°νμ΄μ€ λ§μ μ 곡
μμ‘΄ μμ μμΉ
- μ΄λ€ Classλ₯Ό μ°Έμ‘°ν΄μ μ¬μ©ν΄μΌνλ μν©μ΄ μκΈ΄λ€λ©΄ κ·Έ Classλ₯Ό μ§μ μ°Έμ‘°νλ κ²μ΄ μλλΌ κ·Έ λμμ μμ μμ(μΆμ ν΄λμ€ or μΈν°νμ΄μ€)λ‘ μ°Έμ‘°νλΌ
- μΈν°νμ΄μ€μ μμ‘΄ν΄λΌ
Β