Closed Suyeon9911 closed 1 year ago
Swift 상식에 DTO,VO를 주제로 이야기하지만 DTO, VO는 객체를 사용하는 언어에는 모두 사용될 수 있는 주제이다. DTO는 VO와 같은 것으로 보기도 하지만 차이점이 존재한다. DTO를 사용함으로써 데이터를 효과적으로 격리할 수 있다.
데이터 전송을 위한 객체 데이터를 오브젝트로 변환하는 객체 같은 시스템에서 사용되는 것이 아닌 다른 시스템으로 전달하는 작업을 처리하는 객체 메소드 호출 횟수를 줄이기 위해 데이터를 담고 있는 것 로직을 가지지 않는 순수한 데이터 객체 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 구조체에서 받은 데이터들을 활용한 출력 구문
}
}
스위프트에서는 어떨지 모르겠지만.. DTO, VO 이런 postfix 네이밍이 명시적일수있지만, 과연 좋은 네이밍일지에 대한 고민을 해봤으면 좋겠네 ㅎㅎ 클래스의 그 목적과 역할에 맞는 자연스러운 네이밍을 실무에서는 많이 추구하더라구 ( ex. LadderGameDTO -> LadderGameOutput ) (+ 해외 유명 오픈소스코드들에는 DTO 와 같은 네이밍이 전혀없다는점..)
@daehwan2yo 좋은 코멘트 고마웡,,,귀하신분이 어째 여기까지 오셨는지 ㅋ ㅋㅋㅋ Swift에서는 어떻게 쓰이는지 더 찾아보고 네이밍에 대해서도 고민해봐야겠당 👍🏻
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와 마찬가지로 로직을 가질 수 있다.