SwiftUI13 최종 조립 및 완성 : 메인 뷰(View)와 사용자 경험(UX) 향상 좋은 UX는 어떻게 사용자의 궁금증을 먼저 해결해주는가?시작하며 : 단순한 '조립'을 넘어 '경험'을 설계하다지난 포스팅 2025.09.03 - [app/metalens] - 생명을 불어넣는 작업 : 재사용 가능한 UI 컴포넌트(Components) 제작 에서 앱의 얼굴을 구성할 모든 UI 부품(Components)을 완성했다. EmptyStateView부터 ScoreCircleView, SummaryCardView 까지, 각자 하나의 책임만을 다하는 잘 만들어진 '레고 블록'들이다. 이제 남은 작업은 이 블록들을 PhotoInspectorView 라는 큰 판위에 조립하여 하나의 완성된 화면을 만드는 것이다. 하지만 이번 포스팅은 단순히 블록을 조립하는 방법을 설명하는 데 그치지 않는다. 한 걸음 더 .. 2025. 9. 4. 생명을 불어넣는 작업 : 재사용 가능한 UI 컴포넌트(Components) 제작 거대한 View를 잘게 쪼개는 것의 미학 시작하며 : 왜 View를 분리해야 하는가? 이전 포스팅까지의 여정으로 앱의 두뇌(ViewModel)와 심장(Service)을 모두 구현 했다. 로직과 UI의 지휘자 : 뷰모델(ViewModel)과 비동기 처리async/await와 @Published로 우아하게 상태를 관리하는 법시작하며 : 왜 '지휘자'가 필요한가? 이전 포스팅까지의 작업으로, 사진 데이터를 주면 분석 리포트를 뱉어내는 강력한 엔진(PhotoMetadataService)johjo.net 앱의 심장을 만들다 : 메타데이터 분석 서비스(Service) 구현ImageIO 프레임워크를 파헤쳐 사진의 비밀을 캐내다시작하며 : '실제 일'을 하는 녀석의 등장지난 포스팅에서 앱의 뼈대(Model)와 소통 규.. 2025. 9. 3. 로직과 UI의 지휘자 : 뷰모델(ViewModel)과 비동기 처리 async/await와 @Published로 우아하게 상태를 관리하는 법시작하며 : 왜 '지휘자'가 필요한가? 이전 포스팅까지의 작업으로, 사진 데이터를 주면 분석 리포트를 뱉어내는 강력한 엔진(PhotoMetadataService)을 만들었다. 이제 남은 것은 이 엔진을 UI와 연결하는 일이다. 하지만 여기서 많은 개발자들이 함정에 빠진다. View 코드 안에서 직접 서비스 로직을 호출하고, 상태를 관리하려는 시도를 하는 것이다. 이는 마치 레스토랑 홀 직원이 주방에 직접 들어가 요리하는 것과 같다. 결과는 엉망이 될 수밖에 없다. 그래서 ViewModel이라는 '지휘자' 혹은 '셰프'를 둔다. View(홀 직원)는 오직 ViewModel(셰프)에게 "손님이 사진을 골랐습니다"라고 주문만 전달한다. .. 2025. 9. 3. 데이터의 뼈대를 세우다: 모델(Model)과 프로토콜(Protocol) 정의 좋은 코드는 '무엇'을 담을지와 '어떻게' 소통할지를 먼저 정의한다. 시작하며 : '데이터'가 아닌 '모델'을 설계하는 이유이전 포스팅에서 프로젝트의 기반 공사를 마쳤다. 이제 실제 사진을 분석하고, 그 결과를 보여주는 코드를 작성해야 한다. 이때 가장 먼저 해야 할 일은 무엇일까? 바로 '데이터의 청사진'을 그리는 일이다. 이것을 '모델(Model) 설계' 라고 부르는데, 단순히 String, Int 같은 변수 뭉치가 아니라, 앱이 다루는 정보의 의미와 관게를 구조적으로 정의하는 과정이다. 예를 들어, '사진 분석 결과'는 무엇으로 구성되는가? '원본이 라는 증거'는 어떤 정보를 담아야 하는가? 이 청사진이 명확해야, 이후에 만들어질 모든 로직과 UI가 흔들림 없이 견고하게 세워질 수 있다. 이번 .. 2025. 9. 2. 집을 짓기 전 땅 다지기: 프로젝트 설정과 필수 유틸리티 좋은 앱은 잘 만든 AppError 와 Logger 에서 시작된다. 시작하며 : 왜 '기반 공사'가 중요한가?이전 포스팅에서 MetaLens 라는 앱의 청사진(기획과 아키텍처)을 그렸다.2025.09.02 - [app/metalens] - 메타렌즈 프로젝트 소개2025.09.02 - [app/metalens] - 바이브코딩을 위한 MetaLens 코딩 파트너 설정기 이제 본격적으로 코드로 집을 지을 차례다. 이제 몇번 프로젝트를 진행하다 보니 앱의 안정성과 확장성을 책임지기 위해서는 기초적인 설정들이 중요하다는 것을 깨달았다. 이번 포스팅에서는 기능 개발이라는 '인테리어'에 들어가기 전, 반드시 먼저 해야 할 '기반 공사'에 대해 다룬다. 구체적으로는 아래 3가지다. 글로벌 출시를 위한 완벽한 다국어 지.. 2025. 9. 2. 바이브필름 프로젝트 소개 앱 개발자들이 쉽게 손대지 않는 영역이 바로 "카메라" 부분인 것 같다. 일반적인 서비스들은 데이터베이스를 연동 한다던가, 자사의 백엔드 API를 연동하여 서비스를 하기 때문에 쉽게 경험하기도 어렵다. 월급을 받으면서 '카메라', '필름', '사진' 관련된 앱을 만든다는 것은 직장인 개발자에게는 꽤 생소한 일일수도 있을것 같다. 앱스토어를 검색해 카메라 관련 앱을 만든 회사들을 훑어보면 금방 알 수 있다. 고도화된 기능을 제공하는 앱이면 빅테크에서 만들었고, 대부분은 소규모 스타트업이나 1인 개발자가 만든 경우가 많다. 잘 만든 앱들은 전 세계적으로 큰 사랑을 받으며 수익화에도 성공하고 있는듯 보인다. 즉, 카메라 앱 개발 경험은 흔하지 않지만, 동시에 큰 기회가 숨어 있는 영역이기도 하다. 디지털 카메.. 2025. 8. 31. AI-Ready PRD(Project Requirements Document) 고도화 사실 KindVerb 프로젝트를 7월 부터 진행하고 있었고, 출시까지 거의 모든 코드를 완성한 상태였다. 앱스토어커넥트(https://appstoreconnect.apple.com/)에 앱을 출시하기 위한 정보를 입력하고, SandBox계정으로 인앱결제 테스트를 진행하다가 막히는 부분이 있어 수정이 필요한 상황인데 AI가 아닌, 내가 맥락을 잊어버려 수정할 수 없는 상태가 되었다. (덕분에 썸네일의 앱아이콘은 건졌다.) 자책감이 많이 들었다. 솔직히 이전 프로젝트 였던 SaveFood 프로젝트를 수행 했으면, 이정도 앱은 집중과 몰입만 따라준다면 일주일이면 만들수 있어서다. ChatGPT5로 업그레이드된 모델은 .zip파일로 말아주기만 해도 전체 프로젝트를 분석해 줬고, Gemini 2.5 Pro와의 바.. 2025. 8. 20. README와 .gitignore파일 생성 및 설정 Git으로 버전 관리를 할 때 반드시 마주하게 되는 두 파일이 있다. 바로 README.md 와 .gitignore 파일이다. 이 두 파일은 나중에 프로젝트가 커지거나 협업을 하게 되었을 때 정말 중요한 역할을 하게 된다. 로컬의 Finder 에서 파일들을 생성해도 되지만, 이번 포스팅에서는 GitHub를 이용하여 이 두 파일을 생성하고 Pull 하는 방식으로 진행 한다. README는 프로젝트의 얼굴이다GitHub에 프로젝트를 올렸을 때 처음 보이는 것이 바로 이 README.md 파일이다. 말 그대로 "이 프로젝트를 읽어주세요(READ ME)"라는 의미를 가지고 있고, 프로젝트에 대한 소개, 사용법, 설치법, 기여방법 등을 담는다.GitHub 원격저장소에서 Add a README 버튼을 누름으로써 생.. 2025. 6. 29. iOS 개발을 시작하려면 꼭 알아야 할 것들 나도 앱을 만들 수 있을까?나는 원래 앱 개발자가 아니었다. Swift도 몰랐고, Xcode는 실행해 보긴 했지만, 프로젝트를 완성해 본적이 없었다. 하지만 어느 날 문득, "내가 직접 쓰고 싶은 앱을 만들어볼 수는 없을까?" 라는 생각이 들었다. 마트에서 식재료를 사놓고는 소비기한(유통기한)이 지나서 버리는 일이 반복되면서 "언제까지 이렇게 살 거야?" 라는 반성이 들었고, 소비기한(유통기한) 관리앱을 만들기로 결심했다. 그게 지금 나의 첫 앱이 된 세이브푸드(SaveFood)의 시작이었다. 세이브푸드 iOS앱 드디어 출시지난 몇 달간의 치열한 개발 여정이 드디어 결실을 맺었다. 2025년 6월, 직접 기획하고 개발한 iOS앱 세이브푸드(SaveFood)가 애플의 심사를 통과하고 앱스토어에 정식 출시 .. 2025. 6. 27. 푸시 알림을 구현하며 겪은 설정 지옥 세이브푸드를 개발하면서 이 앱 기능 중 최고의 꽃은 푸시 알림(Push Notifications)이라고 생각했다. 사용자에게 보내지는 소중한 푸시 알림으로 냉장고 보관함에 다른 사용자를 초대하고, 유통기한이 얼마 남지 않았음을 알려야 하는 핵심 기능이라고 생각했기 때문이다. 푸시 알림을 구현하고 테스트해보려면 반드시 애플 개발자 프로그램(Apple Developer Program)에 가입되어야 한다. 개발자 프로그램 가입 후 웹과 엑스코드(Xcode)에서 간단한 설정만 하면 쉽게 구현할 수 있을 줄 알았다. 때문에 요구사항과 설계내역을 검토한 후 더 어려워 보이는 보관함의 사용자 초대부터 구현하며 인고의 시간을 보내고 있었다.인고의 시간이라고 표현한 이유는 무엇일까?바이브코딩으로 ChatGPT와 대화를 .. 2025. 6. 26. 이전 1 2 다음