개발일지/SPRINGBOOT

springboot , record 를 통한 dto

recording or reCoding 2025. 12. 16. 09:22

Java에서 데이터 객체를 만들 때 항상 이런 코드가 따라왔다.

public class UserDto {
    private final Long id;
    private final String name;

    public UserDto(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    public Long getId() { return id; }
    public String getName() { return name; }

    @Override
    public boolean equals(Object o) { ... }
    @Override
    public int hashCode() { ... }
    @Override
    public String toString() { ... }
}

 

 

그래서 Java 16부터 언어 차원에서 “데이터 전용 타입”을 공식 인정한 게 record다.

 

[ DTO 설계할 때 권장 사항 ]
- 모든 필드를 final로 선언할 것
- 생성자에서 초기화된 값을 가지도록 할 것
- setter를 제공하지 말 것
- 각 필드는 getter로 접근할 것
- equals(), hashCode(), toString()을 직접 오버라이딩 할 것
 
 record는 객체지향 원칙을 반드시 지키도록 만들어 졌습니다.

public record User(Long id, String name) {}

 

 

record의 장점

✅ 1) DTO의 의도가 명확해진다

 DTO를 “비즈니스 로직이 없어야 하는 객체”라고 본다.

  • 필드는 final
  • setter 없음
  • 상속 불가

👉 DTO에 로직이 스며드는 걸 구조적으로 막아준다

 

✅ 2) 코드량이 압도적으로 줄어든다

Controller ↔ Service ↔ Response DTO  이 구간은 거의 데이터 전달만 하는 객체다.

  • Lombok 의존도 줄어듦
  • 파일 길이 반 이상 감소
  • 리뷰할 때 읽기 쉬움

 

Spring Boot에서 record는 “DTO를 DTO답게 만들기 위한 최고의 문법”이다.
하지만 Entity나 Domain까지 침범하면 바로 독이 된다.