inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 기본편

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

해결된 질문

435

이지현

작성한 질문수 3

1

spring 객체지향

답변 2

3

김영한

안녕하세요. 지현님

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

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

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

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

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

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

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

감사합니다.

1

y2gcoder

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

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

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

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

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

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

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

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

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

감사합니다.

구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?

0

49

2

MemberService의 인터페이스를 왜 사용하는지 궁금합니다.

0

72

1

롬복 @Setter를 써야 하는 상황이 있는건가요?

0

87

1

빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?

0

79

1

테스트 속도가 나중에 영향이 있을까요?

0

75

1

gradle 설정 안떠서 질문 남깁니다!

0

116

2

build.gradle로 프로젝트를 여는 이유

0

81

1

provider 사용하는 이유

0

85

1

다음 강의 뭘 들어야 할까요

0

123

2

프로토타입 빈, 직접 destroy 호출 안 할 경우

0

62

1

beanB

0

79

2

퀴즈다시풀기

0

63

1

Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ

0

90

2

"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.

0

63

3

run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>

0

102

2

도메인의 정의?

0

57

1

ApplicationContext 질문입니다.

0

60

1

@Scope의 proxyMode를 사용할때 단위 테스트 방법

0

86

2

ai api 선정하기 관련 질문

0

116

2

생성자 자동주입 관련해서

0

61

1

생성자 직접 호출 vs 팩토리 메서드 패턴

0

93

2

Spring에서 SessionScope와 RequestScope는 함께 사용되나요?

1

63

1

12:25

0

75

2

appConfig.xml 오류

0

127

1