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

asdkfur님의 프로필 이미지

작성한 질문수

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

회원 수정 API

jpa create 및 update 시 dto에서 entity 변환방식

해결된 질문

20.04.01 17:32 작성

·

6.5K

14

안녕하세요 정말 유익한 강의 잘듣고 있고요 항상 친절한 답변에 감사함을 느낍니다. 

1.create시 createDto로 서비스로 넘어 온다면 아래에 방법중 어떤게 유지보수와 같은 측면에서 가장 나은 선택인가요?

a.  model mapper 나 mapstruct 라이브러리로 매핑한다.

b. 서비스 계층에서 엔티티 빌더로 dto 값을 하나하나 세팅한다.

c. 엔티티 생성자나 빌더에 dto 를 넘기고 그안에서 값을 세팅한다.

2.update시 updateDto로 서비스로 넘어 온다면 아래에 방법중 어떤게 유지보수와 같은 측면에서 가장 나은 선택인가요?

a.강의에서 처럼 dto 값을빼서 전달한다. entity.change(updateDto.getA(),updateDto.getB())

b. 전체 Dto를 넘긴다. entity.change(updateDto)

3. update patch시에는 변경하지 않는값은  updateDto에 널로 들어온다면  모든 값을 하나씩 체크하면서 null 이 아닌것에대한 엔티티를 업데이트 해주는 방식이 최선인가요?

 

4.만약 엔티티에서 dto 로 변환시에는 보통 어떤 방식으로 실무에서 많이 하나요?

답변 3

30

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

2020. 04. 02. 23:54

안녕하세요. asdkfur님 좋은 질문입니다.

1번 먼저 답을 해드리면

a,b,c 모두 정답입니다. 저는 개인적으로 model mapper를 선호하지 않지만, 주변에서 사용하는 것을 말리지는 않습니다^^

답을 드리면 생성자를 사용하는게 좋은가? 빌더를 사용하는게 좋은가? 별도의 생성자용 static 메서드를 사용하는게 좋은가? 아니면 별도의 생성 클래스를 만들어서 여기에서 생성해 주는게 좋은가? 등등 여러가지 상황이 있습니다.

결국 모두가 정답이기에 제가 선호하는 기준을 말씀드리면, 가장 단순한 방법부터 생각합니다. 만약 생성 로직이 정말 단순한 객체라면 그냥 생성자를 쓰는게 편합니다. 그런데 생성할 때 뭔가 비즈니스 로직이나 의미있는 생성자 메서드 명이 필요하다면 생성자용 static 메서드를 사용합니다. 만약 파라미터가 너무 많거나 복잡하면 빌더를 사용합니다. 이런식으로 상황에 맞는 방법을 잘 선택하는게 중요합니다. 결국 상황에 따라서 복잡도를 높이지 않는 선에서 단순한 방법을 선택하는 것이 좋은 방법이라 생각합니다.

2번도 같은 방법으로 선택하시면 됩니다. 파라미터로 넘기면 아무래도 재사용성이 좋아집니다. DTO를 넘기면 편하지만, 해당 엔티티가 DTO에 의존하게 됩니다. 그래도 파라미터가 너무 많으면 update용 dto를 만드는 것을 고려하는 것이 좋습니다.

3번은 null 체크를 하면서 아닌 것에 대한 업데이트를 해야합니다.

4번은 이번 강의에서 보여드린 모든 방법을 사용합니다. 1번의 답과 마찬가지로 model mapper를 사용하기도 하고, 직접 한땀한땀 필요한 값을 꺼내서 DTO로 변환하기도 합니다. 또는 JPQL에서 DTO로 바로 변환하기도 하구요. 딱 한가지만 조심하면 되는데, 절대 엔티티가 View용 DTO를 의존하면 안됩니다. 반대로 View용 DTO가 엔티티를 의존하는 것은 괜찮습니다.

다 장단점이 있어서 고민이 쉽지 않을 때가 있는데요. 저는 나름 다음과 같은 방법을 사용합니다.

1. 가장 쉬운 방법을 선택한다. (머리속으로 생각이 도는 것 보다 일단 가장 쉬운 방법으로 진행하는 것을 추천합니다.)

2. 직접 코드를 작성해본다. (머리속으로 생각이 도는 것 보다 일단 짜보면 쉽게 풀릴 때가 많습니다. 그리고 그 상황에 따라서 더 나은 코드가 있습니다.)

3. 의존관계를 생각한다. (의존관계가 복잡해지면 잘못된 코드입니다.)

도움이 되셨길 바라며^^ 감사합니다.

3

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

2020. 04. 06. 20:06

항상 진짜 친절한 답변 감사합니다. 정말 많이 배우고 있습니다.

0

Jung Insup님의 프로필 이미지

2021. 10. 27. 13:59

김영한님 안녕하세요~ 항상 좋은 강의 감사드립니다.

Entity update 시 좋은 방법을 찾아보다가 여기까지 오게 되었습니다.

 

혹시 update 할 때 modelMapper를 쓰는 것은 어떻게 생각하시나요?

 

modelMapper.map(entityUpdateRequest, entity)

이런 식입니다.

 

한번도 이렇게 써본 적은 없는데 테스트를 했을 때 update 쿼리가 잘 날라가긴 했습니다.

혹시 다른 문제는 없을지 궁금합니다~

 

감사합니다!

 

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

2021. 10. 28. 21:58

안녕하세요. Jung Insup님

네 사용하셔도 됩니다.

감사합니다.

asdkfur님의 프로필 이미지

작성한 질문수

질문하기