UIKit / SwiftUI에서는 무슨 디자인 패턴을 사용해야할까?
·
iOS
UIKit으로 개발할 때, 저는 Clean Architecture + MVVM + Coordinator 조합을 사용했어요. 사실 처음엔 누구나 그렇듯 MVC 패턴으로 시작했죠. 근데 이게... ViewController가 점점 비대해지더라고요. 전형적인 Massive View Controller 문제가 발생 🚨🚨첫 번째 시도: 상태를 Struct로 분리struct UserState { let name: String let email: String}class ViewController: UIViewController { private var state: UserState func updateUI() { nameLabel.text = state.name ..
URLSession 한 줄 뒤에 숨겨진 것들: DNS부터 전자기파까지
·
iOS
let task = URLSession.shared.dataTask(with: url) { data, response, error in // 응답 처리}task.resume()딸-깍 그런데 안에서는 어떤 동작이 이루어지는 지 아시나요? 이번 시간은 URLSession에 뭐가 있는지 아예 베이스에 대해서라기보다는 어떻게 동작하는지에 초점을 맞춰 글을 작성하려합니다.대신!! URLSession에 관해서는 아주 좋은 블로그를 추천해드리겠습니다:)https://codeisfuture.tistory.com/148 URLSession에 대한 에브리띵실제로는 URLSession은 Apple이 만든 거대한 URL Loading System의 하나인 거고 그 안에는 여러 라이브러리들이 있어요:) URL Loadi..
HTTP 캐싱(Etag & max-age) 그리고 iOS에서는?
·
iOS
왜 캐싱이 필요할까?대부분의 앱은 서버와 HTTP 통신으로 데이터를 가져와요. 그런데 이 과정에는 생각보다 큰 비용이 들어가죠.클라이언트(앱) → 네트워크 왕복 시간이 걸림서버 → 요청을 처리하느라 부하가 증가함사용자 → 데이터 사용량과 배터리를 소모함특히 이런 상황을 생각해봅시다.👉방금 받아온 데이터랑, 지금 또 요청하려는 데이터가 똑같다면? 업데이트된 정보도 없는데, 또 네트워크를 타는 건 이건 명백한 낭비죠입니다.이 문제를 해결하는 방법이 바로 HTTP 캐싱이에요.캐시는 어디에 저장되나?캐시는 어디에 저장되나?중간 서버에 캐시를 둔 구조CloudFront, Cloudflare 같은 CDNNginx, Varnish 같은 프록시요청이 캐시에 있으면 원 서버까지 안 가도 되지만, 여전히 네트워크는 타요..
전략패턴
·
디자인패턴
iOS 개발을 하다 보면 네트워크 요청을 하게 되고 URLRequest를 만들 때 이런 경우들이 있을 수 있죠:그냥 아무 데이터도 안 보내는 단순 GET쿼리 파라미터를 붙여서 GETJSON Body를 넣는 POST개발 초기에는 이런 케이스 몇개만 처리하면 충분합니다. 보통은 이렇게 enum으로 정의하고 switch로 분기했어요enum HTTPTask { case plain case query([String: String]) case json(Encodable)}그리고 URLRequestBuilder에서 이런 식으로…switch task { case .plain: ... case .query(let params): ... case .json(let body): ...}딱 여..
URLSession에 대한 에브리띵
·
iOS
실제로는 URLSession은 Apple이 만든 거대한 URL Loading System의 하나인 거고 그 안에는 여러 라이브러리들이 있어요:)URL Loading System의 전체 구조URL Loading System의 핵심 특징:비동기 처리: 모든 네트워크 작업이 백그라운드에서 수행되어 앱의 반응성 유지프로토콜 지원: HTTP, HTTPS, FTP, 파일, 그리고 커스텀 프로토콜까지 지원Cookie Storage (쿠키 관리부서 🍪)HTTPCookieStorage: 웹사이트 로그인 상태 유지, 사용자 설정 기억 등을 위한 쿠키 자동 관리HTTPCookie: 개별 쿠키 정보를 담는 컨테이너 역할Authentication & Credentials (보안 인증부서 🔐)URLProtectionSpace..
스크롤뷰는 어떻게 스크롤될까? 🤔 UIView 렌더링부터 시작하는 완벽 분석
·
iOS
iOS 앱에서 스크롤은 손가락을 움직이면 화면이 부드럽게 따라 움직이죠. 하지만 이 단순한 동작 뒤에는 iOS의 렌더링 시스템과 UIView의 핵심 속성들이 얽혀 있습니다. 이번 글은 UIScrollView가 어떻게 작동하는지, 그 근본적인 원리인 UIView의 렌더링 과정부터 시작해 frame과 bounds의 차이, 그리고 contentOffset의 정체(?)까지 깊이 파헤쳐 보겠습니다화면 렌더링의 두 단계: Rasterization과 Composition1단계: Rasterization (래스터화): 각 뷰가 자신의 이미지(콘텐츠)를 그리는 단계각 뷰가 자신의 콘텐츠를 비트맵 이미지로 변환하는 과정입니다. UILabel은 텍스트를, UIImageView는 이미지를 그리죠.여기서 중요한 점은 래스터화는..
이미지 URL 저장 시 마주하는 함정 문제들
·
SWIFT개발일지
PHPicker로 URL을 가져오게 된 계기PHPicker로 이미지를 가져올 때, 처음에는 Data 타입으로 메모리에 저장하려고 했어요. 그런데 문제가 생겼어요 🤔이미지 데이터를 Data 타입으로 저장하면 용량이 큰 이미지들 때문에 메모리 사용량이 급격히 늘어나거든요. 사진 한 장이 몇 MB씩 하니까, 여러 장 저장하면 금세 메모리 부족 경고가 뜰 수 있다고 판단을 내렸어요 그래서 생각해낸 방법이 URL만 저장해두고 필요할 때마다 파일을 읽어오는 방식이었어요 💪🏻result.itemProvider.loadFileRepresentation(forTypeIdentifier: "public.image") { url, error in guard let url = url else { return } ..
데이터 보관은 어떻게이루어질까(직렬화: NSCoding부터 Codable까지)
·
iOS
앱을 종료했다가 다시 켰을 때도, 내가 설정해둔 값들이 그대로 남아있어야 하잖아요?예를 들어 다크모드 설정이라든지, 게임 속 설정 같은 것들이요. 그런데 Swift에서 메모리에 올라간 객체들은 휘발성이라 앱이 종료되면 다 사라져 버립니다.그래서 iOS에서는 데이터를 영구적으로 저장하기 위한 여러 방법이 있어요.UserDefaults (가장 간단한 방법)가장 먼저 떠올릴 수 있는 게 바로 UserDefaults입니다. 작고 단순한 데이터를 저장할 때 쓰기 딱 좋아요 하지만! 지원하는 타입은 한정적입니다:String, Int, Double, Float, Bool, URL, Data 그리고 이 타입들로 구성된 Array, Dictionary결국 기본 타입들이네요? 그러면 우리가 개발하면서 만든 객체들은 어떻게..
객체 간 통신(delegate, Closure, NotificationCenter, KVO)
·
iOS
객체들끼리는 어떻게 협업을 할까?아! 그 전에 객체지향이 모냐면...데이터와 그 데이터를 다루는 행위를 하나로 묶고 메시지를 통해 협업하는 프로그래밍 패러다임 입니다캡슐화: 관련된 프로퍼티와 메서드를 하나의 객체로 묶고, 내부 구현은 감추며 외부에는 필요한 인터페이스만 제공책임 분리: 각 객체는 하나의 명확한 책임만을 가져, 역할이 겹치지 않도록 분리합니다.메시지 전달: 객체들이 서로 소통하며 더 큰 기능을 하는거죠객체지향을 처음 배울 때 이런 생각 해보셨나요? "그냥 하나의 클래스에 모든 기능을 다 넣으면 안 되나?"하지만 생각을 해보면 한 사람이 주문받고, 요리, 서빙, 계산까지 다한다면 그 한사람이 아프면 가게가 마비가 되겠죠?=> 바로 응집도가 낮고 단일 책임 원칙(SRP)을 위반한 결과입니다...