Generic에 들어갈 타입에는 interface
가 아닌, typeAlias
가 암묵적으로 추론된다는 점을 알게 되었다. [ 포스팅 ]
type T_CVAProps = VariantProps<typeof style> // CVA type 추출
type T_RemoveOptionalType = Required<T_CVAProps> // optional 삭제
type T_RemoveNull<T> = { [K in keyof T] : NonNullable<T[K]> } // 타입제너레이터 만들기
type T_CompleteCVAProps = T_RemoveNull<T_RemoveOptionalType> // null값 삭제한 타입
// 위의 타입 축약
/**
* @explain cva의 props에 null | undefined를 삭제 하는 generator입니당
* generic에는 반드시 !!! "VariantProps<typeof object>" 로 넣어주세요
* @example type T_RemoveNullableCVAProps = T_CVARequiredProperty<VariantProps<typeof CVA_Object>>
*/
export type T_CVARequiredProperty<T> = Required<{ [P in keyof T]: NonNullable<T[P]> }>
VariantProps<typeof MyType>
: CVA이 타입을 지정하 수 있는 util [포스팅]import { DefaultValues, FieldValues } from 'react-hook-form';
import { z } from 'zod';
/**
* 등록 폼에 사용될 커스텀 훅 타입입니다.
*/
export interface I_CustomUseHookFormProps<T extends FieldValues> {
schema: z.ZodType<T>; // 진짜...
defaultValues: DefaultValues<T>;
}
// hook으로 적용
const useAuth = <T extends FieldValues>({ schema, defaultValues }: I_CustomUseHookFormProps<T>) => {
const form = useForm<T>({
defaultValues,
resolver: zodResolver(schema),
});
z.ZodType<T>
DefaultValues, FieldValues
Generic<T>
파일을 다루는 개발자가 여럿이고, 코드의 일관성과 통일성, 커스텀 컴포넌트의 모듈화를 통해, 개발자들이 최대한 직관적이게 어떻게 작동하는 지를 고민했던 Component입니다. [포스팅]
Controller
, useController
를 학습했다. [포스팅]Render Props Pattern
을 찾아보고 학습했습니다. [포스팅]그 결과 Controller
와 유사한 useController
와 renderProps Pattern
으로 FileController를 만들어 개발자의 DX를 높였다 [포스팅]
// 결과물
<FileController
name="file"
control={form.control}
render={({ base64, register, remove, ...props }) => (
<YourComponent remove={remove} base64={base64} register={register} />
)}
/>
HTTP 통신을 통해 kakaoMap에 데이터를 시각화 하였다. 지도 페이지를 구축하면서 겪었던 이슈와 그에 따른 해결방법을 고민하고 적용했다.
Next.js
에 적용하는 여러 방법을 고민하고 적용대중화 되어있는 카카오맵을 실제 사용자들이 이용하는 것과 같이 기능을 구현해야지 만이 사람들에게 혼란스러운 경험을 제공하지 않기 때문 [ 포스팅 ]
이벤트 UI
UX
위와 같은 고민을 하고, 해결하였다.
- API들은 병렬 호출
- API통신들이 모두 성공한다고 상정
- react-query를 사용하면 좋겠음, caching 기능이 있으므로 stale값을 지정해 한 번 호출할 때만 시간이 걸렸으면 좋겠음. 그 이후에는 caching된 데이터를 사용하였으면 좋겠다.
- 렌더링 최적화 됬으면 좋겠다.
- 비동기 loading처리와 에러처리가 한 번에 이루어졌으면 좋겠다.
[ 포스팅 ]
useQuery * 2
: [ 포스팅 ]useQueries
: [ 포스팅 ]promise.all vs promise.allSettled
: [ 포스팅 ] promise.all + useQuery
: [ 포스팅 ] API 데이터의 좌표와 카카오맵과 호환이 되지않음을 확인 [ 포스팅 ]
카카오맵 내장 API를 통해 좌표변환으로 카카오맵 호환되게 하였지만, 내장 API콜의 제한횟수와, 표기상 rendering 시간 delay 확인 [ 포스팅 ]
렌더링 시간 40.32배 단축 , 97.52% 단축 [ 포스팅 ]
Client의 https
와 서울시 공공데이터의 http
의 차이로 mixed content issue 발생
왜 mixed content error가 나는지 학습 -> 보안의 위험성 ( 중간자 공격 )
http와 https의 작동원리를 학습 [ 포스팅 ] -> 평문 전송과 암호화 전송을 알게 되었습니다.
Next.js의 rewrite와 redirect 작동원리 학습 [ 포스팅 ]
Next.js의 Api router와 rewrite
를 사용해서 문제를 해결 [ 포스팅 ]
통신의 무상태와 비연결성을 학습과 그에 따른 왜 session과 토큰방식이라는 개념과 적용을 하는지 나만의 방식으로 이해 [ 포스팅 ]
http통신의 무상태와 비연결성으로 인해 user의 진입이 힘들기에 토큰과 sesion 방식이 생겨났다라고 이해 하였습니다. [ session과 토큰 ]
sessionStorage
로 관리 [ 포스팅 ] 인가를 위해, axios 모듈화 구현 [ 포스팅 ]
인증 처리를 위해 3가지의 방법을 고민
NextAuth를 사용할지, cookie + zustand로 인증/인가를 처리할 지 고민 [ 포스팅 ]
- 클라이언트와 서버 간의 인증 상태 불일치
토큰 값 관리를 zustand 와 cookie 두 군데에서 관리되는 것이 통일 되지 않는다.- 복잡한 상태관리
토큰갱신과 로그아웃 갱신을 2군데에서 관리 및 일관된 상태관리를 보장하지 못할 우려
인증처리를 위해 next.js의 middleware의 작동원리 학습 [ 포스팅 ]
middleware
를 통해 조건부 라우팅 [ 포스팅 ]
nextAuth의 withAuth
+ middleware
의 조합으로 refactoring [ 포스팅 ]
Next.js에서 SSR을 하기 위해 CSR
과 SSR
그리고 Hydration을 학습 [ 포스팅 ]
react-query의 hydration(SSR)
의 작동원리를 학습 [ 포스팅 ]
SSR을 위한 axios 모듈화와 Calendar Page SSR [ 포스팅 ]
api router로 multipart/form-data에서 파일 객체를 보내면 사라지는 이슈를 발견 그에따른 문제 해결책 2개와
서버와 브라우저 둘다 자바스크립트를 쓴다고 객체가 자유롭게 이동되는 것이 아니다.
브라우저에서 서버로 보내는 Request body를 어떻게 구성하고, 어떤 데이터 타입인지 명시해줘야 한다. 라는 점을 알게 됨 [ 포스팅 ]
File 객체는 Web APis
에서 제공하는 것으로, javascript로 접근 하기 위한 Class
이다. 그러나 노드상에서는 File을 제공하지 않고 바이너리 데이터를 접근 하기 위해서는 Buffer
를 사용하여 접근 상호작용을 한다. [ 포스팅 ]
서버 (node)에는 파일 객체라는 개념이 없는 대신 Buffer
를 통해 Blob
을 다룸
서버측에서는 bodyParser
를 통해서 rawBody를 추출해 객체 형태로 접근 가능하게 해줌 [ 포스팅 ]
formData는 formidable
, multer
를 통해 데이터가 parse
[ 포스팅 ]
bodyParser
가 없을 때는 req.on
메소드를 통해 chunk
로 데이터를 받아와 처리 [ 포스팅 ]
팀원들과 상의 결과 Contet-Type : application/json
으로 보내길 원함