Effective Kotlin - wrapper에 대하여

JINHO LEE·2024년 7월 15일
0

아이템 29 - 외부 API를 랩(wrap)해서 사용하라

외부 API를 직접 사용하는 대신 랩(wrapper)을 사용하면 코드의 유지 보수성과 유연성을 크게 향상시킬 수 있다. 이 글에서는 랩의 정의와 사용법에 대해 알아본다.

랩(Wrapper)란 무엇인가?

랩은 기존의 기능을 감싸는 코드로, 외부 API와 애플리케이션 코드 사이의 인터페이스 역할을 한다. 이를 통해 외부 API의 변경 사항이 애플리케이션 코드에 직접적인 영향을 미치지 않도록 하며, 코드의 가독성과 테스트 가능성을 높일 수 있다.

랩을 사용하는 이유

  1. 유지 보수성 향상

    • 외부 API가 변경되면 애플리케이션 코드 전체를 수정할 필요 없이 랩 코드만 수정하면 된다.
    • 코드의 일관성을 유지할 수 있어 변경 관리가 용이하다.
  2. 유연성 증가

    • 외부 API 변경 시 랩을 통해 쉽게 적응할 수 있다.
    • 랩을 통해 추가적인 기능을 쉽게 확장할 수 있다.
  3. 가독성 향상

    • 복잡한 API 호출 로직을 랩으로 감싸서 코드가 더 간결하고 읽기 쉬워진다.
    • 개발자가 이해하기 쉬운 인터페이스를 제공할 수 있다.
  4. 테스트 용이성

    • 외부 API 호출을 모의(Mock)할 수 있어 단위 테스트가 쉬워진다.
    • 테스트 환경에서 외부 API의 불확실성을 제거할 수 있다.
  5. 안전성 강화

    • 외부 API의 예외 상황을 랩에서 처리하여 애플리케이션의 안정성을 높일 수 있다.
    • 외부 API의 비정상적인 동작에 대한 방어 코드를 추가할 수 있다.

랩의 사용법

Step 1: 외부 API 인터페이스 정의

먼저, 외부 API의 기능을 추상화한 인터페이스를 정의한다. 이 인터페이스는 애플리케이션 코드가 외부 API를 호출하는 방법을 명세한다.

interface ExternalApi {
    fun fetchData(id: String): ApiResponse
}

Step 2: 외부 API의 실제 구현 클래스

이제, 외부 API를 실제로 호출하는 구현 클래스를 작성한다. 이 클래스는 외부 API의 모든 세부 사항을 처리한다.

class ExternalApiImpl : ExternalApi {
    override fun fetchData(id: String): ApiResponse {
        // 실제 외부 API 호출 로직
        val response = // ...
        return ApiResponse(response)
    }
}

Step 3: 랩 클래스 정의

랩 클래스를 만들어 외부 API 호출을 감싼다. 이 클래스는 외부 API 인터페이스를 구현하고, 필요에 따라 추가적인 로직을 포함할 수 있다

class ExternalApiWrapper(private val externalApi: ExternalApi) : ExternalApi {
    override fun fetchData(id: String): ApiResponse {
        // 필요한 추가 로직
        return externalApi.fetchData(id)
    }
}

Step 4: 의존성 주입

애플리케이션 코드에서는 외부 API 구현 대신 랩 클래스를 사용한다. 이를 통해 외부 API 변경 시 애플리케이션 코드에 미치는 영향을 최소화할 수 있다.

class SomeService(private val externalApi: ExternalApi) {
    fun process(id: String): ProcessedData {
        val data = externalApi.fetchData(id)
        // 추가적인 비즈니스 로직
        return ProcessedData(data)
    }
}
fun main() {
    val externalApi = ExternalApiImpl()
    val apiWrapper = ExternalApiWrapper(externalApi)
    val service = SomeService(apiWrapper)
    
    val result = service.process("someId")
    println(result)
}

랩을 사용할때의 단점

장점도 있지만 랩을 사용하면서 단점도 존재한다.

  1. 추가 코드 작성

    • 랩을 작성하는 것은 추가적인 코드 작성이 필요하다.
    • 코드 중복의 가능성이 있으며, 잘못 관리되면 오히려 코드 복잡성을 증가시킬 수 있다.
  2. 성능 오버헤드

    • 랩을 사용하면 추가적인 함수 호출이 발생하여 성능 오버헤드가 생길 수 있다.
    • 성능이 중요한 애플리케이션에서는 주의가 필요하다.
  3. 추가적인 추상화

    • 랩을 사용하면 추상화 계층이 하나 더 추가되어 코드가 다소 복잡해질 수 있다.
    • 불필요한 추상화는 오히려 코드의 이해를 어렵게 할 수 있다.
  4. 설계 및 유지 보수 비용 증가

    • 랩 설계에 시간이 걸리며, 변경 시에도 랩과 원본 API 모두를 고려해야 한다.
    • 랩의 유지 보수에 추가적인 노력이 필요하다.
  5. 잠재적 문제 은닉

    • 랩을 통해 외부 API의 문제를 숨길 수 있지만, 이는 문제 해결을 지연시킬 수 있다.
    • 외부 API의 동작을 완전히 이해하지 못하고 랩을 사용할 경우 예상치 못한 문제가 발생할 수 있다.

결론

외부 API를 랩핑하는 것은 많은 장점을 제공하지만, 단점도 고려하여 신중하게 사용해야 한다. 상황에 맞게 랩핑을 적용하여 코드의 품질을 향상시키는 것이 중요하다.

0개의 댓글