스프링 프로젝트를 기획하면서 DTO를 만드는 과정에서, class를 record로 바꿀 수 있다는 것을 알게되었다.
이런 객체를 사용하는 이유는 다양한 집계 연산을 수행한 후의 결과를 담아두거나, 외부 시스템과 통신 시에 필요하지 않은 데이터를 제거하여 대역폭 사용량을 줄이기 위해, 세부 구현을 노출시키지 않기 위해서, 혹은 변경되지 말아야 하는 API 설계 상의 이유 등 다양한 이유가 있을 수 있습니다.
우리의 경우에는 lombok의 @Getter를 통해 대체하고 있지만..
@Getter
@NoArgsConstructor
public class PassDto {
Long id;
String name;
Integer count;
record 레코드명(컴포넌트1, 컴포넌트2, ...) { }
package com.haedal.entity;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import javax.persistence.Column;
import java.time.LocalDateTime;
@Getter
@NoArgsConstructor
public class PassDto {
Long id;
String name;
Integer count;
Integer price;
LocalDateTime startedDay;
LocalDateTime endedDay;
public PassDto(Long id, String name, Integer count, Integer price, LocalDateTime startedDay, LocalDateTime endedDay) {
this.id = id;
this.name =name;
this.count = count;
this.price = price;
this.startedDay = startedDay;
this.endedDay = endedDay;
}
public static PassDto of(Long id, String name, Integer count, Integer price, LocalDateTime startedDay, LocalDateTime endedDay) {
return new PassDto(id, name, count, price, startedDay, endedDay);
}
public static PassDto from(Pass pass){
return new PassDto(
pass.getPassId(),
pass.getName(),
pass.getCount(),
pass.getPrice(),
pass.getStartedDay(),
pass.getEndedDay()
);
}
public Pass toEntity() {
return Pass.builder()
.passId(id)
.name(name)
.count(count)
.price(price)
.startedDay(startedDay)
.endedDay(endedDay)
.build();
}
}
//Getter, 생성자에 관련된 어노테이션이 사라졌다.
public record PassDto(
Long id,
String name,
Integer count,
Integer price,
LocalDateTime startedDay,
LocalDateTime endedDay
) {
public static PassDto of(Long id, String name, Integer count, Integer price, LocalDateTime startedDay, LocalDateTime endedDay) {
return new PassDto(id, name, count, price, startedDay, endedDay);
}
public static PassDto from(Pass pass){
return new PassDto(
pass.getPassId(),
pass.getName(),
pass.getCount(),
pass.getPrice(),
pass.getStartedDay(),
pass.getEndedDay()
);
}
public Pass toEntity() {
return Pass.builder()
.passId(id)
.name(name)
.count(count)
.price(price)
.startedDay(startedDay)
.endedDay(endedDay)
.build();
}
}