Record
는 Java 14에 처음 도입된 데이터 중심의 클래스를 간단하게 정의할 수 있는 문법입니다. 데이터 객체를 불변으로 설계하면서 반복적인 코드 작성(생성자, getter, equals
, hashCode
, toString
등)을 자동으로 처리합니다. 특히, 데이터를 주고받거나 값 객체를 표현할 때 유용합니다.
불변 객체 (Immutable)
final
로 선언되어 객체 생성 후 값을 변경할 수 없습니다.간결성
equals
, hashCode
, toString
)를 자동 생성합니다.상속 불가
record
는 암묵적으로 final
로 선언되며, 상속할 수 없습니다.데이터 중심 설계
public record Person(String name, int age) {}
위 코드는 다음 메서드들을 자동으로 제공합니다:
String name()
int age()
equals()
, hashCode()
, toString()
public class RecordExample {
public static void main(String[] args) {
// Record 객체 생성
Person person = new Person("Alice", 30);
// 필드 값 접근
System.out.println(person.name()); // Alice
System.out.println(person.age()); // 30
// toString 호출
System.out.println(person); // Person[name=Alice, age=30]
}
}
record
는 getter 메서드 이름을 필드 이름과 동일하게 정의합니다.
따라서, getName()
대신 name()
형태로 접근하며, 이는 record
가 데이터를 표현하는 간단한 값 객체임을 강조합니다.
이 방식은 읽기 전용 속성을 간결하게 표현하고, 데이터 중심 설계에 어울리는 직관적인 API를 제공합니다.
Lombok은 @Getter
, @Setter
, @AllArgsConstructor
와 같은 어노테이션으로 보일러플레이트 코드를 제거합니다. 그러나 Lombok은 다음과 같은 문제를 가질 수 있습니다:
record
는 표준 Java 기능으로 별도의 의존성이 필요하지 않습니다.도메인 객체는 일반적으로 도메인 로직을 포함하므로 record
사용은 적합하지 않을 수 있습니다.
record
는 데이터를 전달하거나 단순히 값을 표현할 때 유용하지만, 도메인 객체에는 다음과 같은 이유로 적합하지 않을 수 있습니다:
record
사용record
는 데이터 전송 객체(DTO) 설계에 적합합니다.
DTO는 주로 계층 간 데이터를 전달하는 데 사용되며, 복잡한 로직을 포함하지 않습니다.
public record UserDTO(String username, String email) {}
record
는 값의 불변성을 보장하기 때문에 값 객체 설계에 적합합니다.
값 객체는 도메인에서 특정 속성(값)을 표현하며, 불변성을 유지하는 것이 중요합니다.
public record Money(String currency, double amount) {}
record
는 이벤트 기반 시스템에서 이벤트 데이터를 전달할 때 유용합니다.
public record UserLoggedInEvent(String username, Instant timestamp) {}
가독성과 생산성 향상
안정성
효율성
표준화
가변 상태가 필요한 경우
복잡한 도메인 로직이 포함된 경우
// Person 객체를 값 객체로 정의
public record Person(String name, int age) {}
// 사용 예
public class RecordUsageExample {
public static void main(String[] args) {
Person person1 = new Person("Alice", 25);
Person person2 = new Person("Bob", 30);
System.out.println(person1); // 출력: Person[name=Alice, age=25]
System.out.println(person1.equals(person2)); // false
}
}
record
는 간결성과 불변성을 제공하며, 데이터 전송 객체(DTO), 값 객체(VO) 등에 적합합니다.
그러나 도메인 객체와 같이 복잡한 로직이나 가변 상태를 필요로 하는 경우에는 일반 클래스를 사용하는 것이 더 적합합니다.