IOS
iOS Dependency Injection 개념 파악하기
의존성 주입이란? iOS 테스트 코드를 공부하며 상당히 많이 접했던 단어입니다. "의존성 주입" 은 무엇일까요? 이론적인 개념은 다음과 같습니다. ``` 소프트웨어 엔지니어링에서 의존성 주입(dependency injection)은 하나의 객체가 다른 객체의 의존성을 제공하는 테크닉이다. 클라이언트가 어떤 서비스를 사용할 것인지 지정하는 대신, 클라이언트에게 무슨 서비스를 사용할 것인지를 말해주는 것이다. "주입"은 의존성(서비스)을 사용하려는 객체(클라이언트)로 전달하는 것을 의미한다. ``` 출처: https://ko.wikipedia.org/wiki/%EC%9D%98%EC%A1%B4%EC%84%B1_%EC%A3%BC%EC%9E%85 대부분의 프로그램은 객체들의 조합인 Composition 으로 이루..
iOS 뷰 컨트롤러 간단하게 테스트 코드 연습하기 ( with Unit Test )
UIKit 환경에서 뷰 컨트롤러는 3가지 방식으로 구성할 수 있습니다. ( Xib, Storyboard, Code Base ) 해당 방식으로 구성된 뷰 컨트롤러를 인스턴스화 하는 방법을 먼저 살펴보겠습니다. 뷰 컨트롤러 인스턴스 가져오기 Xib, Code Base - 별도의 파라미터가 없는 경우 바로 인스턴스화 가능합니다. Storyboard - 먼저 UIStoryboard 인스턴스에 접근하고, 해당 메서드로 생성해야 합니다. 참고 뷰 컨트롤러 view 로드하기 이렇게 가져온 뷰 컨트롤러는 따로 view 를 로드하는 과정을 거쳐야 합니다. XIB 와 Storyboard 기반의 vc 는 loadViewIfNeeded() 를 통해 Outlet 들을 구성하고 연결할 수 있게 됩니다. Code Base 로 구성..
iOS URLSession Test Double 만들기
iOS 에서 네트워크를 테스트하는 방법은 크게 두가지가 있습니다. 1. 실제 서버(혹은 테스트 서버) 에 직접 요청하기 2. Stub 을 통해 실제 네트워크에 요청하지 않고 테스트하기 네트워크 요청은 느리고, 실패 가능성이 있으며 불확실성이 높은 요소입니다. 이런 경우에는 일정한 요청을 return 하는 Stub 을 제작하는 2번으로 주로 테스트를 진행하게 됩니다. URLSessionDataTask vs URLSession 어떤 것을 Stubbing 할까? 테스트 코드 학습을 위해 가장 처음 접했던 포스팅은 배달의 민족 기술블로그 조원님의 "iOS Networking and Testing" 입니다. ( Moya 기반의 test code 코드 작성법도 기술되어 있으니, 꼭 읽어보시면 좋습니다. ) 위에서는..
iOS 에서 Call Stack 으로 버그 해결하기
Xcode 는 프로그램이 실행되는 동안 "Call Stack" 이라고 하는 데이터 구조에 수행중인 정보를 저장합니다. 이는 개발자가 어떤 코드에서 메서드가 호출되고 해당 동작이 다른 부분과 어떻게 상호작용하는지 파악할 수 있도록 도와줍니다. 이번 예시에서는 RxSwift 에서 synchronizationError 를 해결해보겠습니다. * 꼭 런타임 에러가 아니더라도 특정 코드 라인에 Break Point 를 걸면 Call Stack 를 활용할 수 있습니다. 위는 구독 클로저에서 바로 값을 방출하므로 재진입 에러가 발생하게 됩니다. 이런 런타임 에러 상황 혹은 Break Point 걸린 부분에서 Call Stack 을 확인하면 어떤 메서드가 순서대로 호출되었는지 파악할 수 있습니다. 차례대로 Threads..
iOS MVVM 패턴 구현 정리 ( with RxSwift )
현재 MVVM + HelperClass 로 구현된 프로젝트를 RxSwift 로 리팩토링하는 작업을 진행하고 있는데, 작업에 참고할 best practices 를 찾는 과정에서 서로 다른 구현 방식들을 보게 되었습니다. 이를 통해 MVVM 은 적은 코드로 각 컴포넌트들을 쉽게 분리할 수 있다는 장점이 있지만 개발자의 관점에 따라서 구현에 차이점이 있다는 것을 알게 되었습니다. ( 특히 MVVM은 마이크로소프트에서 특정 플랫폼에서 사용되도록 고안된 디자인 패턴으로, 각자 iOS 프레임워크 환경에 맞게 적용하는 단계에서 차이가 발생했다고 생각했습니다. ) 이번 게시글에서는 iOS 에서 각 회사, 단체에서 어떻게 MVVM 구현하였는지 정리하고자 합니다. 데이터 바인딩 종류 1. RxSwift 를 이용한 바인딩 ..
iOS 에서 Pinterest Layout 구현하기 ( UIKit, Custom Layout )
위와 같은 Layout 을 구성해야할 때 어떤 방식을 사용해야 할까요? 단순하게 한 열에 두 개의 아이템이 있으므로, UICollectionView 를 기반으로 하고 이미지 크기 만큼 셀 사이즈를 지정하면 되지 않을까 생각했습니다. min cell-spacing 과 line-spacing 을 0으로 주어도 이상하게 셀 사이에 공백이 발생하고, 생각대로 동작하지 않게 됩니다. CollectionViewFlowLayout 위와 같은 문제점이 발생하는 이유를 알기 위해서는 먼저 Flow Layout 의 동작 방식을 이해해야 합니다. CollectionView 에 기본적으로 사용되는 CollectionViewFlowLayout 은 특정 Line 에 따라서 Cell 을 배치하게 됩니다. 선을 따라서 Cell 을 ..
iOS StoryBoard vs Code Base 간단 정리
storyboard 장점 결과물을 예측하기 쉬움 속성을 쉽게 확인가능 소스코드를 일일히 파악하지 않아도 UI 확인 가능 단점 무겁다 ( 스토리 보드 분리로 해결 가능 ) 링크가 끊어졌을 때 파악하기 힘들다 ( IBOutlet, IBAction ) 협업 문제 ( Diff 로 알기 힘들고, Conflict 나면 해결 어려움 ) Code Base 장점 가볍다 ( 코드만 나와 있으므로 ) Diff 만 보고 파악하기 쉽다 Conflict 발생 가능성이 낮아진다 단점 해당 컴포넌트를 숙지하고 있어야 한다. 어떤 화면이 만들어질지 파악하기 힘들다. 코드가 상당히 길어진다 code base 기반 작성법 Auto Layout 사용 / Auotoresizing 은 더 이상 사용 X NSLayoutConstraint 를 일..
iOS "UITableView Section Header 로드되지 않는 문제" 해결
위 영상처럼 처음 로드했을 때에는 섹션 헤더가 제대로 보이지만, ( xib 를 사용한 Custom Section Header ) 나중에 해당 섹션만 reload 했을 때 Section Header 가 보이지 않는 문제가 발생했습니다. Stack Overflow 에 나와있는 일반적인 해결 방법은 아래와 같습니다. 1. UITableViewDelegate 프로토콜에서 heightForHeaderInSection 리턴하기. 2. reloadRows 대신 reloadSection 으로 해당 섹션 리로드 하기 제 경우에는 위 두가지 방식으로도 해결되지 않아서 구글링을 하며 더 찾아보았습니다. // UITableView Delegate func tableView(_ tableView: UITableView, vie..
iOS MVC 패턴 ( MVC Pattern )
디자인 패턴이란 소프트웨어 개발 방법을 공식화한 것입니다. 지금은 매우 다양한 디자인 패턴이 사용되고 있지만 ( MVVM, MVP, VIPER ) 그 중에서 가장 고전적이고 중요한 MVC 패턴에 대해서 다루겠습니다. MVC 패턴 Model : 근본적인 앱이 어떻게 구성되어야 하는가? 에 중점을 가집니다. 알고리즘 ( 계산기 더하기, 빼기 연산 등 ) Controller : 모델에서 데이터를 가져오고, 뷰에 전달하는 역할을 합니다. MVVM 구조에서는 Model 에서 가져오는 역할을 ModelView 가 대신 수행합니다. View : 화면을 보여주는 역할을 합니다. 기본적으로 데이터를 가지고 있지 않습니다. Controller & View 소통 → Action-target 이라는 방식으로 가능합니다. @I..