
Java record와 class 차이는 단순히 코드 줄 수 차이로만 보면 오해하기 쉽습니다. record는 DTO를 짧게 쓰는 도구처럼 보이지만, 실제로는 어떤 종류의 데이터를 표현하려는지에 대한 설계 선택과 더 가깝습니다.
이번 글에서는 record를 편의 문법으로만 보지 않고, 값 중심 데이터 모델을 더 투명하게 표현하려는 장치로 설명하겠습니다. 특히 DTO, 값 객체, 엔티티를 같은 기준으로 보면 왜 오해가 생기는지도 함께 보겠습니다.

공식 기준은 Oracle records 문서를 참고할 수 있습니다. record는 단순 축약 문법이 아니라 데이터 중심 타입이라는 의도가 함께 들어 있습니다.
record는 왜 나왔을까
기존 class로 단순 데이터 전달 객체를 만들면 필드, 생성자, getter, equals, hashCode, toString 같은 반복 코드가 많았습니다. record는 이런 반복을 줄이면서, 이 타입이 주로 데이터를 담는 역할이라는 의도를 더 분명히 드러냅니다.
즉 핵심은 짧아지는 것 자체보다, “이 타입은 데이터를 투명하게 담는 구조다”라는 점을 언어 차원에서 드러내는 데 있습니다.
class와의 가장 큰 차이는 무엇일까
record는 기본적으로 값 중심, 불변 지향, 구성 요소 중심 타입에 더 가깝습니다. 반면 일반 class는 상태 변경, 행위 확장, 상속 구조, 복잡한 생명주기까지 더 넓은 역할을 맡을 수 있습니다.

DTO에는 왜 잘 맞을까
record를 처음 볼 때 가장 위험한 오해는 “이제 DTO는 무조건 record”라는 식의 단정입니다. 실제로는 외부 프레임워크 제약, 직렬화 방식, 변경 가능성 요구가 있으면 여전히 class가 더 적절할 수 있습니다.
DTO는 보통 외부로 값을 전달하거나 계층 간 데이터를 옮기는 데 집중합니다. 이런 경우 record는 의도와 구현이 잘 맞습니다. 필드 의미를 짧고 명확하게 드러내고, 동등성도 값 기반으로 자연스럽게 가져가기 쉽기 때문입니다.
하지만 DTO라고 해서 무조건 record여야 하는 것은 아닙니다. 직렬화 프레임워크, 라이브러리 제약, 변경 가능한 필드 요구 같은 맥락이 있으면 class가 더 낫기도 합니다.
실전에서는 어떻게 판단하면 좋을까
실전에서는 “이 타입이 값을 전달하는 통로인가, 아니면 상태 변화와 규칙을 품은 객체인가”를 먼저 보면 판단이 빨라집니다. 예를 들어 주문 조회 API의 응답 모델은 값을 전달하는 역할이 중심이므로 record가 잘 맞을 수 있습니다.
반대로 주문 엔티티 자체는 결제 완료, 취소 가능 여부, 재고 반영 같은 상태 변화 규칙을 품고 있으므로 class가 더 자연스럽습니다. 즉 이름에 Order가 들어간다고 같은 기준으로 보면 안 되고, 타입의 역할을 먼저 봐야 합니다.


엔티티에는 왜 조심해야 할까
엔티티는 단순 데이터 뭉치보다 식별성, 변경 규칙, 생명주기, 도메인 행위가 중요할 수 있습니다. 이런 객체는 값 투명성보다 행동과 제약이 더 중요하므로 record가 항상 잘 맞는 것은 아닙니다.
즉 record는 엔티티를 금지하는 문법은 아니지만, 엔티티가 자연스럽게 요구하는 설계와는 결이 다를 수 있습니다. 이 지점을 구분하지 않으면 “짧으니까 record로 통일” 같은 위험한 습관이 생깁니다.
공식 문서 감각은 Oracle records 문서, 값 객체/의도 표현 감각은 Optional 글과도 느슨하게 이어집니다.
잘못된 선택의 대표 예시는 “짧으니까 전부 record로 바꾸자”입니다. 이렇게 접근하면 엔티티의 식별성, 지연 로딩 맥락, 상태 변경 규칙처럼 class가 더 자연스러운 요소를 놓치기 쉽습니다. 결국 문법 통일보다는 역할 통일이 더 중요합니다.
헷갈리는 포인트
- record는 단순히 짧은 class가 아니다
- DTO와 엔티티를 같은 기준으로 보면 안 된다
- 자동 생성 메서드 편리함만 보고 선택하면 설계 판단이 빠진다
- 불변 지향과 값 중심 모델링이 잘 맞는지 먼저 봐야 한다
특히 마지막이 중요합니다. record를 고를지 class를 고를지는 문법 취향보다, 이 타입이 값 중심 데이터인지 행위와 생명주기가 중요한 객체인지에 달려 있습니다.


마무리
Java record와 class 차이의 핵심은 코드 길이가 아니라, 어떤 종류의 객체를 표현하려는지에 있습니다.
즉 값 중심 데이터 모델이라면 record가 자연스럽고, 더 많은 행위와 제약이 필요하면 class가 더 자연스러울 수 있다는 기준을 먼저 잡는 것이 중요합니다.