본문 바로가기
Study/JPA

[JPA] DTO, Domain(Entity)

by 오늘만 사는 여자 2022. 3. 26.
728x90
반응형

유튜브 강의를 듣다가  Entity를 Client, Controller, Service단을 모두 사용하는 것을 보고 Entity는  Client, Controller단에서 쓰이면 안된다는 것을 본적이 있어서 DTO, Entity의 관계에 대해 찾아봤다.

(이미 강의를 들으면서 작성한 코드는 모두 Entity로 접근을 하였기 때문에 나중에 DTO로 바꾸는 리팩토링 작업을 한꺼번에 행봐야겠다.)

 

기존 이미지 수정.

Entity는 Controller, Client단에서 쓰이면 직접 쓰이면 좋은 설계가 아니다.

Entity를 DTO로 바꿔 사용해야한다.

 

Entity

DB에 저장하기 위해 유저가 정의한 클래스 - Domain

실제 DB테이블과 매칭

RDBMS에서 Table을 객체화 시킨것 이라고 생각...

setter금지

@Getter
@NoArgsConstructor
@Entity
public class Member {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private long id;

    private String name;

    private String password;
    
    private String email;
    
}

@Table

DB 테이블과 매핑한다. 기본적으로 @Entity로 선언된 클래스의 이름과  DB테이블 명과 일치하는 것을 매핑한다.

하지만 DB테이블 명과 클래스 이름이 다를경우 @Table(name="DB테이블")을 사용하여 매핑을 한다.

 

@Id

Primary Key를 가지는 변수를 선언 @GeneratedValue을 사용하여 어떻게 id값을 자동으로 생성할지 설정할 수 있다.

 

@Column어노테이션을 상요하지 않는다면 DB컬럼 명과 변수명이 일치하는 것끼리 기본적으로 매핑되지만 서로 다르게 설정하고 싶다면 @Column(name="컬럼명")을 사용하여 설정을 한다.

이 외에도 많은 설정들이 있다..

 

 

DTO

데이터 전송 객체

DB에서 데이터를 얻어 Service나  Controller등으로 보낼때 사용하는 객체

Request, Response등

@Getter
@NoArgsConstructor
public class UserDto {
    private String name;
    private String password;
    private String email;
}

 

 

그러면 DTO <-> Entity를 어떻게 바꿔줄까

@Getter
@NoArgsConstructor
@Entity
public class User {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private long id;

    private String name;

    private String password;
    
    private String email;
    
    @Builder
    public User(String name, String password, String email) {
        this.name = name;
        this.password = password;
        this.email = email;
    }
}

 

Dto class에 toEntity 함수를 정의해서 entity로 바꿀수 있다.  (DB에 등록할때 쓰임)

@Getter
@NoArgsConstructor
public class SaveRequestUserDto {
    private int id;
    private String name;
    private String password;
    private String email;
    
    @Builder
    public SaveRequestUserDto(int id, String name, String password, String email){
        this.id = id;
        this.name = name;
        this.password = password;
        this.email = email;
    }
    
    //dto -> entity
    public User toEntity(){
        return User.builder()
                .id(id)
                .name(name)
                .password(password)
                .email(email)
                .build();
    }
}

 

Dto class에 생성자를 만들때 파라미터를 entity로 넣으면서 매핑된 Dto를 만들수 있다. (DB를 조회할때 쓰임)

@Getter
@NoArgsConstructor
public class ResponseUserDto {
    private int id;
    private String name;
    private String password;
    private String email;
    
    //entity -> dto
    public ResponseUserDto(User entity){
        this.id = entity.id;
        this.name = entity.name;
        this.password = entity.password;
        this.email = entity.email;
    }
}

 

*Entity는 Setter를 만들면 안된다고한다.

Setter를 무분별하게 사용하다보면 여기저기서 entity값을 변경할수 있기 때문에 일관성을 보장할수 없다.

의미있는 변경 메소드이름을 사용한다.

(DB update할때 쓰임)

@Getter
@NoArgsConstructor
@Entity
public class Member {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private long id;

    private String name;

    private String password;
    
    private String email;
    
    //Setter를 사용하지 않고 의미있는 메소드를 사용하여 변경
    public void passwordAndEmailUpdate(String password, String email){
        this.password = password;
        this.email = email;
    }
    
}

 

출처 : https://tmdrl5779.tistory.com/51

728x90
반응형

댓글