Java Record

김상진 ·2024년 12월 17일
0

CS

목록 보기
18/30

Java Record


1. Record란 무엇인가?

Record는 Java 14에 처음 도입된 데이터 중심의 클래스를 간단하게 정의할 수 있는 문법입니다. 데이터 객체를 불변으로 설계하면서 반복적인 코드 작성(생성자, getter, equals, hashCode, toString 등)을 자동으로 처리합니다. 특히, 데이터를 주고받거나 값 객체를 표현할 때 유용합니다.


2. Record의 특징

  1. 불변 객체 (Immutable)

    • 필드는 final로 선언되어 객체 생성 후 값을 변경할 수 없습니다.
  2. 간결성

    • 데이터를 표현하기 위한 보일러플레이트 코드(생성자, getter, equals, hashCode, toString)를 자동 생성합니다.
  3. 상속 불가

    • record는 암묵적으로 final로 선언되며, 상속할 수 없습니다.
  4. 데이터 중심 설계

    • 데이터를 저장하고 전달하는 용도에 적합합니다.

3. Record의 정의와 사용법

1) 기본 문법

public record Person(String name, int age) {}

위 코드는 다음 메서드들을 자동으로 제공합니다:

  • String name()
  • int age()
  • equals(), hashCode(), toString()

2) Record 객체 사용

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]
    }
}

3) Record에서 .name()처럼 사용하는 이유

recordgetter 메서드 이름을 필드 이름과 동일하게 정의합니다.
따라서, getName() 대신 name() 형태로 접근하며, 이는 record가 데이터를 표현하는 간단한 값 객체임을 강조합니다.

이 방식은 읽기 전용 속성을 간결하게 표현하고, 데이터 중심 설계에 어울리는 직관적인 API를 제공합니다.


4. Record와 Lombok의 차이점

1) Lombok과 Record 비교

Lombok은 @Getter, @Setter, @AllArgsConstructor와 같은 어노테이션으로 보일러플레이트 코드를 제거합니다. 그러나 Lombok은 다음과 같은 문제를 가질 수 있습니다:

  • 추가 의존성: Lombok은 외부 라이브러리로, 의존성을 추가해야 합니다.
  • IDE 지원 문제: 일부 IDE에서 Lombok 코드가 제대로 표시되지 않을 수 있습니다.
  • 가독성 문제: Lombok으로 생성된 코드는 자동 생성된 메서드 내용을 명시적으로 보여주지 않기 때문에, 코드 이해가 어렵습니다.

2) Record의 장점

  • record표준 Java 기능으로 별도의 의존성이 필요하지 않습니다.
  • 데이터 객체를 설계할 때, 불변성을 기본으로 제공하여 실수 가능성을 줄입니다.
  • 코드의 의도를 더 명확하게 드러냅니다. (데이터 중심 설계)

3) 언제 Lombok을 사용하는 것이 적합한가?

  • 데이터가 불변이 아니거나, 복잡한 비즈니스 로직이 필요한 경우.
  • 표준 Java 버전을 사용할 수 없는 환경에서.

5. 도메인 객체에 Record를 사용해도 될까?

도메인 객체는 일반적으로 도메인 로직을 포함하므로 record 사용은 적합하지 않을 수 있습니다.
record는 데이터를 전달하거나 단순히 값을 표현할 때 유용하지만, 도메인 객체에는 다음과 같은 이유로 적합하지 않을 수 있습니다:

  • 도메인 객체는 상태 변경(가변성)을 지원해야 할 수 있습니다.
  • 복잡한 비즈니스 로직이 포함될 가능성이 있습니다.
  • 특정 설계 패턴(예: 엔티티와 VO 구분)이 필요할 수 있습니다.

권장사항

  • DTO, VO: record 사용
  • 도메인 객체: 일반 클래스 사용

6. Record의 주 사용처

1) 데이터 전송 객체 (DTO)

record데이터 전송 객체(DTO) 설계에 적합합니다.
DTO는 주로 계층 간 데이터를 전달하는 데 사용되며, 복잡한 로직을 포함하지 않습니다.

public record UserDTO(String username, String email) {}
  • 사용 예시: REST API 응답, 데이터베이스 조회 결과 매핑

2) 값 객체 (Value Object, VO)

record는 값의 불변성을 보장하기 때문에 값 객체 설계에 적합합니다.
값 객체는 도메인에서 특정 속성(값)을 표현하며, 불변성을 유지하는 것이 중요합니다.

public record Money(String currency, double amount) {}
  • 사용 예시: 금액, 좌표, 날짜 등.

3) 이벤트 데이터

record는 이벤트 기반 시스템에서 이벤트 데이터를 전달할 때 유용합니다.

public record UserLoggedInEvent(String username, Instant timestamp) {}

7. Record를 왜 사용하는가?

  1. 가독성과 생산성 향상

    • 데이터를 표현하기 위한 반복적인 코드 작성이 필요 없습니다.
  2. 안정성

    • 불변성을 보장하므로 동시성 문제를 줄일 수 있습니다.
  3. 효율성

    • 데이터 중심 객체에 집중하면서도 유지보수가 쉬워집니다.
  4. 표준화

    • 외부 라이브러리(Lombok)에 의존하지 않고, 표준 Java 기능만으로 개발할 수 있습니다.

8. Record를 사용하지 않는 경우

  1. 가변 상태가 필요한 경우

    • 예: 엔티티 객체, 상태 관리가 필요한 객체
  2. 복잡한 도메인 로직이 포함된 경우

    • 예: 비즈니스 로직이 많거나 객체의 상태가 변해야 하는 경우

9. 예제 코드

// 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
    }
}

10. 결론

record는 간결성과 불변성을 제공하며, 데이터 전송 객체(DTO), 값 객체(VO) 등에 적합합니다.
그러나 도메인 객체와 같이 복잡한 로직이나 가변 상태를 필요로 하는 경우에는 일반 클래스를 사용하는 것이 더 적합합니다.


11. 참고 자료

profile
알고리즘은 백준 허브를 통해 github에 꾸준히 올리고 있습니다.🙂

0개의 댓글

관련 채용 정보