Suyeon9911 / TIL

매일 오전에 적는 미라클 TIL 🥣
10 stars 0 forks source link

[iOS] Clean Architecture 구조에서 DTO 와 Entity의 차이 ? #95

Closed Suyeon9911 closed 1 year ago

Suyeon9911 commented 1 year ago
image

Data Layer에 있는 DTO와 Domain Layer에 있는 Entity는 무슨 차이일까?

DTO

DTO(Data Transfer Object)로서 계층(Layer)간 데이터 교환을 위해 사용하는 객체이다. 데이터 교환만을 위해 사용하므로 로직을 갖지 않고, getter/setter 메소드만 갖는다.

VO

VO(Value Object)는 값 그 자체를 표현하는 객체이다.

로직을 포함할 수 있으며, 객체의 불변성(객체의 정보가 변경하지 않음)을 보장한다.

서로 다른 이름을 갖는 VO 인스턴스더라도 모든 속성 값이 같다면 두 인스턴스는 같은 객체라고 할 수 있다. 이를 위해 VO에는 Object 클래스의 equals()와 hashCode()를 오버라이딩해야 한다.

Entity

실제 DB의 테이블과 매핑되는 객체이다. id를 통해 각각의 Entity를 구분한다. VO와 마찬가지로 로직을 가질 수 있다.

Suyeon9911 commented 1 year ago

Swift 상식에 DTO,VO를 주제로 이야기하지만 DTO, VO는 객체를 사용하는 언어에는 모두 사용될 수 있는 주제이다. DTO는 VO와 같은 것으로 보기도 하지만 차이점이 존재한다. DTO를 사용함으로써 데이터를 효과적으로 격리할 수 있다.

Suyeon9911 commented 1 year ago

DTO (Data Transfer Object)

데이터 전송을 위한 객체 데이터를 오브젝트로 변환하는 객체 같은 시스템에서 사용되는 것이 아닌 다른 시스템으로 전달하는 작업을 처리하는 객체 메소드 호출 횟수를 줄이기 위해 데이터를 담고 있는 것 로직을 가지지 않는 순수한 데이터 객체 VO + set 으로 볼 수 있다. 가변성 DTO 사용 예시

struct LadderGame {
    private var players = [LadderPlayer]
    private var ladder = [[LadderStep]]

            .
            .
            .

    /// LadderGameDTO 구조체로 데이터를 변환해주는 함수
    func translateToDTO() -> LadderGameDTO{
        // 기타 구문들...
        // LadderGameDTO 구조체로 데이터를 넘김
            let ladderGameDTO = LadderGameDTO(names: playerNames,
                                            ladder: buildLadder)
            return ladderGameDTO
        }
}
// 데이터를 담고 있는 객체(DTO)
struct LadderGameDTO {
    var names = [String]
        var ladder = [[LadderStep]]  
}

struct OutputView {
    func printResult(_ ladder : LadderGameDTO) {
        // LadderGameDTO 구조체에서 받은 데이터들을 활용한 출력 구문
    }
}
daehwan2yo commented 1 year ago

스위프트에서는 어떨지 모르겠지만.. DTO, VO 이런 postfix 네이밍이 명시적일수있지만, 과연 좋은 네이밍일지에 대한 고민을 해봤으면 좋겠네 ㅎㅎ 클래스의 그 목적과 역할에 맞는 자연스러운 네이밍을 실무에서는 많이 추구하더라구 ( ex. LadderGameDTO -> LadderGameOutput ) (+ 해외 유명 오픈소스코드들에는 DTO 와 같은 네이밍이 전혀없다는점..)

Suyeon9911 commented 1 year ago

@daehwan2yo 좋은 코멘트 고마웡,,,귀하신분이 어째 여기까지 오셨는지 ㅋ ㅋㅋㅋ Swift에서는 어떻게 쓰이는지 더 찾아보고 네이밍에 대해서도 고민해봐야겠당 👍🏻