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

득이님의 프로필 이미지

작성한 질문수

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

의존성과 Testability (2)

의존성을 분리하는 건 캡슐화를 깼다고 볼 수 없을까요?

23.06.15 10:02 작성

·

954

3

07:05 부근에서 메서드 내에 내부 알고리즘을 확인한 시점에서 캡슐화가 깨졌다는 언급을 해주셨습니다.

개인적으로 생각했을 때는 의존성을 분리했을 때 또한 로직이 외부(인자)로 노출되므로 이것도 캡슐화가 깨졌다고 볼 수 있는 것 아닐까요?

답변 2

3

김우근님의 프로필 이미지
김우근
지식공유자

2023. 08. 22. 01:18

안녕하세요. 답변이 늦었습니다. 개인적으로 하는 일이 많다 보니 질의 응답과 관련해서는 신경을 많이 못 사용하고 있습니다. 근 2달이 되서야 문의 글에 답변을 달고 있으니 여러모로 죄송하네요.

일단 캡슐화에 대한 지적과 질문이 하나 있는 것 같습니다. 그래서 나눠서 답변하겠습니다.

‘캡슐화가 깨졌다’라는 말에 대해서 지적해 주셨는데요. 네, 지적 잘 해주셨습니다. 발언을 강하게 하고 싶다 보니 이런 격한 표현을 사용했습니다. 그런데 실제로 의아해하시는 것처럼 캡슐화가 깨진 것은 아닙니다. 더 정확히 말하면 ‘캡슐화의 가치가 깨졌다’라고 표현하는 것이 맞을 겁니다.

캡슐화의 목적은 객체를 책임에 따라 분배하는 것입니다. 그렇게 해서 일의 집중 범위를 좁히는 것이 목적입니다. ‘내가 책임지기로 한 일은 알아서 할 테니 걱정하지 말고 맡겨. 너는 다른 일에 집중해.’가 되는 거죠.

그런데 책임진 일을 어떻게 수행하는지 확인하기 위해 알고리즘이 무엇인지 확인한다거나, 내부 코드를 들여다본다면, 결국 이러한 책임 단위 일 분배를 하지 못하게 됩니다. 이해가 잘 안된다면 일을 맡겨놓고 마이크로 매니징하는 직장 상사가 있다고 상상하면 좋습니다. 사사건건 감시한다면 하급자도 마음 편히 일하지 못할 것이고 상급자도 큰 그림을 그리지 못할 것입니다. (어디까지나 예시입니다)

따라서 객체의 사용자가 일을 맡겨 놓고 내부 구현이 어떻게 되는지 알고리즘을 확인해야 한다면, 캡슐화가 추구하던 내부 구현을 감춘다는 목적을 방해하게 됩니다. 따라서 ‘캡슐화의 가치가 깨졌다’라고 말할 수 있습니다. 돌이켜보면 이는 강의 내에서 조금 더 확실하게 말했어야 한다고 후회가 남기도 하네요.

아무튼 또 다른 이야기로 의존성과 캡슐화의 상관관계에 대해서도 물어봐 주셨는데요. 일단 의존성을 분리하는 목적은 캡슐화를 추구하기 위함이 아닙니다. 하지만 의존성 분리 역시 책임을 분할하는 것이 목적이기 때문에 캡슐화와 길을 같이할 뿐인 겁니다.

AI의 답변 중에서도 특히 괜찮은 말이 하나 있네요. 의존성을 분리하는 것은 오히려 더 작은 캡슐로 일을 분리하는 것입니다. 따라서 캡슐화를 추구한다고도 볼 수 있고요.

되도록 의존성 분리와 캡슐화를 분리해서 생각하시길 바랍니다. 이 둘은 유기적으로 연결되어 있는 것은 맞으나, 객체 지향에서 실제로 제일 중요한 가치는 역할, 책임, 협력입니다. 의존성 분리와 캡슐화는 이 가치들을 달성하기 위한 수단들 입니다. 따라서 의존성 분리를 하라했으니 의존성을 분리하고, 캡슐화를 추구하라 했으니 캡슐화를 추구하지 말고, 책임 분리와 협력 관계를 구성하는 것에 초점을 맞춰 개발해보세요. 의존성 분리와 캡슐화가 자연스럽게 따라 올 것입니다.

마지막으로 의존성을 분리했을 때 로직이 외부 인자로 노출된다는 말은 잘 이해가 안 되네요. 의존성을 분리한다고 로직이 외부로 노출되지 않습니다. 혹시 강의 내에 그렇게 느끼신 부분이 있거나, 관련된 예시가 있다면 답변하는 데 더 도움이 될 것 같습니다.

답변이 도움이 되셨길 바랍니다. 감사합니다.

1

인프런 AI 인턴님의 프로필 이미지

2023. 06. 16. 10:06

안녕하세요, 인프런 AI 인턴이에요.
의존성을 분리하는 것은 캡슐화를 깨는 것이 아닙니다. 오히려, 의존성을 분리함으로써 모듈 간에 결합도를 낮추고, 모듈 내부의 구현을 숨기는 새로운 캡슐을 형성하는 것입니다. 또한, 인자로 전달되는 객체나 모듈은 의존성의 계층 안에 존재하므로 완전하게 공개되는 것이 아니며, 이러한 방식은 객체 지향 프로그래밍에서 권장되는 디자인 방법 중 하나입니다.
따라서, 의존성을 분리하는 것은 캡슐화를 깨는 것이 아닌 캡슐화를 유지하는 것입니다.
감사합니다.

득이님의 프로필 이미지

작성한 질문수

질문하기