[TIL] 241210 record

MONA·2024년 12월 10일

나혼공

목록 보기
44/92

팀원의 제안으로 dto 작성 시 record 타입을 사용하게 되었다

Record

데이터를 저장하고 전달하기 위한 불변 객체를 생성하는 데 사용되는 새로운 클래스 타입

특징

  1. 간결한 문법
  • 필드, 생성자, equals, hashCode, toString 메서드를 자동으로 생성함
  • 불필요한 보일러플레이트 코드를 줄여줌
    *보일러플레이트 코드: 여러 가지 상황에서 거의 또는 전혀 변경하지 않고 재사용할 수 있는 컴퓨터 언어 텍스트
  1. 불변성
  • 모든 필드는 기본적으로 final이며, 객체 생성 이후에는 수정할 수 없음
  1. 자동 생성 메서드
  • 생성자, equals, hashCode, toString 메서드를 자동으로 생성
  1. 주로 DTO, VO로 활용
  • 데이터 전달 객체(Data Transfet Object)나 값 객체(Value Object)로 적합함

사용

  1. 기본 선언
public record Person(String name, int age) {}

이 선언으로 아래와 같은 내용을 포함할 수 있다

public final class Person {
    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String name() {
        return name;
    }

    public int age() {
        return age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person person)) return false;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Person[name=" + name + ", age=" + age + "]";
    }
}
  1. 생성자
    record는 기본 생성자를 제공한다. 추가적으로 생성자를 정의하거나 필드 값을 검증할 수도 있다
public record Person(String name, int age) {
    public Person {
        if (age < 0) {
            throw new IllegalArgumentException("Age cannot be negative");
        }
    }
}
  1. 일반 메서드 추가 가능
public record Person(String name, int age) {
    public String greet() {
        return "Hello, " + name + "!";
    }
}

장점

  1. 간결성
  2. 자동 메서드 생성
  3. 불변 객체 생성 시 유리
  4. 명확한 의도- 데이터를 표현하기 위한 객체임을 명확히 나타낼 수 있음

단점

  1. 불변성 강제- final이 기본으로, 가변 필드 사용 불가
  2. 상속 불가- 암묵적으로 final으로 선언되면서 다른 클래스가 상속할 수 없음
  3. JPA 비호환성- JPA는 디폴트 생성자와 Setter 메서드를 요구하기 때문에 잘 안 맞을수도 있음
profile
고민고민고민

0개의 댓글