오늘 이 글 어때요?
채팅을 운송 오더로 바꾸는 파이프라인
이 작업에서 저는 서버 분석 API, intent 판정과 초안 변환 호출, 오더 후보 저장, 메시지 처리 상태 관리를 맡았습니다. 이 글은 2026년 10월 당시의 구현을 돌아보며 정리했습니다. 서버 측 공통 오더 식별자로의 전환은 원고를 정리할 때까지 구현되지 않은 상태였습니다.
2026
차주 위치를 실시간으로 공유하는 운송 추적
배민·우버처럼 차주 위치를 지도에서 실시간으로 공유하는 운송 추적을, 폴링·SSE·WebSocket 중 무엇을 어디에 쓸지 고르고, 끊겨도 화주가 못 느끼게 재연결과 경로 이탈·지도 렌더까지 설계한 기록.
WWDC26 워치파티 후기
6월 8일 밤 시작해 다음 날 새벽까지 이어진 WWDC26 워치파티 기록.
react-native-bootsplash 내부 동작 원리
OS LaunchScreen과 RN 첫 paint 사이의 공백을 메우는 방법.
WKWebView와 Android WebView가 화면을 그리는 방식의 차이
같은 페이지가 iOS WKWebView에서는 fragment 앵커 점프 후 위쪽이 빈 화면으로 보이고 Android WebView에서는 멀쩡히 그려진다. 두 엔진의 tile/painting 모델을 따라가며 왜 한쪽에서만 일어나는지 정리한다.
Data Essentials in SwiftUI (WWDC20 10040)
Curt Clifton·Luca Bernardi·Raj Ramamurthy가 SwiftUI의 데이터 소유권·source of truth·@State/@StateObject/@ObservedObject·view life cycle을 한 번에 정리한 세션. 내용·코드·맥락을 한국어로 재구성한다.
Demystify SwiftUI (WWDC21 10022)
Matt Ricketson·Luca Bernardi·Raj Ramamurthy의 대표 세션. identity·lifetime·dependencies 세 축으로 SwiftUI의 업데이트 규범을 체계화한다. dependency graph가 곧 SwiftUI의 render tree라는 것까지.
Demystify SwiftUI Performance (WWDC23 10160)
SwiftUI 앱이 느려지는 원인을 진단하는 법. printChanges로 의존성 추적, body 안의 work 제거, List/Table의 identity 수집 메커니즘까지 — 2021 Demystify가 이론이라면 이 세션은 최적화 매뉴얼이다.
SwiftUI의 Identity · Lifetime · Dependencies
Omar Radwan의 SwiftUI Under the Hood 번역. Demystify SwiftUI 세션(WWDC21 #10022 · WWDC23 #10160)의 세 기둥인 identity·lifetime·dependencies를 코드 예제와 함께 정리한다.
Discover Observation in SwiftUI (WWDC23 10149)
Swift 5.9의 @Observable 매크로는 ObservableObject의 구조적 한계를 뒤집는다. body가 실제로 읽은 property만 추적하는 granular tracking 메커니즘과, @State·@Environment·@Bindable 세 개로 단순화된 property wrapper까지.
A Day in the Life of a SwiftUI View
SwiftUI의 view tree → render tree 변환, .task 재실행 문제와 .id/.task(id:)의 트레이드오프, proposal-reporting 레이아웃 시스템, environment와 preferences의 방향성을 그림 100여 장으로 풀어낸 Chris Eidhof의 강연 정리.
Variadic Views in SwiftUI
VStack 안에 여러 뷰를 넣으면 SwiftUI는 그걸 어떻게 들고 있을까. TupleView·_VariadicView.Tree·UnaryViewRoot/MultiViewRoot의 구분, 그리고 List가 행 사이에 Divider를 끼워 넣을 수 있는 이유까지.
RxSwift에서 Combine으로 넘어가며 정리한 것들
SwiftUI의 내부 동작 원리
View tree, Attribute Graph, _UIHostingView까지 — SwiftUI가 선언형 뷰를 실제 UIKit·Core Animation 위에 매핑하는 내부 구조를 따라간다.
iOS 앱 샌드박스와 Extension 정리
WKWebView의 내부 동작 원리
UIKit의 내부 동작 원리
Runloop, CATransaction, Core Animation layer tree 등 UIKit이 화면을 그리기까지의 내부 동작을 파이프라인 단계별로 정리한다.
Alamofire 제대로 쓰기
Kingfisher Under the Hood
TCA Under the Hood
URLProtocol과 Bonjour로 직접 만든 iOS 실시간 네트워크 디버거
센디 앱을 개발하면서 네트워크부터 의심해야 하는 순간이 자주 있었습니다. QA에서 올라오는 "API가 느려요" 리포트, 특정 화면에서만 재현되는 빈 응답 같은 문제는 대부분 네트워크 구간을 봐야 답이 나옵니다. 그런데 iOS에서 개발 중인 실기기의 요청을 바로 들여다보는 흐름이 생각보다 매끄럽지 않았습니다. Alamofire나 URLSession에 print 로깅을 달아 놔도 Xcode 콘솔에서 필요한 요청만 골라 읽기…
iOS 코드 서명 정리
GitHub Actions + Fastlane 기반 iOS 배포 자동화
기능을 만드는 시간보다 빌드를 기다리는 시간이 더 길게 느껴질 때가 있습니다. 코드 한 줄을 고쳐도 확인을 받으려면 앱을 새로 빌드해 전달해야 하고, 이 과정은 수정할 때마다 처음부터 다시 반복됩니다.
2025
센디 iOS 앱에 React Native 얹기
센디는 iOS와 Android 앱을 각각 네이티브로 개발해 왔습니다. 새로운 기능이 추가되면 두 플랫폼에서 동일한 요구사항을 바탕으로 화면과 로직을 구현했습니다.
Letus Go! 2025 가을 모임 후기
마루360에서 열린 Letus Go! 가을 모임에 다녀온 기록.
React Native New Architecture의 내부 동작 원리
React Native 브라운필드 통합
기존 앱에 RN 얹기.
CRM 캠페인에서 시작한 앱 진입 시스템 구축기 (1): 푸시 알림 수신과 클릭
앱 진입 시스템 구축기 1편. CRM 캠페인에서 사용한 Notification Service Extension 코드와 2025년 7월 기기 화면 녹화로 이미지 푸시 처리와 탭 이후 흐름을 정리.
CRM 캠페인에서 시작한 앱 진입 시스템 구축기 (2): 여러 경로를 모으는 딥링크 라우팅
앱 진입 시스템 구축기 2편. CRM 캠페인에서 사용한 푸시·Universal Link·OneLink 세 진입 경로를 하나의 매칭 테이블로 모으고, 해석·매칭·내비게이션을 타입별로 분리해 새 캠페인을 테이블 한 줄로 끝낸 라우팅 설계.
CRM 캠페인에서 시작한 앱 진입 시스템 구축기 (3): 웹뷰와 네이티브를 잇는 브릿지
앱 진입 시스템 구축기 3편. CRM 이벤트 웹뷰 CTA를 네이티브 화면으로 잇는 단일 브릿지 채널과 enum 강제 디코딩으로 무반응을 없애고, 2-depth 웹뷰 스택을 네이티브 네비게이션으로 관리한 기록.
React Native iOS 앱 부트스트랩
@main에서 첫 화면까지.
WWDC25 워치파티 후기
부산에서 올라와 WWDC25 워치파티에 참석하고 새벽 기차로 돌아온 기록.
센디 결제카드 스캐너 개발기 (2): 카메라 없이 검증하는 모듈 설계
카메라와 촬영 화면, 카드 인식 기능을 하나의 모듈에 담고 영상과 합성 이미지로 검증하는 구조를 정리합니다. 입력을 교체하는 지점과 테스트별 확인 범위를 나누고, 실제 기기에 남겨 둔 검증도 설명합니다.
센디 결제카드 스캐너 개발기 (1): 카메라 프레임에서 카드 정보 추출
카드 번호를 직접 입력하는 부담을 줄이기 위해 구현한 카메라 스캐너입니다. 프레임 수집과 안내 영역 크롭, Vision 텍스트 인식부터 사용자 확인 화면까지의 처리 과정을 설명합니다.
제대로 알고 싶었던 한 해 (2024 회고)
혼자 공부해 온 iOS 지식을 돌아보고, 새싹 과정에서 배우고 설명하며 빈틈을 채운 2024년 회고.
2024
2023
2022
로컬 데이터 저장의 선택지
State·Action·Reducer·Store와 단방향 흐름
실전 구성 팁
SwiftUI 의 diffing algorithm
SwiftUI 가 React 처럼 identifier 나 shortest-edit-script 없이도 대부분의 경우 view 변화를 모호함 없이 판별하는 이유. 비결은 정적 타입. TupleView<(Text, _ConditionalView<A, B>)> 자체가 구조를 드러내므로 같은 타입끼리만 비교하면 된다. Swift 코드로 직접 재구성해 본다.
상태로 화면을 제어한다
SwiftUI 의 render loop
body 평가와 실제 화면 렌더링은 같지 않다. onAppear 가 왜 깜빡임을 만들지 않는지, preference key 기반 커스텀 layout 에서 body 가 두 번 평가돼도 왜 첫 번째는 화면에 닿지 않는지 — CFRunLoop 의 beforeWaiting observer 와 암묵적 CATransaction 의 관계까지 내려가 설명한다.
데이터 흐름의 두 원칙
SwiftUI 에서 escaping closure 를 쓰지 말아야 하는 이유
커스텀 container view 를 만들 때 content 를 @escaping closure 로 받을지, 초기화 때 바로 평가해서 view 로 저장할지. 겉보기엔 closure 쪽이 더 효율적이지만 실제로는 @State 최적화와 memoization 이 동시에 깨진다. Rens Breur 가 왜 view 는 이미 함수인지부터 짚고 시작한다.
아키텍처 패턴과 선택 (MVC와 MVVM)
타깃액션과 네트워크 데이터로 화면 채우기
명령형에서 선언형으로
주요 컴포넌트와 MVC
앱은 어디서 시작하는가
옵셔널과 안전한 nil 처리
팀원과 팀장으로 치른 로봇대회
2020년에는 팀원으로, 이듬해에는 팀장으로 임베디드SW경진대회에 참가해 최우수상을 받기까지의 기록.