/lito-ios

러닝잇 - 기술 면접 대비 CS 학습

Primary LanguageSwift

러닝잇 - 기술 면접 대비 CS 학습

Requirements

ios-version

xcode-version


Tech stacks

Architecture

  • SwiftUI + MVVM + Clean Architecture + Modularization

Frameworks

  • Combine, Tuist, Swinject, Moya, Lottie, KakaoSDK

CI / CD

  • Github Action

Development Detail

CleanArchitecture

LitoCleanArchitecture-Layer drawio (1)

🎯 클린 아키텍쳐
- 각각 분리된 계층의 역할과 책임이 명확해짐에 따라 코드 응집도가 높아짐.
- 책임과 구조가 명확히 나눠져서 개발속도가 빨라지고, 테스트에 용이해짐.
- 백엔드가 내려주는 데이터와 프론트엔드가 관심있는 데이터를 분리함으로써 서로의 관심사 분리가 쉬워짐. 
- 부수적인 효과로 서버의 잘못된 response 에 대한 대응을 response DTO 와 VO 로 나눠서 앱의 안정성을 높일 수 있음.
  • Presentation: UI 관련 로직 처리
  • Domain: 비즈니스 로직을 처리
  • Data: 데이터를 네트워킹을 통해 가져옴

ResponseDTO, ResponseVO

  • 백엔드-프로트엔드의 데이터 관심사 분리를 위해서 Model을 ResponseVO 와 ResponseDTO 로 분리하고 각각 Domain 과 Data 에 나눔.
  • 서버가 잘못된 응답을 줬을떄 앱의 crash를 막고 개발자가 빠르게 알아차리게 만들 수 있음.
  • 반면 Request의 경우 VO와 DTO로 분리해서 처리하더라도 크게 이득을 얻을 수 있는 케이스는 현재 기획한 앱의 기능에서 없다고 판단하여 분리하지 않음.

MVVM + Combine

  • Presentation, Domain, Data 전반의 비동기 처리를 Combine으로 구성.
  • Presentation 을 view, viewModel로 나누고 데이터 publisher를 viewModel에 선언.
  • viewModel 에서 바뀌는 데이터에 따라 view가 변경되도록 reactive programming 을 구현.

Modularization

Untitled-3

🎯 모듈화
- 클린 아키텍처 설계에 따라 모듈 분리
- 재활용성 및 확장성 향상
- 빌드 속도 향상
- 개발자의 실수를 미연에 방지해줌

DI

  • 설계한 CleanArchitecture 에 따라 DI 가 필수적으로 사용됨. (RepositoryProtocol 로 인한 의존성 역전)
  • DI 를 적용할 때 ServiceLocator 의 역할을 쉽게 해줄 수 있는 Swinject 를 사용하였음

Coordinator

  • 화면간의 종속성을 제거하기 위해서 Coordinator 패턴 적용
  • SwiftUI NavigationStack 을 활용하여 구현

Error handling

LitoCleanArchitecture-ErrorHandling 수정후 drawio

🎯 에러 핸들링
- CleanArchitecture 가 계층간의 역할 분리가 명확하다는 이점을 고려하여 계층마다의 에러 관심사와 핸들링 분리.
- Presentation, Domain 레이어와 Data 레이어가 사용하는 에러를 분리하였기 때문에 에러 케이스를 쉽게 확장, 변경 가능.
- Presentation 에서 에러에 대응하는 view가 여러개일 수 있다는 것을 고려하여 ErrorView를 주입받아서 처리하도록 구현.

Unit test

🎯 유닛테스트
- 하나의 기능에 대해 독립적으로 테스트
- 안정적으로 코드 변경 가능
- 코드에 대한 일종의 문서 기능

ViewModel 유닛 테스트

  • 사용자의 동작에 따라 변한 특정 변수의 값이 예상한 값과 일치하는지 테스트
  • 상위 객체와는 독립적으로 테스트 하기 위해 정해진 값을 바로 반환해주는 MockUseCase 주입