Logo

Changchangwoo's blog

TIL
Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct
Nov
Dec
Sun
Mon
Tue
Wed
Thu
Fri
Sat
Today I Learned를 기록하는 공간입니다. 🔥🔥🔥
잔디를 클릭하면 내용확인이 가능합니다.
Pinned

Orval spec 탐색

자바스크립트와 다른 언어와의 타입 이해가 다르다.

  • 일반적으로 JS에서는 값 자체가 없음 = undefined, 값은 있으나 정해지지 않은경우 = null 로서 구분
  • 하지만 다른 스펙 ( kotilin ) 들은 동일하게 판단하지 않음. undefined 개념이 없음, 비었거나 있는경우 null
  • 이로인해 야기된 이슈 => 서버 스펙에는 빈 값을 null로 넣거나 없는경우 spring doc을 통해 Open API 명세가 되는 경우에 ?: (optional)로 들어가게 됨 ( 서버 입장에서는 당연한 것, 값이 없을 수도 있다는 의미이니)
  • 하지만 자바스크립트는 옵셔널을 T : undefined로 식별.
  • 서버에서는 null로서 의도한 값이 있다면 런타임에 비해서 빌드 타입이 한단계 더 좁혀짐.
  • 그러다보니 props : A = [], 인 전제로 코드를 작성하면 undefined인 경우에는 저 부분이 할당이 되지만 = [], null이 들어와버리게 되면 할당 되어지지 않음.
  • 이 경우 배열 메서드 A.map() 등을 활용하게 된다면 타입 깨짐, orval을 통한 자동화 중 헛점이 발견하게 된 사례

-> 서버에는 빈 값을 null로 보내는데 명세에는 "필수 아님" ( optional )로만 적혀서 생성 타입이 T | undefined가 된다. 개발자는 ( 에이전트 ) 는 이 타입만 막는 items = [] 디폴트 할당으로만 방어를 했는데, 실제 null이 들어오니 배열연산자 itmes.map()을 할 때 펑 하고 터져버렸다.

그러면 이거 어떻게 처리하냐

  1. 클라에서 orval 자체 설정을 통해서 nullable 한것들을 잡을 수 있음. => 바로 조치할 수 있는 작업, 근데 이렇게 되면 모든 타입 T | undefind | null 이 처리가 됨. 너무 보기 안좋고 기존 파일들 다시 재 생성하는 시점에 너무 많은 변경이 있음.
  2. 서버에 요청해서 앞으로 non_null한 값들에 대해서는 빈 필드 값으로 요청. 그렇게 되면 클라 undefined랑 의미가 맞기 때문. => 클라 입장에서는 근본적인 방법인데, 서버 히스토리를 잘 모름. 이렇게 변경하게 됐을 때 서버에서 외부 api에서 null을 명시적으로 받도록 하는 프로퍼티들이 있으면 그 부분들을 따로 처리해야하고 ( 기존 동작 회귀 방지 수정 ) 요청 비용이 있음..