본문 바로가기

개발/소프트웨어공학

SOLID - 개방 폐쇄 원칙 (Open-Closed Principle)

개방 폐쇄 원칙

기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가 되어야 한다.

 

주문내역이나 주문정보에 제품의 정보를 출력하는 기능을 생각해보자.

다음 그림은 New Feature 클래스에서 이 기능을 사용하는 경우를 모델링한 것이다.

 

만약 주문내역이나 주문정보가 아닌 다른 곳에 제품의 정보를 출력하는 기능의 개발이 필요한 경우 New Feature 클래스가 해당 매체의 기능을 이용하도록 구성할 수 있으나 이 방식은 OCP를 위반한다.

 

OCP를 위반하지 않은 설계를 하기 위해서는 변해야 할 것은 쉽게 변할 수 있게 하고,

변하지 말아야 할 것은 변하는 것에 영향을 받지 않도록 해야 한다.

 

OCP를 만족하기 위해서는 New Feature 클래스가 개별 기능을 처리하도록 하지 않고 인터페이스를 통해 캡슐화해 처리하도록 해야 한다.

 

OCP는 변경하지 않고도 대상 클래스의 환경을 변경할 수 있는 설계가 되어야 한다.

단위 테스트를 수행할 때 매우 중요하며 테스트 대상이 되는 기능이 웹 서비스를 사용한다면 DB나 웹 서버가 세팅되어야 테스트가 가능하다.

 

단위테스트의 진행에 있어 세팅 시간이 소요된다는 점은 테스트를 회피하게 하는 요인이 되기 때문에 테스트 기능이 사용하는 실제 외부의 서비스를 흉내내는 가짜 객체를 만들어 테스트의 효율성을 높일 필요가 있다.

 

또한 테스트 기능이 특정 상태 의존일 경우도 고려해야 한다.

이를 위해 모의 객체, 가짜 객체, 가상 객체 등을 사용한다.

 

모의 객체는 테스트 더블(double)의 한 종류로, '무엇'인가를 대신하는 가짜라는 뜻이다. 단위 테스트에서는 여러 가지 이유로 다음과 같은 테스트 더블을 사용한다.

 

 - 더미 객체(dummy object) : 테스트할 때 객체만 필요하고 해당 객체의 기능까지는 필요하지 않은 경우에 사용. 더미 객체의 메서드가 호출되는 경우에는 정상 동작을 실행하지 않고 예외가 발생.

 

 - 테스트 스텁(test stub) : 더미 객체에 단순한 기능을 추가. 객체의 특정 상태를 가정해서 작성하며 특정한 값을 반환하거나 특정한 메시지를 출력

 

 - 테스트 스파이(test spy) : 주로 테스트 대상 클래스가 의존하는 클래스로의 출력(간접 출력)을 검증하는 데 사용. 대상 클래스가 실행되는 동안 특정 의존 클래스로의 호출(또는 호출 결과)을 잡아내며 대상 클래스의 실행이 끝난 후에는 원하는 대로 호출되었는지 검사함.

 

 - 가짜 객체(fake object) : 실제 의존 클래스의 기능을 대체해야 할 경우에 사용되며 실제 의존 클래스의 기능 중 전체나 일부를 훨씬 단순하게 구현함. 실제 의존 클래스가 구현되지 않았거나, 너무 느리거나, 테스트 환경에서는 사용할 수 없을 때 가짜 객체를 사용.

 

 - 목 객체(mock object) : 미리 정의한 기대 값과 실제 호출을 단언문(assertion)으로 비교해 문제가 있으면 테스트 메서드를 대신해 모의 객체가 테스트를 실패하게 함. 목 객체는 테스트 더블의 모든 형태들을 포함하는 의미로 사용되기도 한다.

 

#참고자료

https://blog.bitsrc.io/solid-principles-every-developer-should-know-b3bfa96bb688

반응형