Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

['21.07.14] Entity, DTO 분리 본문

Project/영화리뷰 관리

['21.07.14] Entity, DTO 분리

Seung__ 2021. 7. 15. 00:32

1. Entity란?


 DB table에 존재하는 Columns을 field로 가지는 객체.

클래스에 @Entity annotation을 붙여 Entity라고 명시함.

 

 

 

2. DTO란?


https://media.vlpt.us/images/ohzzi/post/4cec2790-be9f-4263-96ee-704325bbeac1/spring-package-flow.png

DTO는 Data  Transfer Object의 약자로, 계층 간 data 교환 역할을 한다.

 

특히  Controller와 같이 client와 맡닿아 있는 계층에 entity를 직접 전달하는 대신 DTO를 사용하여 전달한다.

 

DTO는 단순히 데이터 교환을 위한 객체이기 때문에, 특별한 로직을 갖지 않는다.

 

 

 

3. Entity와 DTO를 왜 분리해야함?


 

view와 통신하는 class는 변경이 잦다! 만약 Entity를 주고받는다면, 잦은 Entity의 변화로 DB의 변경도 잦다.

 

또한 Entity의 변화는 영향의 범위가 매우 크다.

 

특히 view에서 원하고 받는 정보는 실제 DB에 반영될 Data와 다를 수 있다.

 

그리고 Entity를 바로 view로 넘긴다면 보안의 문제점도 있을 것이다.

 

이런 저런 이유로 Entity와  DTO를 분리해야 한다.

 

 

4. DTO package


 1) MovieDTO

@Data
@NoArgsConstructor
@AllArgsConstructor
public class MovieDTO {

    private int id;
    private String title;

    @Nullable
    private String link;
    @Nullable
    private String image;
    @Nullable
    private String subtitle;
    @Nullable
    private String director;
    @Nullable
    private String actor;
    @Nullable
    private String userRating;
    @Nullable
    private List<CommentDTO> commentDTOs = new ArrayList<>();

}

2) CommentDTO

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CommentDTO {


    int id;
    private String content;

}

 

5. entity<->dto


 

Service class에 Entity와 DTO를 양방향으로 전환할 수 있는 method를 만들어 준다.

 

단! 이 때 set을 통해 설정하는데, 빼먹지 않도록 주의하자.. 하나 빼먹어서 계속 Null Point Exception발생했는데,

찾는데 4시간 걸림...

  public MovieDTO movieEntityToDTO(MovieEntity movieEntity){

        var dto = new MovieDTO();
        dto.setTitle(movieEntity.getTitle());
        dto.setActor(movieEntity.getActor());
        dto.setDirector(movieEntity.getDirector());
        dto.setId(movieEntity.getId());
        dto.setImage(movieEntity.getImage());
        dto.setLink(movieEntity.getLink());
        dto.setSubtitle(movieEntity.getSubtitle());
        dto.setUserRating(movieEntity.getUserRating());
        dto.setCommentDTOs(commentEntityToDtoList(movieEntity.getCommentEntities()));

        return dto;
    }

    public MovieEntity movieDTOToEntity(MovieDTO movieDTO){

        var entity = new MovieEntity();
        entity.setTitle(movieDTO.getTitle());
        entity.setActor(movieDTO.getActor());
        entity.setDirector(movieDTO.getDirector());
        entity.setId(movieDTO.getId());
        entity.setImage(movieDTO.getImage());
        entity.setLink(movieDTO.getLink());
        entity.setSubtitle(movieDTO.getSubtitle());
        entity.setUserRating(movieDTO.getUserRating());
        entity.setCommentEntities(commentDtoToEntityList(movieDTO.getCommentDTOs()));

        return entity;

    }

특이점은 Movie는 comment List를 가지고 있기 때문에,

comment List에 대한 Entity<->DTO 전환 method는 별도로 만들어준다.

  public List<CommentDTO> commentEntityToDtoList(List<CommentEntity> commentEntityList){

        List<CommentDTO> commentDTOList = new ArrayList<>();

        for(int i=0;i<commentEntityList.size();i++){

            var temp = commentEntityList.get(i);
            commentDTOList.add(commentEntityToDTO(temp));
        }

        return commentDTOList;
    }

    public List<CommentEntity> commentDtoToEntityList(List<CommentDTO> commentDTOList){

        List<CommentEntity> commentEntityList = new ArrayList<>();

        for(int i=0;i<commentDTOList.size();i++){

            var temp = commentDTOList.get(i);
            commentEntityList.add(commentDTOToEntity(temp));
        }

        return commentEntityList;
    }

 

comment자체를 전환하는 코드는 짧당

 public CommentDTO commentEntityToDTO(CommentEntity commentEntity){

        var dto = new CommentDTO();
        dto.setContent(commentEntity.getContent());
        dto.setId(commentEntity.getId());

        return dto;
    }

    public CommentEntity commentDTOToEntity(CommentDTO commentDTO){

        var entity = new CommentEntity();
        entity.setContent(commentDTO.getContent());
        entity.setId(commentDTO.getId());

        return entity;
    }

 

6. MovieRepository


title로 검색 시 좀 더 편하게 검색하기 위해 findByTitleContains로 변경한다.

 

입력된 title을 포함한 Movie entity를 찾게 된다.

   MovieEntity findByTitleContains(String title);

 

7. API Test


모든 method가 의도대로 동작한다!

 

 

8. GitHub : 210714, comentfunction, API


 

 

bsh6463/MovieManager

Contribute to bsh6463/MovieManager development by creating an account on GitHub.

github.com

 

Comments