티스토리 뷰

반응형

 이 글은 단순히 생각 정리를 위한 글이지 정답을 위한 글이 아닙니다!

 

 최근 Spring api를 개발하고 코드 리뷰를 받았다. DTO 변환 관련하여 코드 리뷰에서 피드백을 받았고 이에 대해서 기록하는 글이다.

 

문제의 그 코드! 위의 코드는 Post Entity 안에 위치한다.

@Entity
@Table(name = "post")
public class Post {
  
  public PostDto toPostDto() {
    return new PostDto(id, title, content, createAt, user.getId());
  }
  
}

 위의 코드들은 피드백을 받았던 문제의 그 코드(일부만 가져 왔다!)이다!

 

 Entity는 데이터베이스의 테이블과 매핑되는 클래스이고, DTO는 계층간의 데이터 전달을 위해 사용하는 객체이다.

 Entity의 값을 통해서 DTO 객체를 생성할 때, 나는 기존에 Entity에서 DTO 객체를 생성해서 리턴하는 방식으로 DTO 객체를 생성하였다. 내가 Entity에서 DTO 객체를 생성해서 리턴 이유는 다음과 같다.

 

1. DTO는 Entity 객체의 데이터를 바탕으로 만들어진다. Entity 입장에서는 보여주고 싶은 데이터와 보여주고 싶지 않은 데이터가 있다. 보여주고 싶은 데이터를 Entity가 DTO를 통해서 보여준다. 그래서 도메인 로직이라고 생각했다.

2. Entity에서 DTO를 통해서 데이터를 생성하면 getter를 통해서 가져올 필요 없이 바로 가져올 수 있다. 이렇게 하면 코드가 더 간결해진다.

3. Post 엔티티를 변환할 때 "postEntity.toPostDto()"라고 표현되는 것이 더 자연스럽게 읽힌다고 생각했다. Post 엔티티가 PostDto로 변환된다라고 읽히기 때문에 더 가독성이 좋은 코드라고 생각했다. (Go에서 변수 선언시 변수명 뒤에 변수 타입이 오는데 '변수는 ~타입이다'라고 읽히기 때문에 더 자연스럽게 읽힌다는 것을 생각했다)

 

 위와 같은 이유로 논란의 그 코드를 작성했다! 하지만 도메인 로직일지 다시 생각해보라는 피드백을 받았다. 😿

 

 다른 사람은 엔티티를 dto로 변환하는 Converter 클래스를 생성하고 해당 클래스를 빈으로 등록했다. 그리고 등록된 컨버터에 파라미터로 엔티티 객체를 넘겼고 dto를 리턴받는 방식으로 변환을 했다.

@Component
public class DtoConverter {
  public PostDto toPostDto(Post post) {
    return new PostDto(post.getId(), post.getTitle(), post.getContent(), post.getCreateAt(), post.getUser().getId());
  }
}

 컨버터 클래스의 예시는 위와 같다. Post 엔티티를 파라미터로 받고 getter를 통해서 가져온 값을 사용해서 dto를 생성하고 리턴한다.

 위와 같이 작성한 사람은 엔티티에서 dto 객체를 리턴하면 의존성이 너무 강해지는 문제가 있을 것 같다고 했다. dto는 엔티티의 데이터를 사용하기 때문에 강한 결합이 있을 수 밖에 없다고 생각했기 때문에 다른 의견을 더 찾아보았다.

 

계층 간의 구조

 스택오버 플로우에는 엔티티 계층과 전송 계층의 종속성이 없어야 한다고 한다. 이는 DTO와 Entity의 사용 범위 때문이라고 생각한다. 위의 그림은 Spring 프로젝트 계층을 표현했다. 보면 DTO와 Entity는 직접적으로 연결되어 있는 구조가 아닌데, Post에서 PostDto를 직접 생성해서 리턴함으로써 계층간의 구조가 깨져버렸다고 생각한다. 따라서 그림을 통해서 보았을 때 Entity에서 바로 DTO 생성해서 리턴하는 것은 문제가 있어 보인다. 하지만 다른 의견 중에는 취향이라는 말도 있고, 다른 코드들을 보면 Entity에서 바로 DTO로 변환하는 코드도 쉽게 찾을 수 있다. 그래서 이는 취향의 문제로 남겨두기로 했고, 좀 더 아키텍처를 지키고 싶은 마음이면 내가 작성한 코드는 변경이 필요한 코드가 아닐까 싶다.

 

참고 자료

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함