[토이프로젝트]당근마켓 구현하기(4) - DTO와 Entity 구분하기

gamja·2022년 11월 14일
0
post-thumbnail

객체를 생성하려는데 DTO와 Entity의 구분이 명확하지 않아서 둘의 차이점에 대해 공부한 뒤 적절하게 사용해보기로 했다.

1. 스프링 패키지 구조

기본적으로 스프링 패키지 구조는 위와 같다.

  • Entity는 클라이언트단에서 직접 사용되지 않도록 해야 한다.
  • 클라이언트단에서는 DTO를 이용한다.

2. DTO와 Entity

2-1. Entity

  • DB에 데이터를 저장하기 위해 사용한다.
  • 실제 DB 테이블과 1:1 매칭되며, DB 테이블에 없는 컬럼은 작성하지 않는다.
  • Entity 클래스는 다른 클래스를 상속받거나 인터페이스의 구현체여서는 안 된다.
  • Request나 Response 값을 전달하는 클래스로 사용하는 것은 좋지 않다.
  • Entity 클래스에는 setter를 만드는 것은 지양한다.
  • Entity에는 setter 대신 Constructor(생성자) 또는 Builder를 사용하여 최종값을 작성한 뒤 DB에 저장한다. (@Builder 사용 추천)

2-2. DTO

  • Entity의 필드 중 응답에 필요한 필드만 사용한다.
  • 계층 간 데이터 교환이 이루어질 수 있도록 하는 객체이다.
  • JSON serialization과 같은 직렬화에 사용한다.
  • getter나 setter메소드 외의 다른 비즈니스 로직은 포함하지 않는다. (생성자도 가능)

3. 사용예시

Entity

@Entity
@Getter
@NoArgsConstructor
@Table(name = "tb_users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private String userId;

    @Column(name = "user_password")
    private String userPassword;

    @Column(name = "user_name")
    private String userName;

    private String nickname;

    private String gender;

    @Column(name = "img_url")
    private String imgUrl;

    @Column(name = "manner_temp")
    private double mannerTemp;

    @Column(name = "phone_num")
    private String phoneNum;

    @Column(name = "region_cnt")
    private int regionCnt;

    @Builder
    public User(String userId, String userPassword, String userName,
                String nickname, String gender, String imgUrl, double mannerTemp,
                String phoneNum, int regionCnt){
        this.userId = userId;
        this.userPassword = userPassword;
        this.userName = userName;
        this.nickname = nickname;
        this.gender = gender;
        this.imgUrl = imgUrl;
        this.mannerTemp = mannerTemp;
        this.phoneNum = phoneNum;
        this.regionCnt = regionCnt;
    }
  }

DTO

@Getter
@Setter
@NoArgsConstructor
public class UserDTO {
    private String userId;
    private String userPassword;
    private String userName;
    
    
    //dto -> entity (db에 등록할 때 사용)
    public User toEntity(){
        return User.builder()
                .userId(userId)
                .userName(userName)
                .userPassword(userPassword)
                .build();
    }

    //entity -> dto(db를 조회할 때 사용)
    public AccountDTO(User entity){
        this.userId = entity.getUserId();
        this.userName = entity.getUserName();
        this.userPassword = entity.getUserPassword();
    }

}

참고 블로그

https://velog.io/@mimmimmu/spring-boot-Entity%EC%99%80-DTO-%EB%B6%84%EB%A6%AC

https://velog.io/@ohzzi/Entity-DAO-DTO%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C

profile
눈도 1mm씩 쌓인다.

0개의 댓글