
Entity를 직접 노출하지 않고 필요 데이터만 전달@NotNull, @NotBlack 등으로 요청 데이터 검증Entity 구가 변경되어도 API의 요청/응답 구조를 독립적 관리@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class UserRequestDto {
private String name;
private int age;
}
Setter사용 시)Getter, Setter등을 직접 정의하거나 Lombok으로 생성final이 아닌 경우)public record UserRequestDto(
String name,
int age
) {}
private final 필드 자동 생성equals(), hashCode(), toString() 자동 생성Setter가 없으며 생성 이후 필드 값 변경 불가 - 불변record타입으로 DTO를 작성한다면
toEntity()와from()메서드를 작성할 수 있다.
둘 다 DTO ↔ Entity 변환 책임을 DTO 안에 두는 패턴이다.
Dto.toEnity(); → 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();
}
}
Entity.from(entity) → 클라이언트 응답 JSONfrom() 메서드는 정적 팩토리 메서드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메서드로 만들어