7월 말 라이브 배포를 끝마치고, 8월은 공식적으로 재정비에 들어가는 달이었습니다.
일도 쉬엄쉬엄하고 몸도 마음도 회복하는 시기었죠.
운동
저는 7월 24일부터 아침 헬스를 시작하였고, 거의 일주일에 5~6번은 꾸준히 나가고 있습니다.
몸과 마음이 지치고 생각이 복잡할때 운동만한 것이 없더군요.
운동할 때만큼은 잡생각을 하지 않고 지금 이순간의 운동에만 집중할 수 있어서 참 좋은 것 같습니다.
끝나고 나면 정말 개운하기도 하고 성취감도 있고요.
이제 겨우 1달 하고도 조금 더 했는데 걸을 때나 계단 올라갈때 훨씬 힘이 나네요. 몸도 건강하고 좋아지니 더 당당해진 기분입니다.
운동은 3분할로 쪼개서 밀기/당기기/하체를 돌아가면서 하고 있고, 운동 기록이나 메모는 번핏 어플로 기록하고 있습니다.
저는 엄살이 심해서 운동 사이의 휴식 시간 타이머를 사용하지 않으면 안되는 스타일이라서 어플이 참 도움이 됩니다.
모임
그리고 소모임 어플 통해서 개발자 모임도 새로 등록했습니다.
아무래도 동일 업종 내 네트워킹을 무시할 수가 없기 때문이죠. 서울에서 친구도 만들고 싶기도 하고요.
사실 오프라인 모임에서 프론트엔드 분들과 모여서 같이 이야기 나누고 싶은데 왜이렇게 프론트엔드 분들은 오프라인 활동을 안나오시는지 모르겠네요😅 백엔드 사람들이 외부 활동에 훨씬 더 적극적인 것 같습니다. ㅠㅠ
그 외에도 한 번도 해본 적 없었던 독서 모임이나 영화 모임 등에도 나가보았습니다.
최근 들어서 다른 사람들의 생각을 좀 들어보고 싶고 이야기도 나눠보고 싶은 생각이 많이 들더라고요. 너무 일만 하다보니 내향성이
문토라는 모임 어플을 사용했는데 이용자 수도 꽤 많고 모임도 다양해서 좋았고, 당근마켓 처럼 매너 온도가 있어서 영 이상한 사람을 경계하고 피할 수 있어서 좋았습니다. (광고아니에요 ㅋㅋ)
코딩의 질을 한 단계 업그레이드
마냥 쉬기만 할 수 없으니 쉬어가는 기간동안 코딩의 질을 한 단계 업그레이드 하는 시간을 가졌습니다.
완전 새로운 기능을 만드는게 아니라 기존에 만들어둔 것을 혁신적으로 개선해보려고 노력해보았습니다.
1. URL 기반의 서브페이지 관리 체계 도입
리액트 URL Hash기반의 서브페이지 관리 체계 도입
우연히 서핏에서 리액트 관련 블로그 글을 보다가 NHN의 TOAST 기술 블로그에서 Jotai 라이브러리에 있는 atomWithHash 로 모달 상태를 URL과 동기적으로 관리하는 방법에 대해 소개하는 글을 보았습니
11001.tistory.com
2. 모듈 조립식 라우터 도입
별도로 포스팅하기엔 내용이 좀 적어서 고민중이긴한데 여기에 간단히 소개해보겠습니다.
라우터별로 Main, SideBar, Header, Footer 등 레이아웃 별로 원하는 컴포넌트를 children 으로 넣어서 조립하는 방식입니다.
이렇게 만들게 된 이유는 간단합니다.
기존에는 라우터별로 한 컴포넌트 안에 필요한 컴포넌트들이 우겨넣어진 상태로 사용했었습니다.
문제는 거의 똑같은 코드를 사용하는 파일이 2개가 있는데 나중에 내용이 달라질 것을 생각하니 하나로 합치지도 못하고, 그대로 두기에는 매번 변경사항을 두 파일에 적용하기엔 귀찮고, 심지어 한쪽을 업데이트 안해줘서 이원화 되어버리기도 하는 문제가 있었기 때문입니다.
처음에는 정말 공통된 부분만 뽑아내고 서로 다른 부분은 각각의 하위 컴포넌트에 집어넣는 방법을 생각했었는데 또 다른 새로운 페이지를 추가해야 되었고, 다른 프로젝트의 컴포넌트를 가져와서 재활용 하는 상황을 고려하게 되면서, 차라리 최소 단위로 다 쪼개서 조립식으로 만들어보기로 결심했습니다.
결국엔 아래와 같이 공통프레임 내부에 필요한 컴포넌트를 레이아웃별로, (레이아웃에 관계없는 채팅 같은 것들은 별도로) 집어넣어서 조립시켰습니다.
각 라우터 별로
<공통프레임>
<채팅/>
<사이드영역 title={'사이드바제목'}>
<사이드영역 렌더링할것 />
</사이드영역>
<메인영역>
<메인영역 렌더링할것 />
</Galaxy>
</공통프레임>
3. 모듈별 ErrorBoundary & Suspense 도입
기존에는 데이터가 하나의 통합 API 로 받아온 뒤 여러 컴포넌트에 전달하는 방식이었고, 최상위 컴포넌트에 ErrorBoundary 를 설정해두어서 Error 발생하면 전체 화면의 에러 페이지를 보여주었습니다.
그런데 최근에는 통합 API를 각 모듈별 API로 쪼개는 작업을 진행하게 되면서 이제는 모듈별 ErrorBoundary를 도입할 때가 되었구나 싶었습니다.
이것 또한 시간되면 별도로 포스팅하게 될 것 같지만, 간단하게 과정을 작성해보겠습니다.
- API 공용 axios instance 제작 하고 제네릭 타입을 받아서 data 를 반환하는 공용 함수 생성
- res.data.data가 아니라 res.data 를 뱉는 버전도 있고, AccessToken 받아서 헤더에 넘기는 버전도 만들었음.
export const request = <T>(url: string, data?: AxiosRequestConfig) =>
axiosInstance.request<{ data: T }>({ url, ...data }).then(res => res.data?.data)
- API 파일 하나에 모든 API 를 정의하여 끌어다 쓸 수 있도록 개선 API 이름은 한글명 지어서 매우 직관적이게 만듬
- 모듈 이름의 폴더 만들어서 필요한 파일을 아래에 모아서 정리
- 모듈.tsx
- 모듈Skeleton.tsx
- styles.ts
- 각 모듈 컴포넌트에서 React Query 를 통해 해당 모듈 API 호출하도록 변경. 캐싱 설정
- 로딩 상태에서는 모듈Skeleton.tsx 파일을 렌더링
- 에러 상태에서는 모듈 단위 ErrorBoundary 에서 Catch
- 400 Error
- 여러 모듈에서 Error 발생한 경우 한번에 새로고침 할 수 있도록 상위 컴포넌트로 에러를 throw 해주었습니다.
- 사용자 스스로 에러 상태에서 벗어날 수 있다고 가정하고, (상위 컴포넌트에) 새로고침 버튼을 주고, 페이지 새로고침 할 수 있게 하였습니다.
- 500 Error
- 사용자 스스로 에러 상태에서 벗어날 수 없다고 가정하고, 오류신고 버튼을 주었습니다. 현재는 구글 폼으로 연결되어 수동으로 에러 리포트를 작성해야하지만, 추후에는 자동 에러 리포트 전송되도록 개선 예정입니다.
- 400 Error
대략 이런 과정들을 추가했고 이제 모듈들이 진정한 의미의 모듈이 되었습니다 ! 와 ! 다른 프로젝트에 가져가서 이식하기 정말 쉽겠네요!
그 외에도 자바스크립트->타입스크립트 마이그레이션 등을 꾸준히 진행하고 있기도 하구요
마음 같아선 빨리 타입스크립트 전환 끝내고 react18 도 도입해보고 싶습니다. 라이브러리 버전 문제로 머리아플것 같긴하지만요...
8월에 엄청 놀고 먹고 쉬었다고 생각했는데 되돌아보니 뭔가 많이 했네요.
'개발자 이야기' 카테고리의 다른 글
2022.09.26 개발자 이야기 (블로그 리모델링, 사내 스터디) (0) | 2022.09.26 |
---|---|
2022.09.18 개발자 이야기 (백엔드 스터디 시작, numble) (0) | 2022.09.18 |
2022.08.04 사는 이야기 (근황: 웹 프론트엔드 신입) (0) | 2022.08.04 |
2021.11.19 사는 이야기 (분노) (0) | 2021.11.19 |
2021.08.28 사는 이야기 (퇴근 후 공부하기) (0) | 2021.08.28 |