TCA + Clean Architecture에서 의존성 관리, Needle 도입한 이유
·
SWIFT개발일지
안녕하세요! 오늘은 아주아주아주 오랜만에 TCA 관련 글을 써보려해요. 어느새 입사 2달차가 되었습니다 🥳현재 프로젝트에서 TCA + Clean Architecture를 기반으로 기능별 모듈화를 목표하고 있어요그런데 의존성 관리를 Needle로 하고 있더라고요. 처음엔 솔직히 의문이 들었어요.TCA에 @Dependency 있잖아. 근데 왜 굳이 Needle을 또 써?? 제 윗 선배님들이 왜 Needle을 쓰는지, 기존 TCA의 한계는 뭔지 공부할 수 있는 힌트를 주셨어요 :) 그걸 바탕으로 제가 직접 파헤쳐보고 내린 결론을 정리해보려 합니다. 비슷한 의문을 가진 분들께 도움이 됐으면 좋겠어요! Clean Architecture를 적용해서 Layer별 모듈화가 되어있다고 가정을 해볼게요App/ 앱 진입..
푸시 알람을 어떻게 설계할까?
·
iOS
토스 같은 금융 앱은 하루에 수백만 건의 알림을 보냅니다. 송금 완료, 카드 결제, 이벤트 참여, 마케팅까지.....만약 이걸 그냥 "생각날 때마다" 보낸다면? 사용자는 알림 폭격에 스트레스 받아서 앱 삭제할 겁니다. 저도 쓰잘데기 없는 알람이 많은 앱들은 성가셔서 대부분 삭제했어요... (죄송합니다 개발자분들)실제로 Localytics 연구에 따르면 사용자의 절반 이상이 성가신 알림 때문에 알림 권한 자체를 거부한다고 하죠.그럼 대기업들은 어떻게 할까요? 그저 "알림 보내기"가 아니라 "언제, 어떻게, 얼마나 자주 보낼 것인가"를 시스템적으로 설계합니다. 이를 위해 알람에 대해 먼저 공부하고 -> 어떻게 설계하는지 -> 로 이어지면서 오늘의 글을 시작하겠습니다:) 발송 주체 Local VS Remot..
iOS 이미지 포맷과 압축 방식 - 사진은 HEIC인데 스크린샷은 왜 PNG일까?
·
iOS
그거 아세요???iPhone으로 사진을 찍으면 파일 확장자가 .HEIC인데, 스크린샷을 찍으면 .PNG로 저장된다는 사실을요!!왼쪽 사진은 제가 직접 쿠알라룸푸르에서 찍은 트윈타워! 그리고 오른쪽은 그 화면을 다시 캡처한 이미지에요! 그래서 파고들기 시작했습니다. 그리고 알게 됐어요.이게 단순히 "애플이 그냥 그렇게 만들어서"가 아니라, 각 포맷의 압축 방식과 특성이 완전히 다르기 때문이라는 걸요. 오늘은 이 이야기를 해보려고 합니다. iOS에서 이미지가 어떻게 처리되는지, 그리고 왜 상황에 따라 다른 포맷을 쓰는지 말이죠. 그리고 살짝쿵 이미지 압축 처리도 들어있어서 어려울 수 있어요:(이미지가 화면에 보이기까지사실 이거는 이전에 https://codeisfuture.tistory.com/96 근본으로..
클린아키텍처 - 입사 1개월 차의 시선으로 다시 읽어보다
·
도서관
예 맞아요 그 유명한 로버트 C, 마틴님이 작성한 그 책입니다. 사실 저번에 SOLID 관련된 내용은 https://codeisfuture.tistory.com/86 클린아키텍처 - (좋은벽돌까지만이라도 만들어보자) 로버트C.마틴왜 설계와 아키텍처를 고민해야 할까?작년 이맘때 처음 클린 아키텍처 책을 읽었는데, 이번에 다시 펼쳐본 이유는 명확했습니다.객체지향 설계에 대해 생각하는 기회가 생겼거든요 🤔로버트 C.codeisfuture.tistory.com이미 1편에서 썻어요.. 그러면 왜 2편을 또 쓰냐??1. 사실 뒷 부분 이해가 잘 안갔어요..정확히 1년2개월전에 읽고 쓸때 뭔말인지. 공감도 안됐어요2. 입사 한달차가 되어가는데....네이버 부캠에서 완벽하게 정의내리지 못한 Usecase의 여파가 다..
ProtoBuf - 이게 뭔데 사람들은 환호성을 지를까?
·
SWIFT개발일지
우버나 카카오 네비 앱을 켜면 뭐가 보이나요? 지도 위에 내 위치가 표시되고, 주변 차량들이 실시간으로 움직이고, 예상 도착 시간이 계속 업데이트되죠.실시간 위치 서비스, 얼마나 많은 데이터가 오갈까요?가정을 하며 생각을 해볼게요.1초마다:내 GPS 위치 → 서버주변 운전자 10명의 위치 ← 서버예상 도착 시간 재계산 ← 서버도로 교통 상황 ← 서버한 명의 사용자만 봐도 이 정도인데, 동시에 100만 명, 아니 그 이상이 사용한다면? 🤯🧐 REST API로 실시간 위치를 추적한다면? -> 폴링 방식// 1초마다 서버에 요청Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in fetchDriverLocations { locations..
아 지겹다 복붙! Xcode 커스텀 템플릿 만들기
·
SWIFT개발일지
TCA로 프로젝트를 진행하면서 정말 지긋지긋했던 순간이 있어요. 새 Feature를 추가할 때마다:// 1. Feature 파일 만들고@Reducerpublic struct UserLoginFeature { @ObservableState public struct State: Equatable { // ... } // 이하 생략}// 2. View 파일 만들고public struct UserLoginView: View { @Bindable var store: StoreOf // ...}// 3. 파일명을 UserLogin으로 일일이 바꾸고...음 벌써 파일을 두개 만들었죠..?? 10번째쯤 되니까 너무 귀찮더라고요. 그래서 찾아본 게 Xcode 커스텀 템플릿이었..
BLE 완전 기초: CoreBluetooth를 이해하기 위한 필수 개념
·
SWIFT개발일지
블루투스 기기와 통신하는 iOS 앱을 만들려면 CoreBluetooth를 써야 해요. 그런데 막상 문서를 열어보면 Service, Characteristic, GATT... 생소한 용어들이 쏟아지죠. 이 글에서는 CoreBluetooth를 제대로 이해하기 위한 기초 지식을 다룰 거예요. BLE가 왜 탄생했고, 어떻게 동작하는지 알고 나면 CoreBluetooth를 다루는데 쉬울거라고 생각합니다:)Classic Bluetooth: 어떤 한계가 있었나?초기 블루투스는 "케이블을 없애자"라는 목표로 탄생했습니다. 지속적인 연결과 높은 데이터 전송률에 최적화됐죠.하지만 시대가 변했습니다. 에어팟, 혈당 측정기, 스마트워치 같은 센서 기기들이 폭발적으로 늘어났어요. 이런 기기들은 한 번 충전으로 며칠, 심지어 몇..
SwiftUI Instruments 하기
·
카테고리 없음
왜 SwiftUI 성능 디버깅이 어려울까?UIKit에서는 Time Profiler로 백트레이스 찍어보면 viewDidLoad에서 뭘 너무 많이 했나, tableView(_:cellForRowAt:)에서 뭘 건드리고 있나 단계별로 명령들을 볼 수 있었어요 그런데 SwiftUI로 넘어오면서 상황이 달라졌어요. 스크롤이 버벅대는데, Time Profiler를 열어보면 뭔가 알기가 어려워요. 선언형 패러다임의 양날의 검일 수도 있는데 이전과 달리 무엇에 집중하다 보니 어떻게는 뛰어넘어 그 어떻게를 보기 힘든거죠!!! 그래서 이번 WWDC26에서는 Instruments를 업데이트 해줬습니다:)(사실 원래도 있긴 했어요)먼저, SwiftUI의 렌더링 루프를 이해해야 해요요즘 아이폰은 대부분 120fps이기에 초당 ..
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 ..