본문 바로가기

전체 글

(59)
[iOS] App과 App Extension 그리고 App Group - 1 iOS 앱을 개발하다보면 특정 기능을 개발하기 위해 Xcode의 Target을 통해App Extension을 추가하여 기능을 개발하게됩니다. 저도 최근 아이폰의 화면을 실시간으로 공유하는 기능을 개발하기 위해Broadcast Upload Extension이라는 Target을 추가하여 구현을 진행하였습니다. 이 글에서는 간단하게 App Extension이 무엇인지,그리고 App과 App Extension 사이에서 데이터 전달은어떤식으로 할 수 있을 지에 대해 진행해보겠습니다.1️⃣ 그래서 App Extension이 뭔데?네, App Extension은 개발자가 만든 앱의 인터페이스가 아닌 외부에서 작동되는컨텐츠를 제공할 수 있는 기능입니다. 예를 들어, 내가 만든 컨텐츠 혹은 정보를 아이폰의 위젯에서 보여..
📋 [iOS] 40-50대분들을 위한 키보드 툴바 UX 개선 경험 건설 현장에서 사용하는 업무용 앱을 개발하면서 예상치 못한 UX 문제를 발견하고 해결한 경험을 공유합니다.문제를 해결하는 과정에서 사용자 중심 설계에 대해 많이 배울 수 있었습니다.🎯 타겟 사용자 분석건설 현장의 특수성개발중이던 앱의 주요 사용자는 40-50대 건설 현장 기사님들입니다. 이분들의 특성을 분석해보니스마트폰 사용에 익숙하지 않은 경우가 많음현장에서 빠르고 간편하게 서류 작성이 필요세밀한 터치 조작보다는 직관적인 인터페이스 선호기존 종이 서류 작성 방식에 익숙함개발 초기 구현처음에는 일반적인 방식으로 구현했습니다사용자가 직접 각 칸을 터치 → 키보드 포커스 이동 → 텍스트 입력겉보기에는 문제없어 보였지만, 실제로 사용해보니 큰 문제가 있었습니다.😰 발견된 문제점직접 체험을 통한 페인 포인트..
🧊 [iOS] ImageViewer.swift 라이브러리 앱 프리징 이슈 해결 이미지 뷰어 라이브러리를 사용하던 중 특정 상황에서 앱이 완전히 멈춰버리는 문제가 발생했습니다. 문제의 원인을 추적하고 해결한 과정을 공유합니다.이 문제는 ImageViewer.swift의 내부 동작 원리를 정확히 이해해야 해결할 수 있었습니다.🚨 문제 상황재현 시나리오피드 앱에서 다음과 같은 상황이 발생했습니다:사용자 A가 이미지가 포함된 피드를 게시사용자 B가 해당 피드를 확인 중사용자 A가 피드를 삭제 (이미지도 함께 삭제됨)사용자 B가 이미지를 클릭하여 전체화면으로 보려고 시도앱이 완전히 멈춤 (Freezing 발생)작동 영상정상작동 피드 삭제 문제 상황기본 구현ImageViewer.swift 라이브러리를 사용하여 이미지 캐러셀 뷰를 구현했습니다:cell.imageView.setupImageV..
🔧 [iOS] Moya + Alamofire RequestInterceptor doNotRetryWithError 커스텀 에러 받지 못하는 문제 해결 RequestInterceptor에서 doNotRetryWithError로 전달한 커스텀 에러가 예상과 다른 에러로 변환되는 문제를 해결한 과정을 공유해보겠습니다.이 문제는 Moya와 Alamofire의 에러 래핑 구조를 정확히 이해해야 해결할 수 있었습니다.🚨 문제 상황기대했던 동작RequestInterceptor에서 리프레시 토큰이 만료된 경우, 다음과 같이 커스텀 에러를 전달했습니다:switch result {case .success: reqeustsForRetry.forEach { $0(.retry) }case .failure: // RequestRetrier에서 전달한 에러 let error = NetworkError.expired(ErrorState(status: "fail"..
🔄 [iOS] 토큰 자동 갱신 시 중복 요청 방지 구현하기 JWT 기반 인증을 구현하면서 가장 까다로운 부분 중 하나가 바로 액세스 토큰의 자동 갱신입니다.특히 동시에 여러 API 요청이 발생할 때 토큰 갱신이 중복으로 일어나는 문제는 많은 개발자들이 한 번쯤 겪어봤을 것입니다.이번 글에서는 Alamofire의 RequestInterceptor를 활용해 이 문제를 해결한 과정을 공유해보겠습니다.🤔 문제 상황 분석초기 구현의 한계점처음에는 단순하게 토큰 만료 에러를 받으면 토큰을 갱신하도록 구현했습니다:import Alamofirefinal class NetworkInterceptor: RequestInterceptor { func retry(_ request: Request, for session: Session, dueTo error: any Error..
ViewModel 도입 - ViewController의 복잡도 개선 MVC 패턴을 사용하면서 ViewController의 복잡도가 점점 증가하는 문제가 발생했다.UI 업데이트, 데이터 로딩, 네비게이션 처리 등의 로직이 하나의 ViewController에 집중되면서, 코드 가독성이 저하되고 유지보수가 어려워지는 상황이 발생했다.이 문제를 해결하기 위해 MVVM 아키텍처를 도입하고, Input/Output 패턴을 적용하여 데이터 흐름을 개선하였다. 1️⃣ 문제: ViewController가 점점 비대해지는 문제 발생프로젝트 초반에는 MVC 패턴을 적용하여 UI와 로직을 분리하려 했지만, 기능이 추가될수록 ViewController의 역할이 과도해지는 문제가 발생했다.특히, 다음과 같은 문제들이 유지보수를 어렵게 만들었다.ViewController 내부에서 UI 이벤트 관리..
테이블뷰 셀에서 의도치 않게 뷰가 늘어나는 문제 해결 과정 UITableViewCell의 특정 요소가 의도치 않게 크기가 늘어나며 레이아웃이 깨지는 문제가 발생했다.레이아웃을 유지하려고 했던 요소들이 밀려나고, 전체적인 UI가 어긋나는 현상이 나타났다. 1️⃣ 문제 정의: 늘어나서는 안 되는 뷰가 늘어나는 상황테이블뷰 셀 내부의 주요 요소는 다음과 같은 구조로 배치titleLabel → 왼쪽 상단에서 텍스트를 표시optionLabel → 왼쪽 하단에서 추가 정보를 표시countLabel → 오른쪽에서 개수를 나타냄forwardImageView → 오른쪽 끝에서 이동을 의미하는 화살표 아이콘 표시 💥 문제 발생:countLabel이 의도치 않게 늘어나면서 titleLabel과 optionLabel의 레이아웃이 깨짐forwardImageView와 countLabe..
UIKit 기반 프로젝트에서 Clean Architecture + MVVM-C 설계 UIKit 기반 프로젝트에서 MVVM 아키텍처를 활용하면서 ViewModel이 점점 비대해지는 문제와 ViewController에서 직접 화면 전환을 수행하는 비효율적인 구조를 경험했다.이러한 문제를 해결하기 위해 Clean Architecture를 적용하여 역할을 명확히 분리하고, Coordinator 패턴을 도입하여 화면 전환을 보다 효율적으로 관리하는 방식으로 설계를 개선하였다. 이 글에서는 MVVM-C 패턴과 Clean Architecture를 결합하여 설계한 과정과 고려한 점을 공유하고자 한다. 1️⃣ 기존 MVVM 아키텍처에서의 문제점ViewModel의 점진적 비대화 문제기능과 로직이 추가될수록 ViewModel이 점점 커지면서 여러 역할을 동시에 담당ViewModel이 비즈니스 로직 처리, ..