DTO변환 위치 : Controller일까? Service일까?
2024. 1. 12. 09:04ㆍ우아한테크코스/프리코스
결론 : 정답이 없다.
PostRequest는 toEntity()를 통해 PostRequest(DTO) → Entity로 변환이 가능하다.
@Getter
@Builder
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class PostRequest {
private String title;
private String content;
private String writer;
public Post toEntity() {
return Post.builder()
.title(title)
.content(content)
.writer(writer)
.build();
}
}
PostReponse에서는 Builder를 통해 Entity → DTO로 변환이 가능하다.
@Getter
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class PostResponse {
private Long id;
private String title;
private String content;
private String writer;
@Builder
public PostResponse(Post post) {
this.id = post.getId();
this.title = post.getTitle();
this.content = post.getContent();
this.writer = post.getWriter();
}
}
위 Entity ↔ DTO간의 변환작업을 Controller에서 해야할까? Service에서 해야할까?
A. Entity ↔ DTO간의 변환작업을 ArticleController에서 해준 경우
- ArticleController
@PostMapping
public ResponseEntity<ArticleResponseDto> createArticle(@RequestBody ArticleRequestDto articleRequestDto) {
//로직 생략
Article article = articleRequestDto.toEntity();
Article savedArticle = articleService.createArticle(article);
ArticleResponseDto articleResponseDto = ArticleResponseDto.from(savedArticle);
return ResponseEntity.ok().body(articleResponseDto);
}
- ArticleService
public Article createArticle(Article article) {
//로직 생략
return articleRepository.save(article);
}
B. Entity ↔ DTO간의 변환작업을 ArticleService에서 해준 경우
- ArticleService
public ArticleDto createArticle(ArticleDto articleRequestDto) {
Article article = articleRequestDto.toEntity();
//로직 생략
return ArticleDto.from(articleRepository.save(article));
}
A Case 문제점
- 비즈니스 로직과 혼재
- Controller가 여러 Domain객체들의 정보를 조합해서 DTO를 생성해야 하는 경우, 결국 Service(응용 계층) 로직이 Controller에 포함되게 됩니다.
- 여러 Domain 객체들을 조회해야 하기 때문에 하나의 Controller가 의존하는 Service의 개수가 비대해집니다.
B Case문제점
- Service의 복잡도 증가: Service에 변환 작업까지 포함되면 역할이 복잡해질 수 있다.
- 코드 재사용성 하락: Service에서 특정 DTO에 의존하게 되면 여러 종류의 Controller에서 해당 Service를 이용할 수 없어 코드 재사용성이 떨어지게 된다.
- 참조 블로그
'우아한테크코스 > 프리코스' 카테고리의 다른 글
싱글톤 패턴이 객체 지향에 위반이 된다는데? 왜? (0) | 2024.01.12 |
---|---|
DTO 왜 사용해? Entity와 DTO를 왜 분리해? (0) | 2024.01.12 |
EnumMap이 HashMap보다 성능이 좋은 이유 (0) | 2024.01.12 |
Enum 캐싱방법(정적 팩토리 메소드 내용 일 부 발췌) (0) | 2024.01.12 |
상속을 자제하고 합성을 이용하자 (0) | 2024.01.12 |