Replies: 4 comments 4 replies
-
최대한 읽기 좋게 쓰려고 노력했는데 깃허브 폰트 스타일이 음슴체로 구조화 해서 쓰지 않은 글은 눈에 잘 안 들어오는 것 같아요 .. 혹시 이해하는 데에 시간 오래 걸리면 디스코드에서 마주쳤을 때 3분컷 설명하겠습니다! |
Beta Was this translation helpful? Give feedback.
-
endpoint 함수 별로 파일을 분리(2번 의견)하지 않으면 https://github.com/Neogasogaeseo/Naega-Web/blob/dev/src/infrastructure/remote/team.ts |
Beta Was this translation helpful? Give feedback.
-
스키마의 타입이 굉장히 복잡한 API가 많기 때문에, serverResponse 필드가 너무 복잡해져서 읽기 힘들 수 있다는 점에 공감해요! |
Beta Was this translation helpful? Give feedback.
-
저도 2번 내용 공감하고, 건영이가 제시해준 방법으로 폴더를 한 뎁스 더 가져가더라두 도메인 별로 나눠두는게 찾기 더 좋을 것 같아요! 그리고 한 가지 질문이 있는데요, 여기서 말하는 원래 이 의도가 컴포넌트 타입과 분리하기 위함으로 이해했어서 해당 부분도 제한하려는 건지 궁금합니다. @NamJwong |
Beta Was this translation helpful? Give feedback.
-
요약
1번 의견은 트레이드 오프가 있어 상대적으로 중요도가 낮다 생각하며, 2번 의견은 중요도가 높다고 생각함.
해당 Discussion을 이해하기 위한 히스토리
최근 새롭게 도입한 api 타입 검증 및 컴포넌트 타입과의 분리를 위한 아키텍처
의견 1. 서버 리스폰스가 매우 크고 복잡할 경우 스키마 선언을 분리하자.
endpoint 중
/api/v1/members/profile/${id}
(getMemberProfileById
)의 서버 리스폰스는 매우 크고 복잡합니다.필드의 개수가 아주 많고 그 중 객체 타입의 필드도 많습니다.
따라서 이런 경우에는
createEndPoint
에서 요구하는serverResponseSchema
에 스키마 선언을 한 번에 하는 것보다는project
,link
,career
와 같은 객체 타입 필드는 따로 스키마 선언을 하는 것이 가독성과 유지보수에 좋겠다는 것이 첫 번째 의견입니다.이에 따라 다음과 같이 해볼 수 있습니다.
한 도메인의 모든 endpoint 함수를 선언하는
api/endpoint/[도메인]/index.ts
에 이 스키마들을 선언하는 것은 곤란하니,api/endpoint/[도메인]/schema/[endpoint 함수명].ts
형태로 파일을 만들어 객체 타입 필드 스키마 선언을 분리했습니다.그런데 이 방법에는 다음과 같은 두 가지 문제점이 있습니다.
getMemberProfileById
의serverResponseSchema
는 매우 길어질 것이다. 객체 타입 필드가 여러 개 있을 뿐만 아니라 애초에 필드 개수가 너무 많기 때문이다. 이런 경우가 반복될 경우api/endpoint/[도메인]/index.ts
는 매우 복잡해져 각 endpoint 함수를 관리하기 어려워질 것이다.getMemberProfileById
가 아닌, 변경이 방향성이 다른 endpoint 함수에서 해당 스키마들을 가져다 쓸 가능성이 생기기 때문이다.의견 2. endpoint 함수의 선언을 파일 별로 분리하자.
따라서 두 번째 의견으로 다음을 제시합니다.
api/endpoint/[도메인]/index.ts
를 사용하지 않고,api/endpoint/[endpoint 함수명].ts
형식으로 함수 별로 파일을 분리해서 선언하는 것이 어떨까요?이렇게 하면
getMemberProfileById
같은 경우에는 최상단에 endpoint 함수를 선언하고 그 아래에 객체 타입 필드의 스키마를 따로 선언할 수 있을 것입니다.이 방식의 장점은 다음과 같습니다.
api/endpoint/[도메인]/index.ts
을 눌러보지 않아도 어떤 endpoint 함수가 있는지 한눈에 보여서 접근성이 매우 좋아질 것이다.getMemberProfileById
경우처럼 스키마 선언을 나눠서 하는 것이 좋을 때 해당 선언을 endpoint 함수와 같은 파일에 함으로써 각 스키마 선언에 대한 접근성을 높이고, endpoint 함수 간의 잘못된 스키마 공유를 막을 수 있다. (우발적 중복 방지)위에서 언급한 두 가지 문제점을 해결할 수 있는 장점들입니다.
각 의견에 대해 스스로 생각하는 중요도
그런데 사실 1번 의견 즉, 스키마 선언 분리는 (저번에 @Tekiter 가 언급했던 것처럼) 선언 앞에 누군가 export 하나만 달면 바로 우발적 중복의 위험이 높아집니다.
그렇기에 우발적 중복을 완전히 회피하려면 스키마를 따로 '선언'하지 않고 바로
serverResponseSchema
에 할당하는 것이 가장 좋다고 생각합니다.(애초에 @Tekiter 가 이러한 의도로
createEndPoint
를 설계한 것 같습니다.)하지만
serverResponseSchema
의 복잡성이 높아지는 경우 관리하기 어려워지므로 트레이드 오프가 있는 것 같습니다.이렇게 1번 의견은 이렇게 트레이드 오프가 있기 때문에 필수라고 생각하진 않습니다.
하지만 이
serverResponseSchema
의 복잡성이 매우 올라갈 수 있다는 문제는 2번 의견으로도 조금이나마 해결할 수 있는 것 같습니다.아무래도 endpoint 함수 자체가 파일로 분리되면
serverResponseSchema
의 가독성이 좋지 않은 상황에서 위 아래 endpoint 함수들과 헷갈리는 일까지는 생기지 않기 때문입니다.따라서 1번 의견은 가져가지 않더라도 2번 의견의 중요도는 높여서 고려해봤으면 좋겠습니다.
Beta Was this translation helpful? Give feedback.
All reactions