개요

SOLID란 무엇이고 왜 필요한 것일까?


The Source Code is the Design

엔지니어란 무엇일까? 어떤 역할을 하는 사람을 엔지니어라고 할까? 건축 엔지니어는 건물의 설계도를 그린다. 자동차 엔지니어는 자동차의 설계도를 그린다. 이렇듯 엔지니어는 청사진을 그리는 사람이다.

그렇다면 소프트웨어 엔지니어는 무엇을 만들까? 물론 설계도다. 하지만 소프트웨어 엔지니어의 결과물은 조금 다르다. UML같은 설계도가 아니다. 소스코드가 도큐먼트다. 그런데 대뜸 이 애기를 왜 하는 것일까?

건물, 회로, 기계에 대한 전략과 소프트웨어의 전략은 다르다. 전자는 설계 단계에서는 비용이 매우 적다. 하지만 실제 구현(생산) 단계에 들어가게 되면 수정이 매우 어렵다.

반면 소프트웨어는 초기 설계 단계에 비용이 매우 크다. 여기서 말하는 설계는 소스 코드를 작성하는 것을 말한다. 하지만 구현 단계인 컴파일과 빌드는 비용이 아주 작다. IDE를 사용하면 버튼 한번 클릭하면 끝난다.

이제 왜 이 얘기를 했는지 느낌이 오는가? 소프트웨어에서 의존성 관리를 잘하고 설계를 잘 해놓는 것이 매우 비용이 높고 힘든 작업이다. 따라서 우린 비용이 큰 설계라는 단계를 잘하기 위해 많은 노력이 필요하다.


Design Smells

앞서 말했듯 소프트웨어 엔지니어링에서 설계는 매우 비싼 비용이 필요하다. 따라서 좋은 설계(소스 코드 작성)를 하는 것은 선택이 아닌 필수다. 그렇다면 좋은 설계인지를 확인하기 위한 기준은 무엇이 있을까?

  1. Rigidity(강직성)
  2. Fragility(취약성)
  3. Immobility(부동성)
  4. Viscosity(점성)

Procedural, OOP

위 예시는 OOP를 적용하지 않은 경우 어떤 문제점이 예상되는지를 확인하기 위해 만들어진 예시입니다.

  1. A 개발자에게 새로운 요구사항이 들어왔다. 만약 키보드 입력을 받아 프린터를 출력하는 요구사항이다. 이 때 아주 쉽게 구현하려면 아래처럼 구현하면 된다.

    public void copy(){
    		int c;
    		while ((c = readKeyboard()) != EOF) {
    				writePrinter(c);
    		}
    }
    

    구현은 끝냈지만 A 개발자는 이것만 할 순 없는 노릇이다. 현업팀의 문의사항도 처리해줘야하고 다른 프로젝트의 버그도 신경써야 하고 회의도 해야한다. 심지어 소스코드를 다운로드하는 것도 시간이 오래 걸린다. 첩첩산중이다. 그런데 여기에 요구사항이 또 추가됐다.