NextJS로 CRUD 마스터하기
웹 개발에서 CRUD 작업은 기본 구성 요소이자 데이터 관리에 중요합니다. 단순한 웹사이트부터 복잡한 기업 솔루션까지 거의 모든 애플리케이션에 어디에나 존재합니다.
NestJS Boilerplate 사용자는 이미 리소스와 해당 속성을 자동으로 생성할 수 있는 강력한 새 도구인 CLI를 평가하고 사용할 수 있었습니다. 이 도구를 사용하면 코드 한 줄도 수동으로 작성하지 않고도 모든 CRUD 작업을 수행하고 필요한 필드를 추가할 수 있습니다. 한편, 우리가 반복해서 발표한 것처럼 BC Boilerplates 생태계에는 완전한 기능을 제공하기 위해 완벽하게 호환되는 Extensive-React-Boilerplate가 포함되어 있습니다(원칙적으로는 완전히 독립적인 솔루션이 될 수 있음). 이제 프런트엔드 관점에서 CRUD 작업을 살펴보겠습니다.
서버 측 렌더링 기능을 갖춘 React 프레임워크인 Next.js에서는 성능, SEO 및 개발자 경험을 향상시키는 기능을 통해 이러한 작업을 효율적으로 관리할 수 있습니다. 이전에 우리는 NextJS 프로젝트를 시작하는 효과적인 방법에 대한 기사를 게시했으며 이제 더 나아가 Next.js에서 API 작업의 세부 사항과 뉘앙스를 분석하고 싶습니다.
아시다시피 CRUD는 생성(Create), 읽기(Read), 업데이트(Update), 삭제(Delete)를 의미합니다. 이 개념은 모든 데이터에 대해 수행할 수 있는 기본 작업을 나타냅니다. 사용자에 대한 정보 검색과 함께 사용자 추가, 편집, 삭제와 같은 기능이 구현되는 관리 패널 사용자의 예를 사용하여 CRUD 작업 작업을 고려해 보겠습니다. 아래에서 설명하는 사용자 정의 React 후크는 React 쿼리에서 데이터 처리, 페이지 매김, 오류 관리 등을 처리하며 이미 Extensive-React-Boilerplate에 통합되어 있습니다. 당연히 이 상용구를 직접 활용할 수 있습니다. 다음 섹션에서는 이러한 기능 구현에 대한 통찰력을 공유하겠습니다.
작업 생성
사용 사례: 데이터를 제출하여 새 리소스를 생성합니다(예: 사용자 등록, 새 제품 추가).
구현: 양식에서 데이터를 수집하고, 서버에 POST 요청을 보내고, 응답을 처리하고, 이에 따라 UI를 업데이트합니다.
예를 살펴보겠습니다. API에 대한 POST 요청이 새 사용자 생성에 통합되었습니다. 아래 코드 조각에서는 usePostUserService 후크가 이 논리를 캡슐화하는 데 사용됩니다. 요청 및 응답 유형을 정의하여 새 사용자를 생성하기 위한 데이터 구조를 지정했지만 여기서는 집중할 수 있도록 이 부분을 생략합니다. Extensive-React-Boilerplate 저장소에서 더 자세한 정보나 더 완전한 그림을 볼 수 있습니다. 왜냐하면 이 코드와 다음의 모든 코드 스니펫이 거기에 있기 때문입니다.
따라서 useFetch 후크를 사용하여 POST 요청을 보내는 사용자 정의 후크 usePostUserService를 생성하겠습니다. 사용자 데이터를 입력으로 받아 API로 보냅니다.
function usePostUserService() { const fetch = useFetch(); return useCallback( (data: UserPostRequest, requestConfig?: RequestConfigType) => { return fetch(`${API_URL}/v1/users`, { method: "POST", body: JSON.stringify(data), ...requestConfig, }).then(wrapperFetchJsonResponse<UserPostResponse>); }, [fetch] ); }
wrapperFetchJsonResponse 함수는 이 문서의 뒷부분에서 "오류 처리"에 대해 살펴보겠습니다.
읽기 작업
사용 사례: 리소스 목록 또는 단일 리소스를 가져오고 표시합니다(예: 사용자 프로필 및 제품 목록 가져오기).
구현: GET 요청을 보내 데이터를 가져오고, 로드 및 오류 상태를 처리하고, UI에서 데이터를 렌더링합니다.
이 예에서 데이터를 읽는 작업에는 사용자 데이터를 가져오기 위해 API에 GET 요청을 하는 작업이 포함됩니다. 요청(UsersRequest)과 응답 유형(UsersResponse)을 정의한 후 페이지 매기기, 필터를 사용하여 모든 사용자를 가져오고 ID별로 단일 사용자를 정렬하거나 가져오는 작업이 포함될 수 있습니다.
사용자 정의 useGetUsersService 후크에서 모든 사용자를 가져오기하기 위해 페이지 매김, 필터 및 정렬을 위한 쿼리 매개변수와 함께 GET 요청을 보냅니다.
function useGetUsersService() { const fetch = useFetch(); return useCallback( (data: UsersRequest, requestConfig?: RequestConfigType) => { const requestUrl = new URL(`${API_URL}/v1/users`); requestUrl.searchParams.append("page", data.page.toString()); requestUrl.searchParams.append("limit", data.limit.toString()); if (data.filters) { requestUrl.searchParams.append("filters", JSON.stringify(data.filters)); } if (data.sort) { requestUrl.searchParams.append("sort", JSON.stringify(data.sort)); } return fetch(requestUrl, { method: "GET", ...requestConfig, }).then(wrapperFetchJsonResponse<UsersResponse>); }, [fetch] ); }
단일 사용자를 가져오는 경우 useGetUserService 후크는 GET 요청을 보내 ID별로 사용자를 가져옵니다.
function useGetUserService() { const fetch = useFetch(); return useCallback( (data: UserRequest, requestConfig?: RequestConfigType) => { return fetch(`${API_URL}/v1/users/${data.id}`, { method: "GET", ...requestConfig, }).then(wrapperFetchJsonResponse<UserResponse>); }, [fetch] ); }
업데이트 작업
사용 사례: 기존 리소스 편집(예: 사용자 정보 업데이트, 블로그 게시물 편집)
구현: 업데이트된 데이터를 수집하고, 서버에 PUT 또는 PATCH 요청을 보내고, 응답을 처리하고, UI를 업데이트합니다.
업데이트된 사용자 데이터로 API에 PATCH 요청을 보내는 기존 사용자 업데이트를 수행해 보겠습니다. 이를 위해 사용자 정의 usePatchUserService 후크에서 요청 UserPatchRequest 및 응답 유형 UserPatchResponse:
를 정의한 후 사용자 ID와 업데이트된 데이터가 포함된 PATCH 요청을 보냅니다.
function usePatchUserService() { const fetch = useFetch(); return useCallback( (data: UserPatchRequest, requestConfig?: RequestConfigType) => { return fetch(`${API_URL}/v1/users/${data.id}`, { method: "PATCH", body: JSON.stringify(data.data), ...requestConfig, }).then(wrapperFetchJsonResponse<UserPatchResponse>); }, [fetch] ); }
참고: 부분 데이터 업데이트에는 PUT 대신 PATCH를 사용하는 것이 더 고급인 반면, PUT는 일반적으로 전체 리소스 업데이트에 사용됩니다.
삭제 작업
사용 사례: 리소스 제거(예: 사용자 삭제 또는 목록에서 항목 제거)
구현: 서버에 DELETE 요청을 보내고, 응답을 처리하고, 제거를 반영하도록 UI를 업데이트합니다.
다음 예에서 사용자 삭제에는 사용자 ID와 함께 API에 DELETE 요청을 보내는 작업이 포함됩니다. useDeleteUsersService 후크에 요청(UsersDeleteRequest)과 응답 유형(UsersDeleteResponse)을 정의한 후 ID별로 사용자를 삭제하기 위한 DELETE 요청이 전송됩니다.
function usePostUserService() { const fetch = useFetch(); return useCallback( (data: UserPostRequest, requestConfig?: RequestConfigType) => { return fetch(`${API_URL}/v1/users`, { method: "POST", body: JSON.stringify(data), ...requestConfig, }).then(wrapperFetchJsonResponse<UserPostResponse>); }, [fetch] ); }
이러한 후크는 HTTP 요청 생성 및 응답 처리의 복잡성을 추상화합니다. 이러한 접근 방식을 사용하면 데이터 가져오기 논리가 캡슐화되어 구성 요소 전체에서 재사용 가능하므로 깔끔하고 유지 관리 가능한 코드베이스가 보장됩니다.
Next.js에서 데이터 검색
자, 우리는 CRUD 작업을 처리하는 예를 다루었고 Next.js가 제공하는 데이터를 얻는 방법을 자세히 살펴보겠습니다. Next.js는 프레임워크로서 React에 기능과 최적화를 추가하기 때문입니다. Next.js는 CSR(클라이언트 측 렌더링)을 넘어 SSR(서버 측 렌더링), SSG(정적 사이트 생성), 내장 API 경로 및 하이브리드 렌더링이 가능합니다. 그럼 Next.js와 React에서 데이터를 검색할 때의 공통점과 차이점에 대해 논의해 보겠습니다.
React 앱이 순전히 클라이언트측이므로 초기 페이지 로드 후 클라이언트에서 데이터 가져오기가 발생합니다. 페이지가 로드될 때마다 데이터를 가져와야 하는 동적 페이지의 경우SSR을 사용하는 것이 더 적합합니다. 이 경우 요청 시 서버에서 데이터를 가져옵니다.
데이터가 자주 변경되지 않는 정적 페이지에 적합한 SSG의 경우 빌드 타임에 데이터를 가져옵니다. 따라서 getStaticProps 메소드는
빌드 시 데이터를 가져오는 데 도움이 됩니다(SSG). 동적 경로와 빌드 시 가져온 데이터를 기반으로 페이지를 사전 렌더링해야 하는 경우 getStaticPaths 메서드를 사용하면 이를 수행할 수 있습니다. 빌드 시 동적 경로를 생성하기 위해 getStaticProps와 함께 사용됩니다. Next 14부터는 이러한 메서드 없이 구성 요소에서 직접 요청할 수 있어 더욱 "React 경험"이 제공된다는 점에 유의해야 합니다.
위 방법에 대한 정보를 요약하기 위해 Next.js의 다양한 데이터 가져오기 방법에 대한 포괄적인 개요를 제공하는 표를 살펴보고 각각의 타이밍과 사용 사례를 강조할 수 있습니다.
Method | Data Fetching | Timing | Use Case |
---|---|---|---|
getStaticPaths | Static Site Generation (SSG) | At build time | Pre-render pages for dynamic routes based on data available at build time. |
getStaticProps | Static Site Generation (SSG) | At build time | Pre-render pages with static content at build time. Ideal for content that doesn't change frequently. |
getServerSideProps | Server-Side Rendering (SSR) | On each request | Fetch data on the server for each request, providing up-to-date content. Ideal for dynamic content that changes frequently. |
useQuery | Client-Side Rendering (CSR) | After the initial page load | Fetch initial data server-side, hydrate, reduce redundant network requests, Background Refetching. |
useSWR | Client-Side Rendering (CSR) | After the initial page load | Fetch and revalidate data on the client-side, suitable for frequently changing data. |
Next.js와 함께 React 쿼리 사용
React 쿼리는 서버 상태 가져오기, 캐싱, 동기화 및 업데이트를 위한 후크를 제공하므로 React 및 Next.js 애플리케이션 모두에서 데이터를 처리하기 위한 훌륭한 도구입니다. 사용의 주요 이점은 다음과 같습니다.
- 효율적인 데이터 가져오기: 캐싱 및 백그라운드 데이터 동기화를 처리하여 중복 네트워크 요청을 줄입니다.
- 자동 다시 가져오기: 데이터가 오래되면 백그라운드에서 자동으로 다시 가져오므로 UI에 항상 최신 정보가 표시됩니다.
- 통합 오류 처리: 오류 처리 및 재시도 지원 기능이 내장되어 있어 네트워크 장애 및 서버 오류를 더 쉽게 관리할 수 있습니다.
- 낙관적 업데이트: useMutation 후크는 서버 요청이 실패할 경우 낙관적 UI 변경 사항과 롤백 논리를 모두 처리할 수 있는 쉬운 방법을 제공하여 낙관적 업데이트를 제공합니다.
- Next.js와의 통합 용이성: getStaticProps 또는 getServerSideProps(필요한 경우)와 같은 다른 Next.js 데이터 가져오기 메소드와 원활하게 통합될 수 있습니다.
- 쿼리 및 변형 검사: ReactQueryDevtools 도구는 모든 활성 쿼리 및 변형의 상태, 데이터, 오류 및 기타 세부 정보를 볼 수 있는 가능성을 제공하고 애플리케이션이 실행될 때 쿼리 상태 업데이트를 실시간으로 관찰할 수 있습니다. .
쿼리클라이언트 제공자
QueryClientProvider는 React 구성 요소 트리에 QueryClient 인스턴스를 제공하는 컨텍스트 공급자 구성 요소입니다. 이 인스턴스는 useQuery와 같은 후크를 사용하는 데 필요합니다. 이를 설정하려면 구성 요소 트리의 루트에 배치하고 재시도 동작, 캐시 시간 등과 같은 쿼리 및 변형에 대한 전역 설정을 구성해야 합니다. 그런 다음 React Query 클라이언트를 초기화하고 애플리케이션 전체에서 사용할 수 있도록 합니다.
function usePostUserService() { const fetch = useFetch(); return useCallback( (data: UserPostRequest, requestConfig?: RequestConfigType) => { return fetch(`${API_URL}/v1/users`, { method: "POST", body: JSON.stringify(data), ...requestConfig, }).then(wrapperFetchJsonResponse<UserPostResponse>); }, [fetch] ); }
그렇다면 왜 프로젝트에 추가해야 할까요? 다음과 같은 경우에 유익합니다.
- 모든 쿼리와 변형에 대한 중앙 집중식 구성.
- 기존 React 애플리케이션에 쉽게 설정하고 통합할 수 있습니다.
- 캐싱, 백그라운드 다시 가져오기, 쿼리 무효화 등의 기능을 활성화합니다.
React 쿼리 개발 도구
React Query가 제공하는 또 다른 중요한 기능은 React Query 상태를 검사하고 디버깅하기 위한 개발 도구인 React Query Devtools입니다. 애플리케이션에 쉽게 추가하고 브라우저 확장을 통해 액세스하거나 이전 예와 같은 구성 요소로 액세스할 수 있습니다.
개발 중에 React Query Devtools를 사용하여 개별 쿼리 및 변형을 검사하고, 특정 쿼리가 프리패치되는 이유를 이해하고 쿼리 캐시 상태를 모니터링하며, 시간이 지남에 따라 어떻게 발전하는지 확인할 수 있습니다.
페이지 매김 및 무한 스크롤
라이브러리 기능을 사용하여 페이지 매김 제어나 무한 스크롤을 구현하려면 useInfiniteQuery가 가장 적합합니다. 먼저, React Query에서 쿼리를 캐싱하고 검색하기 위한 고유 키를 생성합니다. 여기서 by 메소드는 정렬 및 필터링 옵션을 기반으로 고유한 키를 생성합니다.
function usePostUserService() { const fetch = useFetch(); return useCallback( (data: UserPostRequest, requestConfig?: RequestConfigType) => { return fetch(`${API_URL}/v1/users`, { method: "POST", body: JSON.stringify(data), ...requestConfig, }).then(wrapperFetchJsonResponse<UserPostResponse>); }, [fetch] ); }
이를 위해 React Query의 useInfiniteQuery 함수를 사용하고 위의 읽기 작업 섹션에서 설명한 useGetUsersService 후크를 사용합니다.
function useGetUsersService() { const fetch = useFetch(); return useCallback( (data: UsersRequest, requestConfig?: RequestConfigType) => { const requestUrl = new URL(`${API_URL}/v1/users`); requestUrl.searchParams.append("page", data.page.toString()); requestUrl.searchParams.append("limit", data.limit.toString()); if (data.filters) { requestUrl.searchParams.append("filters", JSON.stringify(data.filters)); } if (data.sort) { requestUrl.searchParams.append("sort", JSON.stringify(data.sort)); } return fetch(requestUrl, { method: "GET", ...requestConfig, }).then(wrapperFetchJsonResponse<UsersResponse>); }, [fetch] ); }
여기서 QueryFn은 현재 페이지, 필터 및 정렬 매개변수를 기반으로 사용자 데이터를 검색하고, getNextPageParam 함수는 마지막 페이지의 응답을 기반으로 가져올 다음 페이지를 결정합니다. 사용자가 스크롤하거나 추가 데이터를 요청하면 useInfiniteQuery는 nextPage 매개변수를 기반으로 다음 데이터 세트를 자동으로 검색합니다. 이것이 무한 스크롤이 발생하는 방식입니다. 쿼리의 캐시 시간은 gcTime 매개변수에 의해 설정됩니다.
전반적으로 React Query는 React 애플리케이션의 서버 상태를 관리하고 디버깅하기 위한 포괄적인 솔루션을 제공합니다. QueryClientProvider는 모든 쿼리와 변형에 대해 중앙 집중적이고 일관된 구성을 보장하는 반면, ReactQueryDevtools는 개발 중에 쿼리 동작을 검사하고 이해하기 위한 강력한 도구를 제공합니다.
오류 처리
CRUD 작업을 구현하려면 사용자 친화성과 애플리케이션 안정성을 보장하기 위해 항상 적절한 오류 처리가 필요합니다. 서버 오류는 일반적으로 클라이언트 요청 처리 실패, 서버 코드 오류, 리소스 과부하, 인프라 구성 오류 또는 외부 서비스 오류와 관련이 있습니다. 오류 처리를 위해 Extensive-react-boilerplate는 WrapperFetchJsonResponse 함수 사용을 제안합니다.
function useGetUserService() { const fetch = useFetch(); return useCallback( (data: UserRequest, requestConfig?: RequestConfigType) => { return fetch(`${API_URL}/v1/users/${data.id}`, { method: "GET", ...requestConfig, }).then(wrapperFetchJsonResponse<UserResponse>); }, [fetch] ); }
결론
이 기사에서는 기본적인 CRUD 작업을 다루고 NextJS의 데이터 검색 기술을 살펴보았습니다. 우리는 React Query를 사용하여 상태를 관리하는 방법을 조사했으며, 데이터 검색 디버깅 및 최적화를 위한 QueryClientProvider 및 ReactQueryDevtools의 기능을 간략하게 설명했습니다. 또한 대규모 데이터 세트를 처리하기 위한 페이지 매김 및 무한 스크롤 구현에 대해 논의하고 오류 처리를 해결하여 애플리케이션의 탄력성을 높이고 원활한 사용자 경험을 보장했습니다.
이 기사에 설명된 예제와 기술을 따르면 이제 NextJS 프로젝트에서 CRUD 작업을 처리할 수 있는 준비를 갖추게 됩니다. 또는 프로젝트에 Extensive-react-boilerplate 템플릿을 사용할 수 있습니다. CLI를 사용하는 코드 한 줄 없이 몇 분 만에 CRUD 작업을 수행할 수 있는 기능을 구현하는 완벽하게 호환되는 Nestjs-boilerplate 백엔드가 있습니다. 엔터티 관계에 대해서는 여기와 여기에서 자세히 다루었습니다. 계속해서 실험하고, 모범 사례에 대한 최신 정보를 받아보고, 유용하다고 생각되면 이 상용구를 사용해 보세요.
BC Boilerplates 팀은 항상 개발을 향상할 수 있는 방법을 모색하고 있습니다. GitHub 토론이나 아래 댓글을 통해 여러분의 생각을 듣고 싶습니다.
이 기사의 모든 출처는 Olena Vlasenko와 Vlad Shchepotin??
위 내용은 NextJS로 CRUD 마스터하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

JavaScript는 현대 웹 개발의 핵심 언어이며 다양성과 유연성에 널리 사용됩니다. 1) 프론트 엔드 개발 : DOM 운영 및 최신 프레임 워크 (예 : React, Vue.js, Angular)를 통해 동적 웹 페이지 및 단일 페이지 응용 프로그램을 구축합니다. 2) 서버 측 개발 : Node.js는 비 차단 I/O 모델을 사용하여 높은 동시성 및 실시간 응용 프로그램을 처리합니다. 3) 모바일 및 데스크탑 애플리케이션 개발 : 크로스 플랫폼 개발은 개발 효율을 향상시키기 위해 반응 및 전자를 통해 실현됩니다.

이 기사에서는 Contrim에 의해 확보 된 백엔드와의 프론트 엔드 통합을 보여 주며 Next.js를 사용하여 기능적인 Edtech SaaS 응용 프로그램을 구축합니다. Frontend는 UI 가시성을 제어하기 위해 사용자 권한을 가져오고 API가 역할 기반을 준수하도록합니다.

일상적인 기술 도구를 사용하여 기능적 다중 테넌트 SaaS 응용 프로그램 (Edtech 앱)을 구축했으며 동일한 작업을 수행 할 수 있습니다. 먼저, 다중 테넌트 SaaS 응용 프로그램은 무엇입니까? 멀티 테넌트 SAAS 응용 프로그램은 노래에서 여러 고객에게 서비스를 제공 할 수 있습니다.

C/C에서 JavaScript로 전환하려면 동적 타이핑, 쓰레기 수집 및 비동기 프로그래밍으로 적응해야합니다. 1) C/C는 수동 메모리 관리가 필요한 정적으로 입력 한 언어이며 JavaScript는 동적으로 입력하고 쓰레기 수집이 자동으로 처리됩니다. 2) C/C를 기계 코드로 컴파일 해야하는 반면 JavaScript는 해석 된 언어입니다. 3) JavaScript는 폐쇄, 프로토 타입 체인 및 약속과 같은 개념을 소개하여 유연성과 비동기 프로그래밍 기능을 향상시킵니다.

웹 개발에서 JavaScript의 주요 용도에는 클라이언트 상호 작용, 양식 검증 및 비동기 통신이 포함됩니다. 1) DOM 운영을 통한 동적 컨텐츠 업데이트 및 사용자 상호 작용; 2) 사용자가 사용자 경험을 향상시키기 위해 데이터를 제출하기 전에 클라이언트 확인이 수행됩니다. 3) 서버와의 진실한 통신은 Ajax 기술을 통해 달성됩니다.

실제 세계에서 JavaScript의 응용 프로그램에는 프론트 엔드 및 백엔드 개발이 포함됩니다. 1) DOM 운영 및 이벤트 처리와 관련된 TODO 목록 응용 프로그램을 구축하여 프론트 엔드 애플리케이션을 표시합니다. 2) Node.js를 통해 RESTFULAPI를 구축하고 Express를 통해 백엔드 응용 프로그램을 시연하십시오.
