[25.04.24] 객체 지향 5원칙 - 단일 책임 원칙(SRP)
·
CS
Swift로 개발해오면서 어느 계층은 어떤 책임을 가져야 한다 같은 생각을 가지고 있었고, 이는 곧 유지보수성으로 연결되는 점까지는 인지하고 있었습니다. 중구난방한 코드는 소프트웨어 내 변경이 필요한 경우에 큰 비효율을 초래하기 마련이고, 유지보수성과 유연한 확장을 위한 원칙으로 SOLID 원칙에 대해 알아보게 되었습니다. 지금 공부해보면서도 이해는 어렴풋이 되지만 온전히 와닿진 않았기에 원칙들에 대해 하나씩 뜯어보며 현재 운영중인 토도독의 리팩토링을 진행해보고 더 깊게 생각하는 시간을 가져보겠습니다! SRP, Single Responsibility Principle객체는 오직 하나의 책임을 가져야 한다 (객체는 오직 하나의 변경의 이유만을 가져야 한다.)class UserManager { func..
[26.03.16] NSLock에서 Actor로 RefreshTokenManager 개선기
·
iOS/Swift
1. 문제 상황https://subkyu-ios.tistory.com/60 [25.12.07] MOUP 트러블슈팅 - Keychain 관련 Race Condition1. 문제 상황알림 기능 구현 이후 앱 실행 시 어째선지 자꾸 크래시가 난다. 당시 로그엔 Keychain 데이터 저장 시 문제가 생겼다는 말과 함께 명확히 어떤 문제인지 파악이 되지 않았는데,AI를 조금subkyu-ios.tistory.com 해당 트러블슈팅에서 n개의 api 호출이 동시에 일어나게 될 때 토큰 재발급을 해야하는 상황이었다면 재발급 받은 토큰을 키체인에 동시에 n번 저장하는 과정이 있었습니다. 해당 과정 속에서 키체인 내 이미 저장되어있던 정보가 온전히 삭제되지 못한 채 새로 저장을 시도하게 되면 크래시가 나던 상황이 있어 ..
[26.03.13] Coordinator에서 뒤로가기 이후 UI 상태를 복구하는 방법 (UINavigatio
·
iOS/Swift
1. 문제 상황타이머가 0초가 되어 세션이 종료되면, 다시 시작 기능을 제공하는 종료 시트가 뜨는 플로우입니다.여기서 사용자가 "다시 시작"을 누르면 다시 타이머 설정 화면으로 이동하게 되는데, 이후에 문제가 생겼습니다.. 사용자가 타이머 설정 화면에서 새 타이머를 시작하지 않고 뒤로 갔을 때 세션 화면으로 돌아오긴 하지만, 직전 종료됐던 사이클의 독서 기록 저장 시트가 다시 떠야 하는데 뜨지 않습니다. (기존 시트에서 다시 시작을 누르면 dismiss 후 동작을 하도록 설정해두었기에) 기획된 플로우는 이렇습니다. 뒤로가면 다시 시작할 수 있도록 제공해주어야 하는데 원래 뜨지 않고 타이머만 하염없이 바라보아야만 했습니다..2. 기존 접근 방식의 한계처음에는 이 문제를 navigation stack 자체를..
[26.03.04] AVCaptureMetadataOutput 바코드 중복 인식으로 인한 API 다중 호출 문제 해결
·
iOS/Swift
1. 문제 상황앱 내 바코드 스캐너 기능이 있는데 한번 인식하면 추가 인식을 멈추고 이미 인식된 ISBN 값을 보내 도서에 대한 정보를 받아오도록 했습니다. 아래 코드에서 stopScanning 메서드를 통해 세션을 멈추도록 해두었는데요바코드 인식 성공 시 하단 로그와 함께 viewModel의 Input을 타고 들어가 해당 isbn에 대한 도서를 조회하는 api를 호출합니다.즉, 저렇게 많은 로그가 뜬 만큼 조회 또한 요청되었습니다.. extension BookScannerViewController: AVCaptureMetadataOutputObjectsDelegate { func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metada..
[26.01.19] 타이머 종료 시 로컬 알림이 뜨지 않는 현상
·
iOS
1. 문제 상황앱에서 타이머 종료 시 로컬 푸쉬 알림을 통해 타이머가 종료되었음을 알려야 했습니다.근데 이상하게 이 알림이 뜰 때가 있고 뜨지 않을 때가 있어서 한참 헤매고 있었는데요... 먼저 타이머 시작 시 설정은 다음과 같습니다. 타이머에 대해 구독하기 전 미리 UNUserNotificationCenter에 알림을 예약하도록 했습니다.시간은 그 코드 처리가 될 때 기준으로 종료 시간과의 간격을 넣어 종료 시간에 해당 알림이 뜨도록 구현했고, timer 구독하면서 내부에 넣어준 로직 또한 종료 시간 기준 현 시간과의 간격을 계산하여 잔여 시간으로 처리하는 것이고, 이 잔여 시간이 0초보다 작거나 같을 경우 타이머를 멈추고 관련 로직 처리 후 종료하도록 합니다! 타이머 종료 로직 중에선 누적 시간 처리..
[25.12.13] Coordinator 화면 전환 메서드, 어떤 방식으로 사용할까?
·
iOS/Swift
1. 문제 상황지난 MOUP 프로젝트에서 처음으로 Coordinator를 사용해보고 꾸준히 든 고민, coordinator를 vc에 주입하는 등 이러한 과정들이 정말 꼭 필요하며 최적의 방법인가?를 고민했다. ViewController 측에서 어느 이벤트를 통해 화면 이동을 해야한다는 판단을 하게 되면 화면 전환을 담당하는 coordinator의 메서드를 쓰도록 해야 하는데, 이 과정 속에서 지난 번엔 VC 내에 weak var coordinator를 통해 매번 주입받고 internal(접근제어자를 쓰지 않은 기본상태) 메서드를 사용해야 했는데 이 과정이 반복될수록 꽤나 번거로웠다.화면 전환이 들어가는 ViewController를 생성할 때마다 파라미터로 coordinator = self라는 코드를 넣어..
[25.12.07] MOUP 트러블슈팅 - Keychain 관련 Race Condition
·
카테고리 없음
1. 문제 상황알림 기능 구현 이후 앱 실행 시 어째선지 자꾸 크래시가 난다. 당시 로그엔 Keychain 데이터 저장 시 문제가 생겼다는 말과 함께 명확히 어떤 문제인지 파악이 되지 않았는데,AI를 조금 써가면서 원인 분석을 해보았더니, 초기 로그에 데이터 불러올 때 로그를 출력하도록 한 부분이 단서가 되었다.그리고 해당 크래시는 15분마다 일어났다. 이 15분은 서비스에서 정의했던 액세스 토큰 유효 시간이다.우선 기존 구조에선 초기에 액세스 토큰 만료 시 토큰을 재발급하는 처리 하나밖에 없었어서 UserDefaultsManager, KeychainManager를 통한 유저 관련 정보 저장이 이루어졌다. import Foundationimport Alamofirefinal class AuthInterc..
[TIL / 25.10.11] Combine,, 실습과 함께 훑어봤어요 2
·
iOS/Swift
1. 목표https://jsonplaceholder.typicode.com/users유명한 open api 중 하나인 해당 주소에서 얻어온 users를 테이블뷰에 띄우는 실습을 해봤다. 제대로 구현이 된다면 아래와 같은 결과가 나올 것이다.2. Presentation Layer 우선, 프로젝트 내 아키텍처는 새로 들어가는 프로젝트와 일부 유사하게 clean architecture 기반으로 가져가고 그 외 네트워크는 urlsession 사용한다. 전체적으로 퍼스트파티 위주로 구현한다. 우선 View에 대해선 반응형을 쓰지 않을때와 같았다.Rx를 썼을 때엔 RxCocoa를 사용해 UI 컴포넌트에 대해 여러 기능들을 제공받았는데, Combine엔 RxCocoa같은 게 없다고 한다..!사실 있는데 아직 처음 공..
[TIL / 25.10.11] Combine,, 실습과 함께 훑어봤어요 1
·
iOS/Swift
새 프로젝트에서 Combine을 도입해보기로 결정했기 때문에, 마침 배워보고 싶던 부분이라 공부해봤어요반응형 프로그래밍을 왜 쓰는건지 다시 되짚어보고,, 기존 RxSwift할 때와 어떻게 다른지 중심으로 보고 간단한 open api 받아와서 tableView에 바인딩하는거까지 해보겠습니다~ 1. 반응형 프로그래밍(Reactive Programming)반응형 프로그래밍은 값의 변화(데이터, 이벤트 스트림)가 마치 데이터 흐름처럼 연결/구독되고, 변화가 생길 때마다 자동으로 반응이 흘러가는 것. 비동기들은 기본적으로 예측 어려운 시점에 발생(입력, 네트워킹, 타이머, 센서 등)하기에, 많은 이벤트, 콜백, 비동기 작업을 하나의 Stream으로 간단히 체인/구독해서 관리하려는 개념이다. 퍼스트 파티 기준으로는..
[TIL / 25.09.19] Swift는 왜 struct를 권장하는가
·
카테고리 없음
Swift에서 struct와 class는 비슷해보이지만, 언어 설계 방향과 코드 전체 구조적 특성, 확장성 등 핵심적인 차이를 가진다. class의 경우 Objective-C와의 호환에 맞춰서 도입된 참조 타입(Reference type)이며, 상속, 런타임 타입 체크, ARC(자동 참조 카운트) 관리를 지원한다.struct의 경우 값 타입(Value type)으로, 복사 시 데이터 전체를 새로 복제한다. 상속이 불가능하며, Swift에서 struct는 C의 struct와 달리 메서드, 프로퍼티, 확장, 프로토콜 채택 등 객체지향적 특성을 모두 가진다.이 struct를 클래스와 동등한 1등 시민(First-Class Citizen)으로 두고 실제 표준 라이브러리와 SwiftUI 등 시스템 전반에 기본 설..