인프런 커뮤니티 질문&답변

임현강님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

싱글톤 패턴

싱글톤의 DIP 위반

작성

·

332

1

다른 질문들에서 해답을 찾지 못해 질문을 올립니다.

AppConfig의 memberService()에서

return new MemberServiceImpl(memberRepository());

대신에 

return new MemberServiceImpl.getInstance();
로 사용하는 것은 

클라이언트가 구현체(싱글톤객체)에 의존하게 되므로 DIP가 위배된다 

라는 것이 강의의 내용인데요..

AppConfig와 같은 구성에 사용되는 클래스는 어쩔 수 없이 구현체에 의존을 해야만 하는 것 아니었나요?

실제로 싱글톤 사용 전인
return new MemberServiceImpl(memberRepository());
방식에서도 MemberServiceImpl이라는 구현체를 의존하고 있었고 이전까지의 내용에서는 이를 두고 DIP를 위반한다고 보지는 않았던 거 같은데 말이죠.

오랜만에 공부하려니 쉽지가 않네요.. 

답변 부탁드립니다 ㅠ

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

( 자답 )

혹시 아래 내용이 맞는지 확인 부탁드립니다.

싱글톤 반영 전에는 AppConfig에서 
return new MemberServiceImpl(memberRepository());
를 통해 MemberRepository의 구현체까지 AppConfig 내부에서 모두 결정됨.

즉, 클라이언트 (MemberServiceImpl) 가 MemberRepository의 구현체에 의존하지 않음 
-> DIP 충족

인 것이고,

싱글톤 반영 후 AppConfig에서 
return MemberServiceImpl.getInstance()
할 경우 

클라이언트 (MemberServiceImpl)의 내부 코드에서 다시 MemoryMemberRepository.getInstance() 를 호출해야한다.
즉, 클라이언트가 구현체에 의존하게 된다.
-> DIP 위반

 

제가 너무 AppConfig 안에서만 생각해서 인지부조화가 발생한 것 같은데..

이렇게 받아들이는게 맞을까요?

답변 2

1

안녕하세요. 임현강님, 공식 서포터즈 David입니다.

.
싱글톤 강의는 현재 코드에 적용하는게 아니라 싱글톤  패턴에 대해 설명하시는 것입니다.

이후 스프링에서는 싱글톤 패턴의 한계를 어떻게 풀어내었고 적용하여 사용하고 있는지 설명합니다.

 

내부에서 인터페이스를 선언하고 외부로부터 구현체를 주입받고 있다면 DIP를 만족하는 것입니다.

말씀하신대로 AppConfig만 생각치 마시고 외부로부터 구현체를 주입받아야 하는 클래스와 의존관계를 설정하여 객체를 생성해주는 클래스로 생각해보시면 좋겠습니다.

.
감사합니다.

 

임현강님의 프로필 이미지
임현강
질문자

답변 감사드립니다. 

제가 자답한 내용이 맞다는 말씀이시죠?

0

저도 이부분이 이해가 안됬는데 설명을 듣고도 헷갈리네요ㅜ

그전에는 AppConfig에서 구현객체를 만들었고, 그 객체들을 Appconfig 내에서 연결하여 주었기때문에, 각 구현체 클래스간의 의존관계는 아니었다. 따라서 DIP만족이다. 그러나 싱글톤 패턴일 경우에는 해당 구현 객체를 각 구현 클래스 내에서 만들고 연결하는 파이프? 호스만 appConfig에서 제공해준다. 사실상  구현 객체들은 실제로 각 구현클래스들 끼리 의존하고 있기에 DIP위반이다? 맞나요? 너무어렵네요 ㅜ