작성
·
196
·
수정됨
0
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
import java.util.*;
class BackendDeveloper {
public void writeJava() {
System.out.println("자바가 좋아 인터네셔널~");
}
}
class FrontEndDeveloper {
public void writeJavascript() {
System.out.println("자바스크립트가 좋아 인터네셔널~");
}
}
public class Project {
private final BackendDeveloper backendDeveloper;
private final FrontEndDeveloper frontEndDeveloper;
public Project(
BackendDeveloper backendDeveloper,
FrontEndDeveloper frontEndDeveloper
) {
this.backendDeveloper = backendDeveloper;
this.frontEndDeveloper = frontEndDeveloper;
}
public void implement() {
backendDeveloper.writeJava();
frontEndDeveloper.writeJavascript();
}
public static void main(String args[]) {
Project a = new Project(new BackendDeveloper(), new FrontEndDeveloper());
a.implement();
}
}
의존성 주입이란 객체가 필요로 하는 의존성(다른 객체나 서비스)을 외부에서 생성하여 주입하는 것으로 알고 있었습니다. 설명하실 때는 위 코드가 의존성 주입, DI가 적용되지 않은 코드라고 하셨는데, 의존성 주입의 3가지 방법중 생성자 주입 방식이 적용된 코드인 것으로 보여서 질문드립니다.
인터페이스가 아닌 구체적인 백엔드와 프론트엔드라서 DIP는 위반했지만 DI는 잘 된게 아닌지 헷갈립니다 ㅠㅠ
답변 1
1
안녕하세요 라이언님 ㅎㅎ
네 라이언님말씀이 어느정도는 맞습니다.
이 예시에서 Project 클래스는 BackendDeveloper와 FrontEndDeveloper 인스턴스를 생성자를 통해 전달받습니다. 이는 생성자 주입(Constructor Injection)의 한 형태로, Project 객체가 생성될 때 필요한 의존 객체들을 외부에서 받아오게 됩니다.
즉, 생성자를 주입하고 있다는 측면에서 어느정도는 DI라고 볼 수 있습니다.
그러나 Project
클래스는 BackendDeveloper
와 FrontEndDeveloper
클래스의 구체적인 인스턴스에 직접적으로 의존하고 있습니다.
이는 DIP를 완전히 준수하지 않습니다. 왜냐하면, Project
가 구체적인 클래스가 아닌 추상화에 의존하도록 설계되어야 하지만, 코드 상에서는 직접적인 클래스 타입에 의존하고 있기 때문입니다.
즉, DIP를 준수하지 않은 DI라고 볼 수 있습니다.
여기서 보통은 DIP를 준수하지 않은 DI를 보면서 올바르게 DI가 적용되었다 라고 하지는 않습니다.
예를 들어, 어떤 서비스 클래스가 데이터베이스 접근 인터페이스에 의존하고 있을 때, 개발 환경에서는 인메모리 데이터베이스 구현을, 운영 환경에서는 실제 SQL 데이터베이스 구현을 DI를 통해 주입할 수 있습니다. 이렇게 함으로써, 서비스 클래스는 데이터베이스 접근의 구체적인 구현 방법을 몰라도 되게 만드는 것인데 이 때 DI를 적용했다라고 하면 (DIP를 따르는) DI라고 보통은 판단합니다.
해당 부분에 대한 설명은 추가로 교안내에 수정하도록 하겠습니다. 😃
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.