🔥 레거시 코드를 Swift 패키지로 감싸기

186자
3분

레거시 코드를 패키징하다 보면 여러 가지 상황에 부딪힐 수 있어요. 가령 여러분이 만들고 있는 코드가 Swift 패키지로도 빌드되고, 그렇지 않은 방식으로도 빌드되는 경우가 있겠죠? 대표적인 예로 Xcode에서도 빌드되고 Swift 패키지로도 빌드되는 프로젝트를 패키징하는 상황을 들 수 있어요.

이런 경우 어떻게 해야 할까요? 코드를 두 번 작성하는 건 너무 비효율적이에요. 그렇다고 한 가지 방식으로만 빌드되게 만들자니 호환성 문제가 생길 것 같고요.

이런 경우에는 전처리기 정의인 SWIFT_PACKAGE를 사용해서 Swift 패키지용 코드를 조건부로 컴파일할 수 있습니다. 코드를 다음과 같이 작성하면 됩니다:

#if SWIFT_PACKAGE
import Foundation
#endif
swift

이렇게 하면 SWIFT_PACKAGE가 정의되어 있을 때만 Foundation 모듈을 임포트하게 됩니다. 즉, Swift 패키지로 빌드할 때는 필요한 모듈을 사용하고, Xcode로 빌드할 때는 그 모듈을 사용하지 않게 되는 거죠.

이런 식으로 전처리기 정의를 활용하면 하나의 코드 베이스를 가지고 다양한 빌드 환경에 맞춰 유연하게 대응할 수 있습니다. 예를 들어 Swift 패키지에서는 사용 가능하지만 Xcode에서는 사용할 수 없는 기능이 있다면, 전처리기 정의로 그 부분만 감싸주면 됩니다. 반대로 Xcode에서만 사용 가능한 기능도 마찬가지로 처리할 수 있겠죠.

이렇게 전처리기 정의를 잘 활용하면 하나의 코드 베이스를 다양한 환경에서 빌드할 수 있습니다. 코드 중복도 없애고, 관리도 훨씬 수월해지겠죠? 레거시 코드를 패키징할 때 이 테크닉을 꼭 기억해 두세요!