TIL_20250408_Setter, Record

Kim jisu·2025년 4월 8일

TIL

목록 보기
30/43

Setter를 지양하는 주된 이유는 DTO와 같은 데이터 전달 객체를 불변(immutable)하게 만들어, 데이터의 예측 가능성과 안전성을 높이기 위함입니다.

Setter를 지양하는 이유

  1. 불변성 유지:

    • 안정성: 한 번 생성된 객체의 상태가 변경되지 않으면, 데이터가 의도치 않게 수정되는 것을 방지할 수 있습니다.
    • 예측 가능성: 불변 객체는 상태 변경 없이 일정한 값을 유지하기 때문에, 코드의 동작을 추적하고 디버깅하기 쉽습니다.
  2. 스레드 안전성:

    • 불변 객체는 상태를 변경할 수 없으므로, 멀티스레드 환경에서 동기화 문제를 걱정할 필요가 없습니다.
  3. 간결하고 명확한 설계:

    • 객체가 생성될 때 모든 필요한 데이터가 한 번에 설정되므로, 각 필드의 값을 추적하기 쉬워집니다.
    • 불필요한 setter 메서드가 제거되어 코드가 간결해집니다.

Java Record를 통한 문제 해결

Java Record는 Java 16 이상에서 사용할 수 있는 새로운 기능으로, 불변 객체를 간결하게 정의할 수 있는 방법입니다. Record는 다음과 같은 장점을 제공합니다:

  • 자동 불변성: Record로 정의된 클래스의 모든 필드는 기본적으로 final로 선언되며, setter가 제공되지 않습니다.
  • 간결한 문법: 컴파일러가 생성자, getter, equals(), hashCode(), toString() 메서드를 자동 생성하여, 보일러플레이트 코드를 크게 줄여줍니다.
  • 명확한 의도: Record는 데이터의 전달을 목적으로 하는 객체임을 명시적으로 나타내므로, 코드의 가독성이 향상됩니다.

예시: Record를 사용한 불변 DTO

아래는 페이지 관련 입력값을 관리하는 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에 쿼리 파라미터 정보를 제공할 수 있습니다.

결론

  • Setter를 지양하는 이유: 객체의 불변성을 보장하여 안정성과 스레드 안전성을 높이고, 코드의 명확성과 유지보수성을 개선하기 위해 Setter 사용을 최소화합니다.
  • Record 사용의 장점: Java Record를 사용하면, DTO를 간결하게 불변 객체로 정의할 수 있으며, setter 없이도 안전하게 데이터 전달을 관리할 수 있습니다.

이러한 방식으로 DTO를 관리하면, 보다 안전하고 예측 가능한 애플리케이션을 설계할 수 있습니다.

profile
Dreamer

0개의 댓글