해결된 질문
작성
·
280
0
아래 질문들을 보면서 'appconfig를 사용하면 dIP위반이 아니다'라는 답변도 있고
'클라이언트 객체에서 구현체를 의존하니 DIP위반이다' 라는 답변도 있어 헷갈리네요ㅜ
결국 구현체에서 만든 객체를 가져다 쓰는것이 문제가 아닌, 호출하는 클라이언트에서 getInstance()라는 구현체에 속하는 매소드를 사용해서 DIP위반이라는 말씀이신가요?
(클라이언트는 메인이나 test에서 appconfig or 구현체를 실행하는 부분)
(클라이언트(구현체) <-> getInstance()(구현체매소드))
그러면 이경우 appcofig에서도 getInstance()를 받아주는(객체.getinstance()를 리턴하는) 매소드를 만들어 주면 DIP가 만족된다는 말씀이신거죠?
그리고 위의 말이 맞다면 'private생성자(컴파일 에러나도록) + 각 구현체마다 static 객체생성 + AppConfig에서도 객체리턴이 아닌 객체.getInstance()를 넣어주는 것' 을 spring boot에서는 자동적으로 실행하여 주기에 엄청 편리하다.
해당 설명을 보여주기위해 영한님이 자바로 실행 했을 때와 스프링으로 했을 때를 비교해주신 거고요..
맞나요??
제가 머리가 나빠서 그런지 추상적으로 설명해주신 아래 글들로는 이해가 잘 가지않네요ㅜ
구체적으로 해당 편의 강의에서 어떻게 DIP가 위반된건지 설명해 주실 수 있으신가요??
답변 1
0
안녕하세요, 김기웅 님. 공식 서포터즈 codesweaver 입니다.
.
DIP는 간단히 말하면 '구체클래스'에 의존하지 말고 인터페이스에 의존하라는 뜻입니다.
AppConfig 에서 @Bean 을 등록할 때 구체 클래스를 반환하도록 되어 있다면 이는 DIP 위반 상황이라고 볼 수 있습니다. 그러나 AppConfig에서 @Bean 을 등록할 떄 인터페이스를 사용한다면 DIP 위반이 아니라고 할 수 있겠습니다.
강의에서 DIP 위반한 부분이라고 하면 이 부분입니다.
public class SingletonService {
private static final SingletonService service = new SingletonService();
.. 이하 생략 ..
}
감사합니다.
안녕하세요 김기웅님.
강사님의 해당 부분 설명을 확인하여 보고 다시 답변 드립니다.
.
우선 DIP의 해석을 다시 말씀드리겠습니다. 간단히 말하면 인터페이스를 의존하는 것이 DIP 라고 말씀드렸지만 엄밀히 말하면, 어떤 객체 A가 바뀌더라도 A에 의존하는 객체의 코드를 변경하지 않아야 한다가 DIP의 진정한 목적이라고 할 수 있습니다.
.
그런 의미에서 Config 에서 스프링 빈을 주입하고 있는 상황은, 빈이 다른 객체로 변경된다 하더라도 그 빈에 의존하는 쪽에서 코드를 수정하지 않아도 됩니다. 그런면에서 DIP를 지킨것이라고 볼 수 있습니다.제가 먼저 말씀드렸던 구체 클래스를 반환하는가 인터페이스 객체를 반환하는가는 상관이 없는 문제입니다.
.
그리고 아래 코드는 new SingletonService(); 라는 구체 클래스를 직접 생성하고 있습니다.
private static final SingletonService service = new SingletonService();
만약 SingletonService를 다른 객체로 교체하고 싶다면 해당 객체를 사용하고 있는 객체의 수정이 불가피 합니다. 그런면에서 DIP 가 위반되었다고 할 수 있습니다.
음 .. 위에서 말씀하신 것처럼 SingletonService를 다른 객체로 변경하려고 한다면
싱글톤 패턴이다 보니 내부 코드 수정이 아닌 appconfig에서 다른 구현 클래스를 연결하면 되지 않을까요? 싱글톤 패턴이고 강의 코드로 봐서는 각 객체를 본인 클래스에서 생성하니까요.. private으로 만들고 접근을 getInstance()로만 하는걸로 봐서는 각 객체를 해당 클래스에서만 만드는 것 같아서요 ㅠ
하 너무 어렵네요 정말.. 강의를 다시 봐도 '클라이언트에서 구현체.getinstance로 사용해야 해서 DIP 위반이다'라고 하시는데.. 그러면 appConfig에서 getInstance()하면 DIP위반이 아닌지..ㅠㅠ
안녕하세요. 기웅님
AppConfig에서 getInstacne()를 사용해서 해결하면 DIP를 위반하지 않습니다.
DIP의 핵심은 클라이언트 코드가 구체 코드에 의존하지 않고 변경할 수 있으면 됩니다.
싱글톤이라고 꼭 DIP를 못하는 것은 아닙니다^^ 싱글톤 패턴을 직접 구현하는 것이 여러가지 번거로움과 단점들이 있을 뿐입니다.
감사합니다.
엥 그전에도 appconfig에서 return값으로 memoryServiceImple이라는 구체클래스를 반환했는데 그때에는 DIP를 만족한다 하지 않았나요?? 그리고 올려주신 코드는 클래스 내부에서 해당 객체를 생성하는 코드인데 왜 DIP위반이라고 하신거죠?