레코드 클래스는 자바 14부터 도입된 새로운 종류의 클래스로, 데이터 전송 객체(Data Transfer Object, DTO)나 값 객체(Value Object)를 표현하는 데 유용하다. 레코드 클래스는 final 키워드가 붙은 필드와 이 필드들을 초기화하는 생성자를 자동으로 제공한다. 또한, getter 메소드, equals(), hashCode(), toString() 메소드도 자동으로 생성된다.
레코드 클래스는 간결한 구문으로 데이터만을 보유하는 객체를 표현할 수 있다는 장점이 있다. 따라서, 반복적인 코드 작성을 줄이고 코드의 가독성을 향상시킬 수 있다. 또한, 레코드 클래스의 모든 필드는 자동으로 private final로 선언되므로 불변성을 보장한다.
레코드 클래스의 필드는 모두 final로 선언되므로, 한 번 생성된 객체의 상태를 변경할 수 없다. 따라서, 상태 변경이 필요한 경우에는 레코드 클래스 대신 일반 클래스를 사용해야 한다.
레코드 클래스는 데이터 전송 객체(DTO)나 값 객체(Value Object)를 표현하는 데 적합하다. 이들 객체는 상태 변경이 필요 없으며, 데이터를 저장하고 전달하는 역할만 수행하므로 레코드 클래스의 특징을 잘 활용할 수 있다.
예전 과제에서 썼던걸 스윽 들고와서 써보도록하자
import lombok.Getter;
import lombok.NoArgsConstructor;
import yull.todoblog.domain.Article;
import java.time.LocalDateTime;
@NoArgsConstructor
@Getter
// ArticleViewResponse: 게시글 상세 조회 응답을 위한 DTO
public class ArticleViewResponse {
private Long id; // 게시글 ID
private String title; // 게시글 제목
private String content; // 게시글 내용
private LocalDateTime createdAt; // 생성 시간
private String author;
// 생성자: Article 엔티티를 DTO로 변환
public ArticleViewResponse(Article article) {
this.id = article.getId();
this.title = article.getTitle();
this.content = article.getContent();
this.createdAt = article.getCreatedAt();
this.author = article.getAuthor();
}
}
ArticleViewResponse DTO 클래스를 레코드 클래스로 변경하면 다음과 같다.
package yull.todoblog.dto;
import java.time.LocalDateTime;
// ArticleViewResponse: 게시글 상세 조회 응답을 위한 레코드 클래스
public record ArticleViewResponse(
Long id, // 게시글 ID
String title, // 게시글 제목
String content, // 게시글 내용
LocalDateTime createdAt, // 생성 시간
String author // 작성자
) {
// 추가적인 메서드나 로직이 필요한 경우 여기에 작성할 수 있습니다.
// 레코드 클래스의 생성자
public ArticleViewResponse(Article article) {
this(
article.getId(),
article.getTitle(),
article.getContent(),
article.getCreatedAt(),
article.getAuthor()
);
}
}
이렇게 레코드 클래스를 활용하면, 데이터 전송 객체(DTO)를 보다 간결하고 안전하게 표현할 수 있다.
그리고 보기에 심히 좋았더라 같은 느낌이지 않는가!
어,.....근데 문제가 있다...
뭐야 레코드 클래스를 쓰면....상속이 안되는거야?
Global을 만들어서 상속을 사용해보려했는데 안되네...?그건 내일 보도록하자...