기본 콘텐츠로 건너뛰기

TanStack Query를 쓰는 이유: 서버 상태를 캐시하고 갱신하는 실전 기준

TanStack Query를 쓰는 이유: 서버 상태를 캐시하고 갱신하는 실전 기준 빠른 답 TanStack Query는 서버 응답을 전역 상태처럼 보관하는 도구가 아니라, 서버 데이터의 조회, 캐싱, 갱신 흐름을 관리하는 도구입니다. 같은 데이터를 여러 컴포넌트가 읽을 때 중복 요청을 줄이고, 로딩과 에러, 재요청 상태를 일관된 방식으로 다룰 수 있습니다. staleTime , gcTime , queryKey 설계가 맞지 않으면 최신성 문제나 불필요한 네트워크 요청이 생길 수 있습니다. 입력값, 모달 열림 여부, 작성 중인 폼 값처럼 브라우저가 원본인 상태는 useState , Zustand, Redux 같은 클라이언트 상태와 분리해서 다루는 편이 좋습니다. 목차 시간 흐름으로 이해하기 흐름으로 보기 서버 상태는 일반 상태와 다르다 현재 기준 용어와 버전 차이 QueryClient에서 기본 정책 잡기 queryKey로 데이터 소유권 나누기 mutation 후 캐시 갱신하기 리렌더링 관점에서 보는 장점 흔한 안티패턴 언제 쓰고 언제 분리할까 더 읽을 공식 문서 시간 흐름으로 이해하기 컴포넌트 마운트 useQuery 를 호출한 컴포넌트가 특정 쿼리를 구독합니다. → 캐시 조회 TanStack Query가 queryKey 로 기존 캐시를 찾습니다. → 데이터 반환 캐시가 있으면 화면은 먼저 기존 데이터를 사용할 수 있습니다. → 신선도 판단 staleTime 이 지났거나 무효화된 데이터인지 확인합니다. → 백그라운드 갱신 stale 상태라면 조건에 따라 다시 요청하고 캐시를 갱신합니다. 흐름으로 보기 흐름 다이어그램 이 흐름에서 컴포넌트는 서버 데이터를 직접 소유하지 않습니다. 서버 데이터의 원본은 서버에 있고, TanStack Query는 브라우저 안의 캐시와 갱신 정책을 관리합니다. 컴포넌트는 캐시를 구독하고, 필요한 시점에 다시 가져오거나 무효화하도록 요청합니다. 이 차이를 이해하면 TanStack Query를 “또 하나의 전역 상태 ...
최근 글

localStorage와 sessionStorage 차이: 저장 기간, 탭 범위, 보안 기준으로 고르기

localStorage와 sessionStorage 차이: 저장 기간, 탭 범위, 보안 기준으로 고르기 빠른 답 localStorage 는 브라우저를 닫아도 값이 남고, 같은 origin 의 여러 탭에서 공유됩니다. sessionStorage 는 탭 또는 창 단위 세션에 묶이며, 해당 탭을 닫으면 값이 사라집니다. 둘 다 JavaScript로 읽고 쓸 수 있으므로 인증 토큰, 비밀번호, 개인정보 저장소로 보기에는 위험합니다. 테마·언어 설정처럼 오래 유지할 값은 localStorage , 현재 탭 안에서만 필요한 임시 상태는 sessionStorage 가 어울립니다. 목차 한눈에 비교 시간 흐름으로 이해하기 origin과 탭 범위 이해하기 저장소 선택 규칙 만들기 실제 사용 예시 언제 무엇을 저장할까 보안 주의점 저장 실패와 예외 처리 흔한 오해 정리 선택 기준 정리 한눈에 비교 저장 기간 localStorage 는 코드로 삭제하거나 사용자가 브라우저 데이터를 지우기 전까지 유지되고, sessionStorage 는 탭 또는 창 세션이 끝나면 삭제됩니다. 공유 범위 localStorage 는 같은 origin 의 문서들이 공유하고, sessionStorage 는 탭 또는 창마다 별도 공간을 가집니다. 새로고침 두 저장소 모두 같은 탭에서 새로고침만으로는 삭제되지 않습니다. 새 탭 열기 localStorage 값은 같은 origin 의 새 탭에서도 읽을 수 있지만, sessionStorage 는 새 탭 기준의 별도 저장 공간을 사용합니다. 사용 예시 localStorage 는 테마, 언어, 목록 정렬 방식에 잘 맞고, sessionStorage 는 결제 단계 상태, 임시 폼 입력, 현재 탭의 검색 필터에 잘 맞습니다. 보안 기준 두 저장소 모두 JavaScript 접근이 가능하므로 민감 정보 저장에는 신중해야 합니다. localStorage 와 sessionStorage 는 모두 Web Storage API에 속합니다. 사용법은 거의 같습니다. ...

스레드, 프로세스, 코어는 언제 많을수록 느려질까?

스레드, 프로세스, 코어는 언제 많을수록 느려질까? 빠른 답 스레드 수를 늘리면 동시에 처리할 수 있는 작업은 늘 수 있지만, 컨텍스트 스위칭, 락 경합, 캐시 미스 비용도 함께 커질 수 있습니다. 프로세스는 메모리 격리와 장애 분리에 유리하지만, 스레드보다 생성 비용과 메모리 사용량, 프로세스 간 통신 비용이 큽니다. 코어가 많아도 프로그램이 일을 병렬로 나누지 못하거나 다른 자원에서 막히면 성능 향상은 제한됩니다. 적정 개수는 CPU 사용률, run queue, 메모리, I/O 대기, p95·p99 응답 시간을 함께 보며 측정해야 합니다. 목차 한눈에 비교 시간 흐름으로 이해하기 왜 많을수록 빨라 보일까 스레드가 많을 때 생기는 비용 프로세스가 많을 때 생기는 비용 코어가 많아도 빨라지지 않는 경우 CPU 바운드와 I/O 바운드의 선택 기준 워커 수와 스레드 풀 크기 잡기 Node.js 워커 스레드로 비교하기 운영 명령 출력으로 병목 확인하기 숫자를 조정할 때 남겨야 할 증거 한눈에 비교 스레드, 프로세스, 코어는 모두 동시 처리와 관련 있지만 같은 층위의 개념은 아닙니다. 코어는 하드웨어 실행 자원이고, 프로세스는 운영체제가 격리해 관리하는 실행 단위이며, 스레드는 프로세스 안에서 작업을 나누는 실행 흐름입니다. 실행 자원 코어는 실제 명령어를 실행하는 CPU 자원이고, 스레드와 프로세스는 그 자원을 배정받는 실행 단위입니다. 격리 수준 프로세스는 독립된 메모리 공간을 갖고, 같은 프로세스 안의 스레드는 메모리를 공유합니다. 생성 비용 프로세스는 주소 공간과 자원을 새로 준비해야 하므로 대체로 무겁고, 스레드는 상대적으로 가볍지만 많아지면 스택 메모리와 스케줄링 비용이 누적됩니다. 통신 방식 스레드는 공유 메모리로 빠르게 데이터를 주고받을 수 있지만 동기화가 필요하고, 프로세스는 IPC를 통해 더 격리된 방식으로 통신합니다. 느려지는 지점 실행 가능한 작업이 CPU 코어보다 많아지거나, 락·메모리·DB·디스크·네트워크 같은 공유 자원에서...

단위 테스트와 통합 테스트, 무엇을 어디까지 검증해야 할까

단위 테스트와 통합 테스트, 무엇을 어디까지 검증해야 할까 빠른 답 단위 테스트는 한 함수, 클래스, 정책 객체처럼 작은 책임을 빠르게 검증하고 외부 의존성은 보통 테스트 대역으로 분리한다. 통합 테스트는 DB, HTTP API, 파일 시스템, 메시지 브로커처럼 실제 연결 지점이 함께 동작하는지 확인한다. 슬라이스 테스트는 웹 계층이나 저장소 계층처럼 일부 구성만 로드해 단위 테스트보다 현실적이고 전체 통합 테스트보다 가볍게 검증한다. CI에서는 빠른 테스트를 먼저 실행하고, 통합·E2E·스모크 테스트는 변경 위험과 배포 단계에 맞춰 품질 게이트로 나누는 편이 관리하기 쉽다. 목차 한눈에 비교 왜 경계가 헷갈리기 쉬운가 선택 기준 매트릭스 테스트 범위 정하는 흐름 스택 중립 예시로 보는 테스트 경계 슬라이스 테스트를 둘 위치 CI 품질 게이트 나누기 실패 출력으로 원인 좁히기 테스트 대역과 실제 환경의 균형 운영 검증까지 이어지는 테스트 전략 한눈에 비교 검증 범위 단위 테스트는 작은 책임 단위, 슬라이스 테스트는 특정 계층, 통합 테스트는 여러 구성 요소의 연결을 본다. 실행 비용 단위 테스트는 빠르고 자주 돌리기 좋으며, 통합 테스트는 환경 준비와 I/O 때문에 상대적으로 느리다. 실패 원인 단위 테스트는 실패 지점이 좁고, 통합 테스트는 설정, 데이터, 네트워크, 트랜잭션까지 원인 후보가 넓어진다. 의존성 처리 단위 테스트는 대역 객체를 자주 쓰고, 통합 테스트는 실제 DB나 컨테이너, 테스트용 외부 API 서버를 사용한다. 신뢰도 성격 단위 테스트는 로직 회귀를 빠르게 잡고, 통합 테스트는 배포 후 연결 문제를 줄이는 데 도움이 된다. 왜 경계가 헷갈리기 쉬운가 테스트 이름은 단순하지만 실제 코드에서는 경계가 자주 흐려진다. 예를 들어 OrderService 하나만 테스트한다고 해도 그 안에서 재고 조회, 결제 요청, 주문 저장이 모두 일어나면 클래스 하나를 테스트한다는 사실만으로 단위 테스트라고 부르기 어렵다. 테스트가 묻는 질문...

useEffect 로딩 상태와 Suspense는 무엇이 다르고 언제 써야 할까

useEffect 로딩 상태와 Suspense는 무엇이 다르고 언제 써야 할까 빠른 답 useEffect 방식은 요청 시작, 성공, 실패, 로딩 종료를 컴포넌트 안의 state로 직접 관리한다. Suspense 는 자식 트리가 아직 렌더링 준비를 끝내지 못했을 때 가장 가까운 fallback 을 보여주는 경계 모델이다. 일반 fetch 를 useEffect 안에서 호출하는 것만으로는 Suspense 가 동작하지 않는다. Suspense 를 쓰려면 fallback 위치, Error Boundary, 데이터 캐시나 프레임워크 지원 여부를 함께 봐야 한다. 목차 한눈에 비교 시간 흐름으로 이해하기 현재 React 기준에서 봐야 할 점 useEffect 방식이 맞는 상황 useEffect에서 자주 생기는 안티패턴 Suspense 방식이 맞는 상황 경계 배치와 리렌더링 흐름 선택 기준 한눈에 비교 상태 소유권 useEffect 방식은 isLoading , data , error 를 컴포넌트가 직접 가진다. Suspense 방식은 대기 UI 표시를 경계가 맡고, 데이터 준비 여부는 Suspense를 지원하는 데이터 소스가 담당한다. 데이터 흐름 useEffect 는 첫 렌더 이후 Effect에서 요청을 시작하고 응답을 state로 반영한다. Suspense 는 렌더링 중 값을 읽을 때 아직 준비되지 않았음을 React가 감지하고 경계로 빠진다. 리렌더링 useEffect 는 setState 가 일어나며 로딩 화면, 성공 화면, 실패 화면으로 다시 렌더링된다. Suspense 는 자식 트리 렌더링을 보류했다가 데이터가 준비되면 다시 렌더링을 시도한다. 에러 처리 useEffect 는 보통 error state와 조건부 렌더링으로 처리한다. Suspense 와 함께 쓰는 Promise 실패는 Error Boundary 또는 대체 값 설계가 필요하다. 적용 조건 useEffect 는 브라우저 API, 네트워크 요청, 외부 위젯처럼 컴포넌트 밖 시스템과 동...