Spring Boot

DTO vs VO

먹세 2021. 10. 16. 09:09

정의 

DTO(Data Transfer Object) :

- 계층 간 데이터를 전달하기 위해 사용하는 객체 (Controller <-> Service 등)

- 데이터를 담아서 전달하는 바구니

- getter/setter 메소드만을 갖는다

이외의 다른 메소드는 필요가 없다 (오직 데이터를 담아서 전달만 하는 객체이기 때문)

- setter가 있기 때문에 값이 변할 수 있지만, 의도적으로 setter를 없애고 생성자로 값을 넣어서 불변하게 사용하는 것이 각 계층간 이동시 동일한 값을 보장하기 때문에 더욱 안전하게 사용 가능

 

예시코드 : 

- dto 클래스

public class userDto {
	private String name;
	private Integer age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public  void setAge(Integer age) {
		this.age = age;
	}
}

- 보내는 곳

Service 계층에서 데이터를 세팅해서 보내는 예

public class UserService {
	// UserDto 객체를 리턴
	public UserDto createNewUser() {
		//dto에 넣어서 보낼 데이터들을 정의
		String newName = "홍길동";
		Integer newAge = 20;

		// 데이터를 전달하게 될 dto에 데이터를 set
		UserDto userDto = new UserDto();
		userDto.setName(newName);
		userDto.setAge(newAge);

		return userDto;
	}
}

- 받는 곳

Controller 계층에서 데이터를 받는 예

public class UserController {
	public String createNewUser() {
    	
        // 서비스계층의 createNewUser를 통해서 UserDto 객체를 반환 받아온다
		UserDto getUserDto = UserService.createNewUser();
        
        // 반환받은 UserDto 객체에서 값들을 꺼내서 사용한다
		String name = getUserDto.getName();
		Integer age = getUserDto.getAge();

		return name;
	}
}

 

 

VO(Value Object) :

- 값을 표현하기 위한 객체

- 속성값으로 동일한 객체인지를 비교 (속성값이 달라지면 다른 객체로 본다)

예를들어 흰색의 속성값은 #ffffff 이고, 검정색의 속성값은 #000000 이라서 속성값이 다르기 때문에 다른 객체로 본다

- equals() 와 hashCode() 두 메서드 모두 오버라이딩 하여 비교를 해서 둘다 같을 때 같은 객체로 본다

- setter 메소드를 가지면 안되고, 생성자를 통해서만 값을 초기화 해야 한다 

- getter 이외에 로직이 포함된 메소드를 가질 수 있다

 

 

예시코드 : 

public class colorVo {
	private final String color;

	// 생성자를 통해 set. 값 불변
	public colorVo(String color) {
		this.color = color;
	}

	// 로직이 담긴 메소드 포함 가능
	public String colorChange() {
		return color+"a";
	}
}

 

 

DTO 와 VO 비교 :

  DTO VO
용도 계층 간 데이터 전달 값 자체를 표현
동등 결정 속성값이 모두 같아도 같은 객체가 아닐 수 있다. 속성값이 모두 같으면 같은 객체이다.
가변 / 불변 setter 존재 시 가변,
setter 비 존재 시 불변
불변
로직 getter/setter 이외의 로직이 불필요함 getter/setter 이외의 로직을 가질 수 있음

 

 

 

 

 

참고 : 

https://www.youtube.com/watch?v=z5fUkck_RZM 

https://velog.io/@taehee-kim-dev/DTO-vs-VO

 

DTO vs VO

우테코에서 DTO vs VO 에 대한 주제로 테코톡 발표를 했다.발표를 마친 뒤 질의응답을 받는 시간에, 크루 루트 와 다른 크루들이 핵심적인 질문을 했다.명쾌한 답변을 못 했다. 일단 나에게도 새로

velog.io

 

반응형