티스토리 뷰

Record 클래스

Record는 Java 14에서 처음 도입된 기능으로, Java 16부터 정식으로 사용 가능하다.

레코드는 불변 객체를 쉽게 생성할 수 있도록 도와주는 기능을 제공한다.

 

1. 불변성 보장 

함수형 프로그래밍에서 중요하게 여기는 개념으로 불변성(Immutable)이 있다.

Java의 레코드 클래스는 한번 생성된 객체의 데이터를 변경할 수 없기 때문에 불변성을 가지고 있다.

 

따라서 데이터를 일관성 있게 유지할 수 있기 때문에 데이터 전송 객체(DTO)로 자주 사용된다.

 

 

2. 보일러플레이트 코드 제거

생성자, getter, setter, equals, hashCode, toString 메서드를 자동으로 생성해주기 때문에

DTO에서 주로 사용하는 보일러플레이트 코드(반복되는 코드)를 줄일 수 있다.

 

 

Record를 사용하면 좋은 경우

레코드는 간결한 데이터 표현이 장점이므로, 데이터가 자주 변경되지 않고 주로 읽기 전용일 때 사용하면 좋다.

  • 데이터가 한 번 설정된 후 변경되지 않는 경우: 조회 전용 데이터를 전송할 때 적합하다.
  • 여러 스레드에서 동시 접근이 발생하는 환경: 불변 객체로 인해 안전성을 보장한다.
  • DTO가 단순한 조회 용도로만 사용되고 업데이트가 필요 없는 경우

 

 

DTO 클래스를 사용하면 좋은 경우

레코드 클래스를 DTO 클래스로 사용하기에 정말 적합해보인다.

하지만 레코드는 불변 객체로 생성한 후 매번 새로운 인스턴스를 생성해야하기 때문에, 가변 데이터를 다뤄야하는 아래와 같은 예시에서는 DTO 클래스 사용이 더 나을 수 있다.

 

1. 선택적인 필드 업데이트

 

사용자가 게시글을 수정할 때, 일부 필드만 변경하고 나머지 필드는 그대로 두고 싶을 수 있다.

예를 들어, 제목은 수정하지만 내용은 수정하지 않는 경우, 내용 필드는 빈 값으로 전달한다.

 

2. 부분적인 데이터 전송

게시글 등록 시 첨부 파일과 같이 필수가 아닌 선택 항목은 사용자가 입력하지 않을 수 있다.

public class PostCreateDTO {
    private final String title;
    private final String content;
    private final String fileUrl;

    private PostCreateDTO(Builder builder) {
        this.title = builder.title;
        this.content = builder.content;
        this.fileUrl = builder.fileUrl;
    }

    public static class Builder {
        private String title;
        private String content;
        private String fileUrl;

        public Builder title(String title) {
            this.title = title;
            return this;
        }

        public Builder content(String content) {
            this.content = content;
            return this;
        }

        public Builder fileUrl(String fileUrl) {
            this.fileUrl = fileUrl;
            return this;
        }

        public PostCreateDTO build() {
            if (title == null || title.isEmpty()) {
                throw new IllegalArgumentException("제목은 필수입니다.");
            }
            if (content == null || content.isEmpty()) {
                throw new IllegalArgumentException("내용은 필수입니다.");
            }
            return new PostCreateDTO(this);
        }
    }

    public String getTitle() {
        return title;
    }

    public String getContent() {
        return content;
    }

    public String getFileUrl() {
        return fileUrl;
    }
}

// 사용 예시
PostCreateDTO postDTO = new PostCreateDTO.Builder()
    .title("제목")
    .content("내용")
    .fileUrl("")
    .build();

만약 이런 상황에서 레코드와 빌더 패턴을 사용할 수도 있다.

하지만 선택적으로 필드를 설정할 수는 있지만 이미 생성된 레코드를 수정할 수 없기 때문에 유연성이 떨어진다.

그렇기 때문에 선택 필드가 있는 동적 데이터 처리에는 DTO 클래스를 사용하는게 더 적합하다.

 

 

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함