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

이지현님의 프로필 이미지
이지현

작성한 질문수

스프링 핵심 원리 - 기본편

OCP의 대해서 질문이 있습니다.

해결된 질문

작성

·

371

1

  • OCP에 대해서 궁금한 점이 있습니다. 제가 이해하기로는 OCP란 기능을 확장을 했을 때, 구성 영역인 AppConfig와 확장된 기능에 대한 코드 말고 클라이언트 코드(사용 영역)의 변경이 없어야 된다고 이해했습니다. 그런데 만약에 여기서 기능의 확장을 하면서 메서드 명이 바뀐다거나 메서드의 인자가 추가된다고 했을 때는 결국 OCP를 지킬 수 없다고 생각을 합니다. 다음은 제가 생각한 예시입니다.

  • 예시 1 인자추가 또는 변경
    => 강의에서 사용하신 discount에서 상품에 분류에 따라 할인률이 바뀐다고 한다면 결국 public int discount(Member member, int price) 해당 메서드에서 상품에 가격뿐만 아니라 상품의 종류를 나타낼 인자 혹은 상품이라는 객체를 만들면서 인자를 변경해야 합니다.

  • 예시 2 메서드명의 변경
    => MemberRepository의 save라는 메서드명을 regist로 바꾼다고 하면 결국 MemberServiceImpl의 코드도 save에서 regist로 변경해야 합니다.

  • 결국 두 예시 모두 변경에 닫혀있지 않게 되는데 그렇다고 해서 OCP가 위반되었다고 볼 수 있는 건가요? 이런 모든 경우를 따진다면 사실 OCP는 지킬 수 없는 원칙이라 생각되는데 막상 친구가 저런 반박을 했을 때 딱히 할 말이 없었습니다. 이런 경우에 위반인지 아닌지와 이유에 대해서도 설명해주시면 감사하겠습니다.

답변 2

3

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 지현님

추가로 답변을 남겨드리자면 OCP 원칙은 모든 것을 다 유연하게 변경할 수 있는 것이 아닙니다.

OCP 원칙은 다형성을 기반으로 합니다. 따라서 다형성을 유지하기 위한 인터페이스와 메서드가 그대로 유지된다는 대전제가 있어야 합니다.

인터페이스와 메서드 부분을 변경하게 된다면 그것은 OCP원칙과 무관하게 프로그램 자체가 변경되는 것입니다.

여기서 한단계 더 나아가려면 다음 내용을 공부하시면 도움이 되실거에요.

개발은 크게 인터페이스와 메시지 중심의 객체지향 설계 방법과, 데이터 중심의 설계 방법이 있습니다. 어떤 경우는 객체지향 설계 방법이 잘 맞지만, 어떤 경우는 데이터 중심의 설계 방법이 더 잘 맞습니다. 그리고 하나의 프로젝트 안에서도 둘이 공존합니다. 어떤 것이 더 우월하다기 보다는 상황에 따라 더 잘 맞는 것이 있습니다. 이 부분은 클린코드 책 6. 객체와 자료 구조에서 잘 설명합니다.

관련해서 다음 질문을 참고해주세요.

https://www.inflearn.com/questions/63567

감사합니다.

1

안녕하세요, 이지현 님. 공식 서포터즈 y2gcoder 입니다.

OCP에 대해서 깊게 고민하신 것 같습니다. 개인적으로는 말씀해주신 두 예시 모두 엄격하게 따지자면 OCP를 위반한 것이라고 생각합니다. 물론 두 예시에서도 OCP를 지키려고 하면 지킬 수 있습니다.

첫 번째 예시에서는 파라미터 인자를 확장하면 됩니다. 예를 들어 discount()의 인자 중 Member 객체에 상품 객체를 멤버 변수로 넣는다면 클라이언트 코드를 변경하지 않을 수도 있습니다.

두 번째 예시에 대한 대안으로는 MembrService 인터페이스에 save를 그대로 두고 regist 메서드를 따로 추가하는 것입니다. 이 방법 또한 마찬가지로 기존에 save()를 사용하던 클라이언트 코드를 변경하지 않음으로써 OCP를 준수할 수 있습니다.

OCP를 지키기 위해 억지스럽게 제시해본 두 가지 대안입니다.

지금부터는 개인적인 의견입니다. 그냥 참고만 해주시면 감사하겠습니다!

결국 OCP를 준수하는 근본적인 원인은 코드의 유지보수성을 높여 좋은 코드를 만들기 위함입니다. OCP는 좋은 코드를 만들기 위한 도구일 뿐이라고 생각합니다. 실제 상황에서는 코드의 가독성과 유지보수성을 위해 OCP를 지키지 않아야 할 수도 있습니다. 이 때 OCP를 지키기 위해 코드의 가독성과 유지보수성을 포기하는 것은 도구를 사용하기 위해 도구가 만들어지게 된 목적을 포기하는 것과 같습니다.

원칙을 사용해 좋은 코드를 만들 수 있다면 원칙을 사용해서 해당 코드를 짜는 것이 맞지만, 그 원칙으로 인해 좋은 코드를 작성할 수 없다면 거기에는 해당 원칙이 적합하지 않은 것이라고 생각합니다. OCP를 준수하기 위해 노력하면 본 강의에서 보여주듯이 추상화, 다형성을 이용해 변경을 최소화하는 유지보수하기 좋은 코드를 작성할 수 있습니다. 다만 말씀해주신 두 예시에서는 OCP를 적용하는 것이 오히려 좋은 코드를 만드는 데 방해가 될 것 같습니다.

적재적소에 원칙을 사용해서 좋은 코드를 사용하는 것이 결국 SOLID 원칙을 준수하여 개발하는 것이지 않나 생각합니다.

감사합니다.

이지현님의 프로필 이미지
이지현

작성한 질문수

질문하기