이론/설계

클린 코드 - 경계

tsyang 2021. 6. 13. 00:19

개발을 하다 보면 외부 코드 (구매한 패키지, 오픈 소스, 다른 팀이 개발한 컴포넌트 등) 를 사용할 일이 있다. 이 장에서는 이런 외부코드를 깔끔하게 사용하는 법에 대해 다룬다.

 

외부 코드 사용


외부 인터페이스를 사용할 때는 해당 인터페이스를 사용하는 클래스 밖으로 인터페이스가 노출되지 않도록 해야한다. 만약 그렇지 않다면 다음과 같은 문제가 생긴다.

 

  • 만약 외부 인터페이스의 메서드들이 모두 노출된 상태에서 사용한다면, 누군가 의도치 않은 메서드를 사용하여 예기치 않은 문제를 발생시킬 수 있다. 
  • 외부 인터페이스가 변할 경우, 메서드를 사용한 코드를 모두 수정해야 한다.

 

따라서 외부 코드를 새로운 클래스로 감싸거나 Adaptor 패턴을 이용하면 좋다. 이 경우 인터페이스에 변경이 발생해도 해당 클래스만 수정하면 되고, 외부 코드의 오용을 막을 수 있다.

 

외부 코드를 사용하는데, 아직 외부코드가 개발중이라면? 즉, 아직 존재하지 않은 코드를 사용해야 하는 경우에는 Adaptor 패턴과 '가짜' 클래스를 만들어서 내 코드를 테스트하고, 나중에 외부 코드가 나오면 쉽게 내 코드와 통합할 수 있다

 

 

학습 테스트


필요에 의해 외부 패키지를 가져왔다. 그렇다면 이제 외부 코드를 익히고, 외부 코드를 현재 개발중인 코드들과 통합해야 한다. 외부 코드를 익히기 위해 문서를 보고, 코드를 작성해 본다. 그러나 이런 방법은 시간도 오래 걸리고 디버깅을 할 경우에도 내코드가 문제인지 외부 코드가 문제인지 찾아내기도 골치아프다.

 

테스트를 먼저 작성해보면 어떨까? 

 

  1. 간단한 테스트를 작성한다.
  2. 간단한 코드를 작성한다.
  3. 컴파일 에러를 계속 수정한다.
  4. 테스트가 통과할 때 까지 수정한다.
  5. 통과한 코드를 다른 클래스로 캡슐화한다. => 이제 나머지 프로그램은 외부 코드를 몰라도 된다!

 

예를 들어 어떤 로거 클래스를 가져왔다고 하자.

  1. 콘솔에 "hello"를 출력하는 테스트를 작성한다.
  2. 로거를 호출해서 hello를 출력하도록 해본다.
  3. 컴파일 에러가 난다. 초기화가 안 됐거나, 스트림이 없다. 모두 수정한다.
  4. 테스트가 통과했다.
  5. 적절히 클래스를 만들어 캡슐화하면 콘솔에 원하는 문자열을 띄울 수 있는 클래스가 탄생했다. 

 

이런 학습 테스트는 다음의 장점이 있다.

  1. 외부 코드에서 필요한 지식만 빠르게 확보할 수 있다. 
  2. 테스트 케이스는 어쩌피 필요하다. 학습도 하면서 테스트케이스도 작성할 수 있다.
    (테스트 케이스가 없다면 외부 코드가 변경될 때 마다 위험이 생긴다. 그러니 외부 코드를 업데이트 받는걸 꺼리게 되고 낡은 버전을 오래 사용하게 된다.)

 

참고 : 로버트 C. 마틴, 클린 코드, 인사이트, [143-152p]