본문 바로가기

전체 글9

[Python] asyncio 정리 코드를 except 에 두면 안 되는 이유 취소가 클라이언트에서 서버의 백그라운드 태스크까지 닿는 경로를 따라가며, 정리 코드를 어디에 둬야 하는지 봅니다 LLM 튜터의 답변을 SSE로 흘리는 서버를 운영하고 있습니다. 어느 날 트레이스 하나가 이렇게 찍혔습니다.맨 윗줄이 턴 하나(L0)이고 그 아래는 전부 자식(L1)입니다. 같은 이름의 LLM 호출이 Start 열을 따라 10초 간격으로 계속 늘어납니다. 턴은 30초도 안 되어 끝났습니다. 그 턴 하나가 담고 있는 LLM 시간은 한 시간이 넘습니다. 사용자는 답변을 다 받기 전에 화면을 나갔습니다. 요청은 그때 끊겼는데, 그 요청이 띄운 백그라운드 태스크는 주인을 잃은 채 계속 돌았습니다. 한 턴의 트레이스에 LLM 호출이 수천 건 쌓일 때까지요. 눈여겨볼 것이 하나 더 있습니다. 그 30초짜.. 2026. 9. 7.
[WWDC26] @State 매크로 적용 범위 확인하기 Xcode 27로 빌드하기 전에 @State 선언을 어떻게 확인해야 하는지 봅니다 WWDC26에서 @State가 프로퍼티 래퍼에서 매크로로 바뀌었습니다.그러면서 @State에 담긴 클래스가 뷰 생애당 한 번만 초기화됩니다. 그런데 이 개선은 선언을 어떻게 썼느냐에 따라 적용되기도 하고 안 되기도 합니다. 어느 쪽인지 확인하는 방법을 정리했습니다. WWDC26의 SwiftUI 변경들먼저 이번에 생긴 변경들을 훑어보자면툴바 제어 - visibilityPriority로 화면이 좁아질 때 무엇을 먼저 숨길지 정합니다. toolbarMinimizeBehavior는 스크롤 시 네비게이션 바를 접습니다Document API 확장 - WritableDocument · ReadableDocument로 비동기·점진적 디스.. 2026. 8. 11.
[iOS] SwiftUI 채팅 리스트를 UIKit으로 전환하기 SwiftUI 리스트를 UIKit으로 옮기며 만난 증상 넷을 하나씩 따라가며, 그것들이 왜 같은 자리에서 나왔는지 봅니다 AI 튜터의 답변이 스트리밍으로 흘러 들어오는 채팅 화면을 만들고 있습니다. SwiftUI List로 시작했다가 UIKit UICollectionView로 옮겼습니다. 스트리밍 중에 셀 높이가 계속 바뀌는데 SwiftUI 쪽에서 스크롤 위치를 잡을 손잡이가 없었기 때문입니다. 옮기면서 이슈가 넷 발생했습니다과거 대화를 불러오면 화면이 튄다과거 로드가 스스로를 다시 부른다맨 아래로 보냈는데 맨 아래가 아니다답변이 짧으면 타임스탬프가 사라진다넷 다 원인이 같았습니다. 정석은 리스트를 뒤집는 것입니다채팅 화면에는 오래된 정석이 있습니다. 컬렉션 뷰를 위아래로 뒤집는 것입니다.collect.. 2026. 4. 22.
[iOS] 멀티 업로드로 비교해본 동시성 도구 세 가지 세마포어 · OperationQueue · async/await 로 같은 요구사항을 각각 풀어보며, 무엇이 나아지고 무엇이 그대로였는지 봅니다 이 전 회사에서 3년 가까이 육아 기록 앱의 미디어 업로드를 맡았습니다. 그 사이 Swift의 동시성 도구가 두 번 바뀌었고, 코드도 그때마다 다시 썼습니다.일하면서 가장 어려웠던 멀티 업로드 기능에 대해서 세 방식을 나란히 놓고 정리해봅니다. 요구 사항은 "사진과 영상 여러 개를 정해진 수만큼 병렬로 올린다." 그리고 "올린다"는 한 가지 일이 아니었습니다.항목마다 압축을 먼저 하고 전송합니다. 압축 강도도 등급에 따라 달랐습니다. 그러니까 슬롯 하나가 잡고 있는 시간은 CPU를 쓰는 구간과 네트워크를 기다리는 구간이 붙어 있는 셈입니다.10분짜리 영상 다섯 개.. 2024. 2. 19.
[iOS] Core Graphics로 사진 지우개 구현하기 쑥티콘(사진으로 만드는 스티커)에 "이 부분만 지우고 싶다"는 문의가 계속 들어왔습니다. 손가락으로 문지르면 지워지는 기능. 간단할 줄 알았는데 막상 해보니 결정할 게 많았습니다.요구사항은 두 줄이었습니다.손가락으로 문지른 자리가 투명해진다.그 결과를 저장하고 되돌릴 수 있다. 첫 줄만 보면 쉽습니다. 어려운 건 두 번째 줄이었습니다.1단계: 레이어로 가립니다가장 먼저 떠오르는 방법입니다. 이미지는 그대로 두고 그 위를 가리면 됩니다.CAShapeLayer로 마스크를 만들어 씌우거나, 블렌드 모드를 쓴 레이어를 얹거나. 둘 다 화면에서는 정말로 지워진 것처럼 보입니다.let mask = CAShapeLayer()mask.path = erasedPath.cgPath // 문지른 경로imag.. 2023. 1. 31.
iOS BLE 기기 연동 (CoreBluetooth) iOS 앱에 BLE 기기 연동을 위해 CoreBluetooth 프레임워크를 사용했던 경험을 포스팅하려고 합니다. IoT 기기나 웨어러블 같은 기기를 앱과 연동하려면 꼭 거쳐야 하는 게 바로 BLE(Bluetooth Low Energy) 입니다.iOS에서는 CoreBluetooth 프레임워크를 통해 BLE 통신을 다룰 수 있습니다. CoreBluetooth는 BLE 전용 프레임워크입니다!즉, 블루투스 스피커처럼 클래식 블루투스로 음악 스트리밍하는 기능은 접근할 수 없고, iOS 시스템 레벨에서만 동작합니다. CoreBluetooth로 할 수 있는 건 저전력 통신 기반 센서, 웨어러블 같은 BLE 기기와의 데이터 교환입니다. 블루투스 관련된 정보나 CoreBluetooth의 자세한건 넘어가고 이번 글.. 2020. 3. 3.