
강의를 보면 Spring JPA를 공부하면서, 강사님이 DTO를 만들 때 Record를 사용하는 것을 봤는데,
너모 초면이신 내용이라 한번 정리하려고 합니다.
Java 14에서 추가된 내용으로, 이전에는 boilerplate field와 메서드가 포함된 클래스를 생성해 객체 간의 변경 불가능한 데이터를 전달했어야 했는데 Record가 등장하면서 그 기능을 대체하게 됨.
Java 16부터 정식 기능으로 포함.(Java 14에서는 Preview)
record 는 필드 값을 변경할 수 없음.
record를 선언하면 자동으로 아래의 메서드들이 생성이 됨.
DTO, VO 클래스 생성 시 사용하면 필수 메서드들을 직접 구현할 필요가 없어 간결해짐.
public class Person {
private final String name;
private final int age;
public Person(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 "Person{name='" + name + "', age=" + age + "}";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
record로 DTO 생성public record Person(String name, int age) {}
getter, toString(), equals(), hashCode() 가 자동으로 생성됨.
record는 기본 생성자가 자동 생성되지만, 직접 추가할 수 있음.
public record Person(String name, int age) {
public Person {
if (age < 0) {
throw new IllegalArgumentException("나이는 0 이상이어야 합니다.");
}
}
}
--------------------------------------------------------------------------------
public record GetUserResponseDto(Long id, String name, String profileImage, Integer followingCount, Integer followerCount) {
//record의 경우 this로만 생성자를 선언할 수 있음
public GetUserResponseDto(User user) {
this(user.getId(), user.getName(), user.getProfileImage(), user.followingCount(),
user.followerCount());
}
public record Person(String name, int age) {
public static String country = "대한민국";
public String greeting() {
return "안녕하세요, 저는 " + name + "이고, 나이는 " + age + "살입니다.";
}
public static String getCountry() {
return country;
}
}
단, 인스턴스 변수는 추가할 수 없고, record의 생성자에서 정의한 필드만 가질 수 있음.
getter/setter, toString(), equals(), hashCode()를 직접 작성할 필요 없음.mutable한 객체가 필요한 경우에는 적절하지 않음.record는 extends 키워드를 사용할 수 없음 (다른 클래스를 상속할 수 없음).record 내부에서 선언되지 않은 인스턴스 변수를 추가할 수 없음.DTO, VO 나 DB 결과 등 불변성이 중요하고, 데이터 보관, 전달 역할이 주된 경우 사용이 유용할 것으로 보임.