SOLID 프로그래밍 원칙과 아키텍처 개념 정리
SOLID 프로그래밍 원칙
SOLID 원칙은 소프트웨어 개발에서 유지보수성과 확장성을 높이기 위해 꼭 지켜야 하는 원칙이다. 이를 잘 준수하면 프로젝트 규모가 커지더라도 코드가 꼬이는 상황을 방지할 수 있다. SOLID 원칙은 다음과 같다.
1. 단일 책임 원칙(Single Responsibility Principle)
클래스는 단 하나의 책임만을 가져야한다.
ex) ViewController 와 ViewModel이 있을 때, ViewModel의 코드 수정이 ViewController에 영향을 미치면 안된다.
프로토콜을 사용하여 수정에 닫힌 코드로 작성한 예시이다.
protocol ViewModelProtocol {
func getUserList() -> [UserProtocol]
}
protocol UserProtocol {
}
struct FriendUser: UserProtocol {
}
struct FamilyUser: UserProtocol {
}
2. 개방-폐쇄 원칙(Open/Closed Principle)
클래스는 확장에 열려있어야 하고, 수정에는 닫혀있어야 한다.
3. 리스코프 치환 원칙(Liskov Substitution Principle)
서브 클래스는 부모 클래스에서 정의된 행위를 그대로 유지해야 한다.
4. 인터페이스 분리 원칙(Interface Segregation Principle)
사용하지 않는 인터페이스를 강요하지 않아야 한다.
5. 의존성 역전 원칙(Dependency Inversion Principle)
고수준 모듈은 저수준 모듈에 의존하지 않아야 하며, 둘 다 추상화에 의존해야 한다.
MVVM 패턴
SOLID 원칙을 효과적으로 지키기 위해 MVVM 패턴을 사용한다.
1. View
- ViewController 도 포함된다.
- ViewModel에 이벤트를 전달한다.
2. ViewModel
- UI와 관련된 로직을 처리한다.
- 전달받은 이벤트에 따라 UI 상태를 업데이트하고, 필요시 모델에 이벤트를 전달한다.
3. Model
- 네트워크 호출, 데이터 접근 등 핵심 비즈니스 로직을 처리한다.
MVVM 패턴은 의존성이 단방향으로 흐른다.
- View -> ViewModel -> Model
클린 아키텍처(Clean Architecture)
클린 아키텍처는 SOLID 원칙과 객체지향 프로그래밍 개념을 기반으로, 의존성을 효과적으로 관리하고 유지보수성을 높이는 아키텍처이다.

1. 도메인 레이어
- 프로젝트의 핵심적인 부분이다.
- 엔티티(Entity): 데이터 모델 정의
- 유즈케이스(Use Case): 핵심 비즈니스 로직
- 레포지토리(Repository): 데이터 접근 방식을 결정
2. 데이터 레이어
- 데이터 소스를 관리한다.(API, DB 등)
3. 프레젠테이션 레이어
- UI와 관련된 작업을 처리한다.(ViewModel, ViewController)
도메인은 고수준 모듈이며, 데이터와 프레젠테이션 레이어는 저수준 모듈이다. 도메인 레이어는 저수준 모듈에 직접 의존하지 않으며, 이를 위해 인터페이스(Swift 의 프로토콜)를 활용한다.
의존성 역전 원칙을 적용한 예시코드
// ViewModel
class ViewModel {
private let useCase: UseCaseProtocol
init(useCase: UseCaseProtocol) {
self.useCase = useCase
}
func getUser() {
useCase.getUser()
}
}
// UseCase
protocol UseCaseProtocol {
func getUser()
}
class UseCase: UseCaseProtocol {
private let repository: RepositoryProtocol
init(repository: RepositoryProtocol) {
self.repository = repository
}
func getUser() {
repository.getUsers()
}
}
// Repository
protocol RepositoryProtocol {
func getUsers()
}
class Repository: RepositoryProtocol {
func getUsers() {
// API or Database Logic
}
}
위 코드를 살펴보면 ViewModel, UseCase, Repository 간의 의존성을 프로토콜로 분리하여, 수정 및 확장이 용이하도록 설계되었다.
클린아키텍처의 장점
- 의존성을 줄이고 유지보수성을 높인다.
- 변경에 유연하게 대응할 수 있다.
- 테스트하기 쉽다.
'TIL(Today I Learned)' 카테고리의 다른 글
| 2025.01.24 Today I Learned (0) | 2025.01.24 |
|---|---|
| 2025.01.16 Today I Learned (1) | 2025.01.16 |
| 2025.01.07 Today I Learned (0) | 2025.01.07 |
| 2025.01.06 Today I Learned (1) | 2025.01.06 |
| 2025.01.02 Today I Learned (0) | 2025.01.02 |