• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

repository 에서 findAll 의 return type에 관한 질문이 있습니다!

21.02.12 08:28 작성 조회수 1.38k

0

안녕하십니까 영한님. 우선 항상 좋은 강의에 감사드리며 새해복 많이 받으시길 바랍니다!

다름이 아니라 제가 영한님 수업때 강조받기를 파라미터를 통해서 엔티티를 받지말고 항상 스펙에 알맞는 DTO를 만들어서 받으라고 이해했습니다. 

1. 그렇다면 스펙이 아주 조금 다르더라도 (멤버 변수 하나 차이 정도?) 매번 DTO(커맨드 객체라고 표현해도 맞을까요?)를 별도로 만들어서 데이터를 바인딩 시켜줘야 할까요?

2. 그리고 이건 Spring Data JPA 관련 부분이긴 하지만 JpaRepository<> 에서 기본으로 제공하는 findAll() 의 경우 return type이 List<T> 로 되어 해당 엔티티 타입의 리스트로 반환이 됩니다. 엔티티를 노출 시키지 말라고 강조를 받은 저로써 이 부분은 어떻게 되는건지 의문이 생겨서요. Spring Data JPA 의 경우 뭔가 다른건지 아니면 이 리스트를 다시 DTO를 통해 걸러야하는건지 의문이 생겨 질문 남기도록 하겠습니다!

답변 4

·

답변을 작성해보세요.

1

이상진님의 프로필

이상진

질문자

2021.02.13

오호 답변 정말 감사합니다!

1

2번은 네 생각하신 내용이 맞습니다. 컨트롤러에서 반환하면 결국 json으로 바로 변환되기 때문에 외부 시스템에서 해당 엔티티 스펙을 직접 참고하게 됩니다.

감사합니다.

1

안녕하세요. 상진님

1. 그렇다면 스펙이 아주 조금 다르더라도 (멤버 변수 하나 차이 정도?) 매번 DTO(커맨드 객체라고 표현해도 맞을까요?)를 별도로 만들어서 데이터를 바인딩 시켜줘야 할까요?

-> 정석은 별도로 만들어서 데이터를 바인딩 시키는 것이라고 생각하시고, 프로젝트가 단순하다면 실용적인 관점에서 적절하게 타협하는 것도 방법입니다. 하지만 해당 필드가 누락되는 사유를 명확하게 명기해야 합니다. 이런 부분에서 다른 개발자가 보면 왜 여기에 값이 항상 Null이지? 이 부분을 해결할 수 있어야 합니다. 프로젝트가 복잡하다면 가급적 최대한 별도로 분리하시는 것을 추천드립니다.

2. 그리고 이건 Spring Data JPA 관련 부분이긴 하지만 JpaRepository<> 에서 기본으로 제공하는 findAll() 의 경우 return type이 List<T> 로 되어 해당 엔티티 타입의 리스트로 반환이 됩니다. 엔티티를 노출 시키지 말라고 강조를 받은 저로써 이 부분은 어떻게 되는건지 의문이 생겨서요. Spring Data JPA 의 경우 뭔가 다른건지 아니면 이 리스트를 다시 DTO를 통해 걸러야하는건지 의문이 생겨 질문 남기도록 하겠습니다!

-> 네 엔티티를 노출하지 말라고 하는 것은 컨트롤러에서 API로 데이터를 반환할 때 엔티티를 직접 반환하지 말라는 뜻입니다. 해당 프로젝트 안에서는 엔티티를 자유롭게 사용하셔도 됩니다^^ 그러니까 컨트롤러에서 서비스나 리포지토리를 호출해서 엔티티를 반환 받는 것인 괜찮습니다.

감사합니다.

0

이상진님의 프로필

이상진

질문자

2021.02.12

연휴에도 빠른답변 정말 감사합니다 ㅠㅠ 

1번 질문은 이해 완료 하였습니다!

2번 질문의 경우 제가 이해하기를 프로젝트 내에서 즉, 컨트롤러 메서드 내에서 엔티티를 반환받는 것은 괜찮지만 최종적으로 return 할때는 엔티티를 직접 반환하지 말고 이 또한 listDTO 등을 통해 return 시켜라! 인데 맞게 이해 한걸까요?