Java/Spring

[Java] DTO 쉽게 만드는 법 (record)

뉴벡엔드 2024. 4. 27. 13:41

record

자바에서 record는 자바 14부터 프리뷰 기능으로 도입되었고, 자바 16에서 정식 기능으로 확정되었습니다.

 

주요특징

  1. 불변성: record의 모든 필드는 기본적으로 final입니다. 따라서 객체가 생성된 후에는 필드의 값을 변경할 수 없습니다.
  2. 자동 생성된 메서드: record는 자동으로 equals(), hashCode(), toString() 메서드를 생성합니다. 이는 객체의 동등성을 검사하고, 객체를 문자열로 표현하는 등의 작업을 쉽게 처리할 수 있게 해 줍니다.
  3. 간결한 구문: 필드 정의, 생성자, getter 메서드 등을 명시적으로 작성할 필요 없이, record 선언만으로 자동으로 처리됩니다.
  4. 데이터 중심: 주로 데이터를 저장하고 접근하는 데 사용됩니다. 각 필드에 대한 자동 생성된 getter 메소드를 제공하며, setter 메소드는 제공되지 않습니다.

 

사용사례

  1. 데이터 전송 객체 (DTO): Record는 불변성이 보장되므로, 여러 계층(예: 데이터베이스, 서비스, 컨트롤러) 간에 데이터를 안전하게 전달하는 데 이상적입니다.
  2. 도메인 모델: 복잡한 도메인 로직을 갖는 애플리케이션에서 각 엔티티의 불변성을 유지하며 상태를 관리하고자 할 때 유용합니다.
  3. 캐싱: 불변 객체는 변경되지 않기 때문에, 한 번 생성된 후에 여러 컴포넌트나 서비스에서 재사용하기 좋습니다. 이는 캐싱 메커니즘에 특히 유리합니다.
  4. 복합 키: 데이터베이스 또는 다른 데이터 저장소에서 사용되는 복합 키를 표현할 때 효과적입니다. 각 필드가 불변으로 관리되어야 할 때 Record를 사용하여 이를 쉽게 구현할 수 있습니다.

 

예시)

 

record 적용 전

public class TodoRequest {
    private final String todoName;

    public TodoRequest(String todoName) {
        this.todoName = todoName;
    }

    public String getTodoName() {
        return todoName;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        TodoRequest that = (TodoRequest) o;
        return todoName != null ? todoName.equals(that.todoName) : that.todoName == null;
    }

    @Override
    public int hashCode() {
        return todoName != null ? todoName.hashCode() : 0;
    }

    @Override
    public String toString() {
        return "TodoRequest{" +
               "todoName='" + todoName + '\'' +
               '}';
    }
}

 

 

recode 적용 후

 

public record TodoRequest(String todoName) { }
반응형