안녕하세요. 김소월입니다.
2025년 6월부터 9월까지 약 4개월 동안 ESTsoft KDT 부트캠프 iOS 2기를 수료하며, 그 소회를 간단하게 정리하고자 합니다.
처음 KDT 과정 소식을 접하고 많은 고민이 있었습니다. 초심자를 대상으로 하는 과정이라는 점에서 우려가 있었고, 무엇보다 국비 출신 개발자라는 꼬리표가 달라붙을까 두려웠던 것도 사실입니다.
하지만 결론적으로 말씀드리자면, 매우 만족스럽고 유익한 시간이었습니다. 그동안 영어 원서와 Udemy 강의로만 UIKit과 SwiftUI를 독학했는데, 이번 과정을 통해 내가 올바른 길을 걷고 있는지, 놓친 부분은 없는지 확실하게 점검할 수 있었습니다. 또한 빠른 속도로 핵심 개념을 익히고, Photos, AVFoundation, ActivityKit처럼 독학하기 어려운 영역도 체계적으로 학습할 수 있었습니다.
강사님뿐만 아니라 두 분의 멘토님께서도 상주해 주셔서 프로젝트 중 막히는 부분이나 의문이 생길 때마다 도움을 받을 수 있었습니다. 멘토링을 통해 수업·프로젝트 전반에 대한 개선점에 대한 피드백을 받았고, 취업 준비 과정이나 방향성에 대해서도 조언을 얻을 수 있었습니다. 덕분에 강사님의 개발 철학까지 엿볼 수 있는 값진 경험이었습니다.
누군가는 국비 과정이 대단치 않다고 생각할 수 있습니다. 그러나 수업에 임하는 태도에 따라 그 질은 충분히 달라질 수 있다고 느꼈습니다. 지난 4개월간 수업·과제·사이드 프로젝트 등을 통해 쌓아온 여정을 간략히 정리해 보겠습니다.
수업
수업은 매일 오전 9시부터 오후 6시까지 진행되었습니다. 학교 수업처럼 50분 수업 후 10분 휴식을 반복하는 방식이었고, 마지막 두 시간(오후 4시~6시)은 개인 자습 시간이었습니다. 이 시간에는 주로 TIL(Today I Learned)을 작성하며 하루 동안 배운 내용을 정리했습니다.

사실 처음에는 “하루 6시간 이상 수업을 소화하는 것이 가능할까?”, “진도만 빠르게 나가고 끝나는 것은 아닐까?” 하는 우려가 있었습니다. 그러나 매일 자습 시간에 TIL을 기록하며 학습 내용을 복기할 수 있었고, 이를 통해 배운 내용을 정리하며 하루를 마무리할 수 있었습니다.
커리큘럼은 크게 세 단위로 나누어졌습니다.
- 1단위: SwiftUI 중심의 학습
- 2단위: UIKit 중심의 학습
- 3단위: Photos, AVFoundation, ActivityKit, UserNotifications 등 보다 심화된 기술 학습
1·2단위까지는 비교적 수월하게 따라갈 수 있었지만, 3단위에서는 처음 접하는 개념이 많아 쉽지 않았습니다. 특히 다루는 범위도 넓어 학습량이 크게 늘어난 시기였습니다. 아래는 3단위에서 학습했던 내용 중 일부를 정리한 표입니다.
구분 | 내용 | 비고 |
---|---|---|
Authentication Services | ASAuthorizationController , ASAuthorizationResult | Password AutoFill은 생략 |
AVFoundation | AVCaptureDevice , AVCaptureSession , AVCaptureVideoPreviewLayer , AVFAudio | - |
CoreData | NSManagedObjectContext , NSPersistentStoreCoordinator , NSFetchedResultsController | SwiftData도 동일하게 학습 |
CoreLocation | CoreLocationManager | - |
GCD | DispatchQueue , DispatchGroup | - |
Gesture | UIPanGestureRecognizer , UIPinchGestureRecognizer , UILongPressGestureRecognizer 등 | - |
Integrating SwiftUI | UIHostingViewController , UIViewControllerRepresentable , UIViewRepresentable | - |
MapKit | MKMapView , MKAnnotation , MKClusterAnnotation | - |
Photos | PHPickerViewController , PHImageManager , PHAssetChangeRequest , PHLivePhotoView | - |
Swift Concurrency | async/await , TaskGroup , Continuation , AsyncSequence/AsyncStream | Sendable은 생략 |
UNUserNotifications | UNUserNotificationCenter , UNNotificationCategory , Notification Service App Extension , Notification Content App Extension | - |
UnitTest | XCTest | SwiftTesting은 생략 |
URLSession | URLSession , URLSessionDelegate | - |
UTType | Transferable | - |
사실 이렇게 많은 내용을 학습했지만, 당장 모두 기억하고 있지는 않습니다. 앞으로 취업 준비를 하면서 필요한 자료를 다시 찾아보고, 예제 프로젝트를 작성해가며 하나씩 체득해 나갈 계획입니다.
과제
과제는 총 5차례 주어졌으며, 각 단위 기간마다 배운 내용을 토대로 진행되었습니다. 전반적으로 난이도는 평이했지만, 에셋을 직접 찾아 적용해야 하는 등 비개발적인 부분에서 어려움이 있었고, 과제와 프로젝트 일정이 겹치거나 간격이 촉박해 부담이 있었습니다. 그러나 이러한 과정을 통해 UI를 직접 구현하는 방법에 한층 익숙해질 수 있었습니다.
저는 모든 과제를 단순한 과제가 아닌 작은 프로젝트라고 생각하며 임했습니다. 하루 만에 끝낼 수 있는 작업도 일부러 더 돌아가며 다양한 시도를 했습니다. 예를 들어, 아이디·비밀번호 입력 조건을 구현하는 요구사항에서는 단순 조건문 대신 정규표현식을 새로 학습해 적용해 보기도 했습니다. 이러한 시도 덕분에 새로운 개념을 빠르게 체득하고 적용하는 경험을 할 수 있었습니다.
또한 수업 중 강사님께서 문제 해결 방향에 대한 힌트를 자주 주셨는데, 정답을 바로 제시하기보다 교묘하게 핵심만 짚어주시는 방식이어서 스스로 고민하며 해결할 수 있었고, 그 과정에서 많은 인사이트를 얻었습니다.
과제는 SwiftUI 기반 1개, UIKit 기반 4개로 진행되었습니다. 아래는 모두 완성된 과제의 결과물 이미지입니다.
여행 예약 앱 (SwiftUI)
이미지 | 이미지 | 이미지 |
---|---|---|
![]() | ![]() | ![]() |
로그인 화면 (UIKit)
이미지 | 이미지 | 이미지 |
---|---|---|
![]() | ![]() | ![]() |
뉴스 탐색 앱 (UIKit)
이미지 | 이미지 | 이미지 |
---|---|---|
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
단순히 과제를 수행하는 수준을 넘어, 필수 요구사항에 없던 홈 화면, 검색, 북마크 저장·불러오기 기능까지 직접 구현하며 프로젝트의 완성도를 높였습니다. 또한 스티키 헤더(Sticky Header), 테이블 뷰 셀 내부에 컬렉션 뷰를 삽입하는 등 새로운 시도를 통해 다양한 UI/UX 패턴을 실험했습니다.
이 과정에서 가장 어려웠던 점은 테이블 뷰 내부에 스크롤 뷰를 중첩 배치하는 부분이었습니다. 안쪽 스크롤 뷰의 콘텐츠 길이에 따라 frame 크기를 동적으로 조정해야 했으나 적절한 해법을 찾지 못해 고정 높이로 처리할 수밖에 없었습니다. 이는 UICollectionView의 Compositional Layout을 활용하면 쉽게 해결할 수 있는 문제였지만, 테이블 뷰로도 직접 도전해보고자 했습니다. 결과적으로 아쉬움이 남았지만, 이러한 시도를 통해 구조적 한계를 이해하고 더 나은 접근 방식을 고민하게 된 값진 경험이 되었습니다.
모바일 뱅킹 앱 (UIKit)
이미지 | 이미지 | 이미지 |
---|---|---|
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
앱스토어 투데이 화면 (UIKit)
이미지 | 이미지 | 이미지 |
---|---|---|
![]() | ![]() | ![]() |
프로젝트
세 차례의 팀 프로젝트 모두에서 팀장을 맡았습니다. 일부는 자진해서 맡았지만, 계속 팀장을 하는 것이 과연 바람직한지에 대한 고민도 있었습니다. 다른 사람의 팀 운영 방식도 배워보는 것도 중요하다고 생각했습니다. 기획을 어떻게 주도하는지, 문제가 생겼을 때 어떤 방식으로 해결하는지 등 다양한 케이스를 경험해 보는 것도 중요한 배움의 과정이라고 생각했기 때문입니다.
팀장을 맡으며 제가 지킨 원칙 중 하나는 팀원의 활동에 과도하게 간섭하지 않는다는 것이었습니다. 일정에 차질이 생길 위험이 있을 때는 논의 후 조율했지만, 기본적으로는 각자의 자유와 자율성을 존중했습니다. 긍정적으로 보면 믿고 맡긴다일 수 있지만, 부정적으로는 방치한다라고도 볼 수 있습니다. 특히 사이드 프로젝트에서는 수익 창출이나 결과물의 완벽함보다는 다양한 기술과 경험을 접해보는 것이 더 중요하다고 보았습니다. 따라서 코드 작성이나 기획 과정에서 다소 규칙에서 벗어나더라도, 가능하다면 제지하지 않고 자유롭게 시도할 수 있도록 했습니다. 이런 접근은 장점이 될 수도, 단점이 될 수도 있음을 체감했습니다.
마지막으로, 팀장으로서 가장 큰 어려움은 초기 기획 단계였습니다. 기획을 전문적으로 배운 적이 없었기 때문에 회의가 매끄럽지 못했고, 완벽하게 요구사항을 정의했다고 생각했지만 실제 진행 과정에서 수정이 반복되는 경우가 많았습니다. 물론 실무에서도 기획 변경은 흔한 일이지만, 단기간에 결과물을 완성해야 하는 KDT 프로젝트 특성상 이는 부담이 되는 요소였습니다.
1차
구분 | 내용 |
---|---|
일정 | 05.12(월) ~ 05.16(금) |
주제 | SwiftUI, UserDefaults: 회고 시스템 개발 |
기술 스택 | SwiftUI, SwiftData |
이미지 | 이미지 | 이미지 | 이미지 |
---|---|---|---|
![]() | ![]() | ![]() | ![]() |
일주일이라는 짧은 기간 동안 SwiftData 기반 다이어리 앱을 개발했습니다. 처음 주제와 기한을 접했을 때는 현실적으로 가능할지 의문이 들었지만, 제한된 시간 안에서 팀원 모두가 최선을 다해준 덕분에 깔끔하게 완성할 수 있었습니다.
실질적인 개발 기간은 기획, QA, 발표 준비를 제외하면 약 3일뿐이었기에, 1일차에는 네비게이션 바·플로팅 시트 등 공용 코드 작성, 2~3일차에는 제가 맡은 다이어리 통계 화면 구현에 집중했습니다. 특히 2~3일차에는 새벽 4시까지 개발을 이어가며 기능을 완성하는 등 시간 압박 속에서도 무사히 프로젝트를 마무리했습니다.
비록 충분한 기획이나 UI·UX 디자인을 다듬을 여유는 없었지만, 각 팀원이 센스 있게 역할을 수행한 덕분에 예상보다 완성도 높은 결과물이 나올 수 있었습니다. 특히 발표 준비를 맡은 팀원은 마지막 날 밤새 발표 자료와 스크립트를 준비해, 지금껏 봐온 발표 중 가장 깔끔하고 완벽한 발표를 해주어 인상 깊었고, 고마웠습니다.
2차
구분 | 내용 |
---|---|
일정 | 06.05(목) ~ 06.19(목) |
주제 | AVFoundation·CoreAudio: 취향 햑습형 인터랙티브 플레이어 |
기술 스택 | UIKit, AVFoundation, CoreData |
이미지 | 이미지 | 이미지 | 이미지 |
---|---|---|---|
![]() | ![]() | ![]() | ![]() |
약 2주 동안 사용자에게 동영상을 제공하고, 검색 및 취향 기반 추천 기능을 구현하는 프로젝트를 진행했습니다. 처음에는 추천 알고리즘 설계 자체가 생소해 당황스러웠고, 안정적인 오픈 API를 찾는 것도 쉽지 않았습니다. 결국 Pixabay API를 사용했지만, 서버 불안정으로 인해 AVPlayerViewController에서 동영상이 제대로 재생되지 않는 문제가 잦아 기획 단계부터 난관이 많았습니다.
또한 프로젝트에서 처음 NSDiffableDataSource를 활용했는데, 해시값 충돌로 인한 크래시가 발생해 이틀 동안 원인 분석에 매달렸습니다. 도중에 UI 디자인과 로직을 크게 수정해야 하나 고민도 했지만, 끝내 문제를 해결하며 NSDiffableDataSource에 대한 이해를 깊게 다질 수 있었습니다.
매일 밤 정기적으로 모여 코드를 작성하면서 즐겁게 코딩 타임을 가질 수 있었습니다. 특히 한 팀원은 공용 코드 설계·UI 디자인뿐만 아니라 발표 자료와 README 디자인까지 맡아주셔서 프로젝트 전체의 완성도를 끌어올려 주었고, 또 다른 팀원은 기획에 없던 시청 기록을 진행 바(progress bar)로 표시하는 기능을 구현해 앱의 완성도를 한층 높였습니다. 각자 맡은 역할을 뛰어나게 수행해 준 덕분에 프로젝트를 안정적으로 마무리할 수 있었습니다.
3차
구분 | 내용 | 비고 |
---|---|---|
일정 | 07.28(월) ~ 09.01(월) | - |
주제 | AI Health - Alan AI의 데이터 분석 및 질병 예측 모델을 적용하여 다양한 대상별 건강 상태를 모니터링하고 맞춤형 케어를 제공하는 앱 개발 | - |
기술 스택 | UIKit, SwiftUI, CoreData, HealthKit, MVVM | - |
이미지 | 이미지 | 이미지 | 이미지 |
---|---|---|---|
![]() | ![]() | ![]() | ![]() |
약 한 달 동안 진행한 프로젝트로, 기존에는 노션으로만 아이디어를 수집하고 기획했지만 이번에는 팀원의 제안으로 FigJam을 활용해 기획을 진행했습니다. 초기에는 HealthKit의 수면 데이터를 기반으로 앱을 구현하려 했으나, iOS 18부터는 애플워치를 착용해야만 수면 데이터가 기록된다는 사실을 뒤늦게 파악해 기획을 변경해야 했습니다. 충분한 사전 조사가 이루어지지 못했던 점은 분명 아쉬운 부분이었습니다.
개발에서는 대시보드 화면 및 데이터 시각화에 집중했습니다.
UIBezierPath 기반 원형 프로그레스 바로 일일 걸음 목표 대비 진행률을 표시
UIStackView 기반 막대 차트로 최근 7일 간 걸음 수 시각화
그라디언트가 적용된 상태 프로그레스 바로 나이대별 보행 밸런스 지표를 시각적으로 표현
시각화 구현에 많은 시간을 쏟았지만, 보기 좋은 결과물을 만들어낼 수 있어 의미 있는 성과를 얻었습니다.
다만 협업 과정에서 어려움도 있었습니다. 회의가 길어지거나 논의가 요점에서 벗어나 흐려지는 경우가 있었고, 때로는 발언권을 양보하지 않아 의견 교환이 월활하게 이루어지지 않는 등 균형 잡힌 논의가 어려울 때도 있었습니다. 이전 회의에서 제외하기로 한 기능이 구현되면서 핵심 기능 개발에 차질이 생기기도 했습니다.
이 경험을 통해 “자율성”이 항상 긍정적으로만 작용하는 것은 아니라는 점을 깨달았습니다. 또한 저 역시 정확한 용어 대신 모호하게 설명하는 습관이 있어 의도가 충분히 전달되지 못하는 경우가 있었고, 이를 통해 명확한 의사소통의 중요성을 다시금 실감했습니다.
최종적으로 프로젝트 평가에서 기대만큼 좋은 결과를 받지 못했는데, 그 원인을 두 가지로 정리했습니다.
일정을 지나치게 보수적으로 설정하여 충분히 구현 가능한 기능도 깊이 있게 다루지 못함
주제와 요구사항에 매몰되어 폭넓고 창의적인 기획에 한계가 있었음
또한 Vision이나 CoreML 같은 AI 관련 기술을 적극적으로 활용하지 못한 점도 아쉬움으로 남았습니다. 하지만 이 경험을 통해 사전 조사·기획의 중요성, 팀 협업에서의 소통 문제, 그리고 도전적인 기획의 필요성을 배울 수 있었습니다.
iOS 및 WWDC 스터디
공식 활동과는 별개로, 몇몇 수강생들과 함께 WWDC 정리 스터디를 진행했습니다. 스터디는 매주 WWDC 세션이나 블로그 글을 바탕으로 각자 약 30분 동안 발표하는 형식으로 운영했습니다.
스터디 | 스터디 | |
---|---|---|
![]() | ![]() |
저는 매개변수 팩, Swift Testing, 불투명한 타입(some), Swift Macro와 같은 혼자 학습하기 어려운 고급 문법을 정리하여 발표했고, 다른 분들은 KeyPath나 단위 테스트 작성법을 공유해주셨습니다. 이를 통해 평소 미뤄왔던 문법을 깊이 있게 공부할 수 있었고, 서로 다른 인사이트를 나누며 학습의 폭을 넓힐 수 있었습니다.
온라인 강의 특성상 다른 수강생들과 교류할 기회가 많지 않았던 만큼, 이 스터디는 서로 의견을 교환하고 성장할 수 있는 소중한 경험이었습니다.