Record

Kkd·2025년 1월 23일
0

매일메일 개념정리

목록 보기
73/93

1. Record란?

RecordJava 14에서 처음 소개되고, Java 16에서 정식 기능으로 포함된 새로운 데이터 타입입니다.
주된 목적은 불변(Immutable) 데이터 객체를 간결하고 효율적으로 정의하는 것입니다.

기존 DTO(Class)와 Record 비교

// 기존 방식: DTO 클래스 정의
public class User {
    private final String name;
    private final int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "User{name='" + name + "', age=" + age + "}";
    }
}

Record 사용 시

// Record 방식: 불변 객체 정의 간소화
public record User(String name, int age) {}
  • 생성자, getter, equals(), hashCode(), toString() 자동 생성
  • 불변(Immutable) 객체이므로 setter 없음.
  • 간결한 코드로 DTO(Data Transfer Object), VO(Value Object) 구현에 적합.

2. Record를 DTO로 사용하는 이유

DTO(Data Transfer Object)는 계층 간 데이터 교환을 위해 사용되며, Record는 DTO를 효율적으로 만들기에 적합합니다.

Record가 DTO로 적합한 이유

  1. 코드 간소화

    • getter, toString(), equals(), hashCode() 자동 생성.
    • Boilerplate 코드(생성자, 필드, 메서드) 제거로 가독성 증가.
  2. 불변성(Immutable)

    • DTO는 보통 불변 객체로 만드는 것이 좋음.
    • Record는 필드 값을 변경할 수 없도록 자동 설정됨(객체가 생성된 이후 변경 불가).
  3. 명확한 목적

    • DTO는 값만 담는 용도로 사용 → Record가 목적과 일치.
  4. 메모리 최적화

    • 일반 클래스보다 equals(), hashCode()가 최적화됨.
    • 내부적으로 JVM에서 성능을 최적화하여 힙 메모리 사용 감소.

3. Record를 DTO로 사용하는 예제

DTO로 사용

public record UserDto(String name, int age) {}

UserDto를 간단히 정의할 수 있으며, 불변성을 유지.

Spring Boot에서 Request, Response DTO 활용

// 요청 DTO (Record 사용)
public record UserRequestDto(String name, int age) {}

// 응답 DTO (Record 사용)
public record UserResponseDto(Long id, String name, int age) {}

// Controller 예제
@RestController
@RequestMapping("/users")
public class UserController {

    @PostMapping
    public UserResponseDto createUser(@RequestBody UserRequestDto request) {
        User user = new User(request.name(), request.age());
        return new UserResponseDto(1L, user.getName(), user.getAge());
    }
}

4. Record를 DTO로 사용할 때 고려할 점

  1. 필요한 경우만 사용

    • 불변성이 필요한 경우 DTO에 적합.
    • Setter가 필요하거나, 동적 변경이 필요한 객체는 일반 클래스 사용.
  2. 객체를 직렬화할 때 주의

    • Jackson(JSON 라이브러리)은 Record를 잘 처리하지만, 특정 버전에서는 추가 설정 필요할 수 있음.
  3. JPA Entity로 사용 불가

    • JPA는 Record 지원 X (불변 객체이므로 @Entity에서 @Id 값을 변경할 수 없음).
    • JPA 엔티티에는 클래스를 사용하고, DTO는 Record로 활용.

5. 결론

Record는 DTO를 정의하는 데 매우 적합하며,
불변성을 보장하면서도 코드 가독성과 유지보수성을 높일 수 있음.
JPA Entity 대신 데이터 변환용 객체(요청/응답 DTO)로 활용하는 것이 가장 적절한 방식.


추가 학습 자료

profile
🌱

0개의 댓글