DTO와 레포지토리에 대해

sonny·2025년 1월 28일
0

TIL

목록 보기
115/140

DTO (Data Transfer Object)

DTO는 데이터를 전달하기 위해 사용되는 객체인데 주로 계층 간(ViewModel과 ViewController) 데이터를 주고받을 때 사용된다.

특징

  1. 목적

    • 데이터 전달 전용: 데이터와 그 구조를 캡슐화하여 다른 계층에서 쉽게 사용할 수 있도록 한다.
    • 비즈니스 로직 제거: 데이터를 표현하는 역할만 하고, 복잡한 로직은 포함하지 않는다.
  2. 이점

    • 독립성: 데이터 구조를 ViewModel, Controller 등의 내부 구현으로부터 독립적으로 관리할 수 있다.
    • 명확성: DTO로 데이터 구조를 명시적으로 정의하면 데이터의 흐름이 더 명확해지고, 가독성이 향상된다.
    • 재사용성: 같은 DTO를 여러 계층에서 재사용할 수 있다. (복제본 같은 느낌)
  3. 예시

    • HangdamDTOHangdamEntity를 기반으로 생성되는데 Controller와 ViewModel 사이에서 데이터를 전달하는데 사용된다.
struct HangdamDTO {
    let id: String
    var name: String?
    var happinessCount: Int
    var startDate: String?
    var endDate: String?
}

Repository

Repository는 데이터 소스(데이터베이스, API)와 상호작용하는 역할을 담당한다.

특징

  1. 목적

    • 데이터 접근 캡슐화: 데이터베이스, API, 또는 로컬 파일 등의 데이터를 처리하는 로직을 캡슐화한다.
    • 계층 간 의존성 분리: ViewModel이나 Controller가 데이터 소스의 세부 사항을 알지 못하도록 하여 코드 의존성을 줄인다.
  2. 이점

    • 유지보수성: 데이터 접근 로직이 한 곳에 집중되기 때문에 데이터 소스가 변경되어도 로직 수정 범위가 좁아질 수 있다.
    • 테스트 용이성: 데이터 소스 대신 Mock Repository를 사용하면 테스트 하기가 쉽다.
    • 중복 제거: 데이터 접근 로직을 중앙화하여 코드 중복을 줄인다.
  3. 예시

    • HangdamRepository는 CoreData에서 HangdamEntity를 가져와 DTO로 변환하고 반환한다.
final class HangdamRepository {
    private let coreDataManager: CoreDataManager

    init(coreDataManager: CoreDataManager = CoreDataManager()) {
        self.coreDataManager = coreDataManager
    }

    func getCurrentHangdam() -> HangdamDTO {
        let entity = coreDataManager.fetchHangdams().last ?? createNewHangdam()
        return entity.toDTO
    }

    private func createNewHangdam() -> HangdamEntity {
        return coreDataManager.createHangdam()
    }
}

DTO와 Repository의 역할 분담

  • DTO

    • 데이터를 전달하는데만 사용한다.
    • 데이터의 구조를 명시하고 단순한 데이터 표현에만 초점을 맞춘다.
  • Repository

    • 데이터의 소스와 상호작용(CoreData, API 호출)한다.
    • 데이터를 가져오고 변환하여 필요한 계층(ViewModel)에 제공한다.

  • DTO는 택배 상자다.

    • 상자 안에는 데이터가 들어 있고, 안전하고 명확하게 전달하기 위한 포맷을 제공한다.
    • 상자 자체는 내용을 가공하거나 바꾸는 일을 하지 않는다.
  • Repository는 택배 회사다.

    • 데이터베이스나 API에서 데이터를 가져오고, 원하는 모양(DTO)으로 포장해서 전달한다.
    • 데이터를 어디서 가져오는지는 숨기고, "이 데이터를 요청하면 이런 상자로 전달합니다"라는 약속만 제공한다.

DTO는 진자 멋진 녀석이었다.

profile
iOS 좋아. swift 좋아.

0개의 댓글

관련 채용 정보