피드로 돌아가기
AttributedString 구조로 풀어낸 대규모 iOS 설정 시스템
LINE Engineering
Mobile

AttributedString 구조로 풀어낸 대규모 iOS 설정 시스템

LINE이 7천 줄 단일 파일의 설정 시스템을 AttributedString 기반 구조로 재설계해 순환 의존, 스레드 안전성, 테스트 복잡성 문제 해결

2026년 3월 18일12intermediate

Context

LINE iOS 앱의 동적 설정 배포 시스템(서비스 설정)이 700개의 설정 키를 일체형 구조로 관리하면서 7천 줄에 달하는 단일 파일이 생성되었다. 모듈 간 순환 의존으로 인해 설정값을 의미 있는 타입으로 다룰 수 없었고, 문자열 파싱을 호출부에서 반복 수행해야 했다. 메모리 해제 후 사용(use-after-free) 크래시가 매일 수백 건 발생했으며, QA 과정의 값 오버라이드를 위해 여러 파일에 흩어진 코드 수정이 필수였다.

Technical Solution

  • AttributedString 기반 구조 도입: Foundation의 AttributedString 접근 방식을 참고하여 설정 시스템을 재구현하고, 도메인 고유의 요구 사항(ValueSource 우선순위, 디코딩 로직)을 프로토콜에 추가
  • ConfigurationKey 프로토콜로 분산 선언: 각 모듈에서 자신이 사용하는 설정 키를 개별 enum으로 정의하게 하여 7천 줄 단일 파일을 분산 구조로 변경
  • 명확한 타입 반환: 설정 키 정의 시점에 Value 연관 타입을 명시하여 LineConfigurationManager가 파싱된 타입(예: ImageTransferQuality)을 직접 반환 가능하게 구조화
  • 동시성 안전성 확보: 록 안에서는 문자열값만 추출하고 디코딩을 록 밖에서 수행하는 방식으로 데드락과 재귀적 록 접근 크래시 방지
  • 디버그 오버라이드 내장: ValueSource enum(overridden, server, default)과 debugTitle, debugControlType 메타데이터를 프로토콜에 추가하여 여러 파일의 디버그 UI 코드 통합
  • MockConfigurationService 제공: 테스트 대역을 시스템에서 제공하여 각 모듈이 프로토콜과 테스트 대역을 개별 작성할 필요 제거

Key Takeaway

설정 시스템처럼 도메인 특화 요구사항이 있는 경우, 표준 라이브러리의 추상화(AttributedString)를 기초로 한 후 프로토콜에 도메인 고유의 메타데이터와 제약을 추가하는 방식이 모듈 간 의존성 순환을 해소하고 온보딩 복잡성을 낮출 수 있다.


다양한 모듈에서 설정값을 공유하는 구조에서는 단일 중앙 집중식 파일 대신 각 모듈이 자신의 설정 키를 enum으로 선언하고 프로토콜을 통해 조회하는 분산 방식을 적용하면, 순환 의존을 제거하면서도 각 모듈이 강타입의 설정값을 직접 받을 수 있다. 동시에 시스템이 MockConfigurationService 같은 고품질 테스트 대역을 제공하면 각 모듈의 테스트 작성 오버헤드를 대폭 줄일 수 있다.

원문 읽기
AttributedString 구조로 풀어낸 대규모 iOS 설정 시스템 | Devpick