Inversion of Control, 즉 μ œμ–΄μ˜ μ—­μ „μ΄λž€ λ‹€μŒ ν•œ λ¬Έμž₯으둜 μ •μ˜ν•  수 μžˆλ‹€.

Inversion of Control (IoC) The approach of outsourcing the construction and management of objects

λ¬Έμž₯ κ·ΈλŒ€λ‘œ ν•΄μ„ν•˜λ©΄, 객체의 생성과 관리λ₯Ό μ™Έμ£Όν•˜λŠ” μ ‘κ·Όλ²•μ΄λΌλŠ” 것이닀. μš°μ„  conventional ν•œ μ œμ–΄μ˜ 방식을 μ‚΄νŽ΄λ³΄μž.

Conventional Scenario

슀포츠 클럽의 νšŒμ›μ΄ νŠΉμ • μ½”μΉ˜λ₯Ό μ„ νƒν•˜λŠ” 상화이라고 κ°€μ •ν•˜μž. κΈ°μ‘΄μ—λŠ” μœ„μ™€ 같이 Member λΌλŠ” class κ°€ 직접 FootballCoach λΌλŠ” 객체λ₯Ό μƒμ„±ν•˜μ—¬ 이 객체에 λŒ€ν•œ μ„ μ–Έ, μ΄ˆκΈ°ν™”, 관리 등을 λͺ¨λ‘ class λ‚΄λΆ€μ—μ„œ 직접 μˆ˜ν–‰ν•΄μ•Ό ν–ˆλ‹€. κ·ΈλŸ¬λ‚˜ Football 이 μ•„λ‹Œ λ‹€λ₯Έ 슀포츠의 μ½”μΉ˜λ„ 선택할 수 μžˆλŠ” κ°€λŠ₯성이 높을 λ•Œμ—λŠ” 객체에 λŒ€ν•œ construction κ³Ό management κ°€ μ–΄λ €μ›Œμ§ˆ 수 μžˆλ‹€.

μ΄λ²ˆμ—λŠ” λ‹€λ₯Έ 방식을 μ‚΄νŽ΄λ³΄μž.

Ideal Scenario

ν•΄λ‹Ή 방식은 Member class κ°€ 직접 object 듀을 κ΄€λ¦¬ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, Spring Container μ—κ²Œ μ›ν•˜λŠ” Coach object λ₯Ό 달라고 μš”μ²­ν•˜λŠ” 방식이닀.

μ΄λ ‡κ²Œ 되면 객체듀에 λŒ€ν•œ μ œμ–΄λ₯Ό 객체λ₯Ό μƒμ„±ν•˜λŠ” class 에 μ‘΄μž¬ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, 객체듀을 μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” Spring Container μ—κ²Œ 있기 λ•Œλ¬Έμ— μ œμ–΄μ˜ κΆŒν•œμ΄ λ„˜μ–΄κ°”λ‹€, 즉 μ œμ–΄μ˜ μ—­μ „(Inversion of Control)이 일어났닀고 ν•˜λŠ” 것이닀.

Spring Container

Spring Container λŠ” 객체듀을 μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λ©°, νŠΉμ • 객체λ₯Ό μ›ν•˜λŠ” μš”μ²­μ΄ μžˆμ„ λ•Œ ν•΄λ‹Ή 객체의 reference λ₯Ό μ œκ³΅ν•˜λŠ” μ‹μ˜ κΈ°λŠ₯을 μˆ˜ν–‰ν•œλ‹€. μ—¬κΈ°μ„œ Spring Container λŠ” λ‹€μŒ μ„Έ 개의 μ£Όμš”ν•œ κΈ°λŠ₯을 κ°€μ§„λ‹€.

Primary functions of Spring Container

  1. 객체듀을 λ§Œλ“€κ³  κ΄€λ¦¬ν•œλ‹€. (Inversion of Control)
  2. 객체 μ˜μ‘΄μ„±μ„ μ£Όμž…ν•œλ‹€. (Depedency Injection)
  3. Spring Bean 의 생λͺ… μ£ΌκΈ°λ₯Ό κ΄€λ¦¬ν•œλ‹€. (μ΄ˆκΈ°ν™” ~ μ†Œλ©Έ)

κ·Έλ ‡λ‹€λ©΄ Spring Container 에 μ‘΄μž¬ν•˜λŠ” 객체듀은 μ–΄λ–»κ²Œ configure ν•˜λŠ” κ²ƒμΌκΉŒ? λ‹€μŒ 3κ°€μ§€μ˜ 방법이 μ‘΄μž¬ν•œλ‹€.

Figuring Spring Container

  1. XML configuration file (legacy)
  2. Java Annotations (modern)
  3. Java Source Code (modern)

이제 Inversion of Control 에 μ˜ν•΄μ„œ λ„˜μ–΄κ°„ 객체의 μ œμ–΄μ— λŒ€ν•˜μ—¬, Spring Container λŠ” μ–΄λ–€ λ°©μ‹μœΌλ‘œ 객체λ₯Ό μš”μ²­ν•œ class μ—κ²Œ 객체에 λŒ€ν•œ 접근을 μ œκ³΅ν•˜λŠ”μ§€ μ•Œμ•„λ³΄μž.