Boost‐SwiftUI‐2024.02.25(화).md - BoostSwiftUI/SwiftUI GitHub Wiki

원본 텍스트 파일

Boost-SwiftUI-2024.02.25(화).txt


스터디 시간 및 참여자

  • 2025.02.25 화 오후 9:01 ・ 92분 53초
  • 고병학 권승용 김대황 유정주 윤동주 정종인 홍승현
  • 클로버노트를 이용해 회의 내용을 기록하고, Claude를 이용해 요약, 편집했습니다.

iOS 개발 스터디 노트: 빌드 최적화, 아키텍처, 기술 실무

Xcode 16 빌드 시스템 개선사항

새로운 빌드 프로세스 이해하기

  • Xcode 16은 모듈 빌드 방식과 의존성 관리 방법을 개선한 중요한 빌드 시스템 향상을 제공합니다
    • 이전 빌드 시스템은 의존성을 비효율적으로 처리하여 모듈이 의존성을 기다려야 할 때 지연이 발생했습니다
    • 새로운 시스템은 빌드를 시작하기 전에 먼저 전체 의존성 그래프를 스캔하고 생성합니다
    • 이 비순환적 그래프 생성 방식은 더 효율적인 병렬 처리를 가능하게 합니다

모듈 의존성 관리

  • 새로운 빌드 시스템은 의존성이 적은 모듈을 우선적으로 빌드합니다
    • 이로 인해 프로세스가 의존성을 기다리는 "중단된" 빌드 시간이 줄어듭니다
    • 컴파일러는 의존성 그래프를 기반으로 빌드 순서에 대해 더 지능적인 결정을 내릴 수 있습니다
  • 명시적 모듈 빌드는 컴파일 프로세스 최적화에 도움이 됩니다
    • 헤더와 인터페이스가 미리 생성되어 더 나은 병렬화가 가능합니다

개발 실무에 미치는 영향

  • 이러한 개선사항은 코드에서 더 나은 모듈 분리와 의존성 관리를 장려합니다
    • 명확하게 정의된 의존성을 통해 컴파일러가 빌드 경로를 최적화할 수 있습니다
    • 프로토콜 지향 프로그래밍은 구체적인 구현 간의 직접적인 의존성을 줄여 이점을 제공합니다
    • 명확한 인터페이스가 있는 잘 구조화된 코드는 새로운 빌드 시스템의 이점을 더 잘 활용할 수 있습니다

프로토콜 지향 프로그래밍과 아키텍처

빌드 성능에 대한 이점

  • 프로토콜 지향 프로그래밍은 Xcode의 빌드 최적화와 잘 맞습니다
    • 프로토콜은 구현에 직접적인 의존성 없이 인터페이스를 정의합니다
    • 프로토콜이 정의되면 구현은 독립적으로 컴파일될 수 있습니다
    • 이로 인해 엄격한 빌드 순서의 필요성이 줄어듭니다

역할 분리 고려사항

  • 개발자들은 역할 분리와 코드 유지보수성의 균형에 대한 도전과제를 논의했습니다
    • 과도한 분리는 상용구 코드(boilerplate)를 증가시킬 수 있습니다
    • 충분하지 않은 분리는 유지보수하기 어려운 큰 파일을 만들 수 있습니다
    • 일반적인 합의는 중복이 있더라도 가독성 있는 코드를 우선시하는 것이었습니다

크로스 플랫폼 아키텍처 차이점

  • iOS와 Android 간의 다른 아키텍처 접근 방식에 대한 논의
    • iOS 팀은 미래 서비스 확장성을 위해 여러 개의 작은 모듈을 선호했습니다
    • Android 팀은 더 통합된 접근 방식을 사용했습니다
    • 팀들은 공통 아키텍처 접근 방식에 대한 합의를 이루기 어려웠습니다
    • 이러한 차이는 프로젝트 관리 및 작업 추정에 일부 어려움을 만들었습니다

오디오 처리 최적화

대량 오디오 파일 컬렉션 처리

  • 논의된 도전과제: 1800개의 개별 MP3 파일 로딩으로 인한 상당한 성능 영향
    • 단일 스레드 로딩 프로세스가 약 4초 소요되었습니다
    • 파일들은 순차적으로 재생되어야 하는 긴 오디오의 분할된 세그먼트입니다

제안된 해결책

  • 여러 파일을 동시에 로드하기 위해 태스크 그룹(task group)을 사용한 병렬 처리 구현
    • URL을 해시 키로 사용하여 효율적인 관리가 가능합니다
    • 반복 처리를 피하기 위해 초기 로드 후 지속 시간 및 기타 메타데이터를 캐시합니다
  • 성능 향상을 위한 아키텍처 변경 고려
    • 추출 및 처리 단계를 별도 모듈로 분리
    • 오디오 파이프라인의 다양한 단계를 위한 전용 컴포넌트 생성

기술적 제약

  • 팀은 상위 요구사항으로 인해 미리 분할된 오디오 파일로 작업하고 있습니다
    • 조직적 제약으로 인해 소스 형식을 변경하는 것은 불가능합니다
    • 스트리밍 콘텐츠가 아닌 로컬 파일을 사용하므로 특정 최적화 옵션이 제한됩니다

SwiftUI 구현 도전과제

뷰 크기 조정 문제

  • 개발자들은 SwiftUI에서 동적 뷰 크기 조정의 어려움에 대해 논의했습니다
    • UIKit과 달리 SwiftUI는 뷰가 자식 뷰의 크기와 정확히 일치하도록 만드는 직관적인 방법을 제공하지 않습니다
    • 팀은 이것이 UIKit의 더 직접적인 크기 제어에 비해 특히 어렵다고 언급했습니다

Refreshable 수정자 호환성

  • iOS 15에서 refreshable 수정자의 호환성 문제
    • iOS 15에서 refreshable 수정자는 List 뷰에서만 작동하지만 다른 뷰에 적용되었을 때 오류를 표시하지 않습니다
    • 이로 인해 개발 중에 발견되지 않은, 프로덕션에서의 런타임 문제가 발생했습니다
    • 이 동작은 iOS 16에서 수정되었지만, iOS 15를 지원하는 팀은 이 제한사항을 알고 있어야 합니다

마이그레이션 도전과제

  • Swift 6로의 마이그레이션에 대한 논의
    • 팀은 새로운 Swift 언어 기능에 적응하는 데 어려움이 있다고 언급했습니다
    • 마이그레이션 가이드가 잠재적으로 도움이 될 수 있는 자료로 언급되었습니다

개발 실무 및 기술 역량

문서화 접근법

  • 기업마다 문서화 관행이 다양합니다
    • 일부는 Notion, Swagger, JIRA 티켓을 사용합니다
    • 다른 곳은 Excel 스프레드시트에 의존하거나 최소한의 문서화만 합니다
    • 부실하거나 오래된 문서는 중요한 문제점으로 확인되었습니다
    • Swagger는 백엔드 팀이 적절히 유지관리할 때 가치 있다고 강조되었습니다

버전 관리 시스템

  • 팀들은 다양한 버전 관리 경험에 대해 논의했습니다
    • Git과 GitHub가 가장 일반적이었습니다
    • 일부 개발자들은 SVN과 같은 구식 시스템 경험이 있었습니다
    • 한 개발자는 이전 직무에서 코드 전송을 위해 USB 드라이브를 사용한 극단적인 예를 공유했습니다

지속적 학습 도전과제

  • 일상 업무와 지속적인 학습의 균형 유지가 공통적인 고민이었습니다
    • 개발자들은 업무 후 개인 학습에 에너지를 찾는 데 어려움을 느꼈습니다
    • 일부는 흥미로운 기술을 다루는 업무가 자연스럽게 더 많은 학습으로 이어진다고 언급했습니다
    • 한 개발자는 경력 발전에 대한 스트레스보다 일을 즐기는 데 중점을 두는 시니어 개발자의 조언을 공유했습니다

레거시 코드 현대화

Objective-C UI를 Swift로 변환

  • Interface Builder가 있는 Objective-C에서 SwiftUI로의 마이그레이션에 대한 논의
    • 코드 얽힘이 주요 도전과제로 언급되었습니다
    • 이 프로세스는 한 개발자의 프로젝트에서 약 1.5개월이 소요되었습니다
    • 리팩토링 후, 중복되고 구조가 좋지 않은 코드를 제거하여 코드 크기가 크게 줄었습니다

빌드 시간 최적화

  • 코드 구성이 빌드 시간 효율성에 영향을 미칩니다
    • 많은 의존성을 가진 대형 클래스는 빌드 속도를 늦춥니다
    • 명확한 인터페이스가 있는 작고 집중된 모듈로 코드를 분할하는 것이 도움이 됩니다
    • 프로토콜 지향 접근 방식은 직접적인 의존성을 최소화하여 빌드 병목 현상을 줄일 수 있습니다

메모리 관리

  • 팀은 메모리 누수를 잡는 접근 방식에 대해 간략히 논의했습니다
    • Xcode 16.2는 누수 감지 기능이 향상되었다고 언급되었습니다
    • CI/CD 파이프라인에 누수 감지 기능을 통합하는 방법에 대한 관심이 있었습니다