jpa create 및 update 시 dto에서 entity 변환방식
안녕하세요 정말 유익한 강의 잘듣고 있고요 항상 친절한 답변에 감사함을 느낍니다.
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
안녕하세요. 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. 의존관계를 생각한다. (의존관계가 복잡해지면 잘못된 코드입니다.)
도움이 되셨길 바라며^^ 감사합니다.
0
김영한님 안녕하세요~ 항상 좋은 강의 감사드립니다.
Entity update 시 좋은 방법을 찾아보다가 여기까지 오게 되었습니다.
혹시 update 할 때 modelMapper를 쓰는 것은 어떻게 생각하시나요?
modelMapper.map(entityUpdateRequest, entity)
이런 식입니다.
한번도 이렇게 써본 적은 없는데 테스트를 했을 때 update 쿼리가 잘 날라가긴 했습니다.
혹시 다른 문제는 없을지 궁금합니다~
감사합니다!
강의 관련 외 질문입니다.
0
65
2
SpringBoot4 + Hibernate7 모듈 등록 방법 공유
0
86
1
BeanCreationException
0
86
3
Update 후 UpdateMemberResponse 매핑할 때
0
46
1
트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?
0
98
2
페이징 + 검색조건 관련해서 질문드립니다.
0
70
1
Query Dsl Q파일 질문입니다.
0
81
1
루트 쿼리라는것은
0
58
1
메서드를 분리하는 기준
0
62
1
findAllWithMemberDelivery 메서드 질문드립니다.
0
108
3
연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략
0
83
2
fetch join과 영속화와 OSIV의 관계
0
84
2
Distinct 사용 전 결과에 대한 의문
0
113
2
레포지토리 계층에서의 트랜잭션에 대한 의문
0
56
1
영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.
0
78
2
dto 필드 속 엔티티 여부
0
58
1
뷰템플릿 사용 시
0
76
2
Result 클래스 관련 질문
0
56
1
@PostConstruct 프록시 관련 질문드립니다
0
85
1
DTO 대신 Form 사용은 안되나요?
0
133
1
OSIV ON 상태일 때
0
95
1
fetch join VS fetch join 페이징 궁금증
0
179
2
양방향 연관관계 알아보는 법?
0
104
1
16강 17강 간단 정리 이게 맞을까요 ?
0
165
2





