클린 코드(Clean Code) 리뷰 - 08

 

경계

소프트웨어를 개발할 때 우리는 모든 것을 직접 개발하지 않는다. 외부 라이브러리나 패키지를 사거나 오픈 소스를 이용한다. 또는 사내에서 개발한 컴포넌트를 사용한다. 어떤 식이든 우리가 구현하는 코드와 외부에서 가져온 코드를 깔끔하게 통합시켜야만 한다.

외부코드 사용하기

우리가 사용하는 외부코드들은 많은 기능을 제공해주고 있다. 하지만 이런 많은 기능 모두 사용하지 않으며, 오히려 비즈니스 로직을 구현하고 제공할 때 해가 될 수도 있다. 예를 들어 java.util.Map의 경우 다음과 같은 기능들을 제공해주고 있다.

int size();
boolean isEmpty();
boolean containsKey(Object key);
boolean containsValue(Object value);
V get(Object key);
V put(K key, V value);
V remove(Object key);
void putAll(Map<? extends K, ? extends V> m);
void clear();
...

java.util.Map 을 활용하여 비즈니스 로직을 구현할 때 해당 기능들을 누구나 사용 가능하다

// BookCategoryService.java

// 도서관 책의 청구기호와 카테고리를 가진 컬렉션 
Map<String, BookCategory> bookCategories = new HashMap<>();

해당 컬렉션은 get() 을 활용하여 읽기만을 제공하는 컬렉션으로 제공하고 싶지만 의도치 않은 기능들도 같이 제공될 수 있다. 어느 사람도 clear() 를 통한 삭제가 이뤄질 수 있다.

그러므로 필요한 인터페이스만 제공하기 위해서 Wrapping을 통해서 기능들을 제한하여 제공해야 한다.

외부코드 살피고 익히기

외부코드를 바로 적용하기 이전에 외부코드를 테스트를 진행하여 익혀야 한다. 이를 학습 테스트라 부른다. 학습 테스트를 진행하여 외부코드를 제대로 이해하는지 알아볼 수 있다. 이렇게 제대로 이해해야 우리 쪽 코드에 적절하게 녹여낼 수 있다.

학습 테스트

필요한 API의 지식을 확보할 수 있는 손쉬운 방법의 하나이다. 또한 새로운 버전이 나오더라도 테스트를 통해 새로운 버전의 외부코드가 우리 코드의 이전과 다른 영향을 주는지도 확인할 수 있다. 이러한 학습 테스트를 진행하지 않는다면 새로운 버전의 외부코드가 우리 코드에 끼치는 영향 및 문제가 파악하기 쉽지 않아 손쉽게 새 버전으로 이전하기 어렵다.

결론

깨끗한 경계를 통해서 가독성이 높아진다. 또한, 의도한 방식으로 인터페이스를 구현하여 제공할 수 있으며, 외부 패키지의 관리도 쉬워진다. 명확한 경계로 시스템 전반적으로 이해해야만 코드를 이해할 수 있는 비율이 낮아진다.

Leave a comment