Clean Architecture

    [Clean Architecture] Repository Pattern in IOS

    Repository Pattern Repository Pattern의 필요성 Repository Pattern을 사용하지 않은 앱은 VC or MV이 직접 데이터들을 가지게 된다. 이에 따라오는 문제가 무엇일까? 바로 유지보수이다. 앱이 커지고 화면이 많아져서 개발자가 늘어난다면?? 만약 로컬DB에 저장하기 위해 CoreData를 사용하다가 realm으로 갈아타던지(NSManagedObject이 붙은 자료들), API, JSON등 Networking의 예시로 Codable을 채택해서 만든 객체를 앱 전역에서 사용중인데 서버에서 API에 내려주는 구조가 바뀐다면..? ViewModel의 객체들을 하나 하나 전부 수정해야한다. 만약 다음과 같은 이름과 몸무게를 포함하는 구조체를 사용하고 있다고 하자. str..

    Swinject

    Swinject https://github.com/Swinject/Swinject GitHub - Swinject/Swinject: Dependency injection framework for Swift with iOS/macOS/Linux Dependency injection framework for Swift with iOS/macOS/Linux - GitHub - Swinject/Swinject: Dependency injection framework for Swift with iOS/macOS/Linux github.com DI(Dependency Injection)는 종속성을 해결하기 위해 IoC(Inversion of Control)을 구현하는 소프트웨어 디자인 패턴이다. Swinject는 ..

    DI Container

    Dependency와 injection & SOLID의 의존관계 역전 원칙(DIP)의 사전지식이 필요하다. https://clamp-coding.tistory.com/447 Dependency Container란 무엇인가. 의존성 주입을 해줄 때는 외부에서 인스턴스를 만들어서 주입해준다. 외부에서 인스턴스를 만들어서 주입해주는 곳은 여러곳일 수 있다. 즉 인스턴스를 만드는 위치가 분산되어있다. 근데 Container라는 것이 있고 Container가 모든 인스턴스를 다 가지고 있고, 관리한다고 생각해보자.. Container에 앞으로 내가 사용할 모든 인스턴스를 다 만들어서 등록해두고 => register 필요한 시점에 Container에게 특정 타입의 인스턴스를 달라고하면 Container가 꺼내주는 ..

    [iOS] Coordinator Pattern

    Coordinator Pattern Coordinator 패턴은 ViewController가 보유하던 책임 중 Navigation과 관련된 부분을 다른 인스턴스에서 책임지도록 하는 패턴이다. 기존의 ViewController에서 직접 화면 전환 방식 기존의 방식은 ViewController에서 직접적으로 화면 전환을 시행하고, 다음에 띄워질 다른 ViewController에대해 기존 ViewController가 알고있어야 하는 구조이다. 이는 ViewController간에 심한 커플링을 발생시킨다. 이를 해결한 것이 Coordinator 패턴이다. Coordinator 패턴 모든 ViewController는 Coordinator 인스턴스만 보유할 뿐, 다른 ViewController 인스턴스를 직접적으로..

    [Clean Architecture] Clean Architecture에서 Entity, Use case, Presenter등 구성요소가 무엇인가.

    Clean Architecture + MVVM에대한 글을 읽다보면 아무 지식 없이는 이해할 수 없는 부분이 있다. Entity, Usecase, Repository등 단어자체의 개념적인 이해가 정확히 정리되어있지 않다보니 완벽하게 이해할 수 없다. 이런 용어들을 정리한 블로그를 너무 찾기 힘들기 때문에 이에대한 용어의 정리가 필요하다고 느껴 정리해보려한다. 혹시 틀린점이 있다면 정중히 댓글 부탁드립니다. Entity Entity( = Enterprize Business Rules): Actor가 필요로 하는 데이터의 모델을 의미한다. 특정 '도메인'에서 사용되는 struct 모델 ex) Actor가 필요로 하는 Movie와 MoviewPage에 대한 Entity struct Movie: Equatable..

    [Clean Architecture] SOLID원칙 06. 의존성 주입과 의존성 역전원칙(DI, DIP)

    Dependency(의존성) 객체지향 프로그래밍에서 Dependency, 의존성은 서로 다른 객체 사이에 의존 관계가 있다는 것을 말한다. 즉, 의존하는 객체가 수정되면 다른 객체도 영향을 받는다는 것이다. 예를들어 아래의 코드를 보자. class A{ var num = 1 } class B{ var internalVariable = A() } let b = B() print(b.internalVariable.num) // 1 B클래스는 A클래스를 내부변수로 사용하고있다. 이로써 B클래스는 A클래스에 의존성이 생긴다. 객체끼리 의존하는 경우 많은 문제가 야기된다. 만일 A클래스에 문제가 생긴다면 이를 의존하고 있는 B클래스에도 문제가 생길 수 있으며 재사용성이 낮아진다. (재사용이 가능한건 최상위 클래스..

    [Clean Architecture] SOLID원칙 05. ISP(Interface Segregation Principle) 인터페이스 분리 원칙

    클라이언트는 그들이 사용하지 않는 인터페이스에 의존해서는 안된다. 불필요한 인터페이스 요소들을 포함시키지 말라는 의미이다. 불필요한 요소들이 포함되면서 복잡해지고, 무거워짐에 따라 진작 원하는 정보를 얻을 수 없는 지경에까지 이르기도 한다. 이 문제는 클래스나 프로토콜 모두에게 영향을 줄 수 있다. Protocol protocol의 경우를 먼저 본다. "터치"를 했을 때 반응을 구현해줄 didTap 메서드를 가지고 있는 GuestureProtocol을 보자. protocol GusetureProtocol{ func didTap() } 이후에 더 많은 제스처들을 추가해주고싶어서 프로토콜에 추가한다면? protocol GusetureProtocol{ func didTap() func didDoubleTap(..

    [Clean Architecture] SOLID원칙 04. LSP(Liscov Substitution Principle) 리스코프 치환 원칙

    부모(super class)로 동작하는 곳에서 자식(sub class)를 넣어주어도 대체가 가능해야 한다는 원칙. 자식 클래스를 구현할 때, 기본적으로 부모클래스의 기능이나 능력들을 물려받는다. 여기서 자식클래스는 동작을 할 때, 부모 클래스의 기능들을 제한하면 안된다는 뜻. 부모클래스의 타입에 자식클래스의 인스턴스를 넣어도 똑같이 동작하여야 한다. 나쁜 예. class Rectangle { var width: Float = 0 var height: Float = 0 var area: Float{ return width * height } } class Square: Rectangle { override var width: Float{ didSet{ height = width } } } func prin..

    [Clean Architecture] SOLID원칙 03. OCP(Open-Closed Principle) - 개방 폐쇄 원칙

    확장에는 열려있으나 변경에는 닫혀있어야 한다는 원칙 어떤 기능을 추가할 때, 기존의 코드는 만지지 않고 새로 동작하는 기능에 대해서만 코드가 작성되어야 한다. 이런 원칙을 지키기 위해서는 다양한 방법들이 있다. 프로토콜을 활용할 수 있다. 만약 동물의 소리를 내는 동물원이라는 변수가 있는데 여기에 새로운 동물이 추가된다고 생각하면 어떻게 구현했느냐에 따라 OCP를 지키느냐 안지키느냐로 나뉠 수 있다. 이전의 SRP 예제에서도 프로토콜을 이용해서 OCP원칙을 잘 지키고 있다. 만약 새롭게 DB, API Call, Decoding의 로직을 수행하고 싶으면 단지 각각의 프로토콜을 구현하고 있는 객체를 외부에서 주입하면 되기 때문에 새로운 기능에도 변화없이 대응 가능하게 된다. 안좋은 예 class Dog { ..

    [Clean Architecture] SOLID원칙 02. SRP(Single Responsibility Principle) 단일 책임 원칙

    SRP(Single Responsibility Principle) 개념 하나의 객체는 하나의 책임을 가져야 한다. 즉 하나의 class가 여러 기능을 담당하면 안된다. 예제코드 class LoginService { func login(id: String, pw: String) { let userData = requestLogin() let user = decodeUserInform(data: userData) saveUserOnDatabase(user: user) } private func requestLogin() -> Data { // Call API return Data() } private func decodeUserInform(data: Data) -> User { // Decoding User..