Spring Boot :: Record DTO

hyunjoon park·2024년 3월 19일
1

Spring Boot

목록 보기
10/10

Record 형으로 DTO를 생성하기
https://s7won.tistory.com/2 블로그 기반으로 내용을 정리했다

Record란?

  • Record란 Java14버전부터 추가된 클래스의 일종으로써 불변 데이터를 객체 간에 전달하는 작업을 간단하게 만들어주는 역할을 합니다

Record 클래스의 장점

  • 불필요한 코드를 제거할 수 있다
  • 적은 코드로도 명확한 의도를 표현할 수 있다

Record의 특징

  • 멤버변수는 private final로 선언된다

  • 모든 멤버변수를 인자로 하는 public 생성자를 자동으로 생성한다
    @AllArgsConstructor와 유사하지만, record는 불변 데이터를 다루므로 생성자가 실행될 때 인스턴트 필드를 수정할 수 없다

  • equals, hashcode, toString을 자동으로 생성한다

  • 기본생성자는 제공하지 않으므로 필요한 경우 직접 생성해야 한다


Record 클래스 DTO

먼저 기본 클래스로 만든 DTO이다

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class PayLogRequestDto {
  private String codeNumber;
  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
  private LocalDateTime date;
  private Short type;
  private int innerPoint;
  private String chargerId;
  private String verifyKey;
  private String studentName;

  public PayLog toEntity() {
    return PayLog.builder()
      .codeNumber(codeNumber)
      .date(LocalDateTime.now())
      .innerPoint(innerPoint)
      .chargerId("kiosk")
      .verifyKey("test")
      .studentName(studentName)
      .build();
  }
}

다음은 record형으로 만든 DTO이다

import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;

public record PayLogRequestDto(
  String codeNumber,
  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss") LocalDateTime date,
  Short type,
  int innerPoint,
  String chargerId,
  String verifyKey,
  String studentName
) {

  @Builder
  public PayLogRequestDto(
  	String codeNumber,
  	Short type,
    int innerPoint,
    String chargerId,
    String verifyKey,
    String studentName
  ) {
  	this.codeNumber = codeNubmer;
    this.type = type;
    this.innerPoint = innerPoint;
    this.chargerId = chargerId;
    this.verifyKey = verifyKey;
    this.studentName = studentName;
  }

  public PayLog toEntity() {
    return PayLog.builder()
      .codeNumber(codeNumber)
      .date(LocalDateTime.now())
      .type(type)
      .innerPoint(innerPoint)
      .chargerId("kiosk")
      .verifyKey("test")
      .studentName(studentName)
      .build();
  }
}
  • Getter를 자동생성 해주기 때문에 @Getter 어노테이션이 사라짐
  • 소괄호 안에 멤버변수를 포함합니다

Getter

Getter는 자동으로 생성되지만

PayLogRequestDto payLog = payLogRepository.findByCodeNumber(String codeNumber);

보통 같으면
payLog.getCodeNumber(); 와 같이 getter를 사용하겠지만
멤버변수의 이름으로
payLog.codeNumber(); 다음과 같이 메서드를 만들었다

profile
Backend Developer

0개의 댓글