올리브영 테크블로그 포스팅 스위프트 매크로_1탄, 스위프트 매크로가 뭐예요?
iOS

스위프트 매크로_1탄, 스위프트 매크로가 뭐예요?

정체를 아라보자

2023.11.15

안녕하세요. 블로그에는 처음 인사 드리는 올리브영 모바일앱개발팀 윌입니다.

이번 포스트에서는 스위프트 5.9에 등장한 신기능: 스위프트 매크로를 소개합니다.

이 내용은 Let'Swift 2023에서도 발표 한 내용입니다.

우선 매크로가 뭐예요? 🤔

적절히 대치되는 한 단어를 찾기가 너무 어려워서 일단 위키피디아를 찾아보았습니다.

매크로정의-위키

두 문단에 걸쳐서 설명해주고 있네요. 첫 문장만 한번 읽어볼까요.

매크로는 특정 입력이 어떤 방식으로 대치되어 출력되어야 하는지를 정한 규칙, 혹은 패턴을 의미합니다.

해석을 봐도 약간 모호한데요. 다음 문단도 첫 문장만 읽어봅시다.

매크로는 개발자로 하여금 일련의 명령어들을 하나의 "statement"만을 이용하여 작성할 수 있게 하는데 사용됩니다. ("큰" 블럭의 코드를 "작은" 일련의 문자열로부터 만들어 낼 수 있기때문에 "매크로"라고 불립니다.)

위키에서 두 번째 설명을 보니 Swift Macro Doc 문서의 그림이 이해가 가네요

스위프트-매크로-실행

다만, 엑스코드가 제공하는 코드스니펫 기능, 그리고 C 언어의 전처리기 매크로와 크게 다르지 않은거 같은데요.

스위프트 매크로는 어떻게 다른지 선행기술들을 알아보면서 하나씩 짚어보겠습니다.


비교대상 #1: Xcode-CodeSnippetLibrary

wwdc 영상에서 애플 개발자들이 많이 사용하는 걸 보셨을거에요.

엑스코드-스니펫-라이브러리

실제로 사용해보시면 직접 불러올 코드 블럭을 작성하면서 단축어도 정할 수 있어서 편리한데요.

생각보다 단점들이 꽤나 있습니다.

개발자가 코드를 직접 불러서 붙여 넣어줘야 하고, 팀원들 사이에 공유가 번거롭습니다.

스니펫 파일을 업데이트 하여 팀원 전체가 새로 받아야 하는것도 잘 알려지지 않은 이슈 중 하나입니다.


비교대상 #2: C Macro

C 언어에서 제공하는 매크로 기능은 또 다른 장단점이 있어요

c-macro-medium

불러올 코드 블럭의 선언 위치가 프로젝트 내부에 "소스코드"입니다.

즉, 다른 프로젝트에 쓰려면 "소스카피"가 필요하단 얘기가 됩니다.

또한 매크로가 적용된 코드가 "텍스트" 취급받기 때문에 코드 컴플리션이나 타입 추론 같은 보호장치가 전혀 없습니다.

위의 이미지 예시에서는 -2가 출력되는데요. 매크로 확장한 결과가 (3-1 * 5)가 돼요. 😾

이와 같이 매크로로 인해 발생한 로직 오류로부터 전혀 개발자가 보호받을 수 없게 됩니다.


그럼 스위프트 매크로는 어떻게 다른데요?

스위프트 매크로는 앞서 소개한 선행 기술들과 같은 동작을 하면서 동시에 단점을 보완했습니다.

Compile time execution

macro-expansion-full

컴파일 타임에 자동 실행되며 호출지 주변의 코드를 보고 붙여넣을 코드를 생성해줍니다.


Macro Expansion

callSite+CopyAndPaste

컴파일 전에 매크로 실행 결과를 미리 볼 수 있고, 컴파일 시 만들어진 코드에 에러가 있는 경우 알려줍니다.


Package Manager Adoption

spm

스위프트 패키지 매니저를 통해 배포 할 수 있어 버전 관리, 팀 내 배포가 용이합니다.


다만 무조건 장점만 있는 것은 아닙니다.

코드 생성 프로그램을 작성하기 위해서는 작은 진입 장벽이 있어요.

macro-roles

내가 만든 매크로(가 만들어 낸 코드 블럭이) 어떤 역할을 가져야 하는지 알아야 하고

ast-breakpoint-po

input으로 들어오는 코드가 Swift syntax tree의 어떤 자료형으로 변환되어 코드젠으로 들어오는지도 알 수 있어야 합니다.


이 내용들은 코드젠 프로그램 작성을 해야 할 때 공식자료들과 컨퍼런스 발표 자료들을 더 찾아보시는 걸 추천합니다.


긴 내용 읽어주셔서 감사합니다.

다음 편에서는 매크로 코드젠 프로그램을 작성하고 실제로 적용해 본 경험을 공유 해 볼게요.

그럼 다음편에서 만나요! 🙇

iOSSwiftMacro
올리브영 테크 블로그 작성 스위프트 매크로_1탄, 스위프트 매크로가 뭐예요?
🎮
|
iOS App Engineer
일단 해보는 개발자입니다