DTO의 주요 목적은 데이터를 전달하는 것이며, 전달된 후 변경되지 않는 것이 이상적이다. 따라서 DTO는 불변객체로 만드는 게 좋으므로 setter 사용을 지양해야 한다.
정답은 X
엔티티 클래스는 데이터베이스와 직접 매핑되는 클래스이며, JPA(Hibernate) 같은 ORM 프레임워크에서 객체 상태를 관리하기 위해 사용된다.
→ 상태 변경이 필요하기 때문에 setter 사용이 가능하고, 종종 필요함
DTO*(Data Transfer Object) 는 이름 그대로 데이터 전송을 위한 객체로, 주로 계층 간(Controller ↔ Service ↔ View) 데이터 전달을 위해 사용된다.
→ DTO는 불변성(Immutable) 을 유지하는 것이 좋으며, 따라서 setter를 지양하고 생성자 또는 빌더 패턴을 활용합니다.
public class StudentDto {
private final String name;
private final int age;
public StudentDto(String name, int age) {
this.name = name;
this.age = age;
}
// Getter만 제공
public String getName() { return name; }
public int getAge() { return age; }
}
@Getter
@Builder
public class StudentDto {
private final String name;
private final int age;
}
그러나 만약 DTO가 특정 상황에서 값의 변경이 필요하다면, 제한된 setter를 만들 수 있다. 하지만 이런 경우는 되도록 피하는 것이 좋다.
| 구분 | Entity | |
|---|---|---|
| 목적 | DB와의 매핑, 상태 관리 | 데이터 전달 및 표현 |
| setter 사용 | 필요 시 사용 가능 (신중히 관리) | 지양 (불변 객체로 유지) |
| 대안 | 비즈니스 로직 메서드 활용 | 생성자, 빌더 패턴으로 초기화 |
| 상태 변경 | O (필요) | X (불변성 유지) |