
record는 Java 14에서 도입된 새로운 클래스 타입으로, 불변 데이터 객체를 간결하게 표현하기 위해 만들어졌다.
DB에 저장된 데이터의 전송 객체 dto는 record로 쓸 경우 적합한 형태를 가지고 있다.

record는 필드에 대해 자동으로 생성자, equals(), hashCode(), toString() 메서드를 생성.
즉, record는 선언만으로도 이 메서드들을 명시적으로 작성할 필요가 없다.
record로 선언된 클래스의 필드는 불변하다. 즉, 한번 초기화된 필드는 수정할 수 없다.
record는 필드에 대해 자동으로 private final 키워드를 적용한다.
예를 들어, 아래와 같은 record는 자동으로 username과 password 필드가 private final로 선언된다.
public record LoginRequestDto(String username, String password) {
}
일반 클래스에서는 필드를 선언하고, 생성자, getter, toString(), equals() 및 hashCode() 메서드를 직접 작성해야 하지만, record는 이러한 메서드들을 자동으로 생성하여 코드를 간결하게 만들어 준다. 즉 위의 record는 아래의 코드를 대신할 수 있다.
public class LoginRequestDto {
private final String username;
private final String password;
public LoginRequestDto(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
@Override
public String toString() {
return "LoginRequestDto{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
LoginRequestDto that = (LoginRequestDto) o;
return username.equals(that.username) && password.equals(that.password);
}
@Override
public int hashCode() {
return Objects.hash(username, password);
}
}
record는 필드에 대해 getter 메서드도 자동으로 생성한다. 하지만, 일반적으로 getter라는 이름 대신 필드 이름과 동일한 메서드를 생성한다.
LoginRequestDto dto = new LoginRequestDto("user", "password");
String username = dto.username(); // 필드 이름을 메서드로 접근
record는 상속을 지원하지 않는다. 다른 클래스를 상속할 수 없고, record를 상속받을 수도 없다. 다만, 인터페이스는 구현할 수 있다.