코드 변경이 호환성에 미칠 수 있는 영향

‘호환성’은 원래 코드를 개발한 .NET 구현 버전이 아닌 다른 버전에서 코드를 컴파일하거나 실행하는 기능을 나타냅니다. 특정 변경 내용은 6가지 측면에서 호환성에 영향을 줄 수 있습니다.

동작 변경

동작 변경은 멤버의 동작 변경을 나타냅니다. 변경은 외부적으로 표시되거나(예: 메서드가 다른 예외를 throw할 수 있음), 변경된 구현을 나타낼 수도 있습니다(예: 반환 값이 계산되는 방식 변경, 내부 메서드 호출 추가 또는 제거, 중요한 성능 향상).

동작 변경이 외부적으로 표시되고 형식의 공용 계약을 수정하는 경우 이진 호환성에 영향을 주기 때문에 쉽게 평가됩니다. 구현 변경은 평가하기가 훨씬 더 어렵습니다. 변경의 특성과 API 사용의 빈도 및 패턴에 따라 변경의 영향은 심각한 수준에서 위험하지 않은 수준까지 이를 수 있습니다.

이진 호환성

이진 호환성은 API 소비자가 다시 컴파일하지 않고 최신 버전에서 API를 사용하는 기능을 나타냅니다. 형식에 메서드를 추가하거나 새 인터페이스 구현을 추가할 때 이 변경은 이진 호환성에 영향을 주지 않습니다. 그러나 소비자가 어셈블리에 의해 공개된 동일한 인터페이스에 더 이상 액세스할 수 없도록 어셈블리의 공용 시그니처를 제거하거나 변경하면 이진 호환성에 영향을 줍니다. 이런 종류의 변경을 ‘이진과 호환되지 않는 변경’이라고 합니다.

소스 호환성

소스 호환성은 기존 API 소비자가 소스 변경 없이 최신 버전에서 다시 컴파일되는 기능을 나타냅니다. ‘소스와 호환되지 않는 변경’은 소비자가 상위 버전의 API에 대해 변경을 성공적으로 빌드하기 위해 소스 코드를 수정해야 하는 경우 발생합니다.

디자인 타임 호환성

디자인 타임 호환성은 Visual Studio 및 기타 디자인 타임 환경의 버전 간에 디자인 타임 환경을 유지하는 것입니다. 디자이너의 동작이나 UI가 이 호환성에 영향을 주지만, 디자인 타임 호환성의 가장 중요한 측면은 프로젝트 호환성과 관련이 있습니다. 프로젝트 또는 솔루션을 디자인 타임 환경의 최신 버전에서 열고 사용할 수 있어야 합니다.

이전 버전과의 호환성

이전 버전과의 호환성은 기존 API 소비자가 동일한 방식으로 동작하면서 새 버전에서 실행되는 기능을 나타냅니다. 동작 변경 및 이진 호환성 변경은 둘 다 이전 버전과의 호환성에 영향을 줍니다. 소비자가 최신 버전의 API에서 실행될 수 없거나 실행될 때 다르게 동작하는 경우 이 API는 ‘이전 버전과 호환되지 않습니다’.

개발자는 최신 버전의 API에서 이전 버전과의 호환성을 기대하므로 이전 버전과의 호환성에 영향을 주는 변경은 사용하지 않는 것이 좋습니다.

이후 버전과의 호환성

이후 버전과의 호환성은 기존 API 소비자가 동일한 동작을 나타내면서 이전 버전에서 실행되는 기능을 나타냅니다. 소비자가 이전 버전의 API에서 실행될 수 없거나 실행될 때 다르게 동작하는 경우 이 API는 ‘이후 버전과 호환되지 않습니다’.

이후 버전과의 호환성을 유지하면 실제로 버전 간에 변경하거나 추가하는 것이 불가능합니다. 해당 변경으로 인해 이후 버전을 대상으로 하는 소비자가 이전 버전에서 실행될 수 없기 때문입니다. 개발자는 최신 API를 사용하는 소비자가 이전 API에서 제대로 작동하지 않을 것이라고 예상합니다.

이후 버전과의 호환성을 유지하는 것은 .NET Core의 목표가 아닙니다.