본문으로 건너뛰기

Fatbobman’s Swift Weekly #160: 에이전트 시대의 디스크 관리와 Swift 개발 소식

Fatbobman's Swift Weekly #160

weekly.fatbobman.com

핵심 요약

  1. 에이전트가 생성한 데이터와 정리되지 않은 임시 디렉터리로 디스크 공간이 빠르게 줄어들 수 있어 실행 환경의 경계와 자원 정리 절차가 필요하다.
  2. 이번 호는 Optional, SwiftUI 성능 분석, iOS 27 Now Playing, Text 보간, Factory의 Scene 컨테이너 등 Swift 개발 사례를 소개한다.
  3. 병렬 에이전트의 테스트 환경 격리와 디스크 사용량 진단 도구 szt, DMG 제작 및 Markdown 미리보기 앱 등 개발 도구 소식도 다룬다.

도입

에이전트가 개발 과정에서 많은 데이터를 병렬로 만들고 정리하지 않으면, 여유 공간이 충분한 디스크도 빠르게 가득 찰 수 있다. 이번 호의 편집자 경험에서는 Time Machine 로컬 스냅샷과 테스트 스크립트의 임시 디렉터리가 원인으로 드러났다. 이를 계기로 에이전트 실행 환경의 경계, 자원 관리, 정리 절차가 핵심 문제로 제시된다.

상세 요약

에이전트가 만든 디스크 공간 문제

편집자는 최소 500~600GB의 여유 공간을 유지하던 MacBook에서 디스크 공간이 두 차례 빠르게 소진되는 일을 겪었다.

  • 첫 번째 원인은 에이전트가 개발 중 대량으로 생성·수정·삭제한 파일이었다. 해당 디렉터리가 Time Machine 백업 대상에 포함되어 로컬 스냅샷의 데이터 블록이 누적됐다. 디렉터리를 백업에서 제외하고 기존 로컬 스냅샷을 삭제해 해결했다.
  • 두 번째 원인은 테스트 스크립트가 mkdtempSync로 임시 디렉터리를 만들고도 정리하지 않은 문제였다. QA를 실행할 때마다 5.7GB Design 저장소 전체를 새 디렉터리에 풀어 디스크에 데이터가 쌓였다.

에이전트는 두 문제를 일으킨 동시에 해결에도 활용됐다. 글은 에이전트의 병렬적인 작업 방식이 CPU와 RAM뿐 아니라 저장 공간도 병목으로 만들 수 있다고 지적한다. 더 큰 SSD를 구매하는 데 그치지 않고 실행 환경을 제한하고 자원 관리와 정리 규칙을 세워야 한다는 것이 핵심이다.

Swift와 SwiftUI 활용 사례

  • Optional: take()로 값을 꺼내면서 변수를 nil로 초기화하고, Optional enum의 nil과 각 case를 함께 switch로 처리할 수 있다. map과 flatMap은 변환을 연결하며, 제네릭 제약과 KeyPath를 이용해 재사용 가능한 조건 로직을 구성할 수 있다.
  • SwiftUI 성능: Xcode Instruments의 SwiftUI 템플릿에서 View Body Updates 계층으로 누적 실행 시간이 큰 뷰를 찾고, 상세 표에서 body 실행 시간과 Root Causes를 확인한다. 인과 관계 그래프는 상태 변화와 뷰 업데이트의 연결을 보여준다. 단일 실행 시간만 보지 말고 업데이트 빈도와 원인도 함께 확인해야 한다. 관련 주제로 RocketTrace로 Xcode Instruments 분석을 AI 에이전트에 연결하기를 참고할 수 있다.
  • Now Playing: iOS 27의 프레임워크는 미디어 정보와 재생 상태, 원격 제어를 통합된 미디어 세션 모델로 다룬다. MediaSessionRepresentable로 콘텐츠를 설명하고, MediaPlaybackSnapshot으로 상태를 제공하며, MediaCommand로 시스템에 제공할 재생 동작을 선언한다. Remote Media Session은 App Extensions와 푸시 알림을 이용해 앱이 실행되지 않을 때도 외부 기기의 상태를 잠금 화면과 제어 센터에 표시하고 제어에 응답한다.
  • 접히는 기기 레이아웃: GeometryProxy.reservedRegions(kind:options:)의 .includeInactive로 비활성 접힘 영역 정보를 미리 얻을 수 있다. 그리드 열 수를 사전에 정하고 접히는 동안 열 너비와 간격을 조절해 콘텐츠가 접힘선 양쪽에 유지되도록 한다. iPhone Duo Simulator로 SwiftUI 앱의 레이아웃과 동작 테스트하기도 기기 변화에 대응하는 레이아웃을 다룬다.
  • Text 보간: LocalizedStringKey의 보간은 문자열뿐 아니라 숫자, 날짜, Text, Image 등을 지역별 형식에 맞춰 표시한다. FormatStyle로 통화·백분율·날짜를 지정하고, style:과 timerInterval:로 상대 시간과 카운트다운을 만들 수 있다. 서로 다른 스타일의 Text나 SF Symbols도 문장에 넣을 수 있으며, 실행 시점에 스타일을 정해야 한다면 AttributedString을 사용할 수 있다. 문장 전체를 보존하는 보간은 번역에서 어순을 바꿀 수 있게 하며, Text의 + 연산자는 iOS 26부터 사용 중단됐다.
  • Factory: Scene 단위 사용자 정의 컨테이너를 추가하면서 공개 API를 대체로 유지하는 설계를 소개한다. 기존 속성 래퍼의 제네릭 시그니처를 바꾸지 않고, 단일 Environment Key와 ObjectIdentifier 기반 레지스트리로 컨테이너를 관리한다. Scene 컨테이너를 찾지 못하면 공유 인스턴스로 돌아간다. 계산 속성으로 기존 Environment API를 유지하고, DynamicProperty.update()로 SwiftUI View에서 Scene 컨테이너에 접근한다.

개발 환경과 도구

Git Worktree로 소스 코드를 분리해도 빌드와 테스트 환경까지 격리되는 것은 아니다. Simulator를 공유하면 한 에이전트가 설치한 앱이 다른 에이전트의 앱을 덮어쓸 수 있다. 별도의 DerivedData, Simulator, 빌드 구성을 사용해 빌드 산출물과 실행 환경, 검증 절차를 분리해야 한다.

중국 본토 App Store 배포를 위한 ICP备案 예외 신청 사례도 소개한다. 주로 로컬에서 실행되고 자체 서버에 의존하지 않는 앱은 Apple에 예외를 신청할 수 있으며, 사례의 신청은 약 6일이 걸렸다. 승인은 신청한 앱에만 적용되고 다른 법률·규제 의무를 면제하지 않는다.

도구 소개에는 .app을 끌어다 놓아 DMG 배치를 조정하는 SwiftyDMG, Quick Look 미리보기와 Mermaid·Obsidian 링크를 지원하는 PreviewMD가 포함된다. Swift로 작성한 오픈소스 디스크 분석 도구 szt는 getattrlistbulk로 메타데이터를 일괄 조회하고 여러 스레드로 디렉터리를 스캔한다. 작성자의 측정에서 66만 7천 개 파일, 123GB 디렉터리를 2.4초에 스캔했으며, du는 약 17초가 걸렸다.

결론

이 호의 중심 메시지는 에이전트가 만드는 작업량뿐 아니라 실행 환경과 결과 검증까지 관리해야 한다는 것이다. 디스크 문제는 백업 제외와 로컬 스냅샷 삭제, 누락된 임시 파일 정리로 해결했으며, 병렬 작업에서는 DerivedData와 Simulator도 분리해야 한다. 나머지 글은 Swift API와 도구의 구체적인 적용 사례를 통해 성능 진단, 호환성 유지, 레이아웃 적응과 배포 과정을 다룬다.