teamhide / fastapi-boilerplate

FastAPI boilerplate for real world production
987 stars 156 forks source link

Response Model에 대한 질문 #34

Closed whdvlf94 closed 4 months ago

whdvlf94 commented 5 months ago

안녕하세요 영식님!

우선, 이런 좋은 boilerplate를 공유해주신 것에 대해 감사의 말씀 드립니다. github 뿐만 아니라 블로그를 통해서도 정말 많은 도움 받았습니다!

다름이 아니고, endpoint에서 response_model로 adapter.input.api.v1.response 모듈과 application.dto 모듈 둘 다 사용하시던데, 어떤 기준으로 두 가지를 나눠서 사용했는지 알 수 있을까요?

response 모듈은 'API 응답', dto 모듈은 '애플리케이션 내부 데이터 전송 개체 정의'로 알고 있는데, 혹시 어떤 의도로 작성하신 걸까요?

teamhide commented 5 months ago

@whdvlf94 안녕하세요. 반갑습니다 :)

결론부터 말씀드리면, 저는 대다수의 경우 컨트롤러 레이어에서 다시 한번 Response body에 맞게 응답을 변환하여 내리고 있습니다.

코드를 작성할 당시에는 서비스 레이어의 응답값과 컨트롤러 레이어의 응답값이 동일하여 딱히 변환하진 않았던 것 같네요.

이 부분은 개인이나 팀의 결정에 따라 가시면 될 것 같습니다. 코드 아키텍처에 따라서도 조금씩 달라서요.

도움이 되었으면 합니다!

whdvlf94 commented 5 months ago

빠른 답변 감사드립니다!

추가로 몇 가지 더 질문 드려도 될까요?

  1. container 부분을 보면 app/container와 app/user/container로 구분되어 있는데, User 에서 선언한 container는 사용하지 않으시더라구요. 어떤 의도로 작성하신 건지 궁금합니다!

  2. session 객체가 Singleton으로 관리되고 있는데, UserSQLAlchemyRepo 클래스의 Factory, Singleton 사용 여부에 따라 session 객체 사용 과정에 영향을 줄 수 있나요?

  3. UserSQLAlchemyRepo을 Singleton으로 사용하신 이유가 객체 또는 인스턴스 생성(UserSQLAlchemyRepo, session)에 드는 비용과 메모리 효율성을 고려해서 채택하신건지 궁금합니다.

python으로만 개발을 하다보니 DI 개념이 익숙하지 않네요.. 답변 해주시면 정말 감사하겠습니다..!

teamhide commented 5 months ago

@whdvlf94

  1. 도메인 별로 컨테이너를 분리해서 사용하기 위함입니다. app/container는 전체 도메인에서 필요한 의존성을 관리한다고 보시면 됩니다. 현재 코드상에서는 app/container에 있는 의존성은 없는 코드라고 보셔도 될 것 같아요. 제가 선언해놓고 사용을 안했네요 ㅎㅎ 유저쪽에 필요한 의존성은 app/user/container에 정의해뒀습니다.
  2. SQLAlchemyMiddleware에서 현재 요청 컨텍스트에 대한 고유값을 세팅해두고 세션의 scopefunc에서 해당 값을 참조하여 사용함으로써 각 컨텍스트간 별도의 세션을 사용할 수 있도록 context-local을 적용해두었기에 타 클래스의 Factory, Singleton 여부는 영향이 없습니다. 관련문서 참고하시면 도움이 되실거에요.
  3. 레포지토리는 Stateless이기 때문입니다. 상태를 가지고 있지않은 객체는 Singleton으로 사용하여도 문제가 없습니다. 스프링의 DI도 기본은 싱글톤이에요. 싱글톤을 적용하면 말씀주신 객체 생성 비용도 줄일 수 있겠죠.
whdvlf94 commented 4 months ago

코멘트가 많이 늦었네요.. 답변 정말 감사드립니다!