이번에 회사에 새로 입사하게 되어 온보딩 과정을 거치면서 matchedGeometryEffect라는 개념에 대해서 마주하게 되었다. SwiftUI에서 특정 항목에 대한 값 변동으로 인해 diffing을 거쳐 뷰가 변경되는 과정에 대해서는 이해하고 있었고, 애니메이션을 적용했을때 어떤 방식으로 이뤄지는지에 대해 이해는 했지만 조금 더 부드럽게 애니메이션을 구현하고 싶은 순간들이 있었는데 이부분에서 해법을 찾을 수 있는 matchedGeometryEffect를 알게 되었따! 예를 들어 탭을 선택한다고 했을떄 하나의 하단 막대바가 자연스럽게 좌우로 끊김없이 진행되고 싶을때 기존처럼 그냥 SwiftUI를 통해 조건문을 넣어 랜더링을 하게되면 상태값에 따라 뷰가 다시 그려지기 때문에 자연스럽게 이어지는게 아니라 ..
Swift Concurrency가 해결하고자 한 문제는 어떻게 보면 되게 간단하다 동시에 여러 스레드가 같은 데이터를 건드려도 안전하게 동작해야한다! 라는 점, 즉 Thread-Safety 문제를 해결하기 위함이다. 기존의 GCD를 활용했을때 문제점은DispatchQueue.global().async { myData.value += 1}이 코드가 여러 스레드에서 동시에 실행되면 하나의 value에 여러 스레드가 동시에 접근하고, 그 결과로 데이터 경합 (Race Condition)이 발생하게 된다. 이런 문제를 막기위해서는 락(NSLock)을 사용하던지, 세마포어, 시리얼큐 등 직접 안정성을 관리했어야 했던점이 불필요한 작업들도 많이 들고 비효율적이었다. 이러한 개념을 좀 해결하기 위해서 Swift C..
먼저 프로퍼티 래퍼가 나오게 된 이유에 대해서 설명해보면 프로퍼티 래퍼는 SwiftUI로 넘어오면서 자주 사용하게 되는 개념인데 말 그대로 프로퍼티를 감싸주는 요소라고 생각하면 된다. 프로퍼티 래퍼우리가 상태 추적을 위해 사용하던 State, Binding 등 프로퍼티 래퍼를 사용해 왔다 이 프로퍼티 래퍼는 왜 사용하게 됐을까먼저 프로퍼티 래퍼 안쪽을 살펴보면 프로퍼티의 반복적인 계산 속성을 하나의 프로퍼티 래퍼로 만들어 중복 로직을 작성하지 않고 사용할 수 있게 해주는 개념이다!struct User { private var _name: String = "" var name: String { get { _name.capitalized } set { _name = new..
옛날에 UIKit을 바탕으로 구현했던 터틀보카를 SwiftUI TCA를 활용해 마이그레이션을 진행했다. 진행허면서 TCA를 활용해 구현했을 때 가장 활용하고 싶었던 TestStroe를 활용한 테스트 코드 구현에 대해 알아보려고 한다. 먼저 이전에 스터디를 진행하면서 테스트 코드의 중요성? 에 대해 얘기 했을때 했던 얘기가 기억에 남는 것 같다 단순히 테스트 목적 보다 단독적으로 의존성을 분리하고 명확한 책임을 가지는 캡슐화 된 코드 구현을 지향할 수 있다는 말이 제일 와닿았던 것 같다. 먼저 TCA가 자랑하는 테스트 친화적인 구조는 입력이 같아 항상 같은 출력을 보장하도록 리듀서를 구성하여 테스트 코드 구현이 가능하다.TCA는 TestStore를 통해 테스트 진행이 가능한데 이를 통해 완전한 경리를 통해..
앞서 알아본 Concurrency는 async/await와 Task 기반의 동시성을 제공한다. 동시에 여러 일을 수행할 수 있게 되면서 중요한 문제가 생기는데 바로 바로 더 이상 필요 없는 일을 어떻게 중단하게 할건지? 에 대한 내용!! 예를 들어 사용자가 어떤 작업을 입력했는데 곧바로 해당 작업을 변경한다면 이전의 요청은 필요없어지게 된다거나, 화면을 떠났는데 여전히 해당 작업이 진행되게 된다면 불필요한 리소스를 낭비하게 된다. 이러한 점을 컨트롤하기 위해 Swift Concurrency에서는 어떤 작업 취소가 가능한지 한번 알아보도록 하자! 협력적 취소(Cooperative Cancellation)Swift Concurrency의 취소는 강제로 멈춘다의 개념이 아닌 단순히 작업에 깃발을 꽂아두는 것!..
구조적 동시성은 부모-자식 작업 계층을 명시적으로 만드는 모델이다. 부모가 만든 자식들은 일반적으로 병렬로 실행되게 되고, 부모가 끝나기 전에 자식이 모두 끝나도록 보장된다. 이 덕분에 아래와 같은 두가지 특징이 생긴다!작업 수명 (Lifecycle)이 스코프로 묶여 메모리/자원 누수 가능성이 줄고취소 전파와 우선순위 상속 등 런타임이 제공하는 안전장치를 자연스럽게 활용할 수 있다.여기서 Swift에서는 구조적 동시성을 위해 두가지를 제공한다!async letTaskGroup / withThrowingTaskGroup핵심 개념에 대해서 특징 별로 한줄로 요약하면 다음과 같다.병렬 실행 : 자식 작업은 기본적으로 병렬로 동작한다.스코프 보장 : 부모 스코프가 끝나기 전에 자식이 반드시 완료된다.취소 전파 ..