zero-wiki Help

경계

외부 코드 사용하기

패키지 제공자나 인터페이스 사용자 사이에는 특유의 긴장감이 존재합니다. 왜냐하면 패키지 제공자는 기능이 더 많을수록 더 많은 고객이 구매하기 때문입니다.

반면, 사용자는 자신의 요구에 맞는 기능만을 바랍니다.

new Map().clear(); new Map().delete(); new Map().entries(); new Map().forEach(); new Map().get(); new Map().has(); new Map().keys(); new Map().values(); new Map().set(); new Map().size();

javascript의 Map 인터페이스는 사용자가 원하지 않는 인터페이스까지 가지고 있습니다.

때문에 다음과 같이 경게 인터페이스인 Map을 Sensors 안에 숨길수도 있습니다.

class Sensors { sensors: Map<number, string>; constructor() { this.sensors = new Map<number, string>(); } getById(id) { return this.sensors.get(id); } }

이렇게 한다면 다른 메소드를 이용하여 직접적으로 Map을 조작할 수 없습니다. 그렇다고 해서 Map을 쓸때마다 항상 캡슐화하라는 것은 아닙니다. 여기저기 넘기지 말라는 말입니다.

경계 살피고 익히기

외부 코드를 사용한다면 적은 시간에 더 많은 기능을 출시하기 쉬워집니다. 만약 외부 패키지를 사용하고 싶다면 외부 패키지를 테스트 하는 것이 아닌 우리가 사용하는 코드를 테스트 하는 것이 바람직합니다.

외부 코드를 익히는 것은 어렵습니다. 외부 코드를 통합하기도 어렵습니다. 두 가지를 동시에 하는 것은 두 배나 어렵습니다. 우리쪽 코드를 작성해 외부 코드를 호출하는 대신 먼저 간단한 테스트를 작성하여 외부 코드를 익히는 이러한 방법을 학습 테스트라고 부릅니다.

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

학습 테스트에 드는 비용은 없습니다. 또 이해도를 높여주는 정확한 실험이기에 공짜 이상입니다. 투자하는 노력보다 얻는 성과가 더 큽니다. 패키지 새 버전이 나온다면 학습 테스트를 돌려 차이가 있는지 확인합니다.

학습 테스트는 패키지가 예상대로 동작하는지 검증합니다.

패키지 작성자는 버그를 수정하고 기능을 추가하기에 새로운 버전이 나올 때 마다 새로운 위험이 생겨납니다. 새버전이 호환되지 않으면 학습 테스트가 이를 곧바로 밝혀냅니다.

학습 테스트를 이용한 학습이 필요하든 그렇지 않든, 실제 코드와 동일한 방식으로 인터페이스를 사용하는 테스트 케이스가 필요합니다.

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

서버측 API가 나오기 이전 인터페이스를 작성하고 하였고. 상대측 API가 나왔을 때 이러한 간극을 해소시켜줄 Adapter를 구현하였습니다. 이러한 패턴을 이용하여 API 코드가 바뀔때마다 수정을 통해 편리하게 API 테스트도 진행할 수 있었습니다.

깨끗한 경계

외부 패키지를 호출하는 코드는 분리하는 것이 좋습니다. 통제가 불가능한 외부 패키지에 의존하는 대신 우리 코드에 의존하는 편이 좋습니다.

외부 패키지를 호출하는 코드를 가능한 줄여 경계를 관리하거나 새로운 클래스로 감싸거나, 혹은 Adapter 패턴을 사용하여 원하는 인터페이스로 변경하는 것이 좋습니다.

이러한 방법들을 사용하면 가독성이 좋아질 뿐더러 외부 패키지가 변경이 되었을 때 변경할 코드량도 감소하게 됩니다.

🙏🏻끝으로

프론트엔드 개발을 진행할 때 외부 패키지에 의존해서 개발을 하는 경우가 많습니다. 하지만 이러한 라이브러리들은 1년마다 많은 변화를 불러오고 있고 매번 새롭게 학습을 하거나 이전 버전을 사용할지에 대해 생각을 해보아야 합니다.

외부 패키지에 사용할 코드를 분리하는 것은 좋은 방법인 것 같습니다. 코드 분리도하여 가독성도 좋게하고 의미를 파악하는데에 있어서 쉬울 것 같습니다.

최근에도 fetchWrapper 함수를 구현할지 고민을 하고 있었는데 그저 외부 라이브러리를 갖다쓰는 것이 아닌 다른 라이브러리를 학습을 하여 사용하는 것도 좋을 것 같아 보입니다.

Last modified: 07 August 2024