
record란 java 14에서 프리뷰로 도입되었고 java 16에서 정식 스펙이 된 불변 데이터 객체를 간단하게 정의할 수 있는 기능
기존의 DTO나 VO를 간편하게 만들기 위한 구조
※ 보일러플레이트 코드 (Boilerplate Code)
보일러플레이트 코드란 반복적으로 작성해야 하지만 실제 로직과는 크게 관련이 없는 코드
👉 유지보수를 어렵게 하고 코드량을 불필요하게 증가시키는 코드
ex) equals(), hashcode(), toString()을 직접 구현해야하는 문제
이를 줄이기 위해 Lombok, Java record 같은 기능이 등장
// 레코드명(헤더) {바디}
public record Human(String name, int age) { }
class 선언 대신 record가 들어가며 헤더에 나열되는 필드를 컴포넌트라고 부름
👉 Human이라는 레코드명으로 private final 필드를 name, age를 가진 record
컴파일러는 헤더를 통해 내부 필드를 추론하며 String 타입의 name, int 타입의 age가 있다는걸 인식하고
이후 코드에 명시적으로 getter, toString, equals, hashCode를 선언하지 않아도 이에 대한 구현을 자동으로 제공
record에서는 일반적인 생성자 외에도 컴팩트 생성자(Compact Constructor)를 사용 가능
컴팩트 생성자란 필드 초기화 없이 검증 로직만 포함하는 간결한 생성자
public record Human(String name, int age) {
public Human {
if (age < 0) {
throw new IllegalArgumentException("나이는 0 이상이어야 합니다.");
}
}
}
기존 클래스의 일반 생성자는 필드를 직접 초기화 해야하지만 record는 필드가 final이므로 자동으로 초기화되어 필요한 검증 로직만 남겨 간결한 생성자를 만들 수 있음
// 기존 클래스 일반 생성자
public class Human {
private final String name;
private final int age;
public Human(String name, int age) {
if (age < 0) {
throw new IllegalArgumentException("나이는 0 이상이어야 합니다.");
}
this.name = name;
this.age = age;
}
}