iOS

    [iOS - Swift] Networking 테스트 코드 작성하기 (feat. URLSession)

    배경 및 원리 오늘은 Network 환경에서 테스트 코드를 작성하는 방법을 알아보려고 함. iOS 환경에서 가장 기본적인 Networking 기술은 URLSession이고, 나 또한 지금 URLSession을 사용하기 때문에 URLSession 환경에서의 테스트 코드를 작성해보려고 함. 여기에 필요한 건 Test Double 개념이고, 그중에서도 Stub 또는 Mock 개념이 필요함. (*현업에서는 상태와 행위를 동시에 검증하는 경우가 많아서 ‘Mock’으로 퉁쳐서 사용한다고 함) 이게 뭐임? Unit Test로 URLSession의 통신 자체를 테스트할 수도 있지만(status code가 200인지), 통신으로 받은 데이터를 잘 가공하는지 테스트해야 함. (통신이 잘 된 후 그 다음 과정을 검증하는 것..

    [iOS - Swift] 의존 관계 역전 원칙 (DIP, Dependency Inversion Principle)

    안녕하세요 K입니다. 오늘은 의존 관계 역전 원칙(DIP,Dependency Inversion Principle)에 대해 알아보겠습니다. DIP에 대해 많이 들어보셨나요? 저는 이번에 Unit Test 코드를 작성 중 MockURLSession 테스트 코드를 작성하면서 이 개념을 만났는데요, 쉽게 이해가 안되기도 하고, 굉장히 중요한 개념이기도 해서 이번 기회에 제대로 공부해보았습니다. 의존 관계 역전 원칙(DIP,Dependency Inversion Principle)이 필요한 이유 우선, 의존 관계 역전 원칙(이하 DIP)을 공부하기 전에 제 성향상 이 개념이 필요한 이유와 상황부터 알아야 하는 지라 이것부터 알아보겠습니다. (특정 개념을 공부하면서 그 이유와 목적을 모른다는 것은 말이 안되겠죠?) ..

    [iOS - Swift] TDD를 위한 Unit Test 코드 작성하기 (Feat. XCTest)

    안녕하세요, 이번에는 Unit Test 코드를 작성하는 방법에 대해 알아보겠습니다. 이전부터 워낙 테스트 코드에 대해 많이 들었어서 중요성은 알고 있었지만, 얼핏 들은 세션에서 너무 어렵게 느껴지는 바람에 지레 겁을 먹은 적도 있습니다. (첫인상이 안좋았습니다.) 하지만 테스트 코드를 넘어 TDD와 CI/CD를 위해서라면 꼭 짚고 넘어가야 하는 개념이기 때문에 꼼꼼히 살펴보도록 하겠습니다. 틀린 부분은 댓글로 언제든지 알려주시면 감사하겠습니다! 왜 테스트 코드를 짜야 하는가? 저는 무언갈 공부하기 전에 그것의 쓰임이나 용도, 필요성을 확실히 느껴야 하는 스타일입니다. 도대체 우리는 왜 테스트 코드를 짜야 하고 저는 이걸 왜 배워야 할까요? '테스트' 코드는 말 그대로 무언갈 시험해보기 위한 코드입니다. ..

    [iOS] 의존성 주입(Dependency Injection, DI)이 객체의 결합도를 낮춰주는 이유 (Feat. Car)

    의존성 주입(DI)은 의존성 생성 및 관리를 종속되는 객체와 분리하기 때문에 객체의 결합을 줄여줍니다. 즉, 객체는 의존성이 어떻게 생성되거나 관리되는지 알 필요가 없으므로 의존성은 줄어들고 더 모듈화되고 유지 관리가 쉬워집니다. 이를 더 잘 이해하기 위해 예를 들어 보겠습니다. 자동차를 만들고 있다고 상상해 보세요. 자동차에는 엔진, 변속기, 바퀴와 같은 여러 구성 요소가 있습니다. 각 구성 요소에는 엔진용 연료, 변속기용 오일, 타이어용 공기 등 고유한 의존성 집합이 있습니다. 이제 자동차의 엔진을 교체하고 싶다고 가정해 보겠습니다. 긴밀하게 연결된 시스템에서는 엔진에 종속된 모든 구성 요소를 새 엔진에 맞게 수정해야 할 수 있습니다. 예를 들어, 새 엔진의 출력에 맞게 변속기를 변경하거나 새 엔진의..

    [iOS - Swift] XCTest FAQ (XCTest를 공부하다 생긴 궁금증들)

    이번 게시물에서는 XCTest를 공부하며 생긴 궁금증들을 정리해보겠습니다. XCTest를 작성하는 방법에 대한 글은 이 다음에 바로 올리도록 하겠습니다. 테스트 코드를 작성하기 전에, 무엇을 테스트할지 파악하는 게 우선이다. 밑의 항목은 일반적으로 고려하는 테스트 대상이다. Core functionality: Model classes and methods and their interactions with the controller The most common UI workflows Boundary conditions Bug fixes Test Code의 종류 Unit Test UI Test Performance Test XCTest란? Unit Test, UI Test, Performance Test를 ..

    [iOS - Swift] static func vs func

    코드를 보다 보면, class에서 static func을 자주 볼 수 있습니다. 저도 이번에 XCTest Code를 공부하다가 static func 키워드를 자주 봤는데요, 헷갈리는 부분과 static func과 func과의 차이점, static func을 사용했을 때의 이점을 위주로 정리해봤습니다! 개념 Swift에서 static은 타입의 인스턴스가 아닌 타입 자체에서 호출되는 타입 수준 메서드를 정의하는 데 사용됩니다. 즉, static 메서드는 타입의 인스턴스가 아닌 타입과 연관됩니다. 그렇기 때문에 static 메서드는 타입의 인스턴스를 먼저 생성하지 않고도 타입 자체에서 호출할 수 있습니다. 반면, static을 쓰지 않은 일반 메서드는 해당 유형의 인스턴스와 연관됩니다. 해당 유형의 인스턴스에..

    [iOS] MVVM 패턴이란?

    ✨ MVVM 패턴 탄생 배경 MVC가 간단한 프로젝트에는 용이하지만, 프로젝트가 거대해지고 개발자간의 협업이 늘어날수록 Controller의 규모도 거대해진다는 단점이 존재했다. Controller의 역할 : 레이아웃 코드들, 유저 입력 프로세싱, 비지니스 로직, 데이터 변환, 화면 전환, 생명주기, 콜백처리(델리게이트 등), 네트워크 통신 등. Controller의 역할을 덜어주기 위해 새로운 디자인 패턴 MVP (Model View Presenter)를 고안해냈다. ViewController를 View로 취급, Model은 Model, 중개자 역할로 Presenter 추가. 하지만 Presenter와 View가 서로를 소유하여 높은 의존성을 띄고 있었고 View가 하는 일이 거의 없었다. -> 개선..

    [iOS] MVC 패턴이란?

    ✨ MVC의 요소 MVC = Model + View + Controller Model : 앱의 데이터, 비즈니스 로직 (데이터를 관리하는) 포함 View : 유저가 보는 UI Controller : Model과 View를 이어주는 중간다리 역할 (Middleman) - 해당 View마다 하나씩 붙어서 그 View에 맞는 로직 포함하기 때문에 재사용성은 View보다 훨씬 떨어진다. - ViewController 파일에 View, Controller 각각을 담당하는 코드들이 같이 들어가있다. (밀접해있다.) - 하지만 스토리보드 없이 코드베이스로 해서 View, Controller 코드 분리할 수 있다. ✨ MVC 개요 ✨ MVC 요소들이 서로 연락하는 방법 Model과 View는 서로 직접 연락할 수 없다..