• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

스프링 api 메세지 수신시 map dto 뭐가 좋을까요? 어떤상황에 map , dto 를 선택해서 사용해야 할까요?

23.03.27 08:03 작성 조회수 823

1

안녕하세요 토비님 ~

 

 

토비님 강의와 유튜브 잘 보고 있습니다. 감사합니다.

강의 내용과 벗어난 질문이긴 하지만

개발하다 궁금한 부분 있어 질문 드립니다

 

 

스프링을 이용해서 api 데이터 수신 시

저는 RestTemplate dto선언해서 Mapstruct 이용해서 개발을 했고

다른분은 map 을 이용해서 받아서 개발하는걸 봤습니다

 

 

처리해야 하는 상황에 따라 다르겠지만,

토비님이 경험하신 노하우로는

어떤 경우에는 map 으로 받으면 좋고 어떤경우는 dto 로 받아서

처리하는게 좋은 건지 정석, 베스트 정답이 있을까요?

경우에 따라서 사례를 들어서 설명해주시면 좋겠습니다

 

 

급한 질문은 아니니 한가한 시간 나실 때

알려 주시면 좋겠습니다

 

 

#spring

#스프링

#spring-boot

#스프링부트

#부트

#RestTemplate

#레스트템플릿

#api

#map

#dto

#vo

#최선

#정석

답변 1

답변을 작성해보세요.

0

각 방식의 장점과 단점을 생각해보시고 어떤 경우에 적합한지 판단하셔서 사용하시면 됩니다.

Map은 일단 클래스를 매번 선언하지 않아도 되니까 빠릅니다. 키가 뭐가 들어가는지도 미리 알 필요도 없죠. 그리고 이걸 그대로 화면에 출력하거나 다시 앞 단으로 전달하고 마는 경우라면 생산성이 좋아서 DB에서 조회성 결과를 가져오거나 할 때 유리합니다.

하지만 Map에 담긴 정보를 활용해야 하는 경우엔 헬이 시작되죠. Map의 value에는 타입이 한가지 밖에 안들어가니 보통 String으로 받겠죠. 그걸 로직을 적용해야 하는 코드에서 사용하는 타입으로 변환을 하게 되면 난리가 납니다. 키를 문자열로 넘기기 때문에 오타가 발생하기도 하고, 로직을 적용한 뒤에 다시 Map에 담는 것도 별로 효과적이지 못합니다.

단순 조회용으로 많은 양을 빠르게 찍어내고 프로젝트에서 도망갈 수 있는 상황이라면 Map을 쓰셔도 좋겠습니다만, 저는 그 외에는 DTO와 같은 클래스, 혹은 레코드(자바14+)를 사용하시는 걸 권장드립니다. Lombok 등을 사용하면 필드만 정의하면 되니까 개발도 시간이 걸리지 않습니다. 내가 다루는 데이터가 어떤 것들이고 어떤 타입으로 처리해야할지도 명확하게 하니까 로직을 적용할 때 버그가 줄어들겠죠.

api가 응답하는 데이터의 형식이 미리 알려지지 않은 경우가 있습니다. 이렇게 규약이 정해지지 않았지만 전달 받은 데이터를 활용해야 하는 경우엔 Map이 필요하겠지만 저는 그 외의 경우라면 DTO를 반드시 사용합니다.

그런데 Mapstruct는 어떤 이유로 쓰시는지 잘 모르겠네요. 가져온 자료를 또 다른 형식으로 가공하는게 필요한가보네요. 저는 이런 경우 성능이 아주 중요한 경우가 아니라면 ModelMapper를 사용하는 편인데, 언제부터인가는 수동으로 변환하는 코드를 직접 작성합니다. 생성자나 팩토리 메소드를 이용하죠. 이게 조금 번거롭긴하지만 명시적이라서 좋습니다. 코드에서 정확히 뭘 다루는지 보이니까요. Github copilot을 쓰면서부터는 그 변환 코드를 아주 영리하게 자동으로 만들어줘서 더 사용하기 좋네요.

김동희님의 프로필

김동희

질문자

2023.03.27

맵스트럭쳐를 쓰고 있는 이유는

물류 오더를 수신하는걸 구현하는데

api 수신 후

오더 -> 오더하위 엔티티 -> 그에 따른 하위 엔티티

집어넣어야 할 연관 테이블이 여러개 변환을 해야 합니다

map으로 받아서 loop 돌리며 set하는게 아니라 맵스럭쳐 이용하면 간편히 되더라구요

지금 실무 개발에서 처음 모델매퍼를 써봤지만

성능 차이가 수십배 차이가 나는 걸로 제가 느겼습니다

json 변환 소요 시간 성능 개선 때문에 위해서 맵스트럭처 를 사용했습니다

 

토비님 시간 내서 설명해주셔서 너무 감사드립니다. 수고하세요^^