티스토리 뷰

목차

1. 경계란

2. 외부 코드 사용하기

3. 학습 테스트

 

 

 

1. 경계란

프로젝트에서 오픈소스, 라이브러리 같은 외부 코드를 자주 사용한다.

우리 코드는 외부 코드의 인터페이스를 제공받아 사용하는데

제공자와 사용자 사이의 시스템 경계에서는 문제가 생길 소지가 많기 때문에

외부 코드를 우리 코드에 깔끔하게 통합 할 수 있도록 경계를 잘 지어야 한다.

 

2. 외부 코드 사용하기

캡슐화

외부 코드를 사용하는 부분을 캡슐화해

데이터를 보호하고 외부 인터페이스가 변할 경우 우리 코드에 미치는 영향을 최소화 한다.

java.util.Map 인터페이스를 예로 든다.

Map<Sensor> sensors = new HashMap<Sensor>();
...
Sensor s = sensors.get(sensorId );
  • Map 인터페이스가 제공하는 clear 등 불필요한 기능이 노출된다.
  • 외부 코드가 함부로 호출하면 sensor 데이터가 손상될 수 있다.
  • Map 인터페이스가 변경되면 사용하는 우리 코드의 수정할 코드가 많아진다.
public class Sensors {
    private Map sensors = new HashMap();
    
    public Sensor getById(String id) {
        return (Sensor) sensors.get(id);
    }
}
  • 캡슐화를 통해 Map을 감춘다.
  • 원하는 기능(getById())만 공개할 수 있다.
  • Map 인터페이스가 변하더라도 나머지 프로그램에는 영향을 미치지 않는다.

Map과 같은 경계 인터페이스를 이용할 때는

이를 이용하는 클래스나 클래스 계열 밖으로 노출되지 않도록 주의해야 한다.

 

Adapter 패턴

Adapter 패턴은 외부 코드를 호출할 때,

우리가 정의한 인터페이스대로 호출하기 위해 사용하는 패턴이다.

TransmitterAdapter에 API 사용을 캡슐화해 API가 바뀔 때 수정할 코드를 한 곳으로 모은다.

CommunicationController 코드는 Transmitter 인터페이스를 정의해 외부 API와 분리했기 때문에 가독성이 높아지고 코드의 의도도 분명해진다.

 

또한, 이런 설계는 테스트를 만들때는 적절한 Fake 객체를 만들어 주입해 사용할 수 있기 때문에

외부 API와 분리해 우리의 코드가 제대로 동작하는지 테스트할 수 있다.

Adapter 패턴 in Elastic Search

1. 우리 코드(내 패키지)가 아닌 외부 코드를 import 하고 있다.

2. 외부 코드인 NettyAdaptor는 nettyChannel을 감싸고 있다.

 

Adapter에 우리가 원하는 타입의 파라미터를 전달해 경계 인터페이스를 사용한다.

ByteBuffer, Page타입의 파라미터를 ByteBuf로 변환해 외부 코드인 nettyChannel에 전달한다.

만약 Adapter를 통해 변환을 거치지 않았다면

nettyChannel에 데이터를 전달할 때마다 타입을 변환하는 과정이 필요해진다.

 

3. 학습 테스트

학습 테스트를 작성해 외부 코드에 대한 이해도를 높이고 안정성도 미리 검증할 수 있다.

또한, 외부 코드의 버전이 변경됐을 때, 우리 코드와 호환되는지 확인할 수 있다.

예) 경로 탐색을 위한 라이브러리 JGraph의 학습 테스트

@Test
public void getDijkstraShortestPath() {
    WeightedMultigraph<String, DefaultWeightedEdge> graph
            = new WeightedMultigraph(DefaultWeightedEdge.class);
    graph.addVertex("v1");
    graph.addVertex("v2");
    graph.addVertex("v3");
    graph.setEdgeWeight(graph.addEdge("v1", "v2"), 2);
    graph.setEdgeWeight(graph.addEdge("v2", "v3"), 2);
    graph.setEdgeWeight(graph.addEdge("v1", "v3"), 100);

    DijkstraShortestPath dijkstraShortestPath
            = new DijkstraShortestPath(graph);
    List<String> shortestPath 
            = dijkstraShortestPath.getPath("v3", "v1").getVertexList();

    assertThat(shortestPath.size()).isEqualTo(3);
}​

 

 

 

 

 

 

 

출처

Clean Code(클린 코드) 애자일 소프트웨어 장인 정신 - 로버트 C. 마틴 지음

https://zero-base.co.kr/category_dev_camp/cleancode_1book

728x90