# 2023 4월 TIL
# 2023.04.11
# Overview
- 에디터 리팩토링 진행 중
- 복잡도가 높은 제품을 어떻게 하면 조금 더 읽기 좋은 코드로 작성할 수 있을까 고민 중
- 추상화의 중요성
- 함수형 코딩에 대해서도 이해하면 조금 더 읽기 좋고 재활용하기 편한 코드를 작성할 수 있지 않을까? 하는 생각
- 애쉬에게 함수형 자바스크립트(루이스 아텐시오 저) (opens new window)를 빌려서 읽어보는 중!
- 취미 목적의 독서 모임을 하나 시작했다.
# Next.js 환경에서 MSW 세팅
- Vercel에서 제공하는 msw example (opens new window)을 참고하면 좋다.
- 환경변수에 따른 분기 설정은 각각의 제품 상황에 맞추어 적용한다.
// _app.tsx
// isTest()와 isDev()는 환경 변수 관련 유틸에서 import하여 쓰는 함수
// init 시점의 환경 변수를 읽어와 현재 해당 환경인지의 여부를 boolean으로 반환한다.
/**
* init MSW
*/
const MSWServerInit = async () => {
// MSW in node server
if (typeof window !== 'undefined') return
const { server } = await import('@/mocks/server')
server.listen()
}
const MSWClientInit = async () => {
// MSW in client
if (typeof window === 'undefined') return
const { worker } = await import('@/mocks/browser')
worker.start()
}
if (isTest()) MSWServerInit()
if (isTest() || isDev()) MSWClientInit()
# useEffectOnce custom hook
- React 18 이후 버전에서는 개발 서버 실행 시 빈 deps를 가진 useEffect의 callback이 두 번 마운트 된다. (StrictMode 사용 시.. 에만 그렇긴 함. 근데 보통 StrictMdoe 쓰지 않나요? 아님말구)
- 관련 Link (opens new window)
- 해당 이슈를 해결하기 위해 + useEffect를 한 번 실행하는 경우에 명시적으로 해당 정보를 코드 레벨에 표현할 수 있도록 useEffectOnce와 useMount라는 훅을 만들었다.
- 레퍼런스는 react-use (opens new window)에서 제공하는 useEffectOnce와 useMount hook
- 필요에 의해 useEffectOnce에 현재 effect의 이전 호출 여부를 저장하는 임시 변수만 하나 추가했다.
- useEffectOnce
import { EffectCallback, useEffect, useRef } from 'react'
/**
* @description
* useEffect를 단 한번 실행하는 케이스에 명시적으로 사용하기 위한 hook
* @param callback
*/
const useEffectOnce = (callback: EffectCallback) => {
const effectCalled = useRef(false)
useEffect(() => {
if (!effectCalled.current) {
callback()
effectCalled.current = true
}
}, [])
}
export default useEffectOnce
- useMount
import useEffectOnce from './useEffectOnce'
/**
* @description
* 컴포넌트 mount 시점에 callback을 실행하는 lifecycle custom hook
* @param callback - 컴포넌트 mount 시점에 실행할 callback
*/
const useMount = (callback: () => void) => {
useEffectOnce(() => {
callback()
})
}
export default useMount
- 사실 처음에 신디가 이 hook 만들고 싶다고 이야기하셨을때는 "굳이?" 라는 생각이 들어서 절찬리 반대했는데, 작업하다보니 있으면 편하겠더라. 그래서 오늘 내가 다시 useEffectOnce를 만들고 싶다고 이야기했다. 몹시 머쓱.. 다음부터는 반대할 때에도 좀 더 생각해보고 반대하자. 언제 탈룰라가 될 지 모른다.. ^_^....
- 유틸성 커스텀 훅은 많아서 나쁠 게 없는 듯