Home > CS > 2024 > πŸ’Ύ [CS] DIP의 μ •μ˜μ—μ„œ λ§ν•˜λŠ” 'μΆ”μƒν™”λœ 것'μ΄λž€ λ¬΄μ—‡μΌκΉŒ?

πŸ’Ύ [CS] DIP의 μ •μ˜μ—μ„œ λ§ν•˜λŠ” 'μΆ”μƒν™”λœ 것'μ΄λž€ λ¬΄μ—‡μΌκΉŒ?
CS

β€œπŸ’Ύ [CS] DIP의 μ •μ˜μ—μ„œ λ§ν•˜λŠ” β€˜μΆ”μƒν™”λœ κ²ƒβ€™μ΄λž€ λ¬΄μ—‡μΌκΉŒ?”

μš°λ¦¬κ°€ 잘 μ•Œκ³ μžˆλŠ” SOLID 원칙 쀑 DIP(μ˜μ‘΄μ„± μ—­μ „ 원칙, Dependency Inversion Principle) μ •μ˜λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • β€œκ³ μˆ˜μ€€ λͺ¨λ“ˆμ€ μ €μˆ˜μ€€ λͺ¨λ“ˆμ— μ˜μ‘΄ν•΄μ„œλŠ” μ•ˆ 되고, λ‘˜ λ‹€ 좔상화 된 것에 μ˜μ‘΄ν•΄μ•Ό ν•©λ‹ˆλ‹€.”
    • μ—¬κΈ°μ„œ κ³ μˆ˜μ€€ λͺ¨λ“ˆμ€ β€œλΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§β€ 을 λœ»ν•˜κ³ , μ €μˆ˜μ€€ λͺ¨λ“ˆμ€ μ„ΈλΆ€ κ΅¬ν˜„μ„ λœ»ν•©λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ β€œμΆ”μƒν™”λœ 것” μ΄λž€ μ–΄λ–€ μ˜λ―ΈμΌκΉŒμš”?

πŸ™‹β€β™‚οΈ SOLID 원칙
πŸ™‹β€β™‚οΈ μ˜μ‘΄μ„±

1️⃣ DIP의 μ •μ˜μ—μ„œ λ§ν•˜λŠ” β€œμΆ”μƒν™”λœ κ²ƒβ€μ΄λž€?

  • DIP(Dependency Inversion Principle, μ˜μ‘΄μ„± μ—­μ „ 원칙) 의 μ •μ˜μ—μ„œ λ§ν•˜λŠ” β€œμΆ”μƒν™”λœ 것” 은 μΈν„°νŽ˜μ΄μŠ€ λ˜λŠ” 좔상 클래슀λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • 이 μ›μΉ™μ—μ„œ β€œμΆ”μƒν™”λœ 것에 μ˜μ‘΄ν•΄μ•Ό ν•œλ‹€β€λŠ” 것은, ꡬ체적인 κ΅¬ν˜„ ν΄λž˜μŠ€κ°€ μ•„λ‹Œ μΈν„°νŽ˜μ΄μŠ€λ‚˜ 좔상 클래슀 같은 좔상적인 계측을 톡해 μƒν˜Έμž‘μš©ν•΄μ•Ό ν•œλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

2️⃣ ꡬ체적인 μ„€λͺ….

  • DIP(Dependency Inversion Principle, μ˜μ‘΄μ„± μ—­μ „ 원칙) 의 κΈ°λ³Έ κ°œλ…μ€ κ³ μˆ˜μ€€ λͺ¨λ“ˆ(λΉ„μ¦ˆλ‹ˆμŠ€ 둜직) κ³Ό μ €μˆ˜μ€€ λͺ¨λ“ˆ(세뢀적인 κ΅¬ν˜„) κ°„μ˜ μ˜μ‘΄μ„±μ„ μΆ”μƒν™”λœ κ³„μΈ΅μœΌλ‘œ λ’€μ§‘λŠ” κ²ƒμž…λ‹ˆλ‹€.
  • μ—¬κΈ°μ„œ λ§ν•˜λŠ” β€œμΆ”μƒν™”λœ 것” 은 κ΅¬ν˜„μ΄ μ•„λ‹Œ 계약을 μ˜λ―Έν•˜λ©°, 이 계약은 μΈν„°νŽ˜μ΄μŠ€λ‚˜ 좔상 클래슀λ₯Ό 톡해 μ •μ˜λ©λ‹ˆλ‹€.
    • κ³ μˆ˜μ€€ λͺ¨λ“ˆ : μ‹œμŠ€ν…œμ˜ μƒμœ„ λ ˆλ²¨μ— μœ„μΉ˜ν•˜λŠ” λͺ¨λ“ˆλ‘œ, 일반적으둜 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
    • μ €μˆ˜μ€€ λͺ¨λ“ˆ : ꡬ체적인 μ„ΈλΆ€ μ‚¬ν•­μ΄λ‚˜ 기술적인 κ΅¬ν˜„μ„ λ‹΄λ‹Ήν•˜λŠ” λͺ¨λ“ˆμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ°μ΄ν„°λ² μ΄μŠ€ 처리, 파일 μ‹œμŠ€ν…œ μž‘μ—…λ“€μ΄ ν•΄λ‹Ήλ©λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직(Business Logic)μ΄λž€?
πŸ™‹β€β™‚οΈ μ†Œν”„νŠΈμ›¨μ–΄ κ³΅ν•™μ—μ„œμ˜ λͺ¨λ“ˆ
πŸ™‹β€β™‚οΈ λͺ¨λ“ˆκ³Ό μ»΄ν¬λ„ŒνŠΈλ₯Ό 레고 λΆˆλ‘μ— λΉ„μœ ν•΄λ³΄λ©΄?!

μ˜ˆμ‹œ

  • λ¨Όμ € DIPλ₯Ό μœ„λ°˜ν•˜λŠ” μ½”λ“œ μ˜ˆμ‹œλ₯Ό λ³΄κ² μŠ΅λ‹ˆλ‹€.
    • 이 μ½”λ“œλŠ” κ³ μˆ˜μ€€ λͺ¨λ“ˆμ΄ μ €μˆ˜μ€€ λͺ¨λ“ˆμ˜ ꡬ체적인 κ΅¬ν˜„μ— μ§μ ‘μ μœΌλ‘œ μ˜μ‘΄ν•˜λŠ” κ²½μš°μž…λ‹ˆλ‹€.
class EmailService {
    public void sendEmail(String message) {
        // 이메일 전솑 둜직
        System.out.println("Email sent: " + message);
    }
}

class NotificationManager {
    private EmailService emailService;
    
    public NotificationManager() {
        this.emailService = new EmailService(); // μ €μˆ˜μ€€ λͺ¨λ“ˆμ˜ ꡬ체적 κ΅¬ν˜„μ— 의쑴
    }
    
    public void sendNotification(String message) {
        emailService.sendEmail(message);
    }
}
  • 이 μ½”λ“œμ—μ„œλŠ” NotificationManager(κ³ μˆ˜μ€€ λͺ¨λ“ˆ)κ°€ EmailService(μ €μˆ˜μ€€ λͺ¨λ“ˆ)에 직접 μ˜μ‘΄ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
  • λ§Œμ•½ NotificationManagerκ°€ λ‹€λ₯Έ μ•Œλ¦Ό 방법(예: SMS)을 μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄, EmailService와 같은 μ €μˆ˜μ€€ λͺ¨λ“ˆμ„ μˆ˜μ •ν•˜κ±°λ‚˜ ꡐ체해야 ν•˜λ―€λ‘œ μœ μ—°μ„±μ΄ λ–¨μ–΄μ§‘λ‹ˆλ‹€.

DIP 적용 (μΆ”μƒν™”λœ 것에 의쑴)

  • DIPλ₯Ό μ μš©ν•˜λ©΄, κ³ μˆ˜μ€€ λͺ¨λ“ˆκ³Ό μ €μˆ˜μ€€ λͺ¨λ“ˆ λͺ¨λ‘ μΆ”μƒν™”λœ 계측(μΈν„°νŽ˜μ΄μŠ€λ‚˜ 좔상 클래슀) 에 μ˜μ‘΄ν•˜κ²Œ λ©λ‹ˆλ‹€.
    • μ΄λ ‡κ²Œ ν•˜λ©΄ κ³ μˆ˜μ€€ λͺ¨λ“ˆμ€ μ €μˆ˜μ€€ λͺ¨λ“ˆμ˜ ꡬ체적인 κ΅¬ν˜„μ— μ˜μ‘΄ν•˜μ§€ μ•Šκ²Œ λ˜μ–΄, 더 μœ μ—°ν•˜κ³  ν™•μž₯ κ°€λŠ₯ν•œ μ½”λ“œκ°€ λ©λ‹ˆλ‹€.
// μΆ”μƒν™”λœ 것: Interface μ •μ˜ (μΆ”μƒν™”λœ 계측)
interface NotificationService {
    void sendNotification(String message);
}

// μ €μˆ˜μ€€ λͺ¨λ“ˆ: ꡬ체적인 κ΅¬ν˜„μ²΄
class EmailService implements NotificationService {
    public void sendNotification(String message) {
        System.out.println("SMS sent: " + message);
    }
}

// μ €μˆ˜μ€€ λͺ¨λ“ˆ: 또 λ‹€λ₯Έ ꡬ체적인 κ΅¬ν˜„μ²΄
class SMSService implements NotificatioonService {
    public void sendNotificatioon(String message) {
        System.out.println("SMS sent: " + message);
    }
}

// κ³ μˆ˜μ€€ λͺ¨λ“ˆ: μΆ”μƒν™”λœ μΈν„°νŽ˜μ΄μŠ€μ— 의쑴
class NotificationManager {
    private NotificationService notificationService;
    
    public NotificationManager(NotificationService notificationService) {
        this.notificationService = notificationService // μΆ”μƒν™”λœ 것에 의쑴
    }
    
    public void sendNotification(String message) {
        notificationService.sendNotification(message);
    }
}

μ„€λͺ….

  • μΆ”μƒν™”λœ 것
    • NotificationService μΈν„°νŽ˜μ΄μŠ€λŠ” μΆ”μƒν™”λœ κ²ƒμž…λ‹ˆλ‹€.
    • κ³ μˆ˜μ€€ λͺ¨λ“ˆ(NotificationManager)은 이제 ꡬ체적인 EmailServiceλ‚˜ SMSService에 μ˜μ‘΄ν•˜μ§€ μ•Šκ³ , NotificationServiceλΌλŠ” μΆ”μƒν™”λœ μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•©λ‹ˆλ‹€.
  • ꡬ체적인 κ΅¬ν˜„
    • EmailService와 SMSServiceλŠ” 각각 NotificationService μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ μ €μˆ˜μ€€ λͺ¨λ“ˆμž…λ‹ˆλ‹€.

κ²°κ³Ό.

  • μ΄λ ‡κ²Œ ν•˜λ©΄ NotificatioonManagerλŠ” EmailService λ˜λŠ” SMSService 쀑 μ–΄λ–€ κ΅¬ν˜„μ²΄λ₯Ό μ‚¬μš©ν•˜λ“ μ§€ μƒκ΄€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • λ‹€λ₯Έ μ•Œλ¦Ό μ„œλΉ„μŠ€κ°€ ν•„μš”ν•˜λ‹€λ©΄, λ‹¨μˆœνžˆ NotificationServiceλ₯Ό κ΅¬ν˜„ν•˜λŠ” μƒˆλ‘œμš΄ 클래슀λ₯Ό λ§Œλ“€κ³ , 이λ₯Ό NotificationManager에 μ „λ‹¬ν•˜λ©΄ λ©λ‹ˆλ‹€.
  • 즉, κ³ μˆ˜μ€€ λͺ¨λ“ˆκ³Ό μ €μˆ˜μ€€ λͺ¨λ“ˆμ΄ λͺ¨λ‘ μΆ”μƒν™”λœ μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜κ²Œ λ˜μ–΄, μ½”λ“œμ˜ μœ μ—°μ„±κ³Ό ν™•μž₯성이 크게 ν–₯μƒλ©λ‹ˆλ‹€.

3️⃣ κ²°λ‘ .

  • DIPμ—μ„œ λ§ν•˜λŠ” β€œμΆ”μƒν™”λœ 것” 은 ꡬ체적인 κ΅¬ν˜„μ²΄κ°€ μ•„λ‹Œ μΈν„°νŽ˜μ΄μŠ€ λ˜λŠ” 좔상 클래슀λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • κ³ μˆ˜μ€€ λͺ¨λ“ˆκ³Ό μ €μˆ˜μ€€ λͺ¨λ“ˆ λͺ¨λ‘ 이 μΆ”μƒν™”λœ 계측에 μ˜μ‘΄ν•¨μœΌλ‘œμ¨, 각 λͺ¨λ“ˆ κ°„ 결합을 쀄이고 μœ μ—°ν•œ μ‹œμŠ€ν…œμ„ ꡬ좕할 수 μžˆμŠ΅λ‹ˆλ‹€.