Java 개발에서 데이터를 전달하기 위해 DTO (Data Transfer Object)와 Record를 사용할 수 있습니다. 두 개념은 비슷해 보이지만, 목적, 작성 방법, 불변성, 코드 간결성 등 여러 측면에서 차이가 있습니다.
DTO는 계층 간 데이터를 전달하는 객체입니다.
getter, setter, toString, equals 등을 명시적으로 정의해야 합니다.Setter를 제공하면 객체 상태가 변경될 수 있습니다.import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class UserDto {
private Long id;
private String username;
private String email;
}
Java 16부터 도입된 Record는 데이터를 간결하게 표현하는 불변 객체입니다.
final로 선언되며, 값 변경이 불가능합니다.getter, toString, equals, hashCode 메서드가 자동으로 생성됩니다.
public record UserDto(Long id, String username, String email) {}
| 비교 항목 | DTO (클래스) | Record |
|---|---|---|
| 불변성 | Setter 제공 시 불변성 보장 어려움 | 필드가 final이므로 불변성 보장 |
| 보일러플레이트 | getter, setter, toString 필요 | 자동으로 생성되므로 코드가 간결함 |
| 사용 가능 버전 | Java 버전 제한 없음 | Java 16 이상 |
| 유연성 | 추가 메서드나 로직을 자유롭게 추가 가능 | 제한적, 필드와 생성자만 간결히 표현 |
| 호환성 | 기존 라이브러리나 프레임워크와 호환 | 일부 프레임워크나 라이브러리에서 제한적 |
| 가독성 | 코드 길어질 수 있음 | 매우 간결하고 명확 |
final 필드와 생성자를 사용해야 합니다.getter, equals, hashCode 등이 자동 생성됩니다.