Record란?
Java 16에서 정식 출시된 특별한 클래스 유형
기존 클래스 생성 시 반복적으로 작성하던 보일러플레이트 코드를 줄이는 데 중점을 둠
자동으로 생성자, getter, equals(), hashCode(), toString() 메서드 생성함
public record User(String name, String email, int age) {}
VO(Value Object)란?
도메인 모델 내에서 특정 개념이나 값을 표현하는 객체
객체 간의 값 기반 비교를 지원하며, 값이 동일하면 같은 객체로 간주함
비즈니스 로직과 밀접하게 연관되어 있으며, 특정 값에 대한 제약 조건이나 유효성 검증 로직을 포함함
Coordinates라는 이름의 VO를 구현해, (x,y) 좌표 값의 유효성을 검증하거나, 좌표를 이동시키는 메서드를 구현한 예제
public class Coordinates {
private final double x;
private final double y;
public Coordinates(double x, double y) {
if (x < 0 || y < 0) {
throw new IllegalArgumentException("Coordinates must be non-negative");
}
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public Coordinates move(double deltaX, double deltaY) {
return new Coordinates(this.x + deltaX, this.y + deltaY);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Coordinates)) return false;
Coordinates other = (Coordinates) obj;
return Double.compare(this.x, other.x) == 0 &&
Double.compare(this.y, other.y) == 0;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
}
Record | VO | |
공통점 | ||
1. 불변성 Immutability - Record 필드는 자동으로 final로 선언되어 불변 객체가 됨 - VO도 불변성을 유지하기 위해 필드에 final 키워드를 사용할 수 있음. - 불변성을 통해 안전한 멀티스레드 환경을 보장함 2. 값 기반 동등성(Value-based Equality) - Record는 자동으로 equals()와 hashCode() 메서드를 생성해, 객체 참조가 아닌 필드 값 기반으로 동등성 판단 - Record는 동일한 필드 값을 가지면, 동일한 객체로 간주함 - VO는 동일한 값은 동일한 객체로 간주함 3. 데이터 캡슐화 - 데이터를 캡슐화 해, 내부 필드를 외부에서 직접 변경하지 못하도록 설계함 |
||
차이점 | ||
목적 | DTO(Data Transfer Object) 중심 데이터 전달 역할에 초점 |
특정 도메인에서 개념이나 값 표현 (좌표, 통화, 날짜 등) |
비즈니스 로직 | 비즈니스 로직 설계에 적합하지 않음. 단순히 데이터 정의하고 캡슐화해 전달하는 데 적합 |
비즈니스 로직 포함할 수 있음 좌표의 유효성 검증, 계산 메서드 추가 |
확장성 | 상속 지원하지 않음. 필드가 자동으로 final로 선언되어 확장 어려움. 인터페이스 구현은 가능함. |
일반 Class처럼 상속할 수 있음 |
자동 메서드 | 생성자, getters, equals(), hashCode(), toString() 자동 생성 |
수동으로 모든 메서드 작성해야 함 |
Java 버전 | Java 16 이상 | 모든 버전 가능 |
Q. Record로 생성한 모든 객체는 DTO인가?
- 아니다. Record는 데이터를 캡슐화하는 역할을 하지만, DTO 이외에도 VO를 구현해볼 수 있음
// 값 객체로 사용
public record Coordinates(double x, double y) {}
그러나 VO의 모든 특성을 대체할 수는 없음. VO는 더 넓은 도메인에서 사용되고, 복잡한 비즈니스 로직을 포함할 수 있음.
출처
[1] 매일메일. 250128. Record를 DRO로 사용하는 이유가 뭔가요? 107번. https://maeil-mail.kr
'개발자 강화 > 백엔드' 카테고리의 다른 글
[매일메일] SOLID 원칙이란? (BE.250130) (0) | 2025.01.30 |
---|---|
[매일메일] DB Replication이란? (BE.250129) (0) | 2025.01.30 |
[매일메일] HTTPS란? (BE. 250127) (0) | 2025.01.27 |
[개발] DB Trigger란? (0) | 2025.01.24 |
[매일메일] WAS와 웹서버의 차이점? (BE.250124) (0) | 2025.01.24 |