TCA를 사용하다 보면 네트워크 요청, 데이터베이스 접근, 시간 처리, UUID 생성 같은 외부 기능을 어떻게 Feature에 연결해야 하는지 고민하게 된다.이 때 사용하는 것이 Dependency다.Dependency는 Feature가 직접 외부 객체를 생성하거나 의존하지 않도록 하고, 필요한 기능을 의존성 주입 방식으로 전달하는 구조이다. Dependency란?Dependency는 Feature가 필요로하는 외부 기능을 직접 생성하지 않고 주입받는 구조를 의미한다.예를 들어 다음과 같은 기능들이 Dependency의 대상이 된다.네트워크 API 요청데이터베이스 접근파일 저장UUID 생성시간처리Analytics 이벤트이 기능들을 Feature 내부에서 직접 구현하면 테스트가 어려워지고 코드 결합도가 높..
안녕하세요.블로그 쓰시는 분들이라면 다들 깔끔하면서 가독성이 높은 스킨을 원하시잖아요.그렇다고 남들과 똑같은 스킨은 또 싫고요.저도 그래서 직접 만들게 되었는데,혹시나 원하시는 분들이 있을까봐 이렇게 올려봅니다.다른 분들이 파시는 스킨에 비해서 저렴한 편이라고 생각합니다.대신에 후속 관리는 조금 힘들 것 같아요.하지만 그럴 필요 없을 정도로 이쁜 스킨이니한 번 미리보기 봐보세요~! 포스타입 주소로 이동하면 보여집니다. 티스토리 스킨 CleanSkin1: 할머니의 창고안녕하세요. 블로그 쓰시는 분들이라면 다들 깔끔하면서 가독성이 높은 스킨을 원하시잖아요. 그렇다고 남들과 똑같은 스킨은 또 싫고요. 저도 그래서 직접 만들게 되었는데, 혹시나 원하시는www.postype.com 그럼 다들 즐거운 블로그 생활..
TCA의 모든 비동기 처리와 외부 데이터 흐름은 전부 Effect를 통해 이루어진다. 왜 필요한가?Reducer는 순수 함수여야 한다.즉, “입력(Action)을 받아 State만 변경하고 빠르게 끝나야 함”을 의미한다.Reducer 내부에서 네트워크 통신을 기다리거나 Task.sleep같은 코드를 직접 넣으면 앱 상태 예측이 불가능해진다.따라서 TCA는 비동기 작업이 필요할 때 “내가 직접 일하지 않고, Effect라는 작업 지시서를 만들어 반환”하는 구조를 취한다. Effect의 기본 동작 흐름 코드 예시 Reduce { state, action in switch action { case .fetchUserButtonTapped: state.isLoading = true //단순 데이..
TCA에서 ifLet은 부모 Reducer가 Optional(?) 상태로 존재하는 자식 Reducer의 로직을 안전하게 연결하고 수명주기를 제어하는 연산자(Operator)이다. ifLet의 정의와 역할정의부모의 State 내부에 자식 State가 Optional 타입 (예: ChildFeature.State?)으로 존재할 때, 이 값이 nil이 아닐 때만 자식 Reducer를 동작하도록 바인딩해 주는 메서드이다.역할조건부 로직 실행 : 자식 State가 존재할 때만 자식에서 들어오는 Action을 자식 Reducer로 전달한다.자동 메모리 & Effect 정리 : 자식 State가 nil로 바뀌어 화면이 닫히는 순간, 자식 Reducer에서 실행 중이던 모든 비동기 작업(Effect)을 자동으로 취소하..
Swift에서 enum을 각 케이스(case)를 마치 struct의 프로퍼티처럼 다룰 수 있게 해주는 매크로다.Swift의 struct는 \.name처럼 KeyPath를 써서 내부 값에 접근하기 쉽지만, enum은 케이스 안에 들어있는 연관값(Associated Value)에 접근하기가 번거롭다.@CasePathable은 enum에 이 경로(CasePath)를 자동으로 생성해주는 역할을 한다. 언제 어떻게 사용하나TCA에서 Action enum을 정의할 때 (가장 대표적)부모 Reducer가 자식 Reducer의 Action을 감지하거나 식별할 때 \Action.Cases.child 같은 형태의 경로가 필요한데, 이를 자동으로 만들어 준다.enum 안의 특정 값을 안전하게 끄집어내거나 변경하고 싶을 때원..
매크로와 프로퍼티 래퍼는 동작 방식과 역할이 완전히 다르다. 프로퍼티 래퍼ex) @Binding, @State앱 실행 중에 작동한다 (Runtime)변수의 읽기/쓰기 동작을 감싸서 추가 기능을 제공한다.비유 : 변수를 감싸는 스마트 포장지 매크로ex) @Observable, @Reducer 등코드 컴파일 시점에 작동한다. (Compile Time)보일러 플레이트 코드를 대신 작성해서 소스코드에 삽입한다.비유 : 코드를 자동으로 받아 적어주는 AI 비서
Swift 5.9 및 swiftUI에서 도입된 Property Wrapper로,@Observable 또는 @ObservableState 객체에서 양방향 데이터 바인딩을 추출할 때 사용한다.TCA(v1.7이상)에서는 기존의 복잡했던 ViewBinding 방식 대신, SwiftUI 표준 방식처럼 직관적으로 텍스트 필드, 토글, Sheet 팝업 등을 연결할 때 @Bindable을 활용한다. 핵심역할Store 객체 바인딩 : TCA의 Store를 @Bindable로 선언하면, $store 표기법을 통해 State 내부 값에 대한 Binding이나 Child Store에 대한 Scope 바인딩을 손쉽게 뽑아낼 수 있다.Boilerplate 감소 : 이전처럼 ViewStore를 선언하거나 일일이 Binding용 ..
=> TCA에서 화면전환(Navigation, Sheet, Alert 등)이나 팝업창을 제어하기 위해 상태(State) 속성에 붙이는 Swift 매크로이다.쉽게 말해 “이 데이터는 화면에 팝업이나 새 창으로 떠 있는 자식 화면의 상태입니다.”라고 알려주는 표식.왜 사용?화면 띄움/ 닫힘의 기준자식 화면 데이터가 nil이 아니면 화면이 나타나고, nil이면 화면이 닫힌다.메모리 및 수명 주기 자동 관리자식 화면이 닫혀서 nil이 될 때, 해당 자식 화면이 실행 중이던 비동기 작업(Effect)이나 취소 가능한 작업들을 TCA가 자동으로 안전하게 취소 및 정리해 준다.@ObservableState와의 호환성구버전 TCA에서는 @PresentationState라는 Property Wrapper를 사용했으나, ..