의존성 주입 ( 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 를 기억해두기위해 노력하자.