인프런 커뮤니티 질문&답변

pwn2own님의 프로필 이미지
pwn2own

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

API 개발 고급 정리

DTO를 만드는 레이어에 관한 질문

작성

·

320

0

안녕하세요!

- 서비스에서 DTO를 만들어서 컨트롤러에게 리턴하는 방식

- 서비스에서는 엔티티를 리턴하고 컨트롤러에서 최종적으로 응답을 내보낼 때 DTO로 감싸서 내보내는 방식

두가지의 방법중에서 어떠한것이 더 좋은 선택일까 고민하고 있습니다.

인터넷을 찾아봐도 많은 논쟁들이 있었지만 무엇이 더 나은 방법이라고 확실하게 답변해주는 건 없는 것 같아요.

개인적으로 서비스에서 DTO를 반환하는게 핵심 비즈니스 로직을 감출 수 있고 의존성을 낮출 수 있다고 생각합니다.

그런데 여기서 문제점이 생기는데, 예를 들어  UserService에 아래와 같은 메소드 2개가 있다고 가정할게요.

- findByUserId(Long id) - 내부에서 repo호출하여 유저 엔티티를 가져온 후 DTO로 반환

- updateUser(Long id, ...)

`updateUser()`에서는 `findByUserId()`를 호출하여 유저를 가져오고 특정 로직에 따라 업데이트하는 구문을 수행하는 목적입니다.

그런데 `findByUserId()`에서 엔티티를 반환했기때문에 엔티티를 가져오기 위해 다시 한번 repo를 호출하여 실제 엔티티를 가져온 후 정보를 변경하는 로직을 수행해야합니다. 따라서 추가적인 쿼리가 발생하는 문제가 생깁니다.

사실 위 예제는 조금 극단적인 예제이긴 합니다만, 실무에서 개발하다보니 서비스에서 서비스를 호출하는 경우가 빈번하게 발생하더라구요.

하지만 엔티티 자체를 컨트롤러까지 노출하는건 뭔가 꺼려집니다.

질문을 요약하자면,

DTO를 서비스에서 리턴하는 방식과 서비스는 엔티티를 리턴하고 컨트롤러에서 DTO로 조합하여 최종 응답을 내보내는 방식 중 어떠한 것이 더 좋다고 생각하시는지 알고 싶습니다. (또는 실무에서 자주 사용하는 방식)

감사합니다 :)

답변 2

1

안녕하세요? 주제넘을지는 모르겠지만, 저도 같은 고민을 하고 있는 중에 영한님이 비슷한 질문으로 답변하신 내용이 있어서 공유드립니다!!

https://www.inflearn.com/questions/139564

김영한님의 프로필 이미지
김영한
지식공유자

ildong-dev04님 고맙습니다^^

pwn2own님의 프로필 이미지
pwn2own
질문자

감사합니다!!

0

pwn2own님의 프로필 이미지
pwn2own
질문자

안녕하세요 영한님.

위 답변을 보고 생각하던 중 질문이 하나 더 생겨서 댓글 남깁니다.

1. "실용적으로 엔티티를 전체 구조에서 사용하자(물론 아키텍처 방향에 따라서 엔티티 노출은 제약할 수 있다)" 라고 하셨는데,  그렇다면 응답으로 내보낼 DTO는 컨트롤러에서 조합하여 사용하시나요? 

2. 찾아보니 https://www.inflearn.com/questions/15292 에서 Modelmapper 관련해서도 답변을 주셨더라구요. 2019년도 글인데, 현재에도 영한님은 DTO를 직접 손으로 매핑해서 사용하고 계시나요?

감사합니다 :)

김영한님의 프로필 이미지
김영한
지식공유자

네 답변 드릴게요^^

1. DTO에서 조합하기도 하고 서비스에서 조합해서 내보내기도 합니다. 꼭 컨트롤러에서만 조합하는 것은 아닙니다.

2. 네 저는 수동으로 매핑하는 것을 선호합니다. 실무에서 복잡한 상황이 되면 ModelMapper를 사용하는게 더 복잡해지는 경우도 많습니다.

감사합니다.

pwn2own님의 프로필 이미지
pwn2own
질문자

답변 감사합니다!!

pwn2own님의 프로필 이미지
pwn2own

작성한 질문수

질문하기