티스토리 뷰
Record 클래스
Record는 Java 14에서 처음 도입된 기능으로, Java 16부터 정식으로 사용 가능하다.
레코드는 불변 객체를 쉽게 생성할 수 있도록 도와주는 기능을 제공한다.
1. 불변성 보장
함수형 프로그래밍에서 중요하게 여기는 개념으로 불변성(Immutable)이 있다.
Java의 레코드 클래스는 한번 생성된 객체의 데이터를 변경할 수 없기 때문에 불변성을 가지고 있다.
따라서 데이터를 일관성 있게 유지할 수 있기 때문에 데이터 전송 객체(DTO)로 자주 사용된다.
2. 보일러플레이트 코드 제거
생성자, getter, setter, equals, hashCode, toString 메서드를 자동으로 생성해주기 때문에
DTO에서 주로 사용하는 보일러플레이트 코드(반복되는 코드)를 줄일 수 있다.
Record를 사용하면 좋은 경우
레코드는 간결한 데이터 표현이 장점이므로, 데이터가 자주 변경되지 않고 주로 읽기 전용일 때 사용하면 좋다.
- 데이터가 한 번 설정된 후 변경되지 않는 경우: 조회 전용 데이터를 전송할 때 적합하다.
- 여러 스레드에서 동시 접근이 발생하는 환경: 불변 객체로 인해 안전성을 보장한다.
- DTO가 단순한 조회 용도로만 사용되고 업데이트가 필요 없는 경우
DTO 클래스를 사용하면 좋은 경우
레코드 클래스를 DTO 클래스로 사용하기에 정말 적합해보인다.
하지만 레코드는 불변 객체로 생성한 후 매번 새로운 인스턴스를 생성해야하기 때문에, 가변 데이터를 다뤄야하는 아래와 같은 예시에서는 DTO 클래스 사용이 더 나을 수 있다.
1. 선택적인 필드 업데이트
사용자가 게시글을 수정할 때, 일부 필드만 변경하고 나머지 필드는 그대로 두고 싶을 수 있다.
예를 들어, 제목은 수정하지만 내용은 수정하지 않는 경우, 내용 필드는 빈 값으로 전달한다.
2. 부분적인 데이터 전송
게시글 등록 시 첨부 파일과 같이 필수가 아닌 선택 항목은 사용자가 입력하지 않을 수 있다.
public class PostCreateDTO {
private final String title;
private final String content;
private final String fileUrl;
private PostCreateDTO(Builder builder) {
this.title = builder.title;
this.content = builder.content;
this.fileUrl = builder.fileUrl;
}
public static class Builder {
private String title;
private String content;
private String fileUrl;
public Builder title(String title) {
this.title = title;
return this;
}
public Builder content(String content) {
this.content = content;
return this;
}
public Builder fileUrl(String fileUrl) {
this.fileUrl = fileUrl;
return this;
}
public PostCreateDTO build() {
if (title == null || title.isEmpty()) {
throw new IllegalArgumentException("제목은 필수입니다.");
}
if (content == null || content.isEmpty()) {
throw new IllegalArgumentException("내용은 필수입니다.");
}
return new PostCreateDTO(this);
}
}
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
public String getFileUrl() {
return fileUrl;
}
}
// 사용 예시
PostCreateDTO postDTO = new PostCreateDTO.Builder()
.title("제목")
.content("내용")
.fileUrl("")
.build();
만약 이런 상황에서 레코드와 빌더 패턴을 사용할 수도 있다.
하지만 선택적으로 필드를 설정할 수는 있지만 이미 생성된 레코드를 수정할 수 없기 때문에 유연성이 떨어진다.
그렇기 때문에 선택 필드가 있는 동적 데이터 처리에는 DTO 클래스를 사용하는게 더 적합하다.
'language > java' 카테고리의 다른 글
Collection 객체의 복사 방법 (0) | 2024.11.17 |
---|---|
얕은 복사, 깊은 복사, 방어적 복사 (0) | 2024.11.16 |
Static 메서드를 사용하는 이유 (3) | 2024.11.14 |
일급 컬렉션을 사용하는 이유 (불변 객체, 방어적 복사) (1) | 2024.11.13 |
annotation processor란 (+ kotlin의 kapt) (0) | 2023.09.04 |
- Total
- Today
- Yesterday
- FetchJoin
- 오블완
- n+1
- MongoDB
- Kotlin
- Spring Security
- MultipleBagFetchException
- ChatGPT
- Linux
- Java
- QueryDSL
- spring boot 3
- Cannot construct instance of
- 스프링 스케줄링
- addFilterBefore
- checkout
- jvm warm-up 전략
- dto 클래스 생성자
- port
- array
- 자바 어플리케이션 실행 과정
- 스프링오류
- junit5
- JPA
- bucket4j
- 티스토리챌린지
- 추상클래스
- Git
- redisson 분산락
- 배열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |