일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- springdatajpa
- Greedy
- 자바
- 알고리즘
- Spring Boot
- db
- 백준
- kotlin
- JPQL
- Thymeleaf
- 그리디
- Android
- 인프런
- Proxy
- SpringBoot
- JDBC
- AOP
- QueryDSL
- 스프링 핵심 기능
- java
- transaction
- http
- 스프링 핵심 원리
- pointcut
- Exception
- spring
- 김영한
- Servlet
- jpa
- 스프링
- Today
- Total
개발자되기 프로젝트
['21.07.14] Entity, DTO 분리 본문
1. Entity란?
DB table에 존재하는 Columns을 field로 가지는 객체.
클래스에 @Entity annotation을 붙여 Entity라고 명시함.
2. DTO란?
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
'Project > 영화리뷰 관리' 카테고리의 다른 글
['21.07.17] Null check, ENum (0) | 2021.07.17 |
---|---|
['21.07.15] Naver 영화검색 API (0) | 2021.07.15 |
['21.07.14] Service class생성, api test (0) | 2021.07.14 |
['21.07.13] Naver API 연동 (0) | 2021.07.13 |
['21.07.12] Movie Entity, Repository, API Controller (0) | 2021.07.12 |