## 목차 ##



## 외부 코드 사용하기 ##

  • 경계 인터페이스
    • 외부 라이브러리를 사용하기 위해 사용해야하는 인터페이스
    • ex) Map
    • 경계 인터페이스를 여기저기 함수의 인자로 넘기지 마라.
    • 외부 API를 사용할 때는 이를 사용하는 클래스 안에서 철저히 캡슐화하고 외부로 직접 노출하지 않는다.
    • 외부 API 캡슐화를 통해 꼭 필요한 기능만 다룰 수 있는 메소드만을 제공한다.
Map<String, Sensor> sensors = new HashMap();
Sensor s = sensors.get(sensorId);

위 코드의 방법에는 몇가지 문제점이 존재한다.

a) 사용자가 필요하지 않은 기능까지 제공한다.
b) 예를 들어 `clear()`가 사용되지 말아야 할 메소드라 해도 이를 막을 방법이 없다.

아래와 같이 고치면 이러한 문제를 해결할 수 있다.

public class Sensors {
    Map<String, Sensor> sensors = new HashMap();

    public Sensor getById(String sensorId) {
        return sensors.get(sensorId);
    }

    ...
}

위와 같이 외부 API를 캡슐화하고 필요한 인터페이스만 제공하여 오용을 막을 수 있다.

외부 인터페이스를 사용할 때 마다 매번 위와같이 캡슐화 하라는 소리가 아니다. 핵심은 경계 인터페이스를 여기저기 넘기지 말아야 한다는 것이다.



## 경계 살피고 익히기 ##

  • 학습 테스트

    • 외부 API의 사용을 위해서 간단한 테스트 케이스를 작성해 외부 코드를 익히는 방법
    • 학습 테스트에서는 프로그램에서 사용하려는 방식대로 외부 API를 호출한다.
    • API를 제대로 이해하는지를 확인하는 행위
  • 학습 테스트를 통해 경계 인터페이스를 익힐 수 있다.



## 학습 테스트는 공짜 이상이다 ##

  • 학습 테스트는 비용이 없다.

    • 어쨌든 사용하기 위해서는 API를 배워야한다.
  • 필요한 지식만 확보하며 이해도를 높여준다.

  • 투자하는 노력보다 얻는 성과가 더 크다.

  • API 버전이 바뀌더라도 학습 테스트를 통해 내 코드와의 호환성을 밝혀낼 수 있다.

    • 경계 인터페이스의 새 버전으로 이전하기 쉬워진다.



## 아직 존재하지 않는 코드를 사용하기 ##

  • 개발 중 사용해야할 인터페이스가 아직 정의되지 않은 경우
    • 관련 팀에서 아직 설계를 마치지 못했다.
    • 우리 프로젝트의 지연을 원하지 않기 때문에 자체적으로 임시적인 인터페이스를 설계하여 사용하면서 우리 코드를 테스트한다.

예를 들어 무선통신 시스템의 하위 패키지를 개발중에 '송신기'를 담당하는 팀에서 아직 인터페이스 정의조차 하지 못했다.

그러나 '송신기'모듈에게 원하는 기능은 확실하다.

주파수와 스트림을 지정하면 외부로 신호를 전송해준다.

위의 요구조건을 만족하는 Transmitter 인터페이스를 일단 만들고 transmit(frequency, stream) 메소드를 추가해서 사용했다.

transmitter_interface

CommunicationController를 분리하였다. TransmitterAdapter를 통해 API를 캡슐화하여 Transmitter API가 정의된 후 바뀌어야 할 코드를 한곳으로 모았다.

핵심은 설계 요구조건에 따라 임시 API를 자체적으로 정의해 미리 사용한 것이다. 그리고 모듈을 분리하여 결합도를 없애거나 낮추어서 추후에 API 개발이 완료되어도 쉬운 수정 및 테스트가 가능하다.



## 깨끗한 경계 ##

  • 경계에 위치하는 코드는 깔끔히 분리한다.
    • 테스트 케이스도 작성한다.
    • 이쪽에서 외부 패키지를 세세히 알아야 할 필요가 없다. 캡슐화를 통해 통제 가능한 우리 코드에 의존하자.
    • 캡슐화 혹은 ADAPTER 패턴 등을 사용해 외부 인터페이스 결합도를 낮추자.
    • 이렇게 하면 외부 패키지가 수정되었을 때 우리가 변경해야 할 코드도 줄어든다.

+ Recent posts