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

dongjae0803님의 프로필 이미지
dongjae0803

작성한 질문수

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

List<Domain> -> List<Response> 변환을 Controller에서 하는 게 맞나요?

작성

·

718

0

Domain -> Response 변환 코드를 Domain에 정의해두고

Controller에서 Domain 메서드를 호출해서 Response를 변환하는게 맞나는 건 이해했습니다.

 

근데 실제 API에 해당 내용을 적용하려고 보니 Domain 단 건 조회보다는 List<Domain>을 반환하는 경우가 훨씬 많았습니다.

 

따라서 List<Domain>을 List<Response>로 변환해야 하는데 해당 작업을 for문이나 Stream으로 Controller로 처리하려니 Controller 코드도 지저분해지고 Controller가 하는 역할에 부합하지 않게 되는 것 같습니다.

List<>를 변환할 때는 어디서 하는게 올바른 것인지 질문드립니다!

 

답변 2

1

김우근님의 프로필 이미지
김우근
지식공유자

안녕하세요. 근래에 책을 집필할 기회가 생겨 그쪽에 힘을 실어주다 보니 다른 일에 신경 쓰지 못했습니다. 답변이 늦어 죄송합니다. 다만 해당 강의는 공식적으로 질의응답을 제공하지 않는 강의였다는 점을 이유로 늦어진 부분에 대해 양해 부탁드립니다.

질문을 제가 정확히는 이해하지 못해서 일단 교정해야 할 부분과 궁금해하시는 것 같은 내용을 아래와 같이 나눠 답변드립니다.

교정.1 우선 Domain → Response 로직은 Reponse가 들고 있습니다. (참조: https://github.com/kok202/test-code-with-architecture/blob/v2.0/src/main/java/com/example/demo/post/controller/response/PostResponse.java) 확인해 주시면 좋을 것 같고요.

교정.2 Controller는 Domain 메서드를 호출하지 않습니다. 서비스를 호출하고 도메인을 가져와 Response의 ‘도메인 → Reponse’ 변환 메서드를 호출합니다. (참조: https://github.com/kok202/test-code-with-architecture/blob/73453defa54cd3d7d2288814ca1695a0cd3c0a8d/src/main/java/com/example/demo/post/controller/PostController.java#L30)


다음으로 List<Domain>을 List<Reponse>로 변환하고 싶은 경우

이런 경우 말씀하신 것처럼 변환 로직이 Controller에 있으면 Controller 코드도 지저분해지고 Controller가 하는 역할에 부합하지 않는 일을 하게 됩니다. 그래서 다음과 같은 방법이 있습니다.

  1. 일급 컬렉션을 만듭니다.

이는 List<Domain>보다 Domains라는 클래스를 만들어 사용하고 List<Response>보다 Responses라는 클래스를 만들어 사용한다는 의미입니다. 그리고 복수 개의 도메인을 복수 개의 Response로 변환하고 싶을 때 Responses.from(domains)를 호출해 변환하도록 합니다.

일급 컬렉션과 관련된 자세한 내용은 다음 링크를 참조하는 게 좋아 보입니다. (참조: https://jojoldu.tistory.com/412, 질문과 유사한 사례는 PayGroups 사례를 참고해 해결하면 좋겠네요.)

  1. View / Render로 나눕니다.

     

이건 개인적으로 레거시 프로젝트에 많이 사용하는 방법입니다. Response를 View라 부르고 도메인을 이용해 View를 만들어주는 클래스를 Render라 부릅니다. (명칭은 사람마다 다를 수 있습니다. 다만 개인적으론 이렇게 부르는 게 제일 나았습니다. 이렇게 명명한 이유는 우리가 RestAPI 서버를 만들더라도 API 응답을 내려주는 것이 결국 옛날에 MVC 패턴으로 JSP view를 만들어주는 것과 크게 다를 것 없다 보기 때문입니다.)

그래서 이 경우는 문제 해결이 더 간단합니다. Domain → View 변환 로직을 모두 Render가 들고 있게 하는 겁니다. 그러면 이런 코드가 만들어지겠네요. PostRender.render(posts)

 

개인적으론 1번 방법이 객체 지향적으로 좀 더 맞는 방향이라 생각하기 때문에 이를 더 선호합니다.

답변에 도움 됐길 바라며, 감사합니다.

0

안녕하세요 dongjae0803 님, 인프런 AI 인턴이에요.
일반적으로는 Controller에서 비즈니스 로직에 해당하는 Domain 객체를 가져와서 Response로 변환하는 것이 권장됩니다. 하지만 List을 List로 변환하는 경우에 대해서도 고민하신다면, 이를 처리하는 별도의 컴포넌트를 만들어서 중복 코드를 최소화할 수 있습니다.

예를 들어, List을 List로 변환하는 컴포넌트를 생성하여 그 안에서 변환 로직을 작성하고, 해당 컴포넌트를 사용하여 Controller에서 변환 작업을 수행할 수 있습니다. 이렇게 하면 Controller 코드가 더 깔끔해지며, 역할에 맞는 로직들을 분리하여 관리할 수 있습니다.

또는, Java8에서 제공하는 Stream API를 사용하여 List을 List로 변환하는 방법을 고려해 볼 수도 있습니다. Stream의 map() 메서드를 사용하면 간단하게 변환을 할 수 있습니다.

어떤 방법을 선택하든, 코드의 가독성과 유지 보수성을 고려하여 적절한 방식을 선택하시면 됩니다. 감사합니다!

dongjae0803님의 프로필 이미지
dongjae0803

작성한 질문수

질문하기