아이디어에서 현실로, 백엔드 개발자의 iOS 앱 출시 도전기

Ideas Take Shape
어릴 때부터 손으로 무언가를 만들어 내는 일에 대한 막연한 동경이 있었습니다. 그 꿈은 여러 과정을 거쳐 결국 소프트웨어 엔지니어라는 길로 이어졌습니다.
The Ambition for Apple Ecosystem
iPhone 3GS를 처음 접했을 때, 단순한 전자기기가 아닌 하나의 예술 작품과 같은 감각에 사로잡혔습니다. 개발자로서 애플의 하드웨어와 소프트웨어가 정교하게 조화를 이루는 생태계를 경험하며 그 매력을 더욱 확신하게 되었습니다. 이러한 경험 덕분에 언젠가는 애플 디바이스에서 동작하는 앱을 직접 만들어 보고 싶다는 생각이 자연스럽게 자리 잡았습니다.
개발자가 된 이후, 코드로 무언가를 만들어낼 수 있게 되었습니다. 하지만 제가 만드는 것은 사용자에게 직접 보이는 애플리케이션이 아니라, 그 뒤에서 안정적으로 작동하는 시스템이었습니다. 백엔드 개발은 제 성향에 잘 맞았으며, 시스템의 근간을 구축하고 데이터의 흐름을 설계하는 과정이 매우 흥미로웠습니다.
자연스럽게 관심과 역량이 백엔드에 집중되었습니다. 일정에 맞춰 업무를 완료하려면 지속적인 선행 학습과 깊이 있는 기술 탐구가 필수적이었고, 서버 아키텍처와 데이터 처리에 대한 고민이 항상 우선순위가 되었습니다. 이러한 이유로 개인적인 앱 개발은 늘 뒷전으로 밀려났으며, 이상하리만큼 네이티브 앱 개발은 높은 장벽처럼 느껴졌습니다.
그러던 중, 우연히 접한 인프런 진짜 왕초보 iOS 배우기 강의가 이러한 생각을 완전히 바꿔놓았습니다. 🙊 애플의 개발 도구와 Swift의 기본 컴포넌트가 매우 잘 갖춰져 있어, 간단한 앱 정도는 어렵지 않게 만들 수 있을 것 같다는 자신감이 생겼습니다.
First Things First
시계는 한눈에 들어오는 게 좋아 작업할 때 늘 디지털 시계 앱을 켜두곤 합니다. ⏰ 하지만 기존에 사용하던 앱에서는 원치 않는 화면 전환이 반복되어 사소하지만 신경 쓰이는 불편함이 있었습니다. 단순히 시간을 표시하는 기능이라 개발 부담이 크지 않을 것으로 판단되었고, 작업 환경을 조금이나마 개선할 수 있다는 점에서 iOS 개발의 첫 프로젝트로 적절하다고 생각했습니다.
개발에는 명확한 목표와 일정이 필요합니다. 기한이 있어야 동기부여가 되고, 마감이 있어야 집중도가 높아집니다. 따라서 다가오는 설 연휴를 출시 목표일로 정하였습니다. 단순한 프로젝트지만, 스스로에게 주는 작은 선물이자 의미 있는 경험이 될 것이라 생각했습니다. 목표가 확실해지자 매일의 작업에도 동기가 생겼으며, 작은 진전 하나하나가 더 특별하게 다가왔습니다. 과연 일정에 맞춰 출시할 수 있을까요? 😟
Developing an iOS Application
Xcode를 실행하는 순간, 맥북 활용의 마지막 퍼즐 조각이 맞춰지는 듯한 느낌이 들었습니다. 디자인 작업 없이 바로 개발에 착수했지만, 돌아보니 간단한 디자인을 미리 해두는 것이 더 효율적이었을 것이라 생각되었습니다. 코드를 통해 프로토타이핑을 진행하니 예상보다 시간이 더 걸렸기 때문입니다.
Swift의 컴포넌트들은 개발을 놀랍도록 간편하게 만들어 주었습니다. 마치 Spring의 IoC(Inversion of Control)가 객체 간의 의존성과 제어 흐름을 관리하듯, SwiftUI에서 상태 관리도 복잡한 설정 없이 데이터 흐름과 UI 상태를 직관적으로 연결하는 점이 인상적이었습니다. 또한, 레이아웃 관련 컴포넌트들은 개별적으로 제공되는 덕분에, 여러 속성을 조합해 중첩된 스타일을 구성할 필요 없이 깔끔하고 직관적인 방식으로 화면을 배치할 수 있어 개발 효율성을 더욱 높여주었습니다.
예를 들어, 웹 개발에서는 Tailwind와 같은 유틸리티 기반 CSS 프레임워크를 사용할 때, 레이아웃 속성이 반복적으로 중첩되는 경우가 많습니다:
<div className="flex flex-col items-center justify-center min-h-screen">
<div className="flex flex-col space-y-4 w-full max-w-lg p-4 border border-gray-300 rounded-lg">
<div className="flex justify-between items-center p-2 bg-gray-100 rounded-md">
<div className="flex justify-start items-center space-x-2">
<div className="text-sm font-medium text-gray-700">Item 1</div>
</div>
<div className="flex justify-end items-center space-x-2">
<div className="text-sm font-medium text-gray-700">Item 2</div>
</div>
</div>
<div className="flex flex-col space-y-2 p-2 bg-white border rounded-md">
<div className="flex justify-between">
<div className="text-xs text-gray-500">Sub Item A</div>
<div className="text-xs text-gray-500">Sub Item B</div>
</div>
<div className="flex justify-between">
<div className="text-xs text-gray-500">Sub Item C</div>
<div className="text-xs text-gray-500">Sub Item D</div>
</div>
</div>
</div>
</div>
반면, Swift에서는 직관적인 방식으로 레이아웃을 정의할 수 있어 코드가 훨씬 간결해졌습니다:
VStack(spacing: 16) {
VStack {
HStack {
Text("Item 1")
Spacer()
Text("Item 2")
}
.padding()
.background(Color.gray.opacity(0.1))
.cornerRadius(8)
VStack(spacing: 8) {
HStack {
Text("Sub Item A")
.font(.caption)
.foregroundColor(.gray)
Spacer()
Text("Sub Item B")
.font(.caption)
.foregroundColor(.gray)
}
HStack {
Text("Sub Item C")
.font(.caption)
.foregroundColor(.gray)
Spacer()
Text("Sub Item D")
.font(.caption)
.foregroundColor(.gray)
}
}
.padding()
.background(Color.white)
.overlay(RoundedRectangle(cornerRadius: 8).stroke(Color.gray, lineWidth: 1))
}
.frame(maxWidth: .infinity)
.padding()
}
.frame(maxWidth: .infinity, minHeight: UIScreen.main.bounds.height * 0.3)
이러한 차이는 코드의 가독성과 유지보수성을 높여주며, 개발 과정에서 불필요한 반복을 줄이는 데 큰 도움이 될 것입니다.
어느 빅테크 기업의 브이로그에서 iOS 앱 개발과 관련해 네이티브 vs. 크로스플랫폼 프레임워크에 대한 질문에 “네이티브는 기본적으로 제공하는 요소들이 잘 갖춰져 있어 개발 속도가 빠르다”고 말하는 것을 본 적이 있었는데, 직접 경험해보니 별다른 노력 없이 원하는 대로 화면을 구현할 수 있다는 점에서 그 말이 이해되기 시작했습니다. 물론 여러 플랫폼을 지원해야 한다면 리액트 네이티브 같은 크로스플랫폼 프레임워크가 더 나은 선택이겠지만, 애플 디바이스에 집중할 생각이기 때문에 제겐 해당되지 않았습니다.
시계 기능은 ChatGPT의 도움을 받아 예상보다 훨씬 수월하게 구현할 수 있었습니다. 또한, 애플 디바이스의 명확한 특성이 매우 인상적이었습니다. 특히, 시뮬레이터를 활용하여 iPhone Pro, Pro Max, SE 시리즈의 반응성만 확인하면 되었기에 개발 과정이 한층 더 편리하였습니다.
그래서 한 단계 더 나아가 유저가 시계 색상을 설정할 수 있는 기능을 추가하기로 하였습니다. 이를 위해 SwiftData를 활용하려 했으나, 동작은 원활했음에도 불구하고 해결되지 않는 경고 메시지가 지속적으로 발생했습니다. SwiftData가 아직 완전히 안정화되지 않은 것 같아, 결국 UserDefaults API로 우회하여 문제를 해결하게 되었습니다.
이 앱에서 가장 중요한 것은 화면 전체를 차지하고 있는 시계의 폰트입니다. 이 폰트가 앱의 첫인상을 좌우하고, 시계를 보는 모든 순간에 영향을 주기 때문입니다. 처음에는 시중의 디지털 폰트 중에서 적합한 것을 찾으려 했지만, 디지털 폰트 풀 자체가 크지 않았습니다.
원하는 결과를 얻기 위해 다양한 폰트를 비교하고 테스트했지만, 결국 만족스럽지 못했습니다. 그래서 고민 끝에 폰트를 직접 제작하기로 하였는데, 폰트를 만드는 과정은 예상보다 훨씬 섬세하고 까다로워 계획에 없던 철야 작업을 하게 되었습니다. 하지만, 원하는 형태와 느낌을 하나하나 완성해 나가는 과정에서 앱에 대한 애착이 더 깊어졌습니다.
Launching on the App Store
앱 개발이 완료된 후 애플 앱 스토어에 정식으로 출시하기 위해서는 애플 디벨로퍼 프로그램(Apple Developer Program)을 구독해야 합니다. 개인 개발자는 비교적 수월하다고 알려져 있었지만, 신원 확인 단계에서 예상치 못한 지연이 발생했습니다.
"Your enrollment could not be completed."
이 날이 일정의 마지막 날이라 조급한 마음으로 애플 운영시간이 시작되자마자 전화를 걸었습니다. 다행히 빠르게 응대해 주었고, 계정의 락을 해제한 뒤 결제와 등록 절차를 진행할 수 있도록 도와주었습니다. 아마 신원 증명을 위해 첨부한 한글 주민등록증이 문제가 되었던 것 같은데, 여권으로 제출했다면 바로 통과됐을 것도 같네요.
덕분에 문제를 원활하게 해결할 수 있었고, 결제를 완료하자마자 애플 디벨로퍼로 등록되었습니다. 👩🏻💻
이제 본격적으로 앱스토어 등록 과정에 들어갔습니다. 등록 과정은 준비할 것이 많았지만, 인프런 강의 내용을 그대로 따라하니 어려운 부분은 없었습니다. 다만 앱의 아이콘과 앱 스토어에 제출할 스크린샷은 대충 만들고 싶지 않아서 스케치 앱을 활용해 작업했는데, 이 과정에서 다소 시간이 소요되었지만, 결과적으로 만족스러운 이미지를 준비할 수 있었습니다.
모든 기본 단계 검증을 무사히 통과하고, 이제 애플 심사 제출만 남았습니다. 최초 앱 제출은 심사가 더욱 엄격해서 거절당하는 경우가 많다고 들었기에 제출 버튼을 클릭하기 전 기대보다는 걱정이 앞섰습니다. 그러나 이 앱은 개인정보 수집도 없고 매우 심플한 구조라서 그런지, 심사를 제출한 날 바로 통과되는 예상치 못한 결과를 받아들고 놀라움과 기쁨이 동시에 밀려왔습니다.
그렇게 목표했던 일정에 맞춰서 앱 스토어에 첫 번째 앱을 성공적으로 출시 할 수 있었네요. 🚀 🎉 🥳
More Than Just an App
앱스토어에 앱을 출시하기 위해서는 개인정보 처리방침을 필수로 웹에서 제공해야 합니다. GitHub 리포지토리의 README.md
를 활용해도 괜찮다고는 하지만, 모든 것이 온전한 프로덕트로 완성되었으면 해서 브랜드도 함께 런칭해보면 좋을 것 같았습니다.
브랜드명 작명은 예상보다 훨씬 어려웠습니다. 어지간한 이름은 이미 사용 중이었고, 우리 옹이와 몽이의 지분을 반영해 고양이와 연관된 네이밍을 하고 싶었습니다. 정말 많은 후보를 고민한 끝에 몇 가지는 실제 도메인까지 구매해보며 느낌을 살폈고, 최종적으로 CatBrains로 결정하게 되었습니다.
어느 날, 여느 때처럼 쓰다듬어 달라고 앞에 앉아 있는 몽이의 동그란 뒤통수를 바라보다가 문득 ‘JetBrains’의 ‘Brains’가 떠올랐습니다. 거기에 ‘Jet’ 대신 ‘Cat’을 붙이니 익숙하면서도 귀엽고 친근한 발음이 완성되었습니다. JetBrains가 IDE 분야에서 최상위인 것처럼, 이 브랜드도 그만큼의 가치가 있기를 바라는 마음이 담겼습니다. ☺️ 또한 글자들의 동글동글한 균형감이 매우 마음에 들었습니다.
브랜드 사이트는 그동안 블로그를 구현하며 갈고 닦은 React와 Next.js를 적극 활용했습니다. 이번에는 더 정돈된 코드와 향상된 반응성, 애니메이션 효과, 그리고 시스템 테마에 연동되어 자동으로 전환되는 다크/라이트 테마 전환 기능까지 완성할 수 있었습니다. 결과적으로 블로그보다 훨씬 더 완성도 높은 사이트가 만들어졌습니다. 이 참에 블로그도 개편을… 🫨
Final Touch with WeatherKit
앱을 정식 출시한 후에도 머릿속에 남아 있던 마지막 한 조각이 있었는데, 바로 날씨 예보 연동이었습니다. 단순한 시계를 넘어, 시간과 함께 날씨까지 한눈에 볼 수 있다면 더 유용한 앱이 될 것 같았습니다. 그렇게 연휴 기간 동안 다시 Xcode를 열어 WeatherKit을 연동하고, 날씨 모듈을 추가했습니다. Xcode와 Apple Developer의 설정에서 버튼 몇 번만 클릭하면 자동으로 연동되는 부분이 많아서 신기했습니다. 😲
날씨 정보를 추가하면서 자연스럽게 시계 화면과 조화를 이루는 디자인을 고민하게 되었습니다. 날씨 정보가 단순한 텍스트로 표시되는 것보다는, 직관적이고 깔끔한 아이콘으로 표현되었으면 좋겠다는 생각이 들었습니다. ⛅ 그렇다고 이미지 소스를 구매하기엔 부담스러워서, 결국 스케치 앱을 활용해 날씨 아이콘을 직접 제작하게 되었습니다. 애플 날씨 앱을 참고하며 구름, 해, 비 같은 단순한 형태의 아이콘들이었지만, 이 작은 작업들이 쌓이며 더 세련되고 완성도 높은 앱에 한 걸음 더 다가가는 느낌이었습니다.
그렇게 최종적으로 아래와 같이 구현할 수 있었습니다. 위치 기반 또는 일정 시간 간격으로 날씨 데이터를 갱신하도록 하여, 사용자가 언제나 최신의 날씨 정보를 자연스럽게 확인할 수 있도록 하였습니다. 🔄
하지만 날씨 데이터는 유료로 제공되는 구조였습니다. 괜찮은 날씨 앱들이 대부분 구독 형태인 이유도 그제야 이해되었습니다. 이로 인해 개인적인 용도로만 활용해야 했고, 무료 앱에 포함하여 정식 배포를 하지 못한다는 사실이 많이 아쉬웠습니다.
Where Ideas Lead
하나의 아이디어가 형태를 갖추기까지 기획, 디자인, 브랜딩을 더하며 완성된 여정이었습니다. 주로 시스템의 근간을 설계하고 구축하는 일을 해왔지만, 이번 경험을 통해 단순한 기능 구현을 넘어 사용자의 경험과 감성을 고려한 완전한 프로덕트를 만들어가는 과정의 깊이를 느낄 수 있었습니다.
기획 단계에서는 앱의 방향성과 기능을 정의하고, 디자인에서는 직관적이면서도 미학적인 요소를 고민했으며, 브랜딩을 통해 제품의 정체성과 가치를 명확히 전달하고자 했습니다. 이러한 모든 과정을 거치며 개발의 경계를 넘어 제품 기획, 디자인, 브랜딩까지 아우르는 시야가 넓어졌음을 실감할 수 있었습니다.
새로운 도전을 통해 배움과 성장을 이어갈 수 있었습니다. 이제, 다음은 무엇일까요? 😁
- Apple Developer
- iOS