본문 바로가기
코딩 공부/web & Java

[Java] DTO를 Record로 만드는 이유

by 현장 2024. 4. 17.

Record

// 레코드 선언법
public record 레코드명(컴포넌트1, 컴포넌트2, ...) { }

값의 집합으로 이루어진 간단한 객체를 심플하게 개발하기위해 고안되었으며, immutable data(불변데이터)를 다룰 class 구현에 최적화되어있습니다. 따라서 웹서비스 구현에서 많이 사용되는 DTO 개념에 적용하면 유용합니다.

생성자, accessors(getter), equals(), hashCode(), toString() 등 DTO 특성의 클래스를 개발할때 매번 개발자가 직접 구현해주어야 했던 반복적인 작업이 줄어듭니다. 또한, "이 클래스는 data carrier 용도이다"를 명시적으로 나타낼 수 있으므로 코드에 대한 이해를 돕고 해당 클래스의 목적에 맞지 않는 구현을 하지 않도록 방지해줍니다.

🏷️ 특징

▪️ record는 선언된 모든 필드를 final로 선언합다.

▪️ 기본적으로 getter를 제공하며, getName() 처럼 주어지는것이 아니라 name()처럼 네이밍 처리가 됩니다.

▪️ toString(), equals(), hashCode() 기본 제공됩니다.

▪️ 일반 class처럼 annotation 사용이 가능합니다.

▪️ final 클래스이므로 상속 불가능합니다.

🏷️ DTO에 record가 적합한 이유

DTO는 계층간에 데이터를 전달하는 용도로 많이 쓰이며, 단순히 전달해줄 데이터값만 포함하고 있어야 합니다. 또한 특정한 로직이 포함된 메소드를 갖지 않는 것이 좋으며, 데이터가 도중에 변하지 않도록 설정해줄 필요가 있습니다.

record는 일반 클래스처럼 사용할 수 있지만, 필드에 final을 자동으로 추가해주는 특징을 가지며 getter와 같은 메소드를 기본적으로 지원해주므로 편리한 개발 환경을 제공해줍니다. 따라서 record로 구현한다면, DTO가 가져야 할 특징을 쉽게 구현할 수 있습니다.

그러므로, 온전히 데이터 불변성을 지키는 DTO 클래스를 생성할 필요가 있다면, record를 고려해봐도 좋을 것 같습니다.

🏷️ Class와 Record로 DTO를 만든 예시

✅ Class의 경우

@Getter
@NoArgsConstructor
public class UserDto {
    Long id;
    String name;
    String password

    public UserDto(Long id, String name, String password) {
        this.id = id;
        this.name = name;
        this.password = password;
    }

    public static UserDto of(Long id, String name, String password) {
        return new UserDto(id, name, password);
    }

    public static UserDto from(User user){
        return new UserDto(
                user.getPassId(),
                user.getName(),
                user.getPassword(),
        );
    }

    public User toEntity() {
        return User.builder()
                .id(id)
                .name(name)
                .password(password)
    }
}

✅ Record의 경우

// 어노테이션 제거
public record UserDto(
        Long id,
        String name,
        String password
) {
    
    public static UserDto of(Long id, String name, String password) {
        return new PassDto(id, name, password);
    }

    public static UserDto from(User user){
        return new UserDto(
                user.getPassId(),
                user.getName(),
                user.getPassword()
        );
    }

    public User toEntity() {
        return User.builder()
                .id(id)
                .name(name)
                .password(password);
    }
}

📖 Reference

oyoungsun.log

phdljr.log

'코딩 공부 > web & Java' 카테고리의 다른 글

[JPA] N + 1 문제  (0) 2024.04.23
[Spring] Proxy  (0) 2024.04.17
[Java] Lombok  (0) 2024.03.10
[JPA] findById와 getReferenceById  (0) 2024.03.09
[JPA] JPA Auditing  (0) 2024.02.11