서버에 있는 상태를 타이핑하는 것에 대한 고민 #150
-
고민서버에서 동적으로 가져오는 카테고리 관련 정보가 있습니다. 이것을 타이핑해 사용하기 위해 저는 보통 클라이언트 TS 코드에 다음과 같은 타입을 작성하는데요,
작성할때마다 양심에 걸리는 것이, 서버에서 다이나믹하게 관리되는 상태를 정적으로 타이핑해두는것이 괜찮은가? 혹은 그냥 string타입으로 루즈하게 관리하는 것이 좋을까 싶은데, string 타입으로 관리하자니 해당 정보를 이용해 퍼널상태를 관리한다던지 할 때 유용성이 떨어져 고민입니다. 여러분은 어떻게 동적인 서버상태를 타이핑하고 계신가요? |
Beta Was this translation helpful? Give feedback.
Replies: 4 comments 3 replies
-
오! 좋은 고민거리네요. 저라면 런타임에서 서버 응답을 검증하면서(zod든, 에러 throw든), 정적 타입을 활용하는 방식을 택할 것 같아요. |
Beta Was this translation helpful? Give feedback.
-
서버에서 변경 가능한 enum 필드를 클라이언트에서 TS의 유니온등으로 정의했을 경우, 서버의 필드가 갑자기 바뀌는 상황(있으면 안되는 일이지만)에 클라이언트가 터지는 상황이 불안하신거라면, 유니온 타입에 폴백 스트링을 하나 추가하신 후 else나 switch의 default에서 해당 폴백 스트링을 처리하도록 하면 조금이나마 안전할거같다고 생각합니다 예를들어 switch (projectType) {
case "위치기반 AR":
...
break;
case "얼굴인식 AR":
...
break;
case "이미지마커 AR":
...
break;
case "UNKNOWN":
default:
// 예외처리
break;
} 예전에 개인 프로젝트로 graphQL을 다루면서 문서를 검색하다가 찾았던 패턴이라 아래 해당 문서 공유드립니다 |
Beta Was this translation helpful? Give feedback.
-
상황에 따라 다르기 때문에 커뮤니케이션을 통해 결정해야하는 부분같아요. "안전하다"의 범위를 어디까지로 볼 것 인가에 대해 이야기해야 할것 같은데, 클라이언트에서 서버를 통제할 수 없는 외부요인으로 취급한다면 사실 모든 서버 통신에 대해 정해진 타입을 반환하지 않는 경우를 상정해야 합니다. 하지만 이건 현실적이지 않고, fetch로 받은 응답을 정해진 타입으로 캐스팅한다는것은 그 외 약속한 형태가 아니게 오는건 우리가 정의한 세계에서 없는일이다, 여기에 대한 예외는 우리가 다루는 범위로 취급하지 않겠다 라고 가정 하겠다는 것이에요. 이렇듯 즉, 우리가 만든 세계를 어디까지로 정의할건지에 대한 결정이 아닐까 싶습니다. |
Beta Was this translation helpful? Give feedback.
-
export type ProjectType = "위치기반 AR" | "얼굴인식 AR" | "이미지마커 AR" | (string & NonNullable<unknown>); 느슨하게와 타입좁히는 것에 타협점을 찾고 싶으시다면 이런 방식은 어떠신가요? |
Beta Was this translation helpful? Give feedback.
오! 좋은 고민거리네요.
저라면 런타임에서 서버 응답을 검증하면서(zod든, 에러 throw든), 정적 타입을 활용하는 방식을 택할 것 같아요.
그리고 만약 스웨거에서 enum으로 제공해줄 수 있다면, OpenAPI Generator 등으로 서버 데이터를 기반으로 TypeScript 타입을 생성해주는 장치를 추가하면 서버와 프론트간의 싱크도 챙길 수 있어보입니다.