DEV Community

sunj
sunj

Posted on

Spring Boot DTO와 @Entity 차이, 2024-03-14

controller.dto.LoginDTO.java

import jakarta.validation.constraints.NotBlank;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class LoginDTO {

    @NotBlank(message = "userId를 입력하십시오")
    private String userId;

    @NotBlank(message = "password를 입력하십시오")
    private String password;

}
Enter fullscreen mode Exit fullscreen mode

DTO는 계층(Layer) 간 데이터 교환이 이루어질 수 있도록 하는 객체로 JSON serialization과 같은 직렬화에도 사용되는 객체입니다. DTO는 원래 DAO(Data Access Object) 패턴에서 유래된 단어로 DAO에서 DB 처리 로직을 숨기고 DTO라는 결괏값을 내보내는 용도로 활용했습니다.

Controller 같은 클라이언트 단과 직접 마주하는 계층에서는 Entity 대신 DTO를 사용해서 데이터를 교환하며, Controller 외에도 여러 레이어 사이에서 DTO를 사용할 수 있지만 주로 View와 Controller 사이에서 데이터를 주고받을 때 활용성이 높습니다.

DTO는 getter, setter 메서드를 포함하며, 이 외의 비즈니스 로직은 포함하지 않습니다.

repository.entity.Member.java

import com.backend.backend.backend.controller.dto.SignUpDTO;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.CreationTimestamp;
import java.time.LocalDateTime;

@Entity
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
@Setter
@Builder
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long index;

    @Column(unique = true)
    private String userId;

    private String password;

    private String name;

    @Column(unique = true)
    private String regNo;

    @CreationTimestamp
    private LocalDateTime createDate;

    public static Member toMember(SignUpDTO signupdto){
        Member member = new Member();
        member.setUserId(signupdto.getUserId());
        member.setPassword(signupdto.getPassword());
        member.setName(signupdto.getName());
        member.setRegNo(signupdto.getRegNo());
        return member;
    }
}
Enter fullscreen mode Exit fullscreen mode

Entity 클래스는 실제 DB 테이블과 매핑되는 핵심 클래스로, 데이터베이스의 테이블에 존재하는 컬럼들을 필드로 가지는 객체입니다.

(DB의 테이블과 1:1로 매핑되며, 테이블이 가지지 않는 컬럼을 필드로 가져서는 안 됩니다.)

Entity는 데이터베이스 영속성(persistent)의 목적으로 사용되는 객체이며, 때문에 요청(Request)이나 응답(Response) 값을 전달하는 클래스로 사용하는 것은 좋지 않습니다.

또 많은 서비스 클래스와 비즈니스 로직들이 Entity 클래스를 기준으로 동작하기 때문에 Entity 클래스가 변경되면 여러 클래스에 영향을 줄 수 있습니다.

Entity에서는 setter 메서드의 사용을 지양해야 합니다.

이유는 변경되지 않는 인스턴스에 대해서도 setter로 접근이 가능해지기 때문에 객체의 일관성, 안전성을 보장하기 힘들어집니다.

(setter 메서드가 있다는 것은 불변하지 않다는 것이 됩니다.)

따라서 Entity에는 setter 대신 Constructor(생성자) 또는 Builder를 사용하게 되는데요.

setter 메서드가 아닌 생성자(Constructor)를 이용해서 초기화하는 경우 불변 객체로 활용할 수 있고, 불변 객체로 만들면 데이터를 전달하는 과정에서 데이터가 변조되지 않음을 보장할 수 있습니다.

그리고 아래 코드처럼 Builder를 사용하면 멤버 변수가 많아지더라도 어떤 값을 어떤 필드에 넣는지 코드를 통해 확인할 수 있고, 필요한 값만 넣는 것이 가능하다는 장점이 있습니다.

참조 : https://wildeveloperetrain.tistory.com/101

Top comments (0)