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.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
요약
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