개발하면서 날아가는 기억을 붙잡기 위한 블로그
1인 개발자 뉴스 #41 - 2026년 4월 4주차
이번 주 1인 개발자를 위한 기술 뉴스 2선 — Grafana의 코딩 에이전트 관찰 CLI, Google Room 3.0의 멀티플랫폼 전환
SwiftData @Query 실전 함정 두 가지 — enum #Predicate와 빈 목록의 modelContext
문제 상황 문서 스캔 앱을 만들면서 Inbox/Archive 목록을 구현하고 있었는데요. SwiftData @Query로 문서 상태별 필터링을 하려던 순간, 예상치 못한 컴파일 에러 두 개를 연달아 만났습니다. 함정 1: #Predicate에서 enum 비교가 안 된다 처음 시도한 코드 자연스럽게 이렇게 작성했거든요. @Model class Document { var status: DocumentStatus // enum 저장 프로퍼티 // ... } enum DocumentStatus: String, Codable { case inbox, archived } 그리고 @Query에서 필터링: @Query( filter: #Predicate<Document> { $0.status == .inbox }, sort: \Document.createdAt, order: .reverse ) private var documents: [Document] 깔끔해 보이죠? 그런데 빌드하면 컴파일 에러가 나요. ...
SwiftData 모델명 Tag가 빌드를 깨뜨리는 이유 (+ Xcode 16 .gitkeep 함정)
뭘 하려고 했냐면 문서 스캔 앱을 새로 시작했는데요. SwiftData로 Document와 Tag 모델을 만들고, 테스트를 먼저 작성하는 TDD로 진행하고 있었어요. 모델 코드는 심플했거든요: @Model class Tag { var name: String var color: String @Relationship(inverse: \Document.tags) var documents: [Document] } 여기까지는 문제없었어요. 빌드도 잘 되고. 첫 번째 삽질: Tag가 내 Tag가 아닌데요 테스트에서 FetchDescriptor를 쓰는 순간 터졌어요: let fetched = try context.fetch(FetchDescriptor<Tag>()) error: 'Tag' is ambiguous for type lookup in this context 처음엔 뭔 소린가 했는데요. SwiftUI에 이미 Tag라는 타입이 있더라고요. TabView나 Picker에서 선택 항목을 식별할 때 쓰는 그 Tag요. ...
1인 개발자 뉴스 #40 - 2026년 4월 4주차
이번 주 1인 개발자를 위한 기술 뉴스 3선
CodeFlash - 개발자용 코드 패턴 반복 학습 CLI 스타트업 아이디어
문제 (Problem) 개발자가 새로운 프레임워크나 언어를 학습할 때 효율적인 반복 학습 방법이 없습니다: React hooks, Go concurrency, Rust ownership 등 개념을 한 번 읽고 금방 잊음 공식 문서를 반복해서 찾아보는 데 매일 시간 소모 Anki 같은 SRS(Spaced Repetition System)는 카드를 직접 만들어야 해서 진입장벽 높음 Stack Overflow 답변을 북마크해도 다시 안 봄 “이 API가 뭐였지?” 매일 반복되는 마이크로 비효율 Pain Point 강도: 7/10 - 은근하지만 매일 누적되는 학습 비효율 시장 (Market) 1차 시장: 글로벌 소프트웨어 개발자 세그먼트: 새로운 기술 스택을 학습하거나 팀에 온보딩하는 개발자 TAM: 언어 학습 앱 시장 ~$7.4B + 개발자 도구 시장 ~$6.4B 교차 영역 핵심 사실: AnkiMobile $24.99 일회성 구매로 연 $300-500K 수익 추정. 개발자 특화 SRS는 시장에 없음 솔루션 (Solution) CodeFlash - 프로그래밍 패턴과 API를 코드 스니펫 기반으로 반복 학습하는 개발자용 SRS CLI ...
SelfHealTest Lite - Playwright 자동복구 플러그인 스타트업 아이디어
문제 (Problem) UI 자동화 테스트는 프론트엔드가 변경될 때마다 셀렉터가 깨지는 문제를 안고 있습니다: 디자인 리팩토링 후 data-testid, CSS 클래스, XPath가 일괄 변경 CI 파이프라인이 셀렉터 불일치로 빈번하게 실패 수동으로 깨진 셀렉터를 찾아 수정하는 데 매주 수 시간 소요 Playwright 사용자도 예외가 아님 — locator가 깨지면 수동 업데이트 필요 Pain Point 강도: 9/10 - 테스트 유지보수가 테스트 작성보다 더 고통스러움 시장 (Market) 1차 시장: 글로벌 QA 엔지니어, 풀스택 개발자 세그먼트: Playwright로 E2E 테스트를 운영하는 1-50인 개발팀 TAM: 테스트 자동화 시장 ~$25B (2025), CAGR 15-17% 핵심 사실: 기존 자동복구 도구(Healenium, Katalon, Testim)는 모두 엔터프라이즈 타겟. $50/mo 미만의 인디 개발자용 자동복구 도구는 없음 솔루션 (Solution) SelfHealTest Lite - Playwright 생태계 전용 자동복구 npm 플러그인 ...
ServerShell - 셀프호스팅 원클릭 배포 CLI 스타트업 아이디어
문제 (Problem) 셀프호스팅에 관심 있는 개발자와 파워유저가 서비스를 실제로 배포하려면 여러 장벽에 부딪힙니다: Nextcloud, Gitea, Vaultwarden 등 각 서비스마다 docker-compose.yml 작성 필요 리버스 프록시(Nginx/Traefik/Caddy) 설정 + SSL 인증서 발급이 별도 DNS 레코드 설정, 방화벽 규칙, 볼륨 관리를 수동으로 처리 Coolify나 CapRover 같은 PaaS 도구는 GUI 중심이고 자체 리소스 소비가 큼 결국 “도커 설치까지는 했는데 그 다음이 막막"한 상태에서 포기 Pain Point 강도: 9/10 - 셀프호스팅 진입장벽의 핵심 원인 시장 (Market) 1차 시장: 글로벌 셀프호스팅 사용자, 홈랩 매니아, 프라이버시 중시 개발자 세그먼트: VPS를 보유하고 있거나 구매 의향이 있는 기술 사용자 TAM: IDE-as-a-Service ~$3.7B (관련 시장), 셀프호스팅 세그먼트 급성장 중 핵심 사실: Gitpod Classic 2025년 10월 종료 + SaaS 피로감 + 프라이버시 우려로 셀프호스팅 수요 폭증. r/selfhosted 구독자 100만+ 돌파 솔루션 (Solution) ServerShell - SSH 한 줄로 셀프호스팅 앱을 VPS에 원클릭 배포하는 경량 CLI 도구 ...
SpecLint Mono - Docker Compose 전용 인라인 린터 스타트업 아이디어
문제 (Problem) Docker Compose 파일은 YAML 기반이라 오타나 구조 오류를 IDE에서 즉시 잡아주지 않습니다: 포트 충돌(같은 호스트 포트를 두 서비스가 사용)을 배포 시점까지 모름 볼륨 경로 오류, 존재하지 않는 이미지 태그 참조 deprecated된 옵션(version 필드, links 등) 사용 경고 없음 서비스 의존성 순환(depends_on 사이클) 감지 불가 환경변수 참조 오류(${VAR} 미정의)가 런타임에서야 발견 Pain Point 강도: 8/10 - Docker Compose를 쓰는 개발자가 매일 겪는 설정 디버깅 시장 (Market) 1차 시장: 글로벌 풀스택 개발자, DevOps 엔지니어 세그먼트: Docker Compose로 로컬 개발환경/스테이징을 구성하는 팀 TAM: 개발자 도구 시장 ~$6.4B (2025), CAGR 16% 핵심 사실: VSCode 30M+ 활성 사용자 중 Docker 확장 설치 수 1,000만+. Docker Compose 전용 deep linting 도구는 존재하지 않음 솔루션 (Solution) SpecLint Mono - Docker Compose 파일에 특화된 VSCode/Cursor 인라인 린터 ...
App Store 리젝 4번 먹고 배운 것들 — 인디 개발자 심사 통과 가이드
앱 4개를 연달아 출시하면서 4번 리젝을 먹었어요. 코드가 잘못된 경우도 있었고 메타데이터 설정 실수도 있었는데요. 한 번 정리해두면 다른 분들은 같은 실수를 안 할 수 있을 것 같아서 공유합니다. 1. IAP 상품을 등록했는데 바이너리에 없다 앱: Renio (구독 관리) 가이드라인: 2.1(b) - App Completeness App Store Connect에 구독 상품(Monthly, Yearly)을 등록해놓고, 앱 바이너리에는 StoreKit 구현이 안 되어 있었어요. 상품만 만들고 코드를 아직 안 넣은 채로 제출한 거죠. ...
iOS 음악 앱에서 다른 앱이 오디오를 빼앗아갈 때 대처하는 법
뭘 하려고 했냐면 Subsonic 기반 음악 스트리밍 앱을 만들고 있었는데요. AVPlayer로 백그라운드 재생까지 잘 되고 있었거든요. 그런데 테스트하다가 이상한 걸 발견했어요. 노래 재생하고 앱을 백그라운드로 보냄 YouTube 열어서 영상 재생 (노래 멈춤 — 여기까진 정상) YouTube 영상 닫음 앱에 돌아오면 일시정지 버튼이 보이는데 소리가 안 남 버튼을 누르면 재생이 시작되긴 하는데, 한 번 더 눌러야 하는 거예요. UI는 “재생 중"인데 실제론 멈춰있는 상태. 원인 AVPlayer 기반 앱은 다른 앱이 오디오 세션을 가져가면 시스템이 자동으로 AVPlayer를 pause시켜요. 문제는 이 사실을 앱에 알려주지 않는다는 거예요. 정확히는, 알려주긴 하는데 직접 들어야 해요. ...