iOS28 [iOS] WebSocket 구현 및 중복 연결 문제 해결하기 서론실시간 기능을 구현할 때 서버와 클라이언트 간의 지속적인 양방향 통신이 필요한 경우가 많다.iOS에서는 URLSessionWebSocketTask를 활용해 WebSocket을 구현할 수 있다.이번 글에서는 WebSocket 통신을 구현하면서 겪었던 중복 연결 문제와 데이터 레이스(Data Race) 이슈를 어떻게 해결했는지 공유하려 한다. 실시간 기능을 위해, 여러 다양한 방법이 있다.HTTP Polling: 클라이언트가 주기적으로 서버에 요청을 보내 데이터 확인장점: 구현이 단순하고, 대부분의 서버 환경에서 쉽게 적용 가능단점: 실시간성이 떨어지고, 데이터가 없어도 계속 요청을 보내기 때문에 네트워크 리소스 낭비가 크다Long Polling: Polling의 비효율을 줄이기 위한 방식. 클라이언트.. 2025. 9. 30. [UIKit] DiffableDataSource 도입으로 테이블뷰 성능 개선하기 서론최근 사내에서 TableView에서 숨김/해제 기능을 추가하게 되었고, 해당 과정에서 테이블뷰에 셀을 제거, 추가하는 과정에서 UI 업데이트 성능 문제가 발생하였다.기존 방식은 셀 숨김/해제 시 전체 리스트를 리로드하는 방식이라, 화면이 깜빡이거나, 반응 속도가 느려져 사용자 경험이 좋지 않았다.이 문제를 해결하기 위해 UITableViewDiffableDataSource를 도입했으며, Tap Latency가 250ms → 80ms 수준으로 줄어들었고, 셀 변경만 애니메이션과 함께 UI에 반영되도록 개선했다. 기존 방식의 문제전통적인 방식은 UITableViewDataSource 프로토콜을 구현해 섹션/셀을 직접 관리해야 했고, 아래와 같은 문제가 있었다.데이터 변경 시 reloadData(), pe.. 2025. 9. 27. [Combine] trottle와 debounce 서론연속적으로 스와이프 새로고침을 하거나, 검색창에 입력할 때 타이핑마다 API가 호출되는 등 불필요한 이벤트가 많이 발생한다.이런 과도한 이벤트로 인해 중복 API 호출, UI 버벅임, 서버 부하 같은 문제가 생기며, 이를 해결하기 위해 Combine의 throttle과 debounce를 사용한다. (RxSwift에도 있음) 즉, 불필요한 중복 호출을 방지하기 위해 Combine의 throttle과 debounce라는 두가지 Operator를 사용한다. Throttle: 지정된 시간 내 첫 번째/마지막 이벤트만 처리하고 나머지는 무시일정 시간마다 최대 1번만시작 시점 or 끝 시점버튼 연타 방지, 스크롤 추적실시간성 높음Debounce: 지정된 시간 동안 새 이벤트가 없을 때만 마지막 이벤트 처리이벤트.. 2025. 5. 20. [UIKit] 앱 생명 주기 (App Life Cycle) https://developer.apple.com/documentation/uikit/managing-your-app-s-life-cycle Managing your app’s life cycle | Apple Developer DocumentationRespond to system notifications when your app is in the foreground or background, and handle other significant system-related events.developer.apple.com 참고더보기https://co-dong.tistory.com/62 iOS) App · ViewController의 생명주기iOS에서 생명주기란 앱의 최초 실행과 종료 사이에 발생하는 일련.. 2025. 3. 25. [iOS] How to Play Video: AVFoundation, HLS, DRM, FPS, Chromecast iOS에서 동영상 스트리밍을 위한 기술 OverViewAVFoundationhttps://developer.apple.com/av-foundation/ AVFoundation - Apple DeveloperFind presentations, documentation, sample code, and development resources for using AVFoundation. The AVFoundation framework APIs provides essential services for working with time-based audiovisual media on Apple platforms.developer.apple.comAVFoundation is the full featured framewo.. 2025. 3. 23. [iOS] xcconfig와 Scheme을 활용하여 Prod/Dev환경 분리하기 서론iOS 앱을 개발하다 보면, 개발 환경(Dev), QA, 그리고 프로덕션 환경(Prod)에 따라 API URL, Firebase 설정, 로깅/분석 환경 등을 분리해야 하는 경우가 많다.하드코딩 방식으로 환경을 관리하면 실수로 잘못된 환경의 빌드를 배포할 수 있고, 유지보수도 어렵다. 그래서 사내에서 신규 앱을 초기부터 개발할 때 개발 환경 세팅을 하며 제일 먼저 xcconfig와 Scheme을 활용하여 Prod와 Dev 환경을 분리한 경험이 있다. 이번 글에서는 xcconfig와 Scheme을 활용하여 안전하게 Prod/Dev 환경을 분리하는 방법을 소개할 예정이다. 환경 분리가 필요한 이유그렇다면, 왜 환경 분리가 필요할까?앱마다 환경별로 필요한 설정이 다르다.예를 들어:Dev 서버: https:/.. 2025. 3. 5. [iOS] WebKit - WKNavigationDelegate https://developer.apple.com/documentation/webkit/wknavigationdelegate WKNavigationDelegate | Apple Developer DocumentationMethods for accepting or rejecting navigation changes, and for tracking the progress of navigation requests.developer.apple.com웹뷰의 탐색(네비게이션) 이벤트를 처리하는 프로토콜페이지 로드 시작, 완료, 실패 등의 이벤트를 감지하고 제어 구현 메서드Allowing or denying navigation requestswebView(_:decidePolicyFor:preferences:deci.. 2025. 2. 23. CI/CD with Github Actions 0. 환경(Runner) 설정Docker를 활용한 방법Docker는 개발 환경을 컨테이너로 묶어 일관된 환경에서 작업을 처리할 수 있어, CI/CD 파이프라인 최적화에 유용A. Docker 이미지로 환경 통합Docker 이미지를 생성하여 앱의 빌드 환경을 미리 설정하고, 이를 여러 작업에 재사용각 빌드마다 동일한 환경을 유지하므로, 종속성 문제나 설정 오류를 줄일 수 있으며, 빌드 시간이 단축GitHub Actions에서 Docker 이미지를 사용하는 방법:GitHub Actions 워크플로우에서 docker build를 통해 이미지 빌드빌드된 이미지를 docker run으로 컨테이너 내에서 테스트 및 배포 진행B. 자체 호스팅 서버에 Docker 실행self-hosted runner를 사용하여 로컬 또.. 2024. 9. 19. CI/CD란? 참고더보기https://blog.bytebytego.com/p/ep71-cicd-pipeline-explained-in-simple EP71: CI/CD Pipeline Explained in Simple TermsThis week’s system design refresher:blog.bytebytego.com 지속적 통합 (CI)지속적 통합은 개발자들이 코드 변경 사항을 주기적으로 공유 레포지토리에 통합(merge)하는 것을 말함이 과정에서 자동화된 빌드와 테스트가 수행되어 문제점을 조기에 발견하고 해결할 수 있다.iOS 개발에서의 CI 예개발자가 깃허브에 코드를 푸시(Push)하면, CI 툴이 자동으로 앱을 빌드하고 단위 테스트를 실행함만약 빌드나 테스트에서 오류가 발생하면, 개발자는 즉시 피드백.. 2024. 9. 19. 메모리 최적화 - iOS Memory Deep Dive [참고]더보기https://ios-daniel-yang.tistory.com/96#google_vignette [Swift/TIL #20] 이미지 메모리 최적화 방법들 (WWDC 18)[TIL #20] 2023 / 05 / 01 앨범에서 이미지를 불러오는 작업을 하는데, 사진을 추가할 때마다 메모리 사용량이 기하급수적으로 증가하더라고요. 그래서 오늘은 간단히 이미지 관련, 메모리 최적화 방ios-daniel-yang.tistory.comhttps://hucet.tistory.com/38 [WWDC 2018] iOS Memory Deep Dive (1/2)WWDC 2018 iOS Memory Deep Dive 를 정리한 포스트입니다. 더 자세한 내용을 원하시면 위 링크를 참조하시길 바랍니다. Virtual.. 2024. 2. 23. [Swift] Profiling 방법 자주 쓰이는 프로파일링 방법 ✨ 📝 Memory Profiler 메모리가 얼마나 할당 되어 있고, 어디에 할당되어 있고, 누수 확인가능 1. 메모리 할당 확인 가능 2. 메모리 누수 등의 문제 해결 편리 3. 메모리의 과도한 할당으로 인해 앱이 느려질 경우, 사용 필요 📝 Timer Profiler 스크롤하거나 화면 전환이 될 때 갑자기 느려지는 현상이 일어날때, 해당 경로를 찾아 시간 복잡도를 낮추면 끊기거나 느려지는 현상이 없어짐 1. 뱡목을 유발하는 부분을 찾아 해결하기 편리 2. 각 함수 단위의 수행 시간 확인 가능 3. 호출 경로도 확인 가능 2024. 2. 20. [CS] 동기(Sync), 비동기(Async) [참고]더보기https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-%EB%B9%84%EB%8F%99%EA%B8%B0Async%ED%86%B5%EC%8B%A0-%EB%8F%99%EA%B8%B0Sync%ED%86%B5%EC%8B%A0 🌐 웹의 비동기(Async) / 동기(Sync) 통신 정리웹에서의 비동기와 동기 웹 개발을 하다보면 비동기(Async)와 동기(Sync)라는 용어를 자주 접하게 될 것이다. 이 두 용어는 웹에서 데이터를 주고받는 방식을 설명하는데 사용되는데, 동기(Sync)는inpa.tistory.comhttps://velog.io/@s_sub/Swift-%EB%B9%84%EB%8F%99%EA%B8%B0-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%.. 2024. 2. 16. 이전 1 2 3 다음