**DTO(Data Transfer Object, 데이터 전송 객체)**란 프로세스 간에 데이터를 전달하는 객체를 의미합니다. 말 그대로 데이터를 전송하기 위해 사용하는 객체라서 그 안에 비즈니스 로직 같은 복잡한 코드는 없고 순수하게 전달하고 싶은 데이터만 담겨있습니다.  아래의 그림을 통해 DTO는 주로 클라이언트와 서버가 데이터를 주고받을 때 사용하는 객체임을 알 수 있습니다.

public class UserDTO {
    private Long id;
    private String name;
    private String email;

    // Constructor, Getter, Setter
}

어떤 객체 자체를 넘기는게 아니라 필요한 정보만 가져갈 수 있도록 Data Transfer Object 에 넣어서 주는 것이다!

DTO는 불변성을 가지는 것이 좋습니다. 불변성을 갖는 DTO는 상태 변화로 인해 발생할 수 있는 부작용을 방지하고, 스레드 안전성을 높여 주기 때문에 특히 멀티스레드 환경에서 유리합니다.

불변성을 유지하려면 DTO를 설계할 때 다음을 고려할 수 있습니다:

  1. final 필드: DTO의 필드를 final로 선언하여 값이 한 번 설정되면 변경할 수 없게 만듭니다.
  2. Setter 제거: DTO에는 값을 변경할 수 있는 setter 메서드를 두지 않고, 생성자에서만 값을 설정합니다.
  3. 불변 객체 사용: 만약 DTO가 List, Map 같은 컬렉션을 포함하는 경우, 해당 컬렉션을 불변 컬렉션으로 초기화해 외부에서 변경하지 못하게 합니다.

예시로, 불변성을 가진 DTO는 다음과 같이 작성할 수 있습니다:

java
코드 복사
public class UserDTO {
    private final Long id;
    private final String name;
    private final String email;

    public UserDTO(Long id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }
}

이렇게 불변성을 유지하면 객체의 상태가 변하지 않기 때문에 코드가 예측 가능해지고, 변경 가능성에 대한 걱정 없이 안전하게 DTO를 여러 곳에서 사용할 수 있습니다. 다만, 불변성을 유지하는 것이 필수는 아니며, 간단한 DTO라면 필요에 따라 가변성을 허용하기도 합니다.