의존성 주입 ( DI )

2024. 11. 11. 14:25카테고리 없음

이 글은 영상에서 잠시 지나갔던 의존성 주입을 기억하기 위하여 작성하였다.

 

의존성 주입이란 무엇일까?

 

일단 위키의 설명을 보자.

 

 

"의존성" 과 "주입"을 나누어 설명해 주는데

 

의존성 : 서비스 객체가 클라이언트의 결정을 어떤 서비스로 연결할지를 지정해 주는 것을 말한다.

주입 : 클라이언트에게 서비스를 전달 하는 것을 말한다.

 

위에서 집중할 키워드는 연결과 전달이다.

 

의존성 주입은 새로운 객체를 생성하지 않고 의존성에 연결하여 전달한다.

 

이게 어떤 의미인지가 궁금할 수 있으니 의존성 주입이 왜 필요한지 요새 핫한 Perplexity에게 물어보자.

 

 

직관적으로  보면 new 안쓰고 주입해서 사용한다...!! 정도로만 기억하면 좋을 것 같다.

 

영상에서도 들었던 결합도의 감소와 재사용성 향상 테스트 용이성 등의 장점이 있다고 한다.

 

그럼 이제 예제를 살펴보며 되새겨 보자

 

// 인터페이스 정의
interface MessageService {
    void sendMessage(String message);
}

// 구현 클래스
class EmailService implements MessageService {
    public void sendMessage(String message) {
        System.out.println("이메일 전송: " + message);
    }
}

// 의존성 주입을 사용하는 클래스
class NotificationManager {
    private MessageService messageService; // 의존성 선언

    // 생성자를 통한 의존성 주입
    public NotificationManager(MessageService messageService) {
        this.messageService = messageService; // 주입: 외부에서 생성된 객체를 받아 연결
    }

    public void notify(String message) {
        messageService.sendMessage(message); // 연결: 주입된 객체의 메서드 사용
    }
}

// 의존성 주입을 사용하지 않는 경우 (비교를 위한 예시)
class OldNotificationManager {
     private MessageService messageService;

     public OldNotificationManager() {
         this.messageService = new EmailService(); // 생성: 직접 객체를 생성하여 의존성 설정
     }

     public void notify(String message) {
         messageService.sendMessage(message); // 연결: 직접 생성한 객체의 메서드 사용
     }
}

public class Main {
    public static void main(String[] args) {
        // 의존성 주입을 사용하는 경우
        MessageService emailService = new EmailService(); // 생성: 객체 생성
        NotificationManager manager = new NotificationManager(emailService); // 주입: 생성된 객체를 전달
        manager.notify("안녕하세요!"); // 연결: 주입된 객체를 통해 기능 사용

        // 의존성 주입을 사용하지 않는 경우
        OldNotificationManager oldManager = new OldNotificationManager(); // 생성: 객체 생성 (내부에서 의존성 생성)
        oldManager.notify("안녕하세요! (의존성 주입 없이)"); // 연결: 내부에서 생성된 객체를 통해 기능 사용
    }
}

 

이런식으로 사용이 가능하니 디자인 패턴중 하나인 DI 를 기억해두기위해 노력하자.