# DTO , VO, Builder Pattern

## **DTO (Data Transfer Object)**

* 주로 계층 간 데이터를 전송하기 위한 객체입니다. 필드는 대부분 `public`으로 선언되며, getter/setter를 통해 외부와의 데이터 교환이 목적입니다. 비즈니스 로직은 포함하지 않는 것이 일반적입니다.
  * 예: **API** 전송, **DB에서 조회한 데이터**  등
  * 일반적으로 가변(mutable)하며, 직렬화에 용이한 구조로 설계됩니다.

## **VO (Value Object)**

* 값 그 자체를 표현하는 객체로, 불변(immutable) 성을 가지는 것이 원칙입니다. 동일한 값을 가지면 같은 객체로 간주되며, equals/hashCode를 오버라이딩하여 비교에 사용됩니다.
  * 생성 시 값이 고정되며, setter 없이 **생성자만으로 설정**합니다.
  * 단, 실제 협업시에는 VO와 DTO를 혼동하여 사용하는 경우가 대부분이라 이 원칙이 절대적으로 지켜지는 경우는 흔치 않습니다.

## Builder Pattern

* Builder 패턴은 복잡한 객체의 생성 과정을 단계별로 분리하여, 유연하고 가독성 높은 방식으로 객체를 생성하는 **디자인 패턴**입니다.
* 생성자로는 처리하기 어려운 **다양한 선택적 매개변수**를 다룰 때 유용합니다.
* 내부적으로는 **정적 내부 클래스**를 사용하여 외부 객체를 생성합니다.
* 롬복에서 제공하는 `@Builder`  으로 손쉽게 빌더패턴 구현이 가능합니다.
