minwoorich / 2024-spring-jpa-study

4 stars 5 forks source link

πŸ™‹β€β™‚οΈ IoC 와 DI 에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš” #8

Open minwoorich opened 3 months ago

minwoorich commented 3 months ago

IoCλŠ” 뭐고 DIλŠ” λ­”κ°€μš”? 각각 μ„€λͺ…ν•΄μ£Όμ„Έμš”

minwoorich commented 3 months ago

IoC

IoCλŠ” Inversion Of Controll 의 μ•½μžλ‘œ ν•œκΈ€λ‘œ μ§μ—­ν•˜λ©΄ "μ œμ–΄μ˜ μ—­μ „" 이라고 해석될 수 있으며 ν”„λ ˆμž„ μ›Œν¬λ“€μ˜ μ£Όμš” κΈ°λŠ₯ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

기쑴에 κ°œλ°œμžλ“€μ΄ μ½”λ“œμƒμ—μ„œ 직접 객체λ₯Ό 생성, 호좜, μ†Œλ©Έ μ‹œν‚€λŠ” μž‘μ—…μ„ μž‘μ„±ν–ˆλ‹€λ©΄, μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ—μ„œλŠ” 이 μž‘μ—…μ„ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλΌ λΆˆλ¦¬λŠ” IoC μ»¨ν…Œμ΄λ„ˆκ°€ λŒ€μ‹  객체λ₯Ό 생성, 호좜, μ†Œλ©Έ λ“±μ˜ 관리λ₯Ό λ„λ§‘μ•„ν•˜κ²Œ λ©λ‹ˆλ‹€. μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” 객체듀을 μ‹±κΈ€ν„΄μœΌλ‘œ κ΄€λ¦¬ν•¨μœΌλ‘œμ¨ μ„œλ²„μ˜ μžμ›μ„ 보닀 효율적으둜 μ‚¬μš©ν•  수 있게 λ˜μ—ˆμœΌλ©° κ°œλ°œμžλ“€μ€ μ„œλΉ„μŠ€ λ‘œμ§μ„ κ°œλ°œν•˜λŠ”λ° 보닀 더 λ§Žμ€ 집쀑을 ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

DI

DI λŠ” Dependency Injection 의 μ•½μžλ‘œ ν•œκΈ€λ‘œ μ§μ˜ν•˜λ©΄ "μ˜μ‘΄μ„± μ£Όμž…" 이라고 해석 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

DIλŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 주둜 μ‚¬μš©λ˜λŠ” λ””μžμΈ νŒ¨ν„΄ 및 기법 쀑 ν•˜λ‚˜λ‘œ 객체가 λ‹€λ₯Έ 객체의 κΈ°λŠ₯을 ν•„μš”λ‘œ ν•  λ•Œ μžμ‹ μ΄ 직접 검색 및 생성 ν•˜λŠ”κ²ƒμ΄ μ•„λ‹Œ μ™ΈλΆ€λ‘œλΆ€ν„° (μƒμ„±μž or νŒŒλΌλ―Έν„°,,,) λ“±μœΌλ‘œ μ£Όμž… λ°›λŠ” 기법을 μ˜λ―Έν•©λ‹ˆλ‹€. DI λ₯Ό 톡해 λŸ°νƒ€μž„ μ‹œμ μ— λ™μ μœΌλ‘œ κ΅¬ν˜„μ²΄λ₯Ό μ„ νƒν•˜μ—¬ μ‚¬μš© ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ DIP 원칙을 κ³ λ €ν•˜μ—¬ κ΅¬ν˜„μ²΄κ°€ μ•„λ‹Œ μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜λ„λ‘ 섀계 ν•œλ‹€λ©΄ "λŠμŠ¨ν•œ κ²°ν•©" 이 이루어져 보닀 μœ μ—°ν•˜κ³  ν™•μž₯ κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό μž‘μ„± ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

DI와 DIP

μŠ€ν”„λ§μ„ λΉ„λ‘―ν•΄ λ§Žμ€ ν”„λ ˆμž„μ›Œν¬λ“€μ΄ μ•žμ„œ μ„€λͺ…ν•œ IoCλ₯Ό DI λ₯Ό ν™œμš©ν•΄ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

// DI λ―Έμ‚¬μš©
public class Car{
   public void move(){
      Wheel wheel = new WhiteWheel(); // Wheel 객체λ₯Ό 직접 생성, κ΅¬ν˜„μ²΄λ₯Ό λ°”κΏ€λ•Œλ§ˆλ‹€ μ½”λ“œκ°€ μˆ˜μ •λ˜μ–΄μ•Όν•¨
      // Wheel wheel = new BlackWheel(); 
      // Wheel wheel = new BlueWheel(); 
      // Wheel wheel = new YellowWheel(); 
      wheel.role();
   }
}

// DI μ‚¬μš©
public class Car{
   private final Wheel wheel;

   public Car(Wheel wheel){
       this.wheel = wheel;  // Wheel 을 μ™ΈλΆ€μ—μ„œ μ£Όμž…
   }

   public void move(){
      wheel.role(); // μ™ΈλΆ€λ‘œλΆ€ν„° μ£Όμž…λ°›μ€ wheel 을 μ‚¬μš©
   }
}