
자바 record와 DTO 차이는 record를 처음 본 뒤 가장 자주 헷갈리는 지점입니다. 핵심은 둘을 같은 층위의 개념으로 보면 안 된다는 점입니다.
record는 자바가 제공하는 언어 기능이고, DTO는 계층 사이에서 데이터를 전달하는 역할 이름입니다. 즉 record는 DTO를 표현할 때 쓸 수 있는 문법이지 DTO 그 자체는 아닙니다.
자바 record와 DTO 차이 한눈에 보기

record: 자바 언어가 제공하는 특별한 클래스 문법DTO: 데이터를 전달하기 위한 설계 역할 이름- 그래서 질문은 “record냐 DTO냐”가 아니라 “이 DTO를 record로 표현해도 되느냐”가 맞다
record는 무엇을 자동으로 해줄까
Oracle 문서 기준으로 record는 header를 기준으로 accessor, canonical constructor, equals(), hashCode(), toString()을 자동으로 제공합니다. 또한 컴포넌트 필드는 final입니다.
public record MemberSummary(Long id, String name, String email) {
}이런 선언은 “이 타입은 값 중심 데이터 캐리어다”라는 의도를 짧게 보여줍니다. JEP 395도 record의 목표를 simple aggregation of values와 immutable data modeling 쪽에 둡니다.
DTO는 왜 다른 축의 개념일까
DTO는 보통 controller, service, repository 같은 계층 사이에서 데이터를 전달하기 위한 객체를 뜻합니다. 중요한 것은 역할입니다. class로 만들어도 DTO이고, record로 만들어도 DTO일 수 있습니다.
public class MemberResponseDto {
private final Long id;
private final String name;
public MemberResponseDto(Long id, String name) {
this.id = id;
this.name = name;
}
public Long getId() { return id; }
public String getName() { return name; }
}
public record MemberResponse(Long id, String name) {
}둘 다 응답용 DTO가 될 수 있습니다. 따라서 DTO는 특정 문법 이름이 아니라 어디에 쓰는가를 설명하는 말입니다.
record DTO가 잘 맞는 장면
- 응답 모델처럼 읽기 전용 성격이 강할 때
- 필드가 단순하고 값 중심 의미가 분명할 때
- 자동 생성되는
equals,hashCode,toString이 오히려 잘 맞을 때 - 생성 후 상태를 바꾸지 않는 편이 더 안전할 때
public record OrderItemResponse(
Long productId,
String productName,
int quantity,
int price
) {
}이런 응답용 DTO는 record의 의도와 잘 맞습니다. 값이 정해진 뒤 그대로 전달되기 때문입니다.

class DTO가 더 안전한 장면
반대로 setter, no-args 생성자, 단계적 생성, 내부 표현 캡슐화 같은 요구가 크면 class DTO가 더 편할 수 있습니다. record는 모든 POJO를 대체하는 만능 문법이 아닙니다.
특히 JPA entity는 프록시, 변경 감지, 가변 상태 같은 요구가 자주 붙습니다. 그래서 entity와 DTO를 분리해서 보고 DTO 쪽에만 record를 검토하는 접근이 보통 더 안전합니다.
@Entity
public class Member {
@Id
private Long id;
private String name;
private String email;
protected Member() { }
}
public record MemberResponse(Long id, String name, String email) {
public static MemberResponse from(Member member) {
return new MemberResponse(member.getId(), member.getName(), member.getEmail());
}
}정리
자바 record와 DTO 차이를 한 줄로 정리하면 record는 문법이고 DTO는 역할입니다. 그래서 판단 기준도 “무엇이 더 최신인가”가 아니라 “이 전달 객체를 불변 중심 record로 표현하는 것이 지금 문제에 맞는가”가 되어야 합니다.
같이 보면 좋은 글로는 자바 record와 class 차이, 자바 equals와 hashCode, 자바 String, StringBuilder, StringBuffer 차이가 있습니다. 공식 기준은 Oracle Record Classes와 JEP 395를 참고했습니다.