자바는 14버전부터 record라는 새로운 기능을 도입하여 데이터 객체(Data Object)를 보다 간결하고 명확하게 정의할 수 있게 되었다. 이번 포스팅에서는 record의 기본 사용법과 특징을 살펴보고, 기존의 DTO(Data Transfer Object)와의 차이점도 함께 알아보겠다.
record란 무엇인가?
record는 불변 객체(immutable object)를 쉽게 생성할 수 있도록 도와주는 자바의 새로운 타입이다. 주로 데이터 전달 객체(Data Transfer Object, DTO)나 값을 담는 컨테이너로 사용된다. record를 사용하면 클래스 작성 시 필수적인 반복 작업들을 자동으로 처리할 수 있다.
기본 사용법
다음은 record를 사용한 간단한 예제이다
public record Person(String name, int age) {}
위의 예제는 Person이라는 레코드를 정의한 것이다. Person 레코드는 두 개의 필드 name과 age를 가진다. 이렇게 정의된 레코드는 다음과 같은 작업들을 자동으로 처리한다.
- 필드 정의: String name, int age 필드가 자동으로 정의된다.
- 생성자: 모든 필드를 인수로 받는 생성자가 자동으로 생성된다.
- 접근자 메서드: name()과 age() 메서드가 자동으로 생성된다.
- equals() 및 hashCode(): 필드를 기반으로 한 equals() 및 hashCode() 메서드가 자동으로 생성된다.
- toString(): 필드 값을 포함하는 toString() 메서드가 자동으로 생성된다.
사용 예제
public class Main {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
// 자동 생성된 메서드 사용
System.out.println(person.name()); // 출력: Taeho
System.out.println(person.age()); // 출력: 32
System.out.println(person); // 출력: Person[name=Taeho, age=32]
}
}
커스터마이징
레코드 클래스는 커스터마이징할 수 있다. 예를 들어, 추가 메서드를 정의하거나 생성자를 커스터마이징할 수 있다.
public record Person(String name, int age) {
// 추가 메서드
public String greet() {
return "Hello, " + name;
}
// 커스텀 생성자
public Person {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative");
}
}
}
위 예제에서는 greet()라는 추가 메서드와 나이가 음수일 경우 예외를 던지는 커스텀 생성자를 정의하였다.
DTO와 record의 차이점
DTO(Data Transfer Object)와 record는 데이터 객체를 정의하는 데 사용되지만, 두 가지 방식에는 몇 가지 차이점이 있다.
- 보일러플레이트 코드: DTO는 필드 정의, 생성자, getter/setter 메서드, equals(), hashCode(), toString() 메서드를 수동으로 작성해야 한다. 반면 record는 이러한 메서드들을 자동으로 생성하여 보일러플레이트 코드를 크게 줄여준다.
- 불변성: DTO는 기본적으로 가변 객체(mutable object)로 설계되는 경우가 많다. 그러나 record는 불변 객체로 설계되어, 한 번 생성된 후 변경할 수 없다. 이는 멀티스레드 환경에서 안전성을 보장해준다.
- 의도 표현: record는 데이터 객체의 의도를 명확하게 표현할 수 있으며, 데이터만 담고 있는 객체임을 쉽게 알 수 있다. 반면, DTO는 일반 클래스와 구별하기 어려울 수 있다.
결론
자바의 record는 데이터 중심의 클래스를 쉽게 정의하고 관리할 수 있게 해주는 강력한 도구이다. 이를 통해 코드의 가독성과 유지보수성을 높일 수 있다. DTO와 비교했을 때, record는 보일러플레이트 코드를 줄이고 불변성을 보장하는 등 여러 가지 장점을 제공한다. 앞으로 자바로 데이터 객체를 정의할 때 record를 적극적으로 활용해보자.
'Develop Issue > Spring' 카테고리의 다른 글
log4j 취약점 개요 및 조치 방법, Log4Shell (1350) | 2021.12.13 |
---|---|
type 엘리먼트 설정을 통해 스프링 maven pom.xml의 Missing artifact 오류 해결 (0) | 2018.01.02 |
스프링부트로 블로그 만들기 (0) | 2017.11.09 |
Moldel and View (0) | 2017.09.26 |
JSP에서 ZIP파일 만들기 (0) | 2017.09.22 |