[내일배움캠프] TIL - record타입의 DTO와 toEntity(), from() 메서드

Euiyeon Park·2026년 10월 7일

내일배움캠프

목록 보기
5/9
post-thumbnail

DTO(Data Transfer Object)

  • 계층 간 데이터를 전달하기 위해 사용하는 객체로, 사용하는 이유는
    • 데이터 전달
    • 데이터 캡슐화 : Entity를 직접 노출하지 않고 필요 데이터만 전달
    • 보안 : 민감한 정보가 응답에 포함되는 것을 방지
    • 유효성 검증 : @NotNull, @NotBlack 등으로 요청 데이터 검증
    • 유지보수 : Entity 구가 변경되어도 API의 요청/응답 구조를 독립적 관리

DTO 작성 방법 : Class vs Record

Class

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class UserRequestDto {

    private String name;
    private int age;
}
  • 필드 값 변경 가능(Setter사용 시)
  • 생성자, Getter, Setter등을 직접 정의하거나 Lombok으로 생성
  • 상속 가능(final이 아닌 경우)
  • 복잡한 객체 구조나 값 변경이 필요한 경우 적합

Record

public record UserRequestDto(
    String name,
    int age
) {}
  • private final 필드 자동 생성
  • 생성자, 접근자 equals(), hashCode(), toString() 자동 생성
  • Setter가 없으며 생성 이후 필드 값 변경 불가 - 불변
  • 다른 클래스 상속 불가
  • 코드가 간결하며 데이터 전달 목적에 적합

toEntity(), from() 메서드

record타입으로 DTO를 작성한다면 toEntity()와 from() 메서드를 작성할 수 있다.
둘 다 DTO ↔ Entity 변환 책임을 DTO 안에 두는 패턴이다.

toEntity()

  • Request DTO를 Entity로 변환하는 메서드
  • 클라이언트 요청 JSON → Dto.toEnity(); → Entity
  • Entity 클래스 생성자에 @Builder를 붙여 함께 사용함

Memo.java

    @Builder
    public Memo(String username, String title, String contents) {
        this.username = username;
        this.title = title;
        this.content = content;
        this.deleteStatus = false;  // 명시용(boolean타입 기본값: false)
    }

MemoCreateRequest.java

public record MemoCreateRequest(
        @NotBlank(message = "사용자 이름은 필수입니다.")
        String username,

        @NotBlank(message = "제목은 필수입니다.")
        String title,

        @NotBlank(message = "내용은 필수입니다.")
        String contents
) {
        public Memo toEntity(){
                return Memo.builder()
                        .username(username)
                        .title(title)
                        .contents(contents)
                        .build();
        }
}

from()

  • Entity를 Response DTO로 변환하는 메서드
  • Entity → Entity.from(entity) → 클라이언트 응답 JSON
  • from() 메서드는 정적 팩토리 메서드
public record MemoResponse(
        Long id,
        String username,
        String titile,
        String content
) {
    public static MemoResponse from(Memo memo){
        return new MemoResponse(
                memo.getId(),
                memo.getUsername(),
                memo.getTitle(),
                memo.getContent()
        );
    }
}

✨ [참고] 정적 팩토리 메서드

  • 정적 팩토리 메서드는 new 대신 객체를 생성해서 반환해주는 static 메서드
  • 객체를 만들기 위한 메서드로 아직 객체가 존재하지 않기 때문에 static메서드로 만들어
    객체 없이 클래스 자체에서 호출할 수 있도록 함
profile
"개발자는 해결사이자 발견자이다✨" - Michael C. Feathers

0개의 댓글