+) 22. 06. 20. λλμ΄ μ 리 λ€ λλ΄μ μΆκ°
IoC(Inversion of Control / μ μ΄ μμ ): κ°μ²΄μ μμ±, μλͺ μ£ΌκΈ°μ κ΄λ¦¬κΉμ§ λͺ¨λ κ°μ²΄μ λν μ μ΄κΆμ΄ λ°λμλ€λ κ²μ μλ―Ένλ€.
βοΈ μ€νλ§ νλ μμν¬κ° IoC 컨ν μ΄λ κΈ°λ₯μ μ 곡νλ€.
IoC 컨ν
μ΄λ: κ°μ²΄μ μμ±μ μ±
μμ§κ³ μμ‘΄μ±μ κ΄λ¦¬νλ€.
POJOμ μμ±, μ΄κΈ°ν, μλΉμ€, μλ©Έμ λν κΆνμ κ°μ§λ€.
*POJO(Plain Old Java Project): κ°μ²΄ μ§ν₯μ μΈ μ리μ μΆ©μ€νλ©΄μ νκ²½κ³Ό κΈ°μ μ μ’ μλμ§ μκ³ νμμ λ°λΌ μ¬νμ© ν μ μλ λ°©μμΌλ‘ μ€κ³λ μ€λΈμ νΈ.
μΈμ€ν΄μ€ μλͺ
μ£ΌκΈ°λ₯Ό κ°λ°μκ° μλ 컨ν
μ΄λκ° λμ κ΄λ¦¬ν΄ μ€λ€.
β κ°λ°μλ λ‘μ§μλ§ μ§μ€ κ°λ₯.
*μλͺ
μ£ΌκΈ°: μΈμ€ν΄μ€μ μνμ λ°λΌμ νΈμΆν μ μλ μμ±.
βοΈ IoC λΆλ₯
μμ‘΄μ± κ²μ - DL(Dependency Lookup): μ μ₯μμ μ μ₯λμ΄ μλ Beanμ μ κ·ΌνκΈ° μν΄ μ»¨ν μ΄λκ° μ 곡νλ APIλ₯Ό μ΄μ©νμ¬ Beanμ Lookup νλ κ².
μμ‘΄μ± μ£Όμ - DI(Dependency Injection): Setter Injection / Constructor Injection / Method Injection
κ° ν΄λμ€ κ°μ μμ‘΄κ΄κ³λ₯Ό λΉ μ€μ μ 보λ₯Ό λ°νμΌλ‘ 컨ν μ΄λκ° μλμΌλ‘ μ°κ²°ν΄μ£Όλ κ².
*XML, annotationμΌλ‘ μ€μ .
DLμ μ¬μ©νλ©΄ 컨ν
μ΄λ μ’
μμ±μ΄ μ¦κ°νκΈ° λλ¬Έμ μ£Όλ‘ DIλ₯Ό μ¬μ©νλ€.
βοΈ DIμ κ°λ
κ°λ°μκ° μμ‘΄κ΄κ³λ₯Ό μ€μ ν΄λμΌλ©΄ 컨ν
μ΄λκ° μλμΌλ‘ μ£Όμ
ν΄μ€λ€.
κ°λ°μλ€μ λ¨μ§ λΉ μ€μ νμΌμμ μμ‘΄κ΄κ³κ° νμνλ€λ μ 보λ₯Ό μΆκ°νλ©΄ λλ€.
κ°μ²΄ λ νΌλ°μ€λ₯Ό 컨ν μ΄λλ‘λΆν° μ£Όμ λ°μμ μ€ν μμ λμ μΌλ‘ μμ‘΄κ΄κ³κ° μμ±λλ€.
컨ν μ΄λκ° νλ¦μ μ£Όμ²΄κ° λμ΄ μ ν리μΌμ΄μ μ½λμ μμ‘΄κ΄κ³λ₯Ό μ£Όμ ν΄μ£Όλ κ²μ΄λ€.
β μ₯μ : μ½λκ° λ¨μν΄μ§λ€. μ»΄ν¬λνΈ κ°μ κ²°ν©λκ° μ κ±°λλ€.
βοΈ DIμ μ ν
βοΈ Spring DI 컨ν
μ΄λκ° κ΄λ¦¬νλ κ°μ²΄ == λΉ(Bean)
μ΄ λΉλ€μ κ΄λ¦¬νλ€λ μλ―Έλ‘ μ»¨ν
μ΄λλ₯Ό λΉ ν©ν 리(Bean Factory)λΌ λΆλ₯Έλ€.
λΉ ν©ν 리μ μ¬λ¬ κ°μ§ 컨ν
μ΄λ κΈ°λ₯μ μΆκ°νμ¬ Application Context λΌκ³ λΆλ₯Έλ€.
interface
BeanFactory
β¬οΈ
interface
ApplicationContext
BeanFactory: λΉμ λ±λ‘, μμ±, μ‘°ν, λ°ν κ΄λ¦¬λ₯Ό νλ€.
β¬οΈ νμ₯
ApplicationContext: κΈ°λ₯μ λΉ ν©ν 리μ κ°μ. Springμ κ°μ’
λΆκ° μλΉμ€λ₯Ό μΆκ°λ‘ μ 곡νλ€.
AOP: κ΅μ°¨ κ΄μ¬μ¬μ λΆλ¦¬λ₯Ό νμ©νμ¬ λͺ¨λμ±μ λμ΄λ κ²μ λͺ©νλ‘ νλ νλ‘κ·Έλλ° ν¨λ¬λ€μ. μ½λ μ체λ₯Ό μμ νμ§ μκ³ κΈ°μ‘΄ μ½λμ μΆκ° λμμ μΆκ°νμ¬ μ΄λ₯Ό μννλ€.
βοΈ AOPλ μ ν리μΌμ΄μ μ κ΄μ¬μ¬μ λΆλ¦¬(κΈ°λ₯μ λΆλ¦¬) μ¦, ν΅μ¬μ μΈ κΈ°λ₯μμ λΆκ°μ μΈ κΈ°λ₯μ λΆλ¦¬νλ€. λΆλ¦¬ν λΆκ°κΈ°λ₯μ AspectλΌλ λ νΉν λͺ¨λννλ‘ λ§λ€μ΄μ μ€κ³νκ³ κ°λ°νλ λ°©λ²μ΄λ€.
βοΈ AOPλ λΆκ°κΈ°λ₯μ Aspectλ‘ μ μνμ¬, ν΅μ¬κΈ°λ₯μμ λΆκ°κΈ°λ₯μ λΆλ¦¬ν¨μΌλ‘μ¨ ν΅μ¬κΈ°λ₯μ μ€κ³νκ³ κ΅¬νν λ κ°μ²΄μ§ν₯μ μΈ κ°μΉλ₯Ό μ§ν¬ μ μλλ‘ λμμ£Όλ κ°λ μ΄λ€.
*ν΅μ¬κΈ°λ₯: μ
무 λ‘μ§μ ν¬ν¨νλ κΈ°λ₯. (μνμΌλ‘ μλ₯Ό λ€λ©΄ κ³μ’μ΄μ²΄, λμΆμΉμΈ λ±)
*λΆκ°κΈ°λ₯: ν΅μ¬κΈ°λ₯μ λμμ£Όλ λΆκ°μ μΈ κΈ°λ₯(λ‘κΉ
, 보μ λ±)
βοΈ Aspect: λΆκ°κΈ°λ₯μ μ μν μ½λμΈ μ΄λλ°μ΄μ€(Advice)μ μ΄λλ°μ΄μ€λ₯Ό μ΄λμ μ μ©νλμ§λ₯Ό κ²°μ νλ ν¬μΈνΈμ»·(PointCut)μ ν©μΉ κ°λ μ΄λ€.
β Advice + PointCut = Aspect
AOP κ°λ μ μ μ©νλ©΄ ν΅μ¬κΈ°λ₯ μ½λ μ¬μ΄μ μΉ¨ν¬λ λΆκ°κΈ°λ₯μ λ 립μ μΈ μ μ€ννΈλ‘ ꡬλΆν μ μλ€.
ꡬλΆλ λΆκ°κΈ°λ₯ μ μ€ννΈλ₯Ό λ°νμ μμ νμν μμΉμ λμ μΌλ‘ μ°Έμ¬νκ² ν μ μλ€.
βοΈ AOP μ©μ΄
νκ²: ν΅μ¬κΈ°λ₯μ λ΄κ³ μλ λͺ¨λ. λΆκ°κΈ°λ₯μ λΆμ¬ν λμ.
μ΄λλ°μ΄μ€: νκ²μ μ 곡ν λΆκ°κΈ°λ₯μ λ΄κ³ μλ λͺ¨λ.
μ‘°μΈ ν¬μΈνΈ: μ΄λλ°μ΄μ€κ° μ μ©λ μ μλ μμΉ.
β νκ² κ°μ²΄κ° ꡬνν μΈν°νμ΄μ€μ λͺ¨λ λ©μλλ μ‘°μΈ ν¬μΈνΈκ° λλ€.
ν¬μΈνΈ μ»·: μ΄λλ°μ΄μ€λ₯Ό μ μ©ν νκ²μ λ©μλλ₯Ό μ λ³νλ μ κ·ννμ.
μ μ€ννΈ: AOPμ κΈ°λ³Έ λͺ¨λ. μ±κΈν€ ννμ κ°μ²΄λ‘ μ‘΄μ¬.
μ΄λλ°μ΄μ : μ΄λλ°μ΄μ€ + ν¬μΈνΈμ»·. Spring AOPμμλ§ μ¬μ©λλ€.
μλΉ(Weaving): ν¬μΈνΈμ»·μ μν΄ κ²°μ λ νκ²μ μ‘°μΈ ν¬μΈνΈμ λΆκ°κΈ°λ₯(μ΄λλ°μ΄μ€)λ₯Ό μ½μ
νλ κ³Όμ μ λ»νλ€. μλΉμ AOPκ° ν΅μ¬κΈ°λ₯(νκ²)μ μ½λμ μν₯μ μ£Όμ§ μμΌλ©΄μ νμν λΆκ°κΈ°λ₯(μ΄λλ°μ΄μ€)μ μΆκ°ν μ μλλ‘ ν΄μ£Όλ ν΅μ¬μ μΈ μ²λ¦¬κ³Όμ μ΄λ€.
βοΈ Spring AOPμ νΉμ§
Springμ νλ‘μ(Proxy) κΈ°λ° AOPλ₯Ό μ§μνλ€.
μ€νλ§μ νκ² κ°μ²΄μ λν νλ‘μλ₯Ό λ§λ€μ΄ μ 곡νλ€.
νκ²μ κ°μΈλ νλ‘μλ μ€νμκ°(Runtime)μ μμ±λλ€.
νλ‘μλ μ΄λλ°μ΄μ€λ₯Ό νκ² κ°μ²΄μ μ μ©νλ©΄μ μμ±λλ κ°μ²΄λ€.
νλ‘μκ° νΈμΆμ κ°λ‘μ±λ€. (Intercept)
μ μ²λ¦¬ μ΄λλ°μ΄μ€: νλ‘μκ° νκ² κ°μ²΄μ λν νΈμΆμ κ°λ‘μ± λ€μ μ΄λλ°μ΄μ€μ λΆκ°κΈ°λ₯ λ‘μ§μ μννλ€. κ·Έλ¦¬κ³ κ·Έ νμ ν΅μ¬κΈ°λ₯ λ‘μ§μ νΈμΆνλ€.
νμ²λ¦¬ μ΄λλ°μ΄μ€: νκ²μ ν΅μ¬κΈ°λ₯ λ‘μ§ λ©μλλ₯Ό νΈμΆν νμ λΆκ°κΈ°λ₯(μ΄λλ°μ΄μ€)μ μννλ€.
Spring AOPλ λ©μλ μ‘°μΈ ν¬μΈνΈλ§ μ§μνλ€.
Springμ λμ νλ‘μλ₯Ό κΈ°λ°μΌλ‘ AOPλ₯Ό ꡬν.
β λ©μλ μ‘°μΈ ν¬μΈνΈλ§ μ§μ.
β ν΅μ¬κΈ°λ₯(νκ²)μ λ©μλκ° νΈμΆλλ λ°νμ μμ μλ§ λΆκ°κΈ°λ₯(μ΄λλ°μ΄μ€)μ μ μ©ν μ μλ€.
AspectJ κ°μ κ³ κΈ AOP νλ μμν¬λ₯Ό μ¬μ©νλ©΄ κ°μ²΄μ μμ±, νλκ°μ μ‘°νμ μ‘°μ, static λ©μλ νΈμΆ λ° μ΄κΈ°ν λ±μ λ€μν μμ
μ λΆκ°κΈ°λ₯μ μ μ©ν μ μλ€.
βοΈ Spring AOPμ ꡬν λ°©μ
XML κΈ°λ°μ POJO ν΄λμ€λ₯Ό μ΄μ©ν AOP ꡬν
λΆκ°κΈ°λ₯μ μ 곡νλ Active ν΄λμ€λ₯Ό μμ±νλ€.
XML μ€μ νμΌμ <aop.config>λ₯Ό μ΄μ©ν΄μ μ μ€ννΈλ₯Ό μ€μ νλ€.
β μ΄λλ°μ΄μ€μ ν¬μΈνΈμ»· μ€μ
@Aspect μ΄λ Έν μ΄μ μ μ΄μ©ν AOP ꡬν
@Aspect μ΄λ Έν μ΄μ μ μ΄μ©ν΄μ λΆκ°κΈ°λ₯μ μ 곡νλ Aspect ν΄λμ€λ₯Ό μμ±νλ€. μ΄λ Aspect ν΄λμ€λ μ΄λλ°μ΄μ€λ₯Ό ꡬννλ λ©μλμ ν¬μΈνΈμ»·μ ν¬ν¨νλ€.
XML μ€μ νμΌμ <aop:aspectj-autoproxy /> λ₯Ό μ€μ νλ€.
μ°Έκ³ μλ£
βοΈ IoC (https://youtu.be/GKoCibDM6Ns)
βοΈ AOP (https://youtu.be/GKoCibDM6Ns)
day 6π κ³Ό day8 π μ°Έκ³ .
컬λ μ
(Collection): λͺ©λ‘μ± λ°μ΄ν°λ₯Ό μ²λ¦¬νλ μλ£κ΅¬μ‘°.
Collection Framework: λλμ λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ μ²λ¦¬ν μ μλ κΈ°λ₯μ μ 곡ν΄μ£Όλ ν΄λμ€μ μ§ν©.
*μλ£κ΅¬μ‘°: μ΄λ€ μ 보λ₯Ό λ΄λ κ². μ¬λ¬ λ°μ΄ν°λ₯Ό λ΄μ λ μ¬μ©νλ€.
λ°°μ΄κ³Όμ μ°¨μ΄μ : μ μ λ©λͺ¨λ¦¬ ν λΉμ΄ μλ λμ λ©λͺ¨λ¦¬ ν λΉμ νλ€.
β new int[4]λ₯Ό νλ©΄ 곡κ°μ 4κ°λ°μ λͺ» μ°κ³ , 미리 μ μΈμ ν΅ν΄ 4κ°μ 곡κ°μ λ§λ€μ΄μΌ νμ§λ§ Collectionμ 곡κ°μ΄ νμν λ§νΌ κ³μ μΆκ°ν μ μλ€.
μλ£κ΅¬μ‘° μ ν
List: μμκ° μμΌλ©° μ€λ³΅μ΄ νμ©λλ€.
Set: μμκ° μκ³ μ€λ³΅μ΄ νμ©λμ§ μλλ€.
Queue: λ¨Όμ λ€μ΄μ¨ κ²μ΄ λ¨Όμ λκ°λ μ μ μ μΆ(FIFO) ꡬ쑰.
Map: Key-Value ννλ‘ μ μ₯λλ©°, μμκ° μκ³ ν€λ μ€λ³΅μ΄ μ λμ§λ§ κ°μ μ€λ³΅μ΄ νμ©λλ€.
Listμ Set, Queue μΈν°νμ΄μ€λ Collection μΈν°νμ΄μ€λ₯Ό μμλ°μ§λ§ Map μΈν°νμ΄μ€λ λ
립μ μΌλ‘ μ μλμ΄ μλ€.
List κ΄λ ¨ ν΄λμ€
ArrrayList: λ¨λ°©ν₯ ν¬μΈν° κ΅¬μ‘°λ‘ κ° λ°μ΄ν°μ μΈλ±μ€λ₯Ό κ°μ§κ³ μμ΄ μ‘°ν μ±λ₯μ΄ λ°μ΄λλ€. λ°°μ΄μ ν¬κΈ°λ₯Ό κ³ μ ν μ μλ€.
LinkedList: κ° λ°μ΄ν°κ° λ Έλμ ν¬μΈν°λ‘ ꡬμ±λμ΄ μλ€. ν¬μΈν°λ‘ μ°κ²°λμ΄ μκΈ° λλ¬Έμ ArrayListμ λΉν΄ μ€κ°μ λ°μ΄ν°λ₯Ό μ½μ νκ±°λ μμ νκΈ° μ©μ΄νλ€.
Vector: ArrayListμ λμΌνκ² λμνμ§λ§, ArrayListμ λ€λ₯΄κ² Thread-Safeνλ€. (λ€λ§ μ€λ λκ° ν κ°μ¬λ λκΈ°νλ₯Ό νκΈ° λλ¬Έμ ArrayListμ λΉν΄ μ±λ₯μ μ‘°κΈ λ¨μ΄μ§λ€.)
*Thread-Safe: μ΄λ€ ν¨μλ λ³μ, κ°μ²΄κ° μ¬λ¬ μ€λ λλ‘λΆν° λμμ μ κ·Όμ΄ μ΄λ£¨μ΄μ Έλ νλ‘κ·Έλ¨μ μ€νμ λ¬Έμ κ° μμμ λ»νλ€.
Stack: μ νμ μΈ Stack λ©λͺ¨λ¦¬ ꡬ쑰βνμ
μ μΆ(LIFO)μ ꡬ쑰βλ₯Ό κ°μ§κ³ μλ€.
ArrayListμ HashSetμ μ°¨μ΄μ
ArrayList | HashSet |
---|---|
μμ O | μμ X |
μ€λ³΅κ° O | μ€λ³΅κ° X |
νΉμ μμΉμ μμμ μ κ·Ό κ°λ₯ | νΉμ μμΉμ κ°μ μ κ·Ό λΆκ° |
μ°Έκ³ μλ£
βοΈ List μΈν°νμ΄μ€ μ΄ν΄λ³΄κΈ° (https://youtu.be/uPSkCKB4Kuo)
βοΈ μ΄κ°λ¨ μλ° - 컬λ μ
(https://youtu.be/JUMvRuJDiLQ)