클린 아키텍처 쉽게 이해하기 with SwiftUI 🔍 #85
OneMoreThink
started this conversation in
Idea
Replies: 3 comments 8 replies
-
Preview를 정말 잘 활용하신다는 생각이 들었습니다,,! (저도 꼭 적용해보고 싶네요 ㅎㅎ) |
Beta Was this translation helpful? Give feedback.
0 replies
-
3기 분이 추천해주셔서 읽어봤는데 너무 이해가 잘됩니다!! 다만 하나 궁금한게 있는데 다른 클린 아키텍처 글을 보니 Repository의 인터페이스는 도메인 영역에 두고 Repository의 구현체를 데이터에 두더라구요! 이렇게 하면 의존성 구조가 Presentation -> Domain <- Data 형태로 되어 도메인이 데이터 구조를 의존하지 않아 유지보수성에서 더 좋을 거 같다고 생각합니다! 혹시 이런 의존성 구조에 대해서는 어떻게 생각하시나요? 사실 저도 이제 클린 아키텍처를 공부하고 있어서 의견을 공유하고 싶어 질문 드립니다! |
Beta Was this translation helpful? Give feedback.
2 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
안녕하세요. 다들 안녕하신지요? 3기 아임 파인입니다.
매크로 챌린지도 어느덧 절반이상 지나가고 한달 남짓 남은 시점입니다. 🥺
지난 챌린지때에는 단순한 MVMM 구조에서 Service 또는 Manager를 따로 두어 각 ViewModel에서 필요한 기능들을 제공하는 방식을 선택했는데요. 🍎
이번 메크로 챌린지 때는 이전 챌린지들에 비해 프로젝트 규모가 커져 계층을 좀 더 명확히 나누고 데이터의 흐름을 잘 관리하고자 여러 아키텍쳐를 찾아보던 중 클린 아키텍쳐의 존재에 대해 알게되었습니다. 🛁
본격적인 개발에 들어가기 앞서 클린 아키텍쳐에 대해 명확히 이해하고 팀원들과 공유하고자 다음 글을 작성하였습니다.
혹시 다른 러너분들께도 조금이나 도움이될까 싶어 공유합니다. 🍅
클린 아키텍처가 뭔가요?
앱을 만들 때 코드를 역할별로 깔끔하게 나누는 방법이에요. 마치 서랍장에 물건을 종류별로 정리하는 것처럼, 코드도 하는 일에 따라 구분해서 관리하는 거죠.
클린 아키텍처의 계층 구조 이해하기 📚
계층이란? 🤔
앱의 코드를 역할별로 나눈 각각의 층을 말해요. 각 계층은 자기만의 역할이 있고, 다른 계층과 약속된 방식으로만 소통해요.
Domain Layer (핵심 계층) 💡
앱의 가장 기본이 되는 부분이에요. 마치 집을 지을 때 기초 공사가 중요한 것처럼, Domain Layer는 앱의 핵심적인 데이터 모델과 이를 다루는 규칙들을 담고 있답니다.
Entity: 실제 세상의 물건이나 개념을 앱 속에서 어떻게 표현할지 정하는 설계도예요.
Product
라는 설계도를 그리는 거예요. 마치 다양한 물건들(칫솔, 노트북 등)이 가진 공통된 특징들을 쏙쏙 뽑아서 앱에서 쓸 수 있게 정리하는 거죠!Use Case: 사용자가 앱에서 실제로 하고 싶은 일들을 구현하는 방법이에요!
Product
설계도를 가지고 실제로 어떤 일을 할 수 있을까요?Use Case는 마치 식당의 요리사와 같아요!
이렇게 Use Case를 만들면 좋은 점이 있어요
Data Layer (데이터 계층) 💾
앱에서 필요한 모든 데이터를 관리하는 층이에요! 마치 도서관처럼 필요한 정보를 가져오고, 보관하고, 정리하는 역할을 담당하죠.
Repository: 데이터를 가져오고 저장하는 창고 관리자예요! 🏪
먼저 Repository 설계도를 만들어볼까요?
이렇게 Repository를 두면 좋은 점이 있어요
Data Source: 실제로 데이터를 주고받는 친구예요! 🔄
이렇게 Data Source를 두면 좋은 점이 있어요
DTO (Data Transfer Object): 데이터 배달통이에요! 📦
이렇게 DTO를 두면 좋은 점이 있어요
Presentation Layer (화면 계층) 📱
사용자가 직접 보고 상호작용하는 화면을 만드는 층이에요! SwiftUI에서는 View와 ViewModel이 이 역할을 담당하죠.
View: 사용자에게 보여지는 화면을 구성해요 📺
ViewModel: 화면에 필요한 데이터를 관리하고 비즈니스 로직을 처리해요 🧑🔧
@Published
속성을 통해 데이터 변경을 View에 자동으로 알려줘요Clean Architecture의 데이터 흐름 🔄
1. 사용자 입력 -> 데이터 가져오기 흐름
예시로 "상품 목록 보기" 흐름을 따라가볼까요?
2. 사용자 입력 -> 데이터 저장 흐름
"상품 주문하기" 예시로 살펴볼까요?
주요 포인트 정리 🎯
단방향 데이터 흐름 : 바깥쪽(UI) → 안쪽(Data) 방향으로만 의존성이 있어요.
데이터 변환 : 각 계층마다 전용 데이터 구조를 두어 각 계층에는 해당 계층에 필요한 데이터들만 관리되요.
에러 처리 흐름 : 각 계층별로 발생하는 에러 또한 계층별로 격리시켜서 관리할 수 있어요.
Clean Architecture, 프로토콜 이용해 설계하자 🎯
프로토콜은 간단히 말해서 "이런 기능들은 꼭 구현해야 해!" 하고 약속하는 설계도예요.
예시로 살펴보는 프로토콜 활용
프로토콜을 사용하는 주요 이유 💡
의존성 역전 원칙 (Dependency Inversion)
테스트 용이성
유연한 구현체 교체
기능 명세의 명확성
프로토콜 사용의 장점 요약 🌟
느슨한 결합
테스트 용이성
명확한 책임과 역할
확장성
이렇게 프로토콜 기반으로 설계하면 앱이 더 견고해지고 유지보수하기 쉬워져요! 😊
Clean Architecture와 의존성 이해하기 💉
의존성이란?
의존성은 쉽게 말해서 "A가 B를 필요로 한다"는 관계를 말해요.
Clean Architecture에서의 의존성 규칙
각 계층은 안쪽 계층의 "추상화(프로토콜)"에만 의존해야 해요:
Clean Architecture에서의 의존성 주입
Clean Architecture에서 의존성 주입이 중요한 이유 🌟
계층 분리와 단방향 의존성
테스트 용이성
유지보수성
확장성
의존성 주입을 통해 Clean Architecture의 핵심 원칙들을 지킬 수 있어요:
이렇게 의존성을 잘 관리하면 앱이 더 견고해지고 유지보수하기 좋아져요! 😊
Clean Architecture 구조도 한눈에 보기 👀
각 레이어의 경계와 각 레이어를 구성하는 컴포넌트들 사이에 의존관계 그리고 실제 구현과 전체 데이터의 흐름을 아래와 같이 그림으로 나타내볼 수 있어요.
SwiftUI Preview와 의존성 주입 활용하기 🎨
1. Preview 전용 Container 만들기
2. Preview Provider 구성하기
3. 재사용 가능한 Preview 컴포넌트
4. 실제 View에서 활용
5. 더 나은 Preview를 위한 팁들 💡
이렇게 의존성 주입을 활용한 Preview를 구성하면:
Preview를 잘 활용하면 UI 개발 속도가 훨씬 빨라지고, 품질도 높아져요! 😊
Beta Was this translation helpful? Give feedback.
All reactions