Kotlin Weekly

Kotlin Weekly # -382 " 호환성 종류와 이해"

베블렌 2023. 12. 12. 10:48

11월 4주차에는 호환성에 대한 글입니다.

 

https://proandroiddev.com/source-binary-and-backward-compatibility-rule-them-all-61d3d358582e

 

Source, Binary and backward compatibility rule them all

As a software engineer, it is inevitable that you will encounter compatibility challenges at some point in your career. These may manifest…

proandroiddev.com

 

 

소개

이 글은 소스 호환성, 바이너리 호환성, 그리고 후방 호환성에 대한 글입니다. 이러한 호환성 문제는 코드의 수정 및 업그레이드 과정에서 발생할 수 있으며, 특히 라이브러리를 관리하거나 타사 라이브러리에 의존하는 경우 중요합니다.

항상 호환문제... 네이버 지도를 compose로 사용할때 gps를 받는 google service랑 바이너리 호환성이 문제가 생겼었는데, 어디가 문제인지 모르고 에러코드만 봤을때는 매우 찾아내기 힘듭니다.

 

 

내용

소스 호환성: 소스 호환성은 새로운 코드 버전이 기존 클라이언트 코드에 어떠한 변경도 없이 통합될 수 있는 능력을 의미합니다. 예를 들어, 기존에 사용되던 함수에 새로운 파라미터를 추가하는 경우, 이 함수를 사용하는 기존 코드가 변경 없이 컴파일되어야 합니다. 이를 위해 새로운 파라미터에 기본값을 제공하는 방법을 사용할 수 있습니다.

// 기존 함수
fun getDishes(): List<Dish>

// 변경된 함수
fun getDishes(specification: DishSpecification = DefaultSpecification): List<Dish>

 

바이너리 호환성: 바이너리 호환성은 코드의 새 버전이 기존 클라이언트 코드와 재컴파일 없이도 작동하는 능력을 의미합니다. 이는 클라이언트가 명시적으로 라이브러리를 업그레이드하지 않아도 되는 상황을 말합니다. 바이너리 호환성을 유지하려면 라이브러리의 공개 API를 변경하지 않는 것이 중요합니다.

 

후방 호환성: 후방 호환성은 새 버전의 코드가 기존 버전의 동작을 유지하는 것을 의미합니다. 즉, 새 버전에서 오래된 기능을 그대로 유지하여 기존 클라이언트 코드가 예상대로 작동하게 하는 것입니다.

 

 

실제 사례

예를 들어, DishesRepository 인터페이스에 getDishes 메소드가 있고, 이 메소드에 새로운 파라미터가 추가되면, 기존 클라이언트 코드에서 컴파일 오류가 발생합니다. 이러한 상황에서는 기본값을 제공하거나, 오버로딩된 메소드를 추가하여 소스 호환성을 유지할 수 있습니다.

 

 

Gradle 의존성 충돌 해결

Gradle은 의존성 충돌을 해결하기 위해 최신 버전의 종속성을 선택합니다. 이는 라이브러리의 다양한 버전이 프로젝트에 포함될 때 중요한 문제가 될 수 있습니다. 예를 들어, 한 모듈이 라이브러리의 이전 버전에 의존하고 다른 모듈이 새 버전에 의존하는 경우, Gradle은 자동으로 최신 버전을 사용합니다. 이는 바이너리 호환성 문제를 야기할 수 있습니다.

 

 

정리

  • 개발자들은 이러한 호환성 문제를 인식하고, Gradle 등의 빌드 도구를 활용하여 문제를 관리해야 합니다. 예를 들어, Gradle은 종속성 충돌이 발생할 때 최신 버전의 라이브러리를 자동으로 선택합니다. 이는 바이너리 호환성 문제를 야기할 수 있습니다.
  • 라이브러리의 공개 API를 변경할 때는 항상 주의해야 하며, 가능한 한 소스, 바이너리, 후방 호환성을 유지하는 것이 중요합니다. 예를 들어, 함수에 새로운 파라미터를 추가할 때는 기본값을 제공하거나 오버로드된 버전의 함수를 제공하여 호환성을 유지할 수 있습니다.
  • 이러한 호환성은 라이브러리를 사용하는 다른 모듈이나 애플리케이션에 영향을 미칠 수 있으므로, 라이브러리를 업데이트하거나 수정할 때는 신중한 접근이 필요합니다.

물론 이런식으로 항상 잘 확인해야 하지만, 개인적으로 IDE가 정확히 진단해줬으면 하는 소망도 있습니다.

 

 

 

http://kotlinweekly.net/

 

** Kotlin Weekly **

 

kotlinweekly.net