Setter를 지양하는 주된 이유는 DTO와 같은 데이터 전달 객체를 불변(immutable)하게 만들어, 데이터의 예측 가능성과 안전성을 높이기 위함입니다.
불변성 유지:
스레드 안전성:
간결하고 명확한 설계:
Java Record는 Java 16 이상에서 사용할 수 있는 새로운 기능으로, 불변 객체를 간결하게 정의할 수 있는 방법입니다. Record는 다음과 같은 장점을 제공합니다:
final로 선언되며, setter가 제공되지 않습니다.equals(), hashCode(), toString() 메서드를 자동 생성하여, 보일러플레이트 코드를 크게 줄여줍니다.아래는 페이지 관련 입력값을 관리하는 DTO를 Record로 작성한 예시입니다:
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import io.swagger.v3.oas.annotations.Parameter;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
public record GetBoardRequestDto(
@Min @NotNull @Parameter(example = "0") int page,
@NotNull @Parameter(example = "10") int size
) {
public GetBoardRequestDto {
// size가 10, 30, 50 이외의 값이면 기본값 10으로 설정
if (size != 10 && size != 30 && size != 50) {
size = 10;
}
}
public Pageable toPageable() {
return PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdAt"));
}
}
설명:
불변성:
Record는 생성 시 입력된 값으로만 구성되며, 이후 값을 변경할 수 없으므로 setter가 필요하지 않습니다.
간결성:
필드, 생성자, getter 등이 자동으로 생성되기 때문에 코드가 간결하며, 오직 필요한 로직(예: size 검증 및 Pageable 변환)만 추가하면 됩니다.
Swagger 문서화:
@Parameter 애너테이션을 활용하여 Swagger UI에 쿼리 파라미터 정보를 제공할 수 있습니다.
이러한 방식으로 DTO를 관리하면, 보다 안전하고 예측 가능한 애플리케이션을 설계할 수 있습니다.