챗봇 앱을 구현하면서 TCA를 활용해 아키텍처를 구성할까, 클린아키텍처를 활용해 구성할까 고민하다가 외부라이브러리를 사용하지 않고 클린아키텍처를 통해 제대로 한번 구현해보고 싶은 마음에 클린아키텍처를 활용해 프로젝트를 구성하기로 했다. 이전 블로그 글을 통해 클린아키텍처에 대해서 정리했지만 간단하게 다시 훑고 지나가 보자 클린아키텍처는 크기 Presentation, Domain, Data 로 계층을 나눈다. Presenstation은 UI와 사용자의 상호작용을 처리하는 역할을 담당하고 View와 ViewModel로 나뉜다. View는 사용자의 행동을 받아드려 ViewModel로 전달하게 되고 ViewModel은 사용자 이벤트를 처리하며 UseCase를 호출해 비즈니스 로직을 실행한다. Domain은 핵심..
11월 25일 월요일 날 세종대학교에서 열린 2024 Let’s Swift에 다녀왔다 첫 컨퍼런스 참여라 많은 기대를 하고 방문하게 되었는데 회사에서 티켓도 사주고 연차도 지원해줘서 아주 나이스.. 덕분에 좋은 경험했다!날씨도 너무 좋고 세종대학교 처음 가봤는데 캠퍼스가 너무 이쁘다.. 대학 졸업한지 한참 지난 다음 대학교에 다시 오니 젊은이들 학교 다니는 모습들에 참 가슴이 몽골몽골해지기도 한 것 같다. 9시 30분부터 입장이 가능했고 나는 9시 30분에 시작으로 착각해 8시 50분에 도착해버렸다.. 조금 더 잘 수 있었는데..처음 도착하면 입장권을 확인하고 앱을 설치하면 스탬프를 받을 수 있었다. 앱을 설치하고 그 안에 시간표랑 여러가지 확인도 할 수 있어서 간편하게 사용하기 위해 미리 다운을 받았다..
오늘은 지금까지 수집한 데이터를 바탕으로 데이터 수집량에 관한 진행상황을 알 수 있는 주간 캘린더와 데이터를 시각화해 이해를 도울 수 있는 작업을 진행하였다. 먼저 캘린더 구현된 내용을 살펴보면 날짜를 1주일 단위로 보여주고 그 밑에 일자별로 데이터 수집량을 확인할 수 있도록 구현하였다.컴포넌트화 하기 위해 수집량을 파악하는 Progress 뷰와 캘린더뷰를 별도로 구분했다. CalendarView먼저 캘린더뷰를 살펴보자import SwiftUIstruct CalendarView: View { @State private var selectedDate = Date() @State private var showMonthPicker = false private let calendar = Cale..
오늘은 이전에 백그라운드를 통해 데이터를 수집했던 로직을 사용했을 때 iOS 정책 상 디바이스가 잠겼을 때 데이터에 접근할 수 없는 다소 민감한 데이터들을 처리하기 위해 고민 했던 내용을 기록으로 남겨두려고 한다. SensorKit, HealthKit 데이터와 같이 다소 민감한 데이터는 백그라운드에서 데이터 수집이 가능하지만, 디바이스가 잠겨있을 때 데이터 접근이 불가해진다. 목표는 최대한 많은 데이터를 수집해야하기 때문에 이 점을 바탕으로 가장 최선의 방식은 디바이스 잠김이 해제됐을때 데이터를 수집할 수 있도록 구현하는게 가장 좋다고 판단했다. 먼저 가장 중요한 개념은 UIApplication에서 protectedDataDidBecomeAvailableNotification 부분이라고 볼 수 있다. h..
오늘은 앱 내 다양한 라이브러리를 바탕으로 생체데이터, 생활 데이터 등 이용자의 데이터를 수집하고 해당 데이터를 저장하기 위해 firebase에 데이터를 저장하는 방식에 대해서 알아보려고 한다. 이전에 다룬적이 있으니 SPM을 통해 firebase 를 추가하고 firebase에서 콘솔에 프로젝트를 추가해 GoogleService-Info.plist를 추가하는 과정은 생략하고 진행해보자 ㅎㅎ 이미 많이 해봤으니까! firebase 중 realtimeDatabase에 데이터를 저장하는 과정을 기록해보려고 한다. 먼저 Firebase 데이터 베이스에 접근하기 위해 Database 참조를 생성해 담아주어야 한다.private let realtimeDatabase = Database.database().refer..
이번에 SwiftUI , TCA를 활용하면서 개인 프로젝트를 진행 중인데 이 과정에서 왜 사용하고 있었는지 의문이었던 부분을 기록으로 남겨두려고 한다. Equatable먼저 Swift에서 Equatable 프로토콜을 사용하는 이유는 두 객체를 비교해서 동일한지 여부를 판단할 수 있게 해주기 때문에 Equatable 채택해 == 연산자를 구현하는 방식으로 두 객체를 비교하게 된다. Swift 컴파일러는 struct나 enum이 Equatable을 채택할 때 모든 저장 프로퍼티가 Equatable를 준수하면 자동으로 == 연산자를 구현해주기 떄문에 직접 구현하지 않아도 돼서 매우 편리한 방법이다.import ComposableArchitectureimport MapKitstruct RunningState:..