002. 느슨한 결합

느슨한 결합(loose coupling)은 객체지향 코드가 유지보수 비용면에서 얼마나 탁월한지를 극명하게 보여주는 기술입니다.

대부분 데이터베이스를 필요로 하는 프로그램을 만들때 DB에 종속적인 코딩을 하는것이 일반적입니다. 오라클 DB를 사용한다면 오라클 provider를 프로젝트에 참조 컴포넌트로 등록하고 코드에서 오라클 Command나 Adapter를 사용합니다. 오라클뿐 아니라 Ms-sql이나 DB2 역시 똑같죠. 그런데 이럴경우 데이터 조회처럼 기능은 같은데도 DB에 따라 코드가 달라지는 문제가 생기고 혹시라도 DB를 교차지원 해야하는 경우 중복 코드가 발생해 유지보수비용도 높아지기 마련입니다.

이런 문제는 비단 데이터베이스 관련 코딩에서만 발생하는게 아닙니다. 코드에 사용되는 개체를 구체적으로 선언하거나 화면에 Control을 직접 얹는 그 모든 순간이 바로 같은 문제의 출발점입니다. 그리고 이렇게 선언된 개체가 수천줄짜리 코드 사이사이에 들어앉기라도 한다면 이런 코드의 교체나 수정에는 개발자의 엄청난 리소스가 소진됩니다. 그리고 이 문제를 조금 더 확대해 본다면 결국 개발자는 사소한 문제 해결에 하루의 일과시간 대부분을 할애하고 야근과 주말근무의 악순환으로 내달릴 공산이 커집니다. 그러다보면 소프트웨어 품질은 고사하고 프로그램이 돌아가기만 해도 감사하는 현실이 도래하는거죠.

그렇다면 이쯤에서 이런 문제 해결의 방법이 느슨한 결합이겠구나 라고 생각하시는 분들, 감이 있으신겁니다. 그래서 지금부터 느슨한 결합의 개념을 설명하려고 합니다. 이왕 DB로 시작했으니 그걸로 쭉 가겠습니다.

너무도 당연한 얘기지만 데이터베이스는 저마다 고유의 구현방법으로 만들어져 기술적 상이함을 가지고 있는 물건입니다. 하지만 이렇게 다른 제품들이 하나의 개발언어에서 모두 사용이 가능한것은 그들 모두 개발언어가 제시한 표준을 통해 인터페이스를 하도록 되어있기 때문이죠. 가령 데이터베이스와 어플리케이션을 연결할때 오라클은 OracleCommand를, 그리고 Ms-sql server는 SqlCommand를 제공합니다. 그런데 이 두가지 클래스 모두 닷넷의 DbCommand(System.Data.Common.DbCommand) 추상클래스를 상속받아 만들어진 파생클래스들입니다. 즉 개발회사는 달라도 이 둘 모두 철저히 표준을 지켜준 덕분에 개발자는 코드를 만들때 OracleCommand  또는 SqlCommand 같은 명시적인 코딩뿐 아니라 DbCommand라는 추상화된 개체를 사용해 코딩한뒤 프로그램이 실행환경에 따라 OracleCommand나 SqlCommand를 선택적으로 사용하는게 가능해진겁니다.

명시적 코딩을 했다면 오라클 사용고객과 Sql-Server 사용고객은 조금씩 다른 코드로 빌드된 각기 다른 프로그램을 제공받아야 합니다. 하지만 이런식의 추상화된 개체를 사용해 개발을 하면 오라클 사용 고객이나 Sql-Server 사용 고객 모두에게 동일한 소스로 빌드된 프로그램을 제공할 수 있고 이것은 개발회사 입장에서는 대단히 효율적인 것입니다. 그리고 이 효과적인 방법을 우리는 느슨한 결합이라고 부릅니다.

이 기술을 구현하는 출발점은 기능 단위의 인캡슐레이션(encapsulation)입니다. 기능별로 각각의 클래스에 담기게 되는 코드는 수정할 지점을 직관적으로 찾을 수 있게하고 변경점을 최소화 또는 단일화 시킵니다. 특히 정형화된 디자인 패턴을 사용할 경우 성능의 향상으로까지 이어지는 선순환의 프리미엄도 누리게되죠. 그리고 마침내 유지보수 리소스가 대폭 삭감되는 순간을 맞게됩니다. 이게 바로 장님이 눈을뜨는 부흥회의 기적을 목도하는 장면입니다.

사족 : 구조지향 개발에서도 느슨한 결합이 가능하다고 주장하는 분들이 많습니다. 구조지향 개발을 하면서 부분적으로 느슨한 결합을 사용할 수 있다는 식이죠. 이런분들 곰국 한그릇에 물 열대접 붓고 곰탕 10인분이라고 주장하실 분들입니다.

댓글 없음:

댓글 쓰기