ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DTO란
    프로그래밍/서버 프로그래밍 2019. 2. 15. 14:56

    DTO란?

    오늘은 DTO에 관해 포스팅 해보려고 한다.

    Spring 개발을 하면서 처음 들었던?? 낯설었던 용어중의 하나인데 이참에 확실히 짚고 넘어가는 것이 좋을 것 같다.

    먼저 DTO란 쉽게 말해 Data Transfer Object 로 직역하자면 데이터 전송 객체 이다.

     

    쉽게 말해 DATA를 전송하기 위해 존재하는 객체이다.

    Node JS를 이용한 백엔드만 개발했었던 나에게는 상당히 생소한 존재로 다가왔었다.

    JS에서는 JSON을 주고 받는데 따로 DTO같은 객체가 필요하지 않기 때문이다.

     

    하지만 Spring 에서는 DTO가 없이는 데이터를 주고받기가 힘들다.

    예를 들어

     

    @Entity
    @Getter
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    public class Account {
        @Id
        @GeneratedValue
        private Long id;
        
        @Column(nullable = false)
        private String email;
        
        @Column(nullable = false)
        private String displayName;
        
        @Column(nullable = false)
        private String password;
        
        @Builder
        public Account(String email, String displayName, String password) {
            this.email = email;
            this.displayName = displayName;
            this.password = password;
        }
        
    }
    

     

    이라는 Entity 클래스가 있을 때, 보통은 AccountDto라는 클래스로

     

    @Getter
    @Setter
    @NoArgsConstructor
    public class AccountDto {
        
        private String email;
        private String displayName;
        private String password;
    }
    

     

    이런 식으로 DTO 클래스를 생성한다.

    처음 Spring을 배우기 시작하였을 때는 그냥 Account라는 클래스가 있는데 왜 DTO클래스를 또 만드는지 이해가 되지 않았다. 심지어 id를 제외하고 모두 유사한 코드이기때문에...

    여기서 우리가 DTO가 필요한 이유는

     


     

    첫째로, 나는 Entity에는 Setter를 두지않는 개발방식을 선호한다. JPA에서는 setter를 이용해 Entity의 값이 수정되어 저장되지만 이렇게 하면 차후에 코드 변경시 혹은 코드를 읽을 때 정확히 의도가 파악이 되지않기 때문이다.

    이렇게 Setter를 두지않으면 Controller에서는 Setter가 없으면 @RequestBody로 값을 할당하지 못하기 때문에 따로 Dto를 만들고 거기에 Setter를 할당하는 방식으로 작성한다.

    두번째 이유로는 설상 Entity클래스에 Setter가 있더라도 이를 request / response에서 사용하면 안된다.

    Entity 클래스는 테이블과 직접 매핑되어있는 클래스이기 때문에 변경 및 가공에 신중을 가해야하는 반면, request / response는 항상 변경을 할 일이 생기고, 여러 Entity를 조인해서 Return 해줘야 하는 경우가 많기 때문에 반드시 Controller에서 쓸 DTO와 Entity클래스는 분리하는게 좋다.

     

    댓글

Designed by Tistory.