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

유진이님의 프로필 이미지
유진이

작성한 질문수

스프링 핵심 원리 - 기본편

새로운 구조와 할인 정책 적용

사용 영역과 구성 영역 코드 수정 관련 질문입니다.

작성

·

147

0

두 가지 질문이 있습니다.

먼저 AppConfig를 사용하며, 관심사를 분리해서 사용 영역과

구성 영역으로 나누었습니다. 그래서 서비스가 바뀌더라도 

사용 영역은 그대로 두고, 구성 영역의 변경만 일어나도록 

설계했습니다. 

여기서 궁금한 점이 있습니다. 왜 사용 영역, 또는 클라이언트

라고 말씀하시는 해당 클래스를 서비스 변경이 일어났을때

직접 수정하는 것 보다 구성 영역만을 수정하는 것이 장점이

되는지 궁금합니다. 같은 맥락에서 이를 분리하고 구성 영역을

만드는 것에도 자원이 투자된다는 생각도 듭니다. 

어짜피 사용 영역에서 코드 한줄을 고치나 구성 영역에서

코드 한줄을 고치나 초보인 제 입장에서는 무언가 말장난

같은 의미로 받아들여지지 무엇이 다른지, 장점이 있는지

명확하지가 않아서 질문 남깁니다. 거기다 구성 영역과

나누는 비용까지 들어간다고 느껴졌습니다.

두번째는 OCP는 확장에는 열려있고, 코드 수정에는 

닫혀있다로 배웠습니다. 근데 왜 사용 영역과 구성 영역의

코드가 수정되는 것만이 '코드 수정'이라고 불리며, 이에 따라

OCP가 지켜졌는지, 지켜지지 않았는지를 판단하는지

이해가 어렵습니다. 예를들어, 고정 할인 정책에서 정률

할인 정책으로 서비스를 변경한다면, 정률 할인 정책이라는

서비스를 하나 새로 짜야하는데, 여기의 코드들은 왜 

OCP에서는 논외가 되는지 관점에서 위의 궁금증이 

생겼습니다. 감사합니다.

답변 1

1

안녕하세요. 유진이님, 공식 서포터즈 David입니다.

1. 사용영역의 코드 한 줄만 고치는 것은 해당 구현체가 사용되는 곳이 1곳일 때 해당되는 말입니다. 해당 구현체를 10곳이상에서 사용한다면 10번의 변경이 발생합니다.

이런 관점에서 봤을 때 사용영역과 구성영역을 분리하고, 필요할 때 구성영역을 1번 수정하는 것으로 모든 사용영역에서 구현체를 변경할 수 있다면 사용영역과 구성영역을 분리하는데 들어가는 비용은 trade off될만합니다.

2. OCP가 잘 지켜진 상태라면 정률할인정책을 추가하는 것은 기능을 "확장"하는 것이지 코드를 변경하는 게 아닙니다. DiscountPolicy에 FixedDiscountPolicy 대신 RateDiscountPolicy를 주입하는 것이니깐요. 그래서 구현에 의존하지 않고 인터페이스에 의존해야 하는 것입니다.

감사합니다.

유진이님의 프로필 이미지
유진이
질문자

친절한 답변 감사드립니다. 첫번째는 프로그램이 복잡해지면 해당 구현체를 사용하는 곳이 여러개가 되고, 그 여러개에서 고치는 것 보다 Config를 잘 구성해놨다면 한곳만 수정할 수 있는 이점이 있기 때문에 분리에 비용이 들어도 이점이 상회한다고 이해했습니다.

하지만 두번째 질문에 대해서는 이해가 잘 가지 않습니다. 제가 여쭤본 것은 OCP의 용어 정의가 있는데, 왜 이때 코드 수정에 해당 하하는 내용에 RateDiscountPolicy라는 클래스를 새로 짤때 썼던 코드들이 포함되지 않느냐라는 말이였습니다. 다시말해 없던 클래스를 새로 짰는데, 코드 수정이 일어났으니 OCP를 위배한거라고 생각해야 하는게 아닌가라는 것이였습니다. 혹시 이에대한 답변으로 RateDiscountPolicy는 이미 있던 클래스를 변경한 것이 아닌 새로 짠 클래스기 때문에 코드 수정이 아닌 코드 확장이라고 답변주신걸까요? 

네, 맞습니다.

유진이님의 프로필 이미지
유진이
질문자

고맙습니다.

유진이님의 프로필 이미지
유진이

작성한 질문수

질문하기