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] 깔끔해 보이죠? 그런데 빌드하면 컴파일 에러가 나요. ...

2026년 4월 26일 · 2 분 · Young

App Store 리젝 4번 먹고 배운 것들 — 인디 개발자 심사 통과 가이드

앱 4개를 연달아 출시하면서 4번 리젝을 먹었어요. 코드가 잘못된 경우도 있었고 메타데이터 설정 실수도 있었는데요. 한 번 정리해두면 다른 분들은 같은 실수를 안 할 수 있을 것 같아서 공유합니다. 1. IAP 상품을 등록했는데 바이너리에 없다 앱: Renio (구독 관리) 가이드라인: 2.1(b) - App Completeness App Store Connect에 구독 상품(Monthly, Yearly)을 등록해놓고, 앱 바이너리에는 StoreKit 구현이 안 되어 있었어요. 상품만 만들고 코드를 아직 안 넣은 채로 제출한 거죠. ...

2026년 4월 21일 · 4 분 · Young

iOS 음악 앱에서 다른 앱이 오디오를 빼앗아갈 때 대처하는 법

뭘 하려고 했냐면 Subsonic 기반 음악 스트리밍 앱을 만들고 있었는데요. AVPlayer로 백그라운드 재생까지 잘 되고 있었거든요. 그런데 테스트하다가 이상한 걸 발견했어요. 노래 재생하고 앱을 백그라운드로 보냄 YouTube 열어서 영상 재생 (노래 멈춤 — 여기까진 정상) YouTube 영상 닫음 앱에 돌아오면 일시정지 버튼이 보이는데 소리가 안 남 버튼을 누르면 재생이 시작되긴 하는데, 한 번 더 눌러야 하는 거예요. UI는 “재생 중"인데 실제론 멈춰있는 상태. 원인 AVPlayer 기반 앱은 다른 앱이 오디오 세션을 가져가면 시스템이 자동으로 AVPlayer를 pause시켜요. 문제는 이 사실을 앱에 알려주지 않는다는 거예요. 정확히는, 알려주긴 하는데 직접 들어야 해요. ...

2026년 4월 21일 · 2 분 · Young

HabitTruth - 1인 개발자를 위한 사이드프로젝트 아이디어

문제점 (고통지수: 8/10) “내일부터 운동해야지”, “오늘은 꼭 일찍 자야지” - 매일 이런 약속을 하고 매일 어기고 있진 않으신가요? 기존 습관 추적 앱들의 문제점: 단순 체크리스트: 체크만 하고 끝, 진정한 책임감 부재 자기 기만 허용: 실제로 안 했어도 체크할 수 있음 동기부여 부족: 스트릭이 끊겨도 아무 제재 없음 일회성 실패에 취약: 한 번 실패하면 “이미 망했으니까” 심리 Reddit r/SideProject에서 발견한 한 개발자는 “I built a iOS app for myself because I kept lying to myself"라며 자신만의 책임감 앱을 만들었습니다. ...

2026년 1월 27일 · 2 분 · Young

iOS Postgres Monitoring - 모바일에서 PostgreSQL을 모니터링하는 앱 스타트업 아이디어

문제 (Problem) DBA와 DevOps 엔지니어들은 언제 어디서나 데이터베이스 상태를 확인해야 합니다: 온콜 중 급한 알림이 왔을 때 회의 중 빠르게 쿼리 성능 확인 외출 중 배포 후 DB 상태 모니터링 주말에 집에서 간단한 쿼리 실행 기존 솔루션들은 대부분 데스크톱/웹 중심이며, 모바일 전용 PostgreSQL 모니터링 앱은 매우 희소합니다. 시장 (Market) 항목 내용 타겟 시장 글로벌 (GL) 세그먼트 Database Monitoring, Mobile DevOps 주요 타겟 DBA, DevOps, 백엔드 개발자 TAM 니치 시장이나 충성 사용자 다수 PostgreSQL은 가장 인기 있는 오픈소스 데이터베이스로, AWS RDS, Aurora 등에서 널리 사용됩니다. ...

2026년 1월 22일 · 2 분 · Young

IOS 벨소리 만들기 (Garageband 사용)

아이폰을 사용하다 보면 가끔 벨소리를 바꾸고 싶은 경우가 생긴다. 그럴 때 mp3 파일만 있다면 나만의 벨소리를 만들 수 있다 물론 첨해보면 조금 복잡해 보일 수 있지만, 그리 어렵지 않으니 차근차근 따라해보자 준비물 아이폰 벨소리로 만들기 원하는 mp3파일 Garageband [옵션] Youtube Download bot 순서 준비된 mp3 파일을 아이폰에 다운로드 받는다 아이폰에 다운로드 하는 방법은 많은데 가장 쉬운 방법은 브라우져를 사용하는 방법 다른 방법으로는 Google Drive에 mp3 파일을 넣어놓고 다운로드 받는 방법이 있다 다운로드가 완료되면 파일앱에서 경로를 확인해두자 GarageBand를 연다 아래 이미지에서 더하기 버튼을 누른다 키보드를 선택한다 아래 그림처럼 키보드 그림이 나오면 좌측 상단의 아이콘을 터치한다 그러면 아래와 같은 페이지가 생성이 되는데, 이 페이지에서 우측 상단 + (1번) 버튼을 누른다 아래 그림 처럼 8마디라고 써진 부분을 터치 후 자동 옵션을 켜준다 아래 그림에서 스트링 모양의 2번 버튼을 터치한다 상단에 파일 탭(1번)을 선택하면 왼쪽 하단에 파일 앱에서 항목 탐색 (2번)이라는 버튼이 보인다 처음 과정에서 파일앱에서 mp3를 다운로드 받았던 위치로 이동하여 mp3파일을 추가한다 아래 그림과 같이 추가되면, 해당 mp3 파일을 꾹 눌러서 살짝 이동해보자 그러면 아래와 같이 마이크 모양의 줄이 하나 추가된다 두 손가락을 사용하여 줌아웃시켜서 노래의 양 끝을 볼 수 있도록 조정한다 아래 그림 처럼 양 끝을 클릭하여 내가 원하는 노래 위치를 선택한다 (최대 30초 가능) 조정된 블럭을 시간 제일 앞으로 이동 시킨다. 아래 그림 참고 좌측 상단에 역 삼각형 버튼을 누르면 아래와 같은 메뉴가 나오는데 거기서 나의 노래 메뉴를 선택한다 아래와 같이 나의 노래항목이 보이면, 해당 항목을 꾹 눌러서 메뉴가 뜨면, 공유메뉴를 선택한다 아래 그림처럼 성공이라고 뜰 때까지 기다리자 사운드를 다음으로 사용을 선택하면 해당 벨소리를 바로 사용할 수 있고 작업을 더 하고 싶으면 확인을 눌러 원하는 작업을 계속 하면된다 위에서 만들어진 벨소리는 설정 -> 사운드 및 햅틱 메뉴에서 확인할 수 있다 마치면서 위 과정이 그리 쉽지는 않지만, 아이폰으로만 할 수 있다는 점에서 장점이 크다. 예전에는 맥북이나 다른 컴퓨터를 켜야하고, 파일 옮기는 과정부터 너무 어려웠다. 이제는 화장실에서 큰 일(?)보면서도 벨소리를 만들 수 있다.

2023년 9월 2일 · 2 분 · Young

CUPS - 일반 프린터를 AirPrint 프린터로 만들기

한 줄 요약 CUPS를 사용하면 일반 프린터를 iOS AirPrint를 지원하는 프린터로 변신시킬 수 있다. 왜 CUPS인가? 문제: AirPrint 미지원 프린터 아이폰에서 직접 인쇄하려면 AirPrint를 지원하는 프린터가 필요하다. 하지만… 상황 문제점 오래된 프린터 AirPrint 미지원 저가형 프린터 AirPrint 미지원이 대부분 프린터 교체 비용 부담 CUPS의 해결책 CUPS는 Apple이 만든 오픈소스 프린터 서버다: AirPrint 브릿지: 일반 프린터를 AirPrint로 공유 네트워크 프린터화: USB 프린터도 네트워크로 공유 크로스 플랫폼: Windows, Mac, Linux 모두 지원 CUPS의 장점 1. Apple 공식 프로젝트 Apple이 직접 개발/유지보수 macOS에 기본 탑재된 검증된 기술 안정적인 AirPrint 지원 2. 다양한 프린터 지원 연결 방식 지원 USB ⭕ 네트워크 (IP) ⭕ WiFi ⭕ 병렬 포트 ⭕ 3. 무료 & 오픈소스 별도 소프트웨어 구매 불필요 Docker로 간편 설치 커뮤니티 드라이버 풍부 준비물 프린터: USB 또는 네트워크로 연결된 프린터 Linux PC/서버: Docker가 설치된 PC (NAS, 미니PC, 라즈베리파이 등) iOS 기기: iPhone, iPad 등 Docker Compose로 설치하기 폴더 생성 mkdir -p cups/{config,services} cd cups docker-compose.yml services: cups: image: chuckcharlie/cups-avahi-airprint:latest container_name: cups restart: unless-stopped network_mode: host volumes: - ./config:/config - ./services:/services environment: - CUPSADMIN=admin # ⚠️ 변경하세요 - CUPSPASSWORD=password # ⚠️ 변경하세요 network_mode: host는 Avahi(Bonjour)가 네트워크에서 프린터를 광고하기 위해 필요합니다. ...

2021년 5월 13일 · 3 분 · Young