
안녕하세요.
대덕소프트웨어마이스터고등학교 3학년 Team Finda iOS의 하원입니다.
본 글은 제가 Skip을 도입하는 과정을 담고 있습니다.
부족한 점이나 틀린 부분이 있다면 편하게 말씀해 주시면 감사하겠습니다. 🙇♀️
Skip을 사용하면 Swift와 SwiftUI로 하나의 앱을 작성하여 iOS와 Android 모두에서 네이티브로 출시할 수 있습니다.
즉, SwiftUI로 코드를 짜면 Kotlin으로 코드를 변경해주어 iOS 개발자가 Android Natvie 앱도 함께 출시할 수 있게 해주는 것 입니다!!
저는 원래 평화롭게 FINDA iOS 앱 개발을 하며 취준하고 있는 평범한 학생이였습니다.
전 블로그 글처럼 TCA도 열심히 공부하고, 모듈 구조도 AI와 머리를 맞대며 열심히 짰어요.
그러나.. 갑작스러운 안드로이드 개발자 탈주로 인해 Skip을 도입하게 되었습니다..
이전에 Skip 도입을 고려하지 않았기 때문에 라이브러리도 꽤 사용했고, 모듈 구조도 고심을 많이 해서 설계했었기에 정말 아쉬웠습니다.
회사에 가면 이런 일이 흔할까요..? 🙈🥲
그래도 새로운 지식을 얻는 즐거움을 느끼며 시작해보겠습니다..!
(Skip 세팅 이외에 모든 건 제 개인적인 생각이니 흘려들어주세요 🙏)
물론 모듈 구조를 지키고 TCA를 이용할 수 없는 건 아닙니다!!
그러나 Android 프로젝트를 따로 파줘야 합니다. 그래도 구조 지키면 좋은거 아님? 하실 수 있으니 제가 장단점을 정리해왔습니당.
2가지의 방법이 있어요 !!
1. 레포를 나누지 않고, 한 레포에서 개발 진행하기
2. 레포를 iOS, Android 나눠서 개발 진행하기
장점
단점
장점
단점
사실 처음에는 후자를 선택하려고 했지만, 이렇게 Skip을 도입하게 된거!
Skip의 장점을 모두 사용해보고 싶어졌습니다!!
또한, 엄청 큰 프로젝트는 아니고, 협업도 진행하고 있지 않아서 모듈 구조를 다 뭉개고(이럴거면 구조 열심히 짜지 말걸 🥲) 한 레포에서 개발을 진행하기로 했습니다!
brew install skiptools/skip/skip
skip checkup
저는 여기서 바로 오류가 뜨더라구요..

찾아보니까 Skip을 이용하려면 android platform-tools이랑 adb를 먼저 설치해야 하더라구요.. ㅎㅎ 설치 해보겠습니당
여기 아래부터는 제가 삽질하는 내용입니다.. 바로 해결하고 싶으시면 7. 해결과정으로 이동해주세요🙇♀️
sdkmanager --install "platform-tools" "platforms;android-34" "build-tools;34.0.0"
sdkmanager --licenses
저는 이거 할 때도 java의 위치 못찾아서 java -version하니까 여기가 문제더라구요.. 그래서 추가로 아래 명령어도 쳤습니다 (sdkmanager 사용 잘 되면 아래는 넘기면 돼요)
echo 'export JAVA_HOME=$(/usr/libexec/java_home)' >> ~/.zshrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.zshrc
source ~/.zshrc
다 해서 다시 확인해봤습니다
skip checkup

이번엔 잘 깔렸는데 Skip이 SDK 위치를 모르네요… ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ
echo 'export ANDROID_HOME=$HOME/Library/Android/sdk' >> ~/.zshrc
echo 'export ANDROID_SDK_ROOT=$ANDROID_HOME' >> ~/.zshrc
echo 'export PATH=$ANDROID_HOME/platform-tools:$PATH' >> ~/.zshrc
echo 'export PATH=$ANDROID_HOME/emulator:$PATH' >> ~/.zshrc
source ~/.zshrc
먼저 SDK 폴더를 생성하고 거기에 android platform-tools를 설치해 주겠습니다. 이래야 skip이 경로를 찾더라구요
SDK 폴더 생성
mkdir -p ~/Library/Android/sdk
SDK 설치 (이거하면 adb도 함께 깔립니다~)
sdkmanager --sdk_root=$HOME/Library/Android/sdk \
"platform-tools" \
"platforms;android-34" \
"build-tools;34.0.0"
sdkmanager --sdk_root=$HOME/Library/Android/sdk --licenses // 라이선스 승인
해결 !!!!!!!!!!!!!!!!!11

이게 프로젝트 루트에 들어가서 스킵을 생성해줘야 하는데 종류가 있습니다.
native와 transpiled가 있는데
파일에 선언하는 값은 모듈이 네이티브 Swift로 컴파일될지 아니면 Kotlin으로 트랜스파일될지를 결정합니다.
라고 합니다.. 선택지가 4개가 있는데 (이 부분은 정보가 별로 없었어서 정확하지 않아요!)
저는 디폴트 기본인 transpiled-app을 이용해볼게요!
skip init --transpiled-app --appid=[번들아이디] [프로젝트 폴더 이름 (소문자만 가능)] [앱 이름]
이때 앱 이름과 프로젝트 폴더 이름 다르게 하는 거 잊지마세용
그럼 루트에 프로젝트 폴더가 생겼을 텐데 이제 그냥 파일들을 일단
프로젝트폴더/Sources/앱 이름 경로로 다 옮겨주세요
제가 실제로 Skip을 이용하면서 SwiftUI를 이용한 Swift에서 이건 이렇게 바꿔줘야 한다!를 알아보겠습니다.
1 . .overlay() 오류
보통 .overlay()에서 나는 오류는 .overlay{}로 바꾸면 해결이 됩니다 !!
2 . Double 오류
Double 타입에서 오류가 많이 나는 걸 볼 수 있는데.. Double과 Float 이 섞이면서 발생하는 오류 또는 Double 타입임에도 Int형으로 써서 발생하는 오류입니다. 이건 타입만 잘 맞춰주고 소수점 써주면 에러가 안나요!
3 . .clipShape(.rect(cornerRadius: 10))
여기도 오류를 나는 경우가 꽤 있는데 이건 그냥 원래 형식으로 작성해주시면 됩니다. .cornerRadius(10)
또는 .clipShape(RoundedRectangle(cornerRadius: 10) 도 되는 것 같아요
4 . 이미지 오류
이미지가 안뜨는 오류가 발생했는데 이 2가지만 명심하면 됩니다!
Image(name) // x
Image(name, bundle: .module) // o
assets에서 group/folder 사용하지 않기.. (이유 찾는 게 정말 어려웠음 ㅜㅜ)
이렇게 group 안에 넣어두면 인식을 못하더라구요

5 . 꿀팁
#if SKIP
// 안드 환경에서만 돌아가는 코드
#endif
// 안드, ios 둘 다 돌아가는 코드
6 . 기타
이건 당연한 말이지만 iOS 앱 개발하면서 외부 라이브러리 많이들 쓰셨을 텐데 Skip을 이용하시면 보통 사용 못하십니다.. ex. DGChart, Moya 물론 Alamofire도 ㅎㅎ 그렇기에 URLSession + async/await 직접 구현해야 해요.
끝까지 읽어주셔서 감사합니다. 🙇♀️
더 자세한 내용은 https://skip.dev/docs/gettingstarted/ 이쪽으로 가면 찾아보실 수 있습니다! 궁금한 점은 댓글이나 이메일로 연락주세요!
이메일: hawon9781@gmail.com
글에 대한 피드백은 언제나 환영입니다!
kotlin을 안씀으로써 생기는 비용과 iOS에만 존재하는 서드파티를 사용할 수 없는 비용 중에 잘 고민해야겠네요..
잘 만들어진 네트워킹 라이브러리를 못쓰는 건 너무 치명적인데 말이죠