본문 바로가기
Dev/Swift 내 정리

[Architecture] Clean Architecture 나만의 언어로 정리하기

by Mintta 2023. 4. 11.
이해를 위해 직접 ppt로 그리면서 적어보았습니다

Clean Architecture

전체적인 흐름

구현해본 흐름도

Service를 UseCase라고 생각해주시면 될 것 같습니다. 아래 글에서는 'Service(UseCase)' 이와 같이 표기했습니다.

Presentation Layer

MVVM

View는 뷰를 선언하고 레이아웃을 처리하고 애니메이션 처리 등 UI를 그리는데에만 집중합니다.

사용자에게 들어온 Input 이벤트를 ViewModel에게 전달하고, 변경된 값을 View에 그립니다.

변경된 값을 감지하는 방법으로는

- Observer Pattern을 기반으로 한 RxSwift나 Combine를 통해 ViewModel안에 있는 "화면에 그릴 값"들을 감시하는 방법

- didSet과 closure를 통해서 값이 업데이트가 됐다는 이벤트를 받는 방법

이정도가 있습니다. (+ KVO)

 

ViewModel은 View에서 별다른 연산없이 그냥 가져다가 화면에 뿌려줄 수 있게끔 가공된 데이터를 가지고 있습니다.

비즈니스 로직은 Service(UseCase)에게 넘겨줍니다.

+++

화면전환은 Coordinator가 담당하게끔 함으로써 더 분리가 가능하다.

 

Domain

Service(UseCase)는 비즈니스 로직을 담고 있는 앱의 가장 핵심적인 영역입니다.

복잡한 연산이나 모든 로직이 이곳에 들어갑니다.

 

Data

Repository는 서버나 로컬DB 등으로부터 응답을 받아 Service에게 넘겨줍니다.

 

 

모델은 총 3가지가 존재한다. 

모델은 총 3가지 종류가 있다.

 

모델은 총 3종류가 있습니다. 핵심적인 내용은 위의 사진과 같습니다.

  • Entity는 서버에서 받은 응답. 그대로의 날 것의 구조체입니다.
  • Model은 서비스를 구현하는데 우리에게 필요한 값들만 추출해서 만든 모델로, 현재 앱의 상태(state)를 담고 있습니다.
  • ViewModel은 이름 그대로 "Model for View"입니다.
    View에 보여질 데이터를 가지고 있어 View는 해당 값을 가져다가 화면에 입히면 됩니다.

Service(UseCase)가 핵심.

Service(UseCase)는 왕이다.

 

 

흐름도에서 보면 Service(UseCase)에게 모두 존댓말을 붙이는 것을 볼 수 있습니다.

이는 Service(UseCase)가 가장 핵심적인 부분임을 나타내기 위해 윗사람 컨셉으로 해주었습니다.

그 이유로는 Service(UseCase)에는 모든 앱의 핵심적인 부분이 모두 들어가 있습니다.

  • Entity: Entity를 받아 Model로 가공하는 작업을 이곳에서 수행하기에 Entity를 알고 있습니다
  • Model: Model로 가공하여 ViewModel로 넘겨주기 때문에 Model 또한 알고 있습니다.
  • Logic: 모든 비즈니스 로직은 이 곳에서 실행되기 때문에 로직 또한 알고 있습니다.

 

결론

이렇게 계층을 분리하면 확실히 앱이 아무리 커지고 코드가 아무리 많아져도 쉽게 감을 잡을 수 있을 것 같습니다.

또한, 이렇게 계층으로 분리하게 되면 각각의 책임이 명확하고 각자의 역할에만 집중하기 때문에 변경사항에 정말 유연하게 대처할 수 있겠구나 싶습니다. 서로간의 의존도가 낮기 때문에 테스트시에도 용이하다는 장점도 있습니다.

그에 대한 트레이드 오프로 많아지는 파일과 간단한 로직에도 복잡해지는 단점은 있겠네요. 

 

 

Reference


- https://www.youtube.com/watch?v=M58LqynqQHc

- https://medium.com/@justfaceit/clean-architecture%EB%8A%94-%EB%AA%A8%EB%B0%94%EC%9D%BC-%EA%B0%9C%EB%B0%9C%EC%9D%84-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%84%EC%99%80%EC%A3%BC%EB%8A%94%EA%B0%80-1-%EA%B2%BD%EA%B3%84%EC%84%A0-%EA%B3%84%EC%B8%B5%EC%9D%84-%EC%A0%95%EC%9D%98%ED%95%B4%EC%A4%80%EB%8B%A4-b77496744616

댓글