2024/09 11

We do not provide support for this pre-release version.

We do not provide support for this pre-release version. Issue with `tuist graph` after updating to macOS After upgrading to macOS 15, I encountered the following error when running the tuist graph command ProblemThe 'brew' command exited with error code 1 and message:Warning: You are using macOS 15.We do not provide support for this pre-release version.It is expected behaviour that some formulae..

SwiftUI로 Placeholder가 존재하는 TextField 설계 팁 (UIKit호환)

SwiftUI로 Placeholder가 존재하는 TextField 설계 팁 (UIKit호환) 최근에는 SwiftUI와 UIKit을 정말 많이 혼용해서 사용하고 있음.특히 몇몇 컴포넌트들은 SwiftUI로 작성한 것들을 UIKit에서 가져다가 사용하는 컴포넌트들이 많은데, 서로 손쉽게 사용할 수 있도록 설계.  글의 순서구현 결과 스크린샷구현 예시 코드SwiftUI UsageUIKit Usage 구현 결과 스크린샷  구현 예시 코드구현 포인트 @State, @Binding을 외부에 직접 노출시키는 것이 아닌 Delegate를 통해 이벤트를 전달함.장점: UIKit에서 공통된 코드 규칙으로 편리하게 사용할 수 있음.  import SwiftUI/// 리스트에서 사용하는 검색 필드struct Search..

Dependency Container 만들기

Dependency Container 만들기 의존성 주입해줘야 하는데, 매번 의존성 주입을 위해 반복되는 작업을 하는게 불편함.SwiftUI에서 @EnvironmentOjbect를 활용한 처음 작성한 코드를 새롭게 바꿔보고자 함. 글의 순서environmentObjcet를 활용한 초기 개발주입할 것들을 구조체로 분리하여 정의주입할 객체 생성하기UI구성하는 Builder에 주입하기 environmentObjcet를 활용한 초기 개발 모듈화 전 해당 부분을 처리할 때 SwiftUI에 environmentObject를 활용하고자 함.사유: App Root 영역에서 container를 작성해두면 모든 하위 뷰에서 사용할 수 있기 때문개선하기로 한 이유UIKit과 혼용해서 사용할 때 보라색 이슈가 발생하며,..

SwiftUI 하위뷰에서 상위뷰로 DelegatePattern을 활용해 이벤트 전달하기

SwiftUI 하위뷰에서 상위뷰로 DelegatePattern을 활용해 이벤트 전달하기  글의 순서상황어떻게 처리할까?코드 적용 예시마무리 상황홈 화면에서 프로필 리스트가 있는 네비게이션 방식으로 화면을 전환하고, 해당 화면에서 프로필을 전환하고 pop 혹은 dismiss로 홈 화면으로 돌아왔을 때, 프로필이 전환되어야 함. 즉, 하위 뷰가 상위 뷰로 프로필이 전환되었음(이벤트)을 알려야 함. 어떻게 처리할까?우선 UIKit에서라면 여러가지 방법이 있겠지만, 단순하게는 Delegate Pattern이 있음.SwiftUI에서는 Environment, preferenceKey를 활용할 수 있고, @State, @Binding을 활용해 하위 뷰와 연결할 수도 있음. SwiftUI에서 제안된 방법들은 사용..

Coordinator 모듈을 통해 UI 모듈간 순환참조 해결하기

Coordinator 모듈을 통해 UI 모듈간 순환참조 해결하기  모듈을 분리하면서 화면 이동에 대한 처리가 필요해짐.기존 구조에서`UI` 모듈끼리 서로의 UI 및 기능이 필요한 경우 모듈간 순환참조가 발생할 수도 있음. 글의 순서완성한 동작 영상문제 상황아이디어 스케치Coordinator 모듈 설계하기UI 모듈 영역 적용 및 사용App 모듈 영역 적용 및 사용PresentationView 자세히보기NavigationDestinationView 자세히보기   완성한 동작 영상 영상 재현경로 설명HomeUI (모듈)[present] MultiProfileUI (모듈)[navigation] > ProfileEditUI (모듈)3개의 모듈이 화면전환이 정상적으로 동작함.   문제 상황예를 들어 홈 > 통합검..

모듈화 리팩토링 과정에서 고민했던 것들

모듈화 리팩토링 과정에서 고민했던 것들 Tuist 3.x 버전으로 사용한게 마지막이라 4.x 버전으로 학습하고 변경해보고자 함.최근 모듈화 관련 글과 다른 사람들이 사용한 Tuist 프로젝트를 여럿 보면서 어떤 부분은 기존에 내가 사용하던 부분보다 나은 점도 많다고 느낌.매번 모듈화에 같은 구조를 사용했는데, 다른 사람들이 작성한 프로젝트를 참고해 해당 구조로 구성하여 작성해보면서 장단점에 대해서 고민해보고자 함. 글의 순서프로젝트 모듈화 구조 스크린샷리팩토링 시작 전 생각 정리NetwrokSDK 모듈에 대해서feature에서 ui를 분리한 이유화면전환 어떻게 할 것인지이미 구현된 UI가 필요한 경우는 어떻게 할 것인가?관리하는데 드는 비용에 대한 고민마무리 소감 프로젝트 모듈화 구조 스크린샷  리팩토링..

SwiftUI 화면 dismiss 상황에서 흰 화면 나타나는 문제

SwiftUI 화면 dismiss 상황에서 흰 화면 나타나는 문제 SwiftUI 기반의 코드에서 화면 dismiss 상황에서 흰 화면이 나타나는 문제가 발생하여 그 과정을 기록 글의 순서해당 현상에 대한 영상프로젝트에서 사용한 화면 전환 방식해당 현상이 발생했을 때 흰화면이 나타나는 원인 분석어떻게 해결하는게 좋을까?현재 상황에서 해당 문제가 왜 발생할까?어떤 방식을 선택하는게 좋을까?향후 생각할 포인트.  해당 현상에 대한 영상문제 현상 재현을 위해서 내부 컨텐츠를 제거하고 화면전환.해당 현상 재현 플로우홈 > 멀티 프로필 > 프로필 생성 > 프로필 생성 닫기 > 멀티 프로필 닫기 > 홈홈 멀티 프로필 간에는 문제가 되는 코드로 작성멀티 프로필 프로필 생성 간에는 문제가 없는 코드로 작성 프로젝트에..

Swift Concurrency를 적용하면서 발생한 동시성 문제

Swift Concurrency를 적용하면서 발생한 동시성 문제사내에서도 동일한 이슈가 발생했었어서 해당 부분에 대해서 정리하고자 함.기존 Combine으로 작성된 코드를 async-await으로 교체하는 작업을 진행.  글의 순서Combine으로 작성된 코드 살펴보기Swift Concurrency로 단계적으로 전환하기Swift Concurrency로 안전성 확보하기Combine에서 Swift Concurrency 적용 Combine으로 작성된 코드 살펴보기기존 코드는 캐싱을 위해 캐시 프로퍼티가 존재하며, Combine을 기반으로 작성되어 있었음.Combine을 선택한 이유는 RxSwift가 익숙하여, RxSwift와 닮은 애플 퍼스트파티 선택에서 Combine을 선택   Swift Concurre..

UseCase와 Repository 테스트 목적 정리

UseCase와 Repository 테스트 목적 정리 이 포스팅은 현재 기준으로 내가 테스트 코드를 작성할 때 가지는 일종의 가이드라인. 성장하면서 바뀔 수도 있음. 글의 순서UseCase 테스트 목적Repository 테스트 목적Repository 테스트 하기SearchSubwayUseCaseTests 실패 후 로직 보완 안드로이드 공식 앱 아키텍처 가이드를 확인하면서 UseCase 영역에 해당하는 Domain이 Optional로 되어 있음을 확인할 수 있었음.개인 경험에 의하면 실제로 UseCase에서 특별한 처리 없이 사실상 래핑에만 해당하는 경우도 많긴 함. 일반적인 상황에서는 Domain Optional 이어도 나쁘지 않겠지만, 기능이 하나 둘 추가되면서 Repository가 두꺼워지고 결국은 ..

apple/XCTest 2024.09.20

지하철 검색 기능에 캐싱 로직 도입하기

지하철 검색 기능에 캐싱 로직 도입하기 지하철 검색 로직에 캐싱 로직을 도입. 글의 순서SearchSubwayUseCase 개선SearchSubwayUseCase 테스트를 위한 Stub 객체 만들기SearchSubwayUseCaseTests 캐싱 로직 동작 검증 코드SearchSubwayUseCaseTests 실패 후 로직 보완  지하철 검색 로직은 사용자가 키보드를 통해 검색어를 입력할 때 throttle을 활용해 약간의 시간을 두어 검색을 실행.여기까지는 우리가 일반적으로 사용하는 검색 로직. 동일한 값에 대해 서버 요청을 줄이고, 동일한 결과값을 더 빨리 제공할 수 있으므로 이점은 확실. SearchSubwayUseCase 개선기존에 Combine을 활용해서 처리하고 있었는데, cache 프로퍼티..