DTO (Data Transfer Object)
스프링 프로젝트를 진행하다보면, DTO에 대해서 많이 들어봤을 것이다. DTO는 계층 간에 데이터를 전달해주기 위해 사용하는 클래스이다. 그렇기에 데이터가 쉽게 변하면 안된다는 특징을 가지고 있다. 그래서 보통 DTO 클래스의 필드에는 final 속성을 갖거나 Setter를 선언하지 않는다.
@Getter
public class NameRequest{
private final String name;
}
Record
JDK 14버전에 추가된 기능으로 record는 class 처럼 사용할 수 있지만, class와는 달리 몇 가지 특징을 가지고 있으며 가장 주된 특징은 불변성이다.
public record NameRequest(String name) {}
특징
1) 모든 필드가 `final`
record의 필드는 자동으로 `private final` 이라 생성 이후 값 변경이 불가하고, Setter도 없다.
2) 기본 getter 제공
기본적으로 `getter` 를 제공하며, `getX()` 처럼 주어지는 것이 아니라 `x()` 형식으로 제공된다.
public record NameRequest(String name) {}
public class Main {
public static void main(String[] args) {
NameRequest req = new NameRequest("Alice");
System.out.println(req.name()); // "Alice"
// System.out.println(req.getName()); // 컴파일 에러: 메서드 없음
}
}
3) 필드 값이 같으면 `equals` 는 true에 해당한다.
`equals` , `hashCode` 가 필드 값 기준으로 자동 생성된다. 즉, 두 레코드의 필드 값이 모두 같다면 동등하다고 판단한다.
public record NameRequest(String name) {}
public class Main {
public static void main(String[] args) {
NameRequest a = new NameRequest("Alice");
NameRequest b = new NameRequest("Alice");
System.out.println(a == b); // false
System.out.println(a.equals(b)); // true (
System.out.println(a.hashCode() == b.hashCode()); // true
}
}
언제 사용하면 좋을까 ?
API 요청과 응답 DTO 에서 사용하는 것이 좋다. 즉, '값을 담아서 전달만' 할 때가 가장 적합하다. 가변 로직이 필요 없는 '데이터 운반용' 이면 record가 가장 안전하다.
'Spring' 카테고리의 다른 글
| [Spring] Spring Events 사용해 이벤트 발행하기 (0) | 2025.09.07 |
|---|---|
| [Spring] Setter 사용을 지양해야하는 이유 (0) | 2025.08.29 |
| [Spring] 연관관계 (0) | 2025.08.29 |
| [Spring] PSA (Portable Service Abstraction) (0) | 2025.08.27 |
| [Spring] @Transactional 개념과 사용 (0) | 2025.08.19 |