Java Record를 활용한 데이터 전달 객체 간편화

Record: 자바에서 데이터 컨테이너 클래스를 단순화하는 새로운 방식

Java 14부터 도입된 record는 순수한 데이터를 담는 클래스를 작성할 때 발생하는 반복적인 코드를 줄여주는 핵심 기능입니다. 이전까지는 단순한 데이터 포장용 클래스를 만들기 위해 필드 선언, 생성자, 게터 메서드, 그리고 equals(), hashCode(), toString() 등의 오버라이드 메서드를 수동으로 구현해야 했습니다.

record는 이러한 작업을 선언형 문법으로 대체하여 컴파일 타임에 자동으로 필요한 구성 요소를 생성합니다.

기존 방식의 복잡성

예를 들어, 이름과 나이를 포함하는 사람 정보를 표현하려면 다음과 같은 코드가 필요했습니다:

public class Employee {
    private final String fullName;
    private final int yearsOfService;

    public Employee(String fullName, int yearsOfService) {
        this.fullName = fullName;
        this.yearsOfService = yearsOfService;
    }

    public String getFullName() { return fullName; }
    public int getYearsOfService() { return yearsOfService; }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (!(obj instanceof Employee other)) return false;
        return Objects.equals(fullName, other.fullName) &&
               yearsOfService == other.yearsOfService;
    }

    @Override
    public int hashCode() {
        return Objects.hash(fullName, yearsOfService);
    }

    @Override
    public String toString() {
        return "Employee{fullName='" + fullName + "', yearsOfService=" + yearsOfService + '}';
    }
}

이러한 코드는 길고 반복적이며, 실수할 여지가 많습니다.

Record로의 간소화

같은 목적을 record를 사용하면 한 줄로 완료됩니다:

public record Employee(String fullName, int yearsOfService) {}

컴파일러는 자동으로 다음을 생성합니다:

  • 공개된 매개변수를 받는 규칙적 생성자
  • 각 필드에 대한 접근자 메서드 (fullName(), yearsOfService())
  • equals(), hashCode(), toString()의 적절한 구현

결과적으로 개발자는 비즈니스 로직에 집중할 수 있게 되며, 코드의 가독성과 유지보수성이 크게 향상됩니다.

특징 및 제약사항

  • record는 기본적으로 final이며 상속 불가.
  • 모든 필드는 암시적으로 final이므로 불변성을 보장.
  • 정적 필드, 정적 메서드, 인스턴스 메서드를 추가할 수 있음.
  • 그러나 비정적 인스턴스 필드는 허용되지 않으며, 기존의 인스턴스 변수처럼 사용할 수 없습니다.
  • 컴파일러가 생성한 메서드는 재정의 가능 — 필요 시 직접 구현 가능.

또한, record는 인터페이스를 구현하거나, 다른 record를 확장할 수 있는 정적 메서드를 정의하는 데 유용하게 사용될 수 있습니다.

적합한 사용 사례

  • DTO(Data Transfer Object)
  • 값 객체(값 기반 비교가 중요한 경우)
  • 복합 키(예: 두 개 이상의 필드 조합된 식별자)
  • 단순한 데이터 그룹화

하지만 복잡한 행위나 상태 변경이 필요한 도메인 모델에는 부적합합니다. 그런 경우에는 기존의 클래스 또는 빌더 패턴을 고려해야 합니다.

다른 언어와의 비교

record는 Kotlin의 data class나 Scala의 case class와 유사한 개념으로, 현대적인 언어 스타일로의 진화를 보여줍니다. 또한 switch 표현식, 패턴 매칭 등과 함께 사용될 수 있어, 향후 더 강력한 언어 기능의 기반이 됩니다.

태그: Java Record data class immutability DTO value object

6월 7일 22:34에 게시됨