DevLog

엔지니어링 블로그를 한 곳에서 탐색하고, 최근 발행 흐름을 빠르게 파악할 수 있는 서비스 입니다.

Quick Links

  • Latest Feed
  • Engineering Directory

Support

  • 소개
  • 개인정보처리방침

Contribute

  • 원하는 블로그 추가 (준비 중)
  • Feedback

© 2026 DevLog Inc. All rights reserved.

본 사이트는 공개 RSS 피드를 통해 콘텐츠를 수집하며, 모든 콘텐츠의 저작권은 원저작자에게 있습니다.

Back to Feed
Read Original

Contents

Continue Reading

  • More from 라인
  • Related reads#iOS
#Mobile

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

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

Summary

7천 줄의 설정 파일과 이별하기: LINE iOS팀이 AttributedString에서 찾은 시스템 설계의 해답

거대해진 모놀리식 구조를 깨고 Swift의 고급 기능을 활용해 모듈화와 안전성을 동시에 잡은 기술적 여정

이 아티클은 LINE iOS 앱의 동적 설정 배포 시스템을 재설계한 사례를 다룹니다. Foundation의 AttributedString API 설계를 영리하게 벤치마킹하여, 대규모 프로젝트의 고질적인 문제인 순환 의존성과 스레드 안전성 문제를 해결하는 과정을 상세히 설명합니다. 현대 Swift 문법인 Dynamic Member Lookup과 Swift 6의 동시성 모델을 실무에 어떻게 적용할 수 있는지 보여주는 훌륭한 사례 연구입니다.

  • 01AttributedString의 구조를 응용해 런타임 비용 없는 타입 안전한 라우팅 구현
  • 02700개 이상의 설정 키를 60여 개 모듈에 분산 정의하여 의존성 딜레마 해결
  • 03OSAllocatedUnfairLock과 Sendable을 통한 고질적인 메모리 크래시 정복
  • 04디버그 메뉴와 테스트 대역 자동화를 통해 개발자 경험(DX)의 비약적 향상
  • 05기본 구현(Default Implementation)을 활용한 반복적인 디코딩 로직 제거

+RECOMMENDATION

전역 싱글턴 설정값 관리로 인해 모듈 분리에 어려움을 겪고 있거나, 복잡한 키-값 시스템을 타입 안전하게 추상화하고 싶은 시니어 iOS 엔지니어에게 일독을 권합니다. 라이브러리 설계 관점에서 Swift의 타입 시스템을 활용하는 통찰력을 얻을 수 있습니다.

The Problem

LINE iOS 앱이 성장함에 따라 700여 개의 설정 키를 관리하는 기존 모놀리식 시스템에서 순환 의존성, 수동 파싱에 따른 런타임 에러, 그리고 스레드 안전성 부재로 인한 빈번한 크래시 문제가 발생했습니다. 특히 개별 모듈이 각자의 설정 타입을 정의할 수 없어 발생하는 구조적 제약과 테스트 대역의 부재로 인해 개발 및 QA 생산성이 저하되었습니다.

The Solution

Foundation 프레임워크의 AttributedString 설계 패턴인 AttributeScope와 Dynamic Member Lookup을 차용하여, 각 모듈이 독립적으로 설정 키를 정의하고 타입 안전하게 접근할 수 있는 구조로 재설계했습니다. 또한 Swift 6의 Sendable과 OSAllocatedUnfairLock을 활용해 동시성 문제를 해결하고, 키 단위로 디코딩 로직과 디버그 오버라이드 기능을 캡슐화했습니다.

The Result

모듈 간의 순환 의존성을 제거하여 관심사 분리를 실현하였으며, 정적인 타입 체크를 통해 잘못된 디코딩으로 인한 오류를 방지했습니다. 스레드 안전성을 확보하여 매일 수백 건씩 발생하던 메모리 관련 크래시를 근본적으로 해결하였고, 표준화된 테스트 대역(Mock) 제공을 통해 모듈별 테스트 작성을 용이하게 개선했습니다.

Trade-off

참조 타입인 서비스 객체를 사용함에 따라 락(Lock)을 활용한 동기화 처리가 필수적이었으며, 데드록 방지를 위해 디코딩 로직을 임계 구역 밖으로 분리하는 등 설계 복잡도가 다소 증가했습니다. 또한 기존 시스템으로부터의 점진적 전환을 위해 일시적으로 두 시스템이 공존하는 마이그레이션 비용이 발생합니다.

03

Key Concepts

Concept · 01

Dynamic Member Lookup

런타임에 결정되는 프로퍼티 접근을 컴파일 타임의 타입 체크와 연결해주는 Swift의 기능입니다.

  • AttributeDynamicLookup을 통해 키 패스 기반의 프로퍼티 라우팅을 구현함
  • 런타임 오버헤드 없이 컴파일러가 타입을 추론하도록 설계의 핵심으로 활용됨
Concept · 02

AttributeScope

관련된 속성 키들을 논리적인 그룹으로 묶어 네임스페이스를 제공하는 프로토콜 기반의 구조입니다.

  • 각 서비스 모듈이 독립적으로 설정 영역을 선언할 수 있게 함
  • 설정 모듈이 모든 타입을 알 필요 없이 역방향 의존성 문제를 해결함
Concept · 03

Sendable & Lock

데이터 레이스를 방지하고 동시성 안전성을 보장하기 위한 Swift 6의 타입 시스템 및 동기화 메커니즘입니다.

  • OSAllocatedUnfairLock을 사용해 가변 상태에 대한 접근을 동기화함
  • 사용자 정의 디코딩 시 발생할 수 있는 데드록을 방지하기 위해 록 밖에서 연산을 수행하도록 최적화함
Continue reading · same source

라인More from 라인

View all posts from 라인
  • 초당 100만 건, LINE 앱에 Apache Kafka 종단 간 암호화 적용기

    KafkaCryptographyAES-GCM
    3일 전
  • AI로 웹 엔지니어 없이 LINE 앱 안에서 그룹 영상 통화 서비스 만들기

    LIFFWebRTCLINE Planet SDK
    1주 전
  • 임베딩 안정화로 검색 리랭킹의 콜드 스타트 문제를 해결하다: LINE Part Time Jobs 적용 사례

    Embedding StabilizationCold Start ProblemTwo-Tower Model
    2주 전
  • 프롬프팅에서 워크플로로, AI로 프런트엔드 개발 생산성 끌어올리기

    LLMMCPAI Agent
    2주 전
  • AI 에이전트끼리 토론한다면? 멀티 에이전트 협업으로 재설계하는 개발 프로세스

    AI AgentLLM OrchestrationSoftware Development Lifecycle
    2주 전

Related reads#iOS

Explore #iOS
무신사

AI한테 테스트 코드를 맡겼더니 커버리지가 8배 올랐다

#iOS3개월 전
당근·iOS Webview

웹뷰 엔지니어를 위한 iOS Webview Input 경험 개선기

#iOS4개월 전
쏘카·Bluetooth

쏘카프레임 - 블루투스 모듈

#iOS6개월 전
쏘카·Socar Frame

쏘카프레임 - 앱 프레임워크와 개발자 경험

#iOS6개월 전

Source

라인
라인
Engineering Blog

Published · March 18, 2026

Topics

iOSSwiftAttributedStringDynamicMemberLookupSoftwareArchitectureThreadSafetyRefactoring