Record는 Java 14에서 처음 소개되고, Java 16에서 정식 기능으로 포함된 새로운 데이터 타입입니다.
주된 목적은 불변(Immutable) 데이터 객체를 간결하고 효율적으로 정의하는 것입니다.
// 기존 방식: 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) {}
DTO(Data Transfer Object)는 계층 간 데이터 교환을 위해 사용되며, Record는 DTO를 효율적으로 만들기에 적합합니다.
코드 간소화
getter
, toString()
, equals()
, hashCode()
자동 생성.불변성(Immutable)
명확한 목적
메모리 최적화
equals()
, hashCode()
가 최적화됨.public record UserDto(String name, int age) {}
➡ UserDto
를 간단히 정의할 수 있으며, 불변성을 유지.
// 요청 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());
}
}
필요한 경우만 사용
객체를 직렬화할 때 주의
JPA Entity로 사용 불가
@Entity
에서 @Id
값을 변경할 수 없음).✅ Record는 DTO를 정의하는 데 매우 적합하며,
✅ 불변성을 보장하면서도 코드 가독성과 유지보수성을 높일 수 있음.
✅ JPA Entity 대신 데이터 변환용 객체(요청/응답 DTO)로 활용하는 것이 가장 적절한 방식.
추가 학습 자료