고정글

프론트엔드

🧨 우당탕탕 Axios 인터셉터 만들기

-- 토큰 만료와의 혈투 기록 -- 프론트엔드를 하다보면, 그 어떤 api보다도 나를 가장 괴롭히는게 등장한다 바로 토큰 만료(401) 이번 글은 “처음에 대충 회사 코드 ctrl c + ctrl v 했다가 혼나서 결국 프로젝트 갈아엎고 다시 처음부터 axios 인터셉터 설계하게 된 이야기” 시작은 항상 \복붙이었다. 솔직히 말하면 인터셉터 만들 여유보다는 화면 구성하고싶은 맘이 조급했다. 백오피스를 마이그레이션 하라는 지시를 받았고, 인터셉터 그까이거 그냥 사용하던거 쓰면 되는거 아님? 당연히 이렇게 시작했다. 나는 그냥 옛날 코드 가져와 붙였고, 아무 생각 없이 진행하고 있었다. 근데 코드리뷰에서 멘토님이 한 말씀 기존거 가져다쓰지 마시고 처음부터 머리 박아가면서 만들어보시죠. 네..? 다시요..? 그렇게 나는 다시 401을 맞았다. 그래서 진짜로 인터셉터가 어떤 구조로 작동해야 하는지, 토큰 로직은 어떻게 구성해야 하는지 기본부터 다시 뜯어보기로 했다. 사실 이번 인턴 면접에서 토큰 기반 인증에 관한 질문이 있었고, (현 멘토님이 내 면접관이셨다) 한 페이지에서 여러 요청이 동시에 401 에러가 나오면 어떻게 해결하는지에 대해 여쭤보셨다. 나는 그것까지는 생각을 해본 적이 없어서 잘 모르겠다고 답 했었고?? 두고두고 맘에 남았다. 그래서 기존 프로젝트 axios 인터셉터 보고 “오 이렇게 만드는구나. 설계가 잘 되어있구나” 하고 그대로 갖다 썼던 마음이 큰 것 같다. 첫 삽질: 401 해결하려다 403 맞기 나는 빠르게 at 만료 감지를 만들고, refresh api도 붙였다. 그리고 좀 기다려서 만료되었을 때 나의 시나리오 오래된 at로 api 호출 서버가 401 던짐 인터셉터가 refresh 호출 새 토큰으로 요청 재시도 … 되어야 하는데 만료된 at로 api 호출 -> 401 err 자동적으로 refresh api 호출 -> 403 err 아니 왜 재발급 한번도 못했는데 왜 403 나옴? 이 악몽같은 현상으로 하루종일 삽질만 했다. 재발급 시마다 alert도 띄워보고, Authorization 헤더도 다시 붙여보고, 인터셉터 바깥에서 refresh 호출 성공하는것도 확인했는데,, 원인이 걍 퐝당했음. at와 rt의 유효기간이 같았던 것임!!! 아!뿔!싸! 기존 인터셉터도 이거 처리가 안되어있더라! 너무 모르겠어서 jwt.io에서 token 까보고 알았다. at가 만료되었을 때 rt도 만료가되어 refresh를 할 수 있는 시간이 없었던 것이다. accessToken 만료 → refresh 요청 시도 근데 refreshToken도 이미 만료 → 403 그래서 당연히 403이 나는 구조였다. 근데 백엔드를 바꿔달라고 할 수가 없는 상황 이걸 계기로 오랜만에 조금 머리를 굴려보았다. 자동 재발급? 그건 좀 아닌것같아요. 처음에는 이런 식의 자동 로직을 생각했다. 사용자가 뭘 하든 at 만료 5분전에 자동으로 refresh 하자 근데 이 생각을 말씀드렸더니 멘토님이 말씀하셨다. 사용자가 아무 행동도 안하는데 알아서 재발급 하는건 아닌 것 같아요! 맞말임. 아무래도 백오피스다보니까 보안적인 부분도 고려를 했어야했다. 그래서 방향을 바꿨다. 사용자가 실제 api 요청 시 만료 시간이 5분 이하라면 그때 refresh 하자 즉 활성 사용자만 재발급 → 비활성 사용자 세션은 종료 동시 요청 문제 → Pending Queue 도입 다음 문제는 이거였다. 이거는 내가 면접 때 질문을 받고 대답을 못했던 그 문제이기도 한데 A API 요청 시 → 토큰 만료 → refresh 시작 그 사이에 B API 요청 → 또 토큰 만료 → refresh 또 호출 이러면 refresh api가 동시에 여러번 호출되며 경합이 발생한다. 그래서 필수적으로 refresh 중엔 다른 요청을 멈춰서 줄세우는 로직이 필요하였다. 그것이 바로 pending queue ~~내가 자료구조 수업에서 듣고 코테 풀때만 쓰던 큐를 진짜 써보는 날이 오다니~~ 요약하자면 refresh 중이면 → 요청을 queue 에 쌓아둠 refresh 끝나면 → queue에 있던 요청들을 새 토큰으로 재요청 이렇게 하면 동시 재발급 요청 문제는 해결된다. 세션 만료 경고가 여러 번 뜨는 문제 아 근데 산넘어 산이라더니 에베레스트가 나옴 refresh 실패(401/403) → 로그아웃 처리할 때 다음과 같은 코드가 있었다. 근데 api 여러개가 동시에 터지면서 alert이 여러개가 떴던것임! alert 확인 버튼 연타함 그래서 로그아웃이 한 번만 실행되게 하기 위해서 zustand에 isLoggingOut state를 추가하여 해결하였다. 근데 왜 isLoggingOut 초기화가 안돼요? 문제 발생 두번째 세션 만료 로그아웃 때, 401 떴는데 로그아웃이 안되더라 그건 내가 isLoggingOut 상태값을 zustand persist 미들웨어에 넣어놨기 때문이었다. 그래서 persist partialize 설정해서 해결하였다. ㅎㅎ 바보 최종 Axios 인터셉터 코드 삽질 끝에 만들어진 인터셉터 구조는 다음과 같다. 토큰 만료 5분 이하 → refresh refresh 동안 다른 요청은 pending queue refresh 실패 → 로그아웃 alert 중복 방지 → isLoggingOut accessToken, refreshToken 상태는 zustand에서 관리 Authorization 헤더 자동 주입 정리하자면.. 이번에 인터셉터를 처음부터 설계하면서 느낀 점: 토큰 구조를 이해해야 한다 세션 만료 UX까지 고려해야 한다 동시 요청 문제까지 잡아야 한다 상태관리까지 연계해야 한다 인터셉터는 그냥 훅 두 개가 아니라 프로젝트의 전체 인증 흐름을 담당하는 중요한 부분임을 깨달았다. 그리고 무엇보다: 절대… 생각 안하고 코드 복붙부터 시작하지 말자.

2025년 11월 19일 15:33

프론트엔드

최고의 프로젝트 구조를 찾아서....

프론트엔드 디자인 패턴: Atomic Design + FSD 적용기 프롤로그: 협업을 시작하며 처음으로 현업에서 종사하는 여러 프론트엔드 개발자들과 협업을 진행하면서 다양한 프론트엔드 디자인 패턴에 대해 깊이 고민할 기회가 생겼다. 그중에서도 가장 큰 고민은 어떻게 폴더 구조를 정리하고, 컴포넌트를 재사용할 것인가? 였다. 이 과정에서 접하게 된 대표적인 디자인 패턴이 바로 Atomic Design Pattern과 Feature-Sliced Design(FSD) 이다. 이번 글에서는 Atomic Design의 장점과 한계, 그리고 이를 보완하기 위해 FSD와 결합한 방식을 소개하려 한다. Atomic Design Pattern 적용기 Atomic Design Pattern이란? Brad Frost가 제안한 UI 설계 방식으로, 컴포넌트를 작은 단위에서 점점 확장하는 방식이다. UI를 다음 5가지 단계로 구성한다. 1. Atoms (원자) – 더 이상 쪼갤 수 없는 최소한의 UI 요소 (ex. Button, Input, Typography) 2. Molecules (분자) – Atom이 조합된 단위 (ex. SearchBar, Dropdown) 3. Organisms (유기체) – 여러 Molecule이 조합된 UI 블록 (ex. Header, Footer) 4. Templates (템플릿) – Organism을 배치한 UI 레이아웃 5. Pages (페이지) – 최종 데이터가 반영된 화면 Atomic Design Pattern 적용 시 폴더 구조 이런 구조를 사용하면 컴포넌트를 조합하는 방식이 명확해지고, 재사용성이 높아지는 장점이 있다. 하지만 실제 프로젝트에 적용하면서 몇 가지 한계를 경험했다. Atomic Design의 한계와 고민 Feature-Sliced Design(FSD)이란? FSD(Feature-Sliced Design) 은 기능(Feature) 단위로 폴더를 구성하는 방식이다. • 컴포넌트는 기능 단위로 묶는다. • 비즈니스 로직, 서비스 로직, UI 컴포넌트를 명확하게 구분한다. • 페이지별로 독립적인 폴더 구조를 유지하여 유지보수가 쉽다. Atomic Design + FSD 결합 후 디렉토리 구조 • Atomic Design은 components 폴더에서 UI 요소를 관리하는 데 적용 • FSD는 features 폴더에서 기능별로 폴더를 나누어 관리 • 공통적으로 사용하는 로직(hooks, api 등)은 shared 폴더에 배치 적용 후 개선된 점 폴더 구조가 기능 중심으로 정리되어 유지보수가 쉬워졌다. UI 컴포넌트와 비즈니스 로직을 분리할 수 있었다. 페이지 단위로 기능을 나누면서 개발 속도가 빨라졌다. 고민했던 점 Atomic Design을 어디까지 적용할 것인가? • Atom/Molecule/Organism으로 나누는 것은 좋은데, 모든 컴포넌트가 Atomic한 것은 아니다. • 어떤 기준으로 구분할지 논의가 필요했다. FSD의 Feature 컴포넌트는 어디에 넣어야 할까? • features/{feature}/components 안에 넣어야 할까? • 아니면 components/organisms로 가야 할까? • 결국 독립적인 기능일 경우 features 안에 넣고, 재사용할 UI는 components에 넣기로 결정 3. FSD 적용 후 폴더 depth를 어떻게 제한할 것인가? • 너무 깊은 구조를 만들지 않기 위해 최대 3 depth 이하로 제한 • 예외적으로 스터디 만들기 폼처럼 많은 컴포넌트가 필요한 경우 한 depth 추가 최종 정리 & 회고 Atomic Design과 FSD를 결합한 이유? • Atomic Design은 UI 컴포넌트의 재사용성을 높이는 데 효과적 • FSD는 비즈니스 로직을 기능 단위로 구분하여 유지보수를 쉽게 함 • 두 가지를 조합하면 UI와 기능을 분리하면서도 재사용성을 높일 수 있음 적용하면서 느낀 점 • Atomic만 적용하면 폴더 구조가 너무 깊어지고 관리가 어려워진다. • FSD만 적용하면 재사용성이 떨어질 수 있다. • 적절한 기준을 정하는 것이 중요하며, 프로젝트의 규모와 특성에 맞춰 유연하게 적용하는 것이 중요하다.

2025년 03월 13일 02:45

프론트엔드

React Query로 데이터 처리의 효율성 높이기

React Query를 왜 사용해야 하는가? 사실, React Query 사용 전에는 서버 담당자가 자꾸 React Query를 쓰세요 라고 권장하는 이유를 잘 이해하지 못했습니다. 난 함수 호출 잘 하고있는데? 굳이 배워야해? 라는 마인드였죠 하지만 블로그 코드를 리팩토링하고 뜯어보면서, account 정보를 불러오는 함수를 너무 많이 호출한다는 사실을 깨달았습니다. (이 블로그 왼쪽에 위치한 그 유저 정보 맞습니다.) 그러면서 그냥 유저 정보를 Recoil로 담아서 전역으로 관리할까? 라는 생각도 들었습니다. 하지만 유저 정보가 바뀌었을 때, 또 다른 곳에서 이 함수를 호출해야 한다는 문제가 생깁니다. 그리고 또 고민이 생겼습니다. 지금 계속 호출하는 게 서버에 괜찮나? 현재는 나 혼자만 사용하지만, 더 많은 사용자가 들어오게 된다면 서버에 큰 부담이 될 것이라는 생각이 들었습니다. 이렇게 고민하던 중에, React Query가 제공하는 자동 캐싱과 최신 데이터 요청 기능이 문제를 해결해줄 수 있다는 것을 알게 되었습니다. React Query란? React Query는 데이터 페칭과 상태 관리를 매우 효율적으로 처리할 수 있는 라이브러리입니다. React Query는 서버에서 데이터를 가져오는 작업을 간편하게 만들어주며, 비동기 작업을 처리하고 그 결과를 캐싱하여 성능을 최적화 합니다. 주요 특징은 다음과 같습니다. 자동 캐싱 및 재사용: 동일한 데이터 요청이 있을 경우, 이전에 받은 데이터를 재사용하여 네트워크 요청을 최소화합니다. 자동 갱신: 데이터가 변경되면, 자동으로 최신 데이터를 가져옵니다. 로딩, 오류 및 데이터 상태 관리: 로딩 상태, 오류 상태 등을 관리할 수 있는 기능을 제공하여 상태 관리가 간편해집니다. 쿼리 무효화 및 재요청: 데이터를 수정한 후, 쿼리를 무효화하여 최신 데이터를 다시 요청할 수 있습니다. 여태까지 내가 계속 해왔던 방법 - 함수 계속 호출하기 리액트 프로젝트에서 데이터를 처리할 때, useEffect 안에서 함수를 계속 호출하는 방식을 사용했습니다. 이 방식은 간단하지만, 몇 가지 단점이 존재합니다: 반복되는 코드: 데이터 요청이 여러 곳에서 반복되어 코드 중복이 발생합니다. 로딩 상태와 에러 처리: loading, error 상태를 일일이 관리해야 하므로 코드가 복잡해집니다. 성능 문제: 데이터 요청이 자주 발생하면 불필요한 네트워크 요청이 많아져 성능에 영향을 줄 수 있습니다. React Query로 바꿔보자 위 코드는 React Query의 useQuery 훅을 사용하여 유저 정보를 서버에서 가져오는 함수입니다. 이 코드는 자동 캐싱과 데이터 갱신 기능을 통해 데이터를 처리합니다. 쿼리 키와 데이터 요청 useQuery는 queryKey를 통해 요청을 구분하고, queryFn을 통해 데이터를 요청합니다. queryKey:해당 데이터 요청을 고유하게 식별 queryFn: 실제로 데이터를 요청하는 함수 캐시 관리 staleTime: 데이터가 오래된 것으로 간주되기 전에 데이터를 얼마나 유효하게 유지할지를 결정 cacheTime: 데이터가 캐시에서 삭제되기까지의 시간을 설정 에러 처리 및 로딩 상태 onError: 데이터 요청 중 오류가 발생했을 때 호출 isLoading: 요청 중 로딩 상태 error: 요청 실패 시의 에러 정보 refetch refetch: 데이터를 수동으로 다시 요청할 수 있는 함수 그래서 React Query가 뭐가 다른데? 이 질문이 나온 이유는, React Query를 사용해도 새로고침을 하면 다시 fetch가 된다는 점에서 의문이 발생했기 때문입니다. 새로고침만 해도 쿼리가 다시 실행되는데 그러면 내가 모든 컴포넌트에 account 함수 호출하는거랑 뭐가 달라? 제가 의문이 생겨서 chatGPT에게 실제로 물어봤던 내용입니다. 기존 방식에서는 페이지를 새로고침할 때마다 데이터를 새로 요청하게 되며, 이를 계속 함수 호출이라고 표현할 수 있습니다. 이 방식은 사용자가 새로고침을 할 때마다 매번 API 요청을 보내고, 그에 따른 로딩 상태가 표시되기 때문에 불편할 수 있습니다. 또, 같은 데이터를 반복적으로 요청하게 되어 성능에도 영향을 미칩니다. 반면, React Query는 자동 캐싱 기능을 제공하여, 한 번 데이터를 요청하고 나면 캐시에서 데이터를 가져옵니다. 이후에는 서버에 다시 요청을 보내지 않고, 이미 받은 데이터를 사용할 수 있기 때문에 불필요한 요청을 줄일 수 있습니다. 그리고 데이터가 수정되거나 갱신될 때는 invalidateQueries나 refetchQueries를 통해 필요한 시점에만 다시 요청을 보내어 최신 상태로 동기화할 수 있습니다. 차이점 1: 데이터 요청 및 캐시 관리 • 기존 방식: 페이지 새로 고침 시마다 데이터를 새로 요청. • React Query: 데이터가 캐시되어, 동일한 데이터 요청 시 네트워크 요청을 최소화하고, 자동으로 최신 상태를 유지. 차이점 2: 로딩 상태 관리 • 기존 방식: 페이지 새로 고침 시마다 로딩 상태가 반복적으로 표시. • React Query: 이미 캐시된 데이터가 있으면 로딩 없이 바로 데이터를 표시하고, 필요 시 백그라운드에서 갱신. React Query의 캐싱과 탭 전환 여기서 중요한 점은 다른 탭으로 넘어갔다가 다시 돌아올 때도 React Query는 이미 캐시된 데이터를 사용한다는 점입니다. 기존 방식에서는 페이지를 새로고침할 때마다 데이터를 요청해야 했지만, React Query는 데이터가 캐시되기 때문에 같은 데이터를 다시 요청하지 않고, 캐시된 데이터를 사용합니다. 예를 들어, useQuery로 한 번 데이터를 요청하고 나면, 해당 데이터는 캐시에 저장됩니다. 다른 페이지나 탭으로 이동하더라도, 같은 데이터를 다시 요청하지 않고 캐시된 데이터를 즉시 사용할 수 있습니다. 만약 데이터가 변경되었다면, React Query는 invalidateQueries나 refetchQueries를 통해 데이터를 새로 요청하여 자동으로 최신 데이터를 반영합니다. 이렇게 React Query는 데이터 요청을 효율적으로 관리하며, 불필요한 요청을 줄이고, 사용자 경험을 개선할 수 있습니다. 🚨문제: 데이터 변경 요청 후 캐시된 데이터 유지 문제는, userData 수정 요청을 보내고 데이터를 변경한 후에도 캐시된 데이터가 계속 유지된다는 점입니다. 예를 들어, 사용자가 자신의 정보를 수정하는 API 요청을 보낸 후, 데이터베이스에는 수정된 내용이 반영되었지만, React Query의 캐시에는 여전히 이전 데이터가 남아 있을 수 있습니다. 이 경우, 수정된 데이터가 즉시 반영되지 않고, 여전히 오래된 캐시 데이터를 사용하게 됩니다. 문제 발생 이유 • 캐시와 서버 데이터 간 불일치: useQuery로 데이터를 요청한 후 React Query는 캐시된 데이터를 사용하고, 수정된 데이터는 서버에서 갱신되었지만, 캐시에는 여전히 이전 데이터가 저장되어 있을 수 있습니다. • 자동 갱신 미흡: invalidateQueries나 refetchQueries를 사용하지 않으면, 수정된 데이터를 즉시 다시 요청하지 않기 때문에 캐시된 데이터가 계속 사용됩니다. refetch( ) 사용으로 해결하기 이 문제를 해결하기 위해서는 useQuery로 데이터를 요청하고, refetch( )를 사용하여 수정된 데이터를 강제로 다시 가져오는 방법이 필요합니다. refetch( )는 useQuery로 가져온 데이터를 다시 요청하는 함수로, 데이터 수정 후 필요한 시점에만 다시 요청을 보내어 최신 상태로 동기화할 수 있습니다. 예를 들어, userData를 수정한 후 refetch( )를 사용하여 해당 데이터를 다시 가져올 수 있었습니다: 결론 React Query는 서버 부하를 줄이고, 데이터 요청을 효율적으로 관리하는 데 중요한 도구입니다. 자동 캐싱과 데이터 갱신 기능을 통해 불필요한 네트워크 요청을 줄이고, 서버에 가는 요청을 최소화할 수 있습니다. 특히 refetch( )를 사용하여 데이터 수정 후 즉시 최신 데이터를 요청할 수 있어, 서버와 클라이언트 간의 데이터 동기화를 원활하게 할 수 있습니다. 기존 방식에서 발생할 수 있는 중복된 요청과 성능 문제를 해결하면서, React Query는 데이터 관리의 효율성을 높이고 서버 성능 최적화에도 기여할 수 있습니다. 따라서, React Query는 단순한 데이터 요청 라이브러리를 넘어서, 서버 자원을 효율적으로 관리하고 성능을 최적화하는 데 필요한 필수 도구라고 할 수 있습니다.

2025년 01월 20일 09:40

프론트엔드

스파게티 코드 갱생시키기 프로젝트

🔴 개관 저는 프로그래밍을 할 때 단순히 돌아가기만 하면 된다는 접근보다, 가독성과 코드의 효율성을 더욱 중요하게 여깁니다. 처음 React Native로 프로젝트를 진행했을 때, React와 달리 데이터를 저장하고 사용하기 위해 복잡한 코드를 작성해야 했던 경험이 있습니다. 당시에는 효율성보다는 기능 구현에 초점을 맞췄기 때문에 코드가 비효율적이었습니다. 초보자라면 누구나 겪을 문제라고 생각합니다. 그러나 이번에 React Native로 두 번째 프로젝트를 진행하며, 비효율적인 AsyncStorage의 저장 및 조회 코드를 모듈화하여 재사용성과 유지보수성을 높이겠다고 계획했습니다. 🔴 첫 번째 React Native 프로젝트: 완전한 스파게티 코드 오랜만에 캡스톤에서 진행했던 프로젝트의 코드를 꺼내보았습니다. React Native를 처음 사용해보는거라서 아주 스파게티 코드입니다. 지금 생각하면 아주 끔찍한 코드입니다. 서버에서 오는 응답에 따른 두번의 Alert 코드와 그 Alert을 감싸고있는 AsyncStorage 함수의 모습입니다.... 초반에는 기능 구현에만 집중했기 때문에 비효율적인 코드가 발생하였습니다. 저는 여기서 Alert나 AsyncStorage에 대한 모듈화가 필요하다고 생각하였지만 기간이 빡빡하기도 하였고, 저의 실력 문제;;로 진행하지는 못하였습니다. 🔴 두번째 React Native 프로젝트: 코드 모듈화 사실 첫번째 어플리케이션을 리팩토링하자! 하는 마음이 지금도 남아있지만.... AI 서버와 백엔드 서버가 다 내려갔기 때문에 리팩토링, 유지보수 한다고 해도 돌아간다는 보장이 없습니다. 모듈화의 기회는 두번째 프로젝트에서 달성할 수 있었습니다. 저는 제일 문제된다고 생각한 것이 AsyncStorage 함수와 Alert 함수라고 생각했습니다. 그래서 프로젝트에 Utils 폴더를 만들어 전역적으로 이 함수들을 관리하기로 결심했습니다. Alert 컴포넌트 코드를 먼저 보여드리겠습니다. 확인 버튼이 있는 알림창과 확인, 취소 버튼이 있는 알림창 컴포넌트를 만들었습니다. 두 파일로 나눠서 만들까 하다가 Utils/component 폴더 내부에 또 Alert 폴더를 만들기 싫어서 한 파일만 임포트하면 두 Alert 컴포넌트 접근 가능해서 위의 이유로 한 파일에 합쳐 작성했습니다. 아래 코드는 위 컴포넌트 사용 예시입니다. 치매 진단지를 서버로 제출하는 함수인데, 서버에서 오는 응답 코드에 따라 다른 Alert 컴포넌트를 띄우거나 탭을 이동하는 코드입니다. 물론! 저 함수에 title, message, onPress 세 개의 파라미터가 들어가기 때문에 모듈화를 시켜 사용한다고 해도 여전히 코드가 어지럽고 길긴 합니다. ~~하지만 제 실력으로는 최선이었습니다.~~ 하지만 모듈화를 안하고 사용했다면? 진짜 아찔합니다. 다음으로는 절 힘들게했던 AsyncStorage 함수입니다. React와는 다르게 ReactNative에서는 async가 필요해서 코드가 굉장히 복잡해졌습니다. 여기서 흠은 console을 띄웠다는 점인데요.. 다음은 에러가 나온다고 하면 Alert창을 띄우거나.. 다시 시도하거나 하는 방식을 해봐야겠습니다. Storage 싱글톤 객체를 만들어서 내부에 네가지 메서드를 넣었습니다. 한창 정보처리기사 공부할때 디자인패턴이 나오길래 신나했던 기억이 납니다.. 주로 사용했던 메서드는 setItem과 getItem 입니다. 위에는 아까 봤던 Alert 컴포넌트와 Storage 의 setItem 메서드가 결합된 코드입니다. 엄청 깨끗해지고 가독성도 좋아졌습니다. (맞나..?) 🔴 결론 저는 캡스톤에서 처음으로 React Native를 사용해봤습니다. 기간이 부족했기 떄문에 몸통박치기 수준이 아니고 몸통 갈아넣기 정도로 일단 써보자 마인드였는데요 만약에 프론트가 저 혼자가 아니고 여러명이서 진행했다면 프론트끼리 머리채잡고 싸웠을수도 있습니다. 이런 스파게티 코드는 물론 개발 진행에 있어서 굉장히 불가피하다고 생각합니다. 하지만 계속해서 코드를 리팩토링하고 유지보수한다면 전보다는 실력이 10%정도.. 아님 1%라도 성장하는 것 같습니다. 요즘 저는 리팩토링을 진행했다고는 하지만 지금보면 발싸개같은 코드를 다시 보면서.. React 디자인패턴 공부에 박차를 가해야겠다는 생각이 듭니다.... 저의 시행착오가 여러분들에게 도움이 되셨으면 좋겠습니다.

2024년 10월 22일 23:15