DTO와 Entity

SeungHoon·2024년 6월 20일

Spring

목록 보기
3/15

DAO (Repository)
- 실제로 DB에 접근을 하는 객체이다.
- DAO는 서비스랑 DB를 연결하는 역할을 하며, 인강에서 Repository가 여기에 해당한다고 할 수 있다.

DTO
- 데이터를 DB에 전송하기 위한 객체이다. (순수 데이 전송을 위한 객체)
- DAO와는 다르게 getter/setter 이외의 메소드는 만들지 않는다. POJO이다.

Entity
- DB에 존재하는 column들을 필드로 가지는 객체를 의미한다.
- DB에 존재하는 테이블과 일대일 대응이며, 테이블에 없는 필드를 가져서는 안된다.
- Spring data JPA를 사용한다면 Entity class에 @Entity를 붙여서 표시할 수 있다.

Entity와 별개로 DTO를 사용하는 이유

  1. view layer와 DB layer를 분리하기 위해서이다

    • 객체를 표현하기 위한 계층과 저장하는 계층의 역할을 분리하기 위해 사용한다.
  2. Entity 객체의 변경을 피하기 위해서

    • Entity 객체를 그대로 사용하면 프로그래머의 의도와 다르게 데이터가 변질될 수 있다.
  3. view와 통신하는 DTO 클래스는 자주 변경된다.

    • view(클라이언트)와 통신하는 DTO 클래스는 요구사항에 따라 자주 변경된다. 어떤 요청에서는 특정 값이 추가될 수 있고, 특정 값이 없을 수도 있다. 따라서 Entity 객체와 분리하여 사용해야 한다.
  4. 도메인 모델링을 지키기 위해

    • 도메인 설계를 잘하였다고 하더라도 원하는 데이터를 표시하기가 쉽지 않을 수 있다. Entity 클래스에 표현을 위한 필드나 로직이 추가되면 객체 설계를 망가뜨릴 수 있기 때문이다. 그래서 DTO에 표현을 위한 로직을 추가해 사용하는 것이 Entity의 도메인 모델링을 지킬 수 있다.
  5. DAO?

    • 실제 DB에 접근하는 객체를 말한다. DAO는 service와 실제 데이터베이스를 연결하는 역할을 한다. (데이터를 꺼내오거나 넣는 역할).
    • JPA의 경우 Repository가 Dao의 역할을 한다고 볼 수 있다. 하지만 DAO와 완전히 같은건 아니다.

DTO를 다양하게

다음 예시 코드를 보자.

public class BookDTO {

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class BookRequestDTO {
        @NotBlank
        @Size(min = 1, max = 50)
        private String title;
        @NotBlank
        @Size(min = 2, max = 20)
        private String author;

        public Book toEntity() {
            return Book.createBook(title, author);
        }
    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class BookResponseDTO {

        private Long id;
        private String title;
        private String author;
        public static BookResponseDTO fromEntity(Book book) {
            return BookResponseDTO.builder()
                    .id(book.getId())
                    .title(book.getTitle())
                    .author(book.getAuthor())
                    .build();
        }
    }
}

도메인 별로 내려줘야하는 데이터 포맷이 다른 경우가 많기 때문에 BookDTO 클래스 안에

inner static class로 요청용, 응답용 DTO로 분할해서 쓰는 경우가 있다.

profile
공유하며 성장하는 Spring 백엔드 취준생입니다

0개의 댓글