[스프링 입문을 위한 자바 객체 지향의 원리와 이해] OCP - 개방 폐쇄 원칙
"소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다."
- 로버트 C. 마틴
위 문장을 조금 더 의역해 보면 아래와 같은 문장을 이끌어 낼 수 있다.
"자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다."
1) 개방 폐쇄 원칙이란?
- 개방 폐쇄 원칙은 다양한 곳에서 다양하게 이야기되고 있으니
딱 꼬집어서 예를 들기가 그리 쉽지는 않다.
몇 가지 예제를 통해 개방 폐쇄 원칙을 이해해보자.
- 어느 날 한 운전자가 마티즈를 구입했다.
그리고 열심히 마티즈에 적응했다고 해보자.
그리고 훗날 그 운전자에게 쏘나타가 생겼다.
- 창문과 기어가 수동이던 마티즈에서 창문과 기어가 자동인 쏘나타로 차종을 바꾸니
운전자의 행동에도 변화가 온다.
마티즈를 운전할 때 운전자는 마티즈 인스턴스의 기어수동조작() 메서드를 사용했는데
쏘나타로 차종을 변경하자 쏘나타 인스턴스의 기어자동조작() 메서드를 사용하게 된다.
- 운전자는 차량에 따라 운전하던 습관을 바꿔야만 하는 것일까?
스틱 차량에서 오토 차량으로 바꿨다고 해서 운전자가 운전에 영향을 받아야만 하는가를 생각해 보자.
현실 세계라면 당연히 어느 정도 변화가 있어야 하겠지만, 객체 지향 세계에는 다른 해법이 있다.
- 위의 그림과 같이 상위 클래스 또는 인터페이스를 중간에 둠으로써
다양한 자동차가 생긴다고 해도 객체 지향 세계의 운전자는 운전 습관에 영향을 받지 않게 된다.
다양한 자동차가 생긴다고 하는 것은 자동차 입장에서는 자신의 확장에는 개방돼 있는 것이고,
운전자 입장에서는 주변의 변화에 폐쇄돼 있는 것이다.
- 혹시라도 데이터베이스 프로그래밍을 경험한 적이 있다면
개방 폐쇄 원칙의 아주 좋은 예를 이미 알고 있을 것이다.
그 예란 바로 JDBC다.
JDBC를 사용하는 클라이언트는 데이터베이스가 오라클에서 MySQL로 바뀌더라도
Connection을 설정하는 부분 외에는 따로 수정할 필요가 없다.
- Connection 설정 부분을 별도의 설정 파일로 분리해두면 클라이언트 코드는 단 한 줄도
변경할 필요가 없다.
JDBC뿐만 아니라 iBastic, MyBatis, 하이버네이트 등등 데이터베이스 프로그래밍을 지원하는
라이브러리와 프레임워크에서도 개방 폐쇄 원칙의 예를 볼 수 있다.