검증NumberterKit이 그럼 기존의 Race Condition 문제를 해결했는지와 실제로 성능은 어느정도 개선되었는지에 대해 분석하였습니다. 테스트 케이스를 통한 검증앞서 수동 테스트로 동작을 확인했지만,신뢰할 수 있는 결과를 보장하기 위해 XCTestCase를 통한 자동화 테스트도 함께 진행하였습니다.다음과 같이 Race Condition 재현 테스트를 테스트 케이스로 등록하여,매번 일관된 결과가 출력되는지 검증했습니다.import XCTestfinal class FormatterProviderTests: XCTestCase { func testDecimalFormatterRaceSafe() { let number = NSNumber(value: 1234.5678) ..
iOS
NumberFormatter()를 개발하던 도중, static Formatter 공유 방식이 멀티스레드 환경에서 Race Condition을 유발한다는 테스트 결과를 확인하였습니다. 이번 개선에서는 해당 테스트를 동일하게 반복 실행하여,SpinLock 동기화 적용 전후의 차이를 직접 검증하였습니다. 결과적으로, SpinLock을 적용한 이후에는 설정 충돌 없이 일관된 결과가 출력됨을 확인할 수 있었습니다. 공용 NumberForamtter() 인스턴스 접근앞선 블로그에서 작성했듯이, 다음과 같은 문제점이 발생하였습니다.public extension Decimal { func formatted(fractionDigits: Int) -> String { FormatterProvider.d..
데이터 변환의 불편함iOS 앱을 개발하다 보면 숫자를 문자열로 변환하거나, 통화 및 퍼센트로 표시하는 등의 작업을 반복적으로 하게 됩니다. 저 또한 최근에 개발한 프로젝트가 가상 화폐와 관련된 프로젝트였기 때문에 Int64, Decimal 등의 데이터 타입의 변환이 빈번하게 발생하였습니다. 보통 이런 상황에서 Extension이나 Formatter와 관련된 폴더 및 파일을 생성하고 관리합니다.하지만 이러한 처리 로직이 프로젝트마다 다르게 작성되고, formatter 설정 방식도 일관되지 않다 보니 유지보수가 어려워지는 문제를 겪게 되었습니다. 특히, 같은 Decimal 타입이라도 어떤 화면에서는 소수점 없이, 어떤 화면에서는 소수점 둘째 자리까지 표현해야 하는 상황이 빈번하게 발생하였고, 이에 따른 fo..

View ProtocolUIKit과 비교하였을 때 SwiftUI의 특징은 struct로 이루어졌다는 것과 View Protocol을 채택하고 있다는 것입니다. SwiftUI에서 우리가 작성하는 대부분의 화면은 View 프로토콜 기반으로 구성되며, 그 중심에는 body라는 프로퍼티가 존재합니다.@MainActor @preconcurrency public protocol View { /// The type of view representing the body of this view. /// /// When you create a custom view, Swift infers this type from your /// implementation of the required ``View/b..

SwiftUI는 애플이 만든 선언형(Declarative) UI 프레임워크로, iOS, macOS, watchOS, tvOS 전반에서 통일된 방식으로 앱의 UI를 구축할 수 있게 해주는 프레임워크입니다. SwiftUI의 탄생 배경UIKit, AppKit 등 기존의 프레임워크는 다음과 같은 문제점을 가지고 있었습니다.UIKit / AppKit의 문제설명명령형 구조복잡한 상태 변화 처리, 많은 버그 유발뷰 업데이트직접 상태를 추적하고, 뷰를 수동으로 갱신코드 중복플랫폼마다 API가 달라, iOS와 macOS 개발을 별도로 해야 함UI와 로직 분리 어려움코드 양이 많아지고, 의도 파악이 힘듦 애플은 이러한 문제를 해결하기 위해 다음과 같은 특징을 지니고 있는 SwiftUI를 개발하였습니다.Swift의 안전성과..

MVVM 패턴을 도입하게 된 이유와 구조적 이점iOS 개발을 하다 보면, UIViewController 파일이 점점 커지고 복잡해지는 상황을 자주 마주하게 됩니다.기능이 늘어나면서 화면 구성, 사용자 입력 처리, 네트워크 통신, 데이터 가공 등 여러 역할을 한 클래스에서 수행하게 되는데, 이로 인해 코드의 가독성과 유지보수성이 급격히 떨어지게 됩니다.이러한 문제를 해결하기 위해 등장한 것이 바로 MVVM(Model - View - ViewModel) 패턴입니다.이번 글에서는 MVVM 패턴의 구성 요소와 각각의 역할, 그리고 실제 예제를 통해 어떻게 ViewController의 책임을 줄이고 관심사를 분리할 수 있는지를 정리해보고자 합니다. MVVM의 구성 요소MVVM은 그 이름처럼 Model, View,..

MVCMVC 패턴은 Model-View-Controller의 구조를 가지는 디자인 패턴으로, UIKit 프레임워크에서 자주 사용되는 디자인 패턴입니다. UIKit 프레임워크는 MVC 패턴을 기반으로 구성되어 있습니다.Model-View-Controller는 각자 다른 역할들을 가지고 있습니다.Model앱에서 사용되는 데이터와 비즈니스 로직을 담당합니다.UI와 독립적으로 이루어져 있으며, 데이터 저장 및 가공, 네트워크 요청 처리 등을 수행합니다.값이 변경되는 데이터를 Model이 가지고 있는 경우에는 Notification과 KVO 등을 통해 Controller에 변경 사항을 전달합니다.View사용자에게 화면을 표시하는 역할을 담당합니다.버튼, 레이블, 이미지 등의 **UI 요소들(UIView, UIBu..

여러 데이터를 표현하기 위해선 다양한 방법으로 구현할 수 있습니다. 그 중에서 반복적인 형식의 데이터를 표현하는 방법 또한 여러 가지인데, 대표적으로 UICollectionView, UIPageViewController, UIScrollView가 있습니다. 각 뷰가 어떻게 동작하는지와 메모리의 관점에서 어떠한 특징을 보이고 있는지 학습하였고, 이를 기반으로 상황에 따라 어떠한 뷰를 사용할 지 정의하고자 합니다. UICollectionView동작 방식UICollectionViewCell을 기반으로 데이터를 리스트 또는 그리드 형태로 표시합니다.재사용 큐를 사용하며, 보이지 않는 셀은 메모리에서 로드 또는 제거되지 않고, 재사용됩니다.메모리 관점셀을 재사용하기 때문에 효율적입니다. UIPageViewCont..