Quickstarters
How to Build a React Frontend and Connect It to a Backend?
35 분
이 튜토리얼에서는 react를 사용하여 할 일 목록 애플리케이션을 만들고 이를 백엔드 서비스에 연결합니다 이 프로젝트는 기본 crud(생성, 읽기, 업데이트, 삭제) 작업과 간단한 사용자 인터페이스를 포함하기 때문에 이상적인 시작점입니다 끝나면 연결된 백엔드가 있는 완전한 기능의 앱을 갖게 되며, 관리되는 백엔드 서비스를 개발 워크플로에 통합하는 방법을 보여줍니다 처음부터 풀스택 애플리케이션을 구축하려면 종종 백엔드를 설정하고, 데이터베이스를 관리하고, 인증을 처리하고, 인프라를 배포해야 합니다 이러한 작업은 복잡하고 시간이 많이 소요될 수 있으며, 특히 프론트엔드 개발에 집중하는 경우에는 더욱 그렇습니다 우리는 이 목적을 위해 back4app을 사용할 것입니다 back4app은 확장 가능한 백엔드 서비스(baas) 솔루션을 제공하여 애플리케이션 구축에 집중할 수 있도록 하며, 호스팅, 데이터베이스 및 api를 처리합니다 back4app은 즉시 사용할 수 있는 데이터베이스, 인증, 서버 측 논리를 위한 클라우드 코드 및 원활한 통합을 위한 sdk를 포함한 백엔드 서비스를 제공합니다 또한 컨테이너화된 배포를 지원하여 풀스택 애플리케이션 호스팅을 위한 유연한 선택이 됩니다 이러한 기능을 통해 서버 인프라를 관리하지 않고도 애플리케이션을 신속하게 구축하고 배포할 수 있습니다 주요 요점 이 기사를 읽음으로써 다음을 배울 수 있습니다 업계 표준 도구를 사용하여 현대적인 react 프로젝트를 설정합니다 애플리케이션 데이터를 관리하기 위해 백엔드 서비스를 원활하게 통합합니다 동적인 사용자 경험을 위한 필수 crud 작업을 구현합니다 완전한 기능을 갖춘 todo 애플리케이션을 배포하고 todo app 이 실행되는 것을 확인합니다 사전 요구 사항 이 튜토리얼을 효과적으로 따르려면 다음 도구와 기술이 필요합니다 node js 및 npm 이 컴퓨터에 설치되어 있어야 합니다 npm을 사용하여 종속성을 설치하고 react 애플리케이션을 실행합니다 터미널에서 node v 및 npm v 를 실행하여 설치를 확인합니다 기본 react 지식 , 함수형 컴포넌트, 훅을 사용한 상태 관리 및 사용자 입력 처리 포함 이 튜토리얼에서는 react 기초를 다루지 않으므로 jsx 및 컴포넌트 구조에 대한 친숙함이 필요합니다 백엔드 서비스를 설정하고 관리하기 위한 back4app 계정 이 필요합니다 계정이 없으면 back4app https //www back4app com/ 에서 가입하세요 이 모든 것이 준비되면 프로젝트를 설정하고 빌드를 시작할 준비가 된 것입니다 프로젝트 설정 시작하려면 로컬 개발 환경을 설정하고 vite를 사용하여 프론트엔드 프로젝트를 초기화해야 합니다 이것은 빠르고 효율적인 개발 경험을 보장하면서 프로젝트 구조를 깔끔하게 유지합니다 먼저, node js (lts 버전) 이 설치되어 있는지 확인하세요 설치되어 있지 않다면 nodejs org https //nodejs org/ 에서 다운로드하여 설치하세요 설치가 완료되면 다음을 실행하여 확인합니다 node v npm v 이제 vite , create react app보다 우수한 속도를 제공하는 현대적인 빌드 도구를 사용하여 react 프로젝트를 초기화하세요 터미널에서 다음 명령을 실행하세요 todo app 을(를) 원하는 프로젝트 이름으로 바꾸세요 npm create vite\@latest todo app template react 프로젝트 폴더로 이동하세요 cd todo app 필요한 종속성을 설치하세요 npm install 설정을 확인하기 위해 개발 서버를 시작합니다 npm run dev 이것은 로컬에서 react 앱을 실행합니다 제공된 url을 브라우저에서 열어 실행 중인지 확인하세요 프론트엔드가 설정되면, 다음 단계는 데이터 저장 및 api 상호작용을 처리하기 위해 back4app에서 백엔드를 만드는 것입니다 할 일 백엔드 만들기 back4app은 parse , nosql 데이터베이스, 인증, 클라우드 코드 및 api 생성 을 제공하는 완전 관리형 백엔드 서비스입니다 이를 통해 백엔드를 처음부터 구축하지 않고도 앱의 데이터를 관리할 수 있습니다 작업 데이터 모델을 생성하여 할 일 목록 항목을 저장하고 이를 react 프론트엔드에 연결합니다 백엔드 애플리케이션 만들기 로그인 하여 back4app 대시보드 https //www back4app com/ 를 클릭하고 "새 앱 만들기" 애플리케이션의 이름을 입력하세요 (예 todoapp ) 및 백엔드 유형으로 nodejs/parse 를 선택합니다 생성 후 "데이터베이스" > "브라우저" , 클릭하여 "클래스 만들기" , 그리고 "사용자 정의" 를 선택합니다 이름을 작업 으로 지정하고 클래스 수준 권한 을 설정하여 공개 읽기 및 쓰기를 허용합니다 (나중에 이를 세분화할 수 있습니다) "작업" 클래스에 다음 필드를 추가합니다 제목 (문자열) – 작업 제목 설명 (문자열) – 작업 세부정보 완료됨 (부울) – 완료 상태 마감일 (날짜) – 작업 마감일 "저장" 을 클릭하여 스키마를 생성합니다 back4app을 react에 연결하기 이제 parse javascript sdk 를 사용하여 백엔드와 통신하기 위해 back4app을 react 프로젝트에 통합하세요 npm을 통해 설치하세요 npm install parse 다음으로, application id 와 javascript key 로 초기화하여 sdk를 구성하세요 이러한 자격 증명은 back4app 대시보드 의 앱 설정 > 보안 및 키 섹션에서 가져옵니다 앱 id와 js 키가 강조된 back4app 키 페이지 내부 src/main jsx , 최소화된 sdk를 가져오고 application id 와 javascript key 로 초기화하여 parse를 구성하세요 import parse from 'parse/dist/parse min js'; const parse app id = 'your application id'; const parse js key = 'your javascript key'; const parse server url = 'https //parseapi back4app com/'; parse initialize(parse app id, parse js key); parse serverurl = parse server url; 백엔드가 연결되면 to do list ui 를 구축하고 crud 작업을 통합할 수 있습니다 프론트엔드 개발 이제 백엔드가 설정되고 연결되었으므로, react에서 to do list ui 를 구축할 시간입니다 작업을 추가, 표시, 업데이트 및 삭제하는 컴포넌트를 만들고 상태를 효율적으로 관리할 것입니다 컴포넌트 구조화 애플리케이션은 세 가지 주요 컴포넌트로 구성됩니다 taskform jsx – 새로운 작업 추가를 처리합니다 tasklist jsx – 모든 작업을 표시하고 작업을 완료로 표시하거나 삭제하는 제어를 제공합니다 taskitem jsx – 완료로 표시하거나 삭제하는 등의 작업을 나타냅니다 먼저 components 폴더를 src 안에 생성하고 다음 파일을 추가하세요 mkdir src/components touch src/components/taskform jsx src/components/tasklist jsx src/components/taskitem jsx 상태 관리 로컬에서 작업을 관리하기 위해 usestate 및 useeffect 훅을 사용하여 back4app에서 데이터를 가져오고 업데이트합니다 먼저, app jsx 내부에 상태를 정의합니다 import { usestate, useeffect } from "react"; import parse from "parse/dist/parse min js"; import taskform from " /components/taskform"; import tasklist from " /components/tasklist"; function app() { const \[tasks, settasks] = usestate(\[]); useeffect(() => { fetchtasks(); }, \[]); const fetchtasks = async () => { try { const task = parse object extend("task"); const query = new parse query(task); const results = await query find(); settasks(results map((task) => ({ id task id, task tojson() }))); } catch (error) { console error("error fetching tasks ", error); } }; return ( \<div classname="container"> \<h1>to do list\</h1> \<taskform fetchtasks={fetchtasks} /> \<tasklist tasks={tasks} fetchtasks={fetchtasks} /> \</div> ); } export default app; 작업 양식 만들기 내부에서 taskform jsx , 새로운 작업을 추가하기 위한 제어된 양식을 만듭니다 이는 입력 값을 상태에 저장하고 back4app에 데이터를 제출합니다 import { usestate } from "react"; import parse from "parse/dist/parse min js"; function taskform({ fetchtasks }) { const \[title, settitle] = usestate(""); const \[description, setdescription] = usestate(""); const handlesubmit = async (e) => { e preventdefault(); try { const task = parse object extend("task"); const task = new task(); task set("title", title); task set("description", description); task set("completed", false); await task save(); fetchtasks(); settitle(""); setdescription(""); } catch (error) { console error("error adding task ", error); } }; return ( \<form onsubmit={handlesubmit}> \<input type="text" placeholder="task title" value={title} onchange={(e) => settitle(e target value)} required /> \<input type="text" placeholder="description" value={description} onchange={(e) => setdescription(e target value)} required /> \<button type="submit">add task\</button> \</form> ); } export default taskform; 작업 표시 내부에서 tasklist jsx , 작업 목록을 렌더링하고 완료로 표시하고 삭제하는 작업을 포함합니다 import taskitem from " /taskitem"; function tasklist({ tasks, fetchtasks }) { return ( \<div> {tasks length === 0 ? ( \<p>no tasks available\</p> ) ( tasks map((task) => ( \<taskitem key={task id} task={task} fetchtasks={fetchtasks} /> )) )} \</div> ); } export default tasklist; 작업 항목 구성 요소 안에 taskitem jsx , 작업을 완료로 표시하거나 back4app에서 삭제하는 작업을 정의합니다 import parse from "parse/dist/parse min js"; function taskitem({ task, fetchtasks }) { const handlecomplete = async () => { try { const query = new parse query("task"); const tasktoupdate = await query get(task id); tasktoupdate set("completed", !task completed); await tasktoupdate save(); fetchtasks(); } catch (error) { console error("error updating task ", error); } }; const handledelete = async () => { try { const query = new parse query("task"); const tasktodelete = await query get(task id); await tasktodelete destroy(); fetchtasks(); } catch (error) { console error("error deleting task ", error); } }; return ( \<div classname={`task item ${task completed ? "completed" ""}`}> \<h3>{task title}\</h3> \<p>{task description}\</p> \<button onclick={handlecomplete}> {task completed ? "undo" "complete"} \</button> \<button onclick={handledelete}>delete\</button> \</div> ); } export default taskitem; 애플리케이션 스타일링 다음에 styles css 파일을 src 에 생성하고 기본 스타일링을 추가하세요 / container to center the content and add some spacing / container { max width 600px; margin 40px auto; padding 0 20px; text align center; font family sans serif; } / make the heading stand out and add spacing below it / container h1 { margin bottom 20px; } / style the form so that inputs and the button are nicely spaced and aligned / form { display flex; flex direction column; align items center; gap 10px; margin bottom 20px; } / make the text inputs fill a reasonable width and add padding / form input\[type="text"] { width 80%; max width 400px; padding 8px; box sizing border box; font size 1rem; } / style the 'add task' button / form button { padding 8px 16px; cursor pointer; font size 1rem; border none; background color #eaeaea; transition background color 0 2s ease; } form button\ hover { background color #ccc; } / basic text styles for empty task list message / container p { font size 1rem; } / task item container \ centered in both directions (flex + align items/justify content) \ a gap between elements for visual breathing room / task item { display flex; flex direction column; align items center; justify content center; gap 12px; border 1px solid #ccc; border radius 6px; padding 15px; margin 10px 0; background color #fafafa; text align center; / centers text for titles/descriptions / transition background color 0 2s ease; } / completed tasks visually differ strikethrough and grey text / task item completed h3, task item completed p { text decoration line through; color #888; } / task title / task item h3 { margin 0; font size 1 1rem; } / task description / task item p { margin 0; font size 1rem; } / buttons within each task item (centered and with some spacing) / task item button { padding 6px 12px; border none; background color #eaeaea; cursor pointer; font size 0 9rem; } task item button\ hover { background color #ccc; } / on wider screens, you can display elements in a row but keep them centered adjust justify content/align items if you want them spaced differently / @media (min width 600px) { task item { flex direction row; } } 이 css를 main jsx import " /styles css"; 애플리케이션의 ui 당신의 할 일 목록 앱 은 이제 react ui, back4app 통합 및 기본 스타일링이 적용된 작동하는 프론트엔드를 갖추었습니다 완성된 할 일 목록 앱 다음으로, 이 프론트엔드를 back4app 웹 배포 에 배포할 것입니다 back4app 웹 배포에서 프론트엔드 배포하기 back4app 웹 배포는 애플리케이션을 배포하기 위한 완전 관리형 컨테이너화된 환경 을 제공합니다 이것은 docker 기반 배포 , 프론트엔드를 컨테이너로 패키징하고 back4app의 인프라에서 실행할 수 있도록 지원합니다 이는 확장성, 보안 및 github와 직접 통합하여 쉽게 ci/cd 파이프라인을 보장합니다 컨테이너화를 위한 vite 구성 vite는 기본적으로 개발 모드에서 애플리케이션을 제공합니다 프로덕션을 위해서는 정적 버전을 빌드하고 nginx 와 같은 경량 웹 서버를 사용하여 제공해야 합니다 먼저, vite config js 를 업데이트하여 배포를 위한 적절한 기본 경로를 지정하세요 import { defineconfig } from 'vite'; import react from '@vitejs/plugin react'; export default defineconfig({ plugins \[react()], base ' /', // ensures correct asset paths in a containerized environment }); 이제 빌드 명령을 실행하여 프로덕션 준비 파일을 생성하세요 npm run build 배포를 위한 dockerfile 생성 a dockerfile 은(는) react 앱이 어떻게 컨테이너화되는지를 정의합니다 프로젝트의 루트에 dockerfile 이라는 이름의 파일을 생성하고 다음 구성을 추가하세요 # use an official lightweight node js image from node 18 alpine as build \# set working directory workdir /app \# copy package json and install dependencies copy package json package lock json / run npm install \# copy project files copy \# build the project run npm run build \# use an nginx server for efficient static file serving from nginx\ alpine copy from=build /app/dist /usr/share/nginx/html \# expose port 80 expose 80 \# start nginx cmd \["nginx", " g", "daemon off;"] 이 dockerfile은 다음과 같은 작업을 수행합니다 의존성을 설치하고 react 앱을 빌드하기 위해 node js 를 사용합니다 효율적인 정적 파일 제공을 위해 빌드된 파일을 nginx 컨테이너에 복사합니다 애플리케이션을 제공하기 위해 80 포트를 엽니다 컨테이너를 로컬에서 빌드하고 테스트하기 배포하기 전에 컨테이너가 예상대로 작동하는지 로컬에서 테스트하세요 다음 명령어를 실행하여 docker 이미지를 빌드합니다 docker build t todo frontend 그런 다음 다음을 사용하여 컨테이너를 시작합니다 docker run p 8080 80 todo frontend 브라우저에서 http //localhost 8080 를 열어 react 앱이 올바르게 제공되는지 확인하세요 github에 푸시하고 back4app에 연결하기 back4app에 배포하려면 먼저 프로젝트를 github에 푸시하세요 git init git add git commit m "initial commit for back4app deployment" git branch m main git remote add origin \<your github repository url> git push u origin main 이제 back4app 웹 배포 플랫폼을 통해 배포하려면 다음 단계를 따르세요 로그인 하세요 back4app 웹 배포 https //www back4app com/containers "새 앱 만들기"를 클릭하고, 프로젝트 이름을 지정한 후 github 리포지토리 를 선택하세요 back4app이 github에 접근할 수 있도록 권한을 부여하고 todo app 리포지토리를 선택하세요 "dockerfile 배포"를 선택하고 빌드 설정을 확인하세요 "배포"를 클릭하여 첫 번째 빌드를 시작하세요 배포 관리 및 모니터링 배포가 완료되면 back4app 대시보드 에서 앱으로 이동하세요 여기에서 다음을 수행할 수 있습니다 문제를 디버깅하기 위해 로그 를 확인하세요 컨테이너 재시작 및 자원 사용량을 모니터링 하세요 "빌드 트리거" 버튼을 사용하여 새로운 커밋으로 재배포하세요 개인 도메인에서 호스팅하는 경우 커스텀 도메인 을 설정하세요 back4app 웹 배포 대시보드 배포된 애플리케이션 이 튜토리얼에서 사용된 배포된 애플리케이션에 접근하려면 https //todoapp ku5ofg8s b4a run/ https //todoapp ku5ofg8s b4a run/ https //todoapp ku5ofg8s b4a run/ 프론트 엔드가 성공적으로 배포되었으므로, 다음 단계는 모든 것이 원활하게 작동하는지 확인하기 위한 테스트 및 디버깅입니다 테스트 및 디버깅 프론트 엔드와 백 엔드를 배포한 후, 애플리케이션이 올바르게 작동하는지 확인해야 합니다 여기에는 프론트엔드 백엔드 상호작용 , 일반적인 문제를 식별하고 오류를 효과적으로 디버깅하는 것이 포함됩니다 통합 애플리케이션 테스트 react 프론트 엔드가 back4app 백 엔드와 제대로 상호작용하는지 확인하려면 다음 단계를 따르세요 api 연결 테스트 브라우저의 개발자 콘솔을 열고 ( f12 → 네트워크 탭 ) 작업을 추가하거나 가져올 때 api 호출을 확인하세요 api 요청이 실패하면 응답 상태와 오류 메시지를 검사하세요 작업 수동 추가 및 검색 할 일 목록 ui 를 사용하여 작업을 추가하세요 작업이 유지되도록 페이지를 새로 고치세요 back4app 데이터베이스 브라우저 를 열고 작업이 작업 클래스 아래에 나타나는지 확인하세요 crud 작업 확인 ui에서 작업을 완료하고 삭제한 후 back4app의 데이터베이스에서 변경 사항을 확인하세요 업데이트가 반영되지 않으면 브라우저 콘솔이나 api 로그에서 오류를 확인하세요 엣지 케이스 테스트 유효성 검사가 작동하는지 확인하기 위해 빈 작업을 제출해 보세요 느린 인터넷 연결을 시뮬레이션하여 ( chrome devtools → 네트워크 → 느린 3g ) 성능을 테스트하세요 일반적인 문제 및 문제 해결 cors 오류 ( access control allow origin 문제) 이동하여 back4app 대시보드 > 앱 설정 > 보안 및 키 "허용된 헤더 및 도메인" 아래에 "allowed headers and domains" , 프론트엔드의 url을 추가하세요 백엔드를 저장하고 재시작하세요 인증 실패 (401 권한 없음 오류) 애플리케이션 id와 자바스크립트 키가 react 앱에 올바르게 구성되어 있는지 확인하세요 사용자 인증을 사용하는 경우, 세션 토큰이 api 요청에 포함되어 있는지 확인하세요 백엔드 배포 문제 api가 응답하지 않는 경우, back4app 웹 배포 > 로그 로 이동하여 백엔드 배포의 오류를 확인하세요 필요한 경우 컨테이너를 재시작하세요 테스트 및 디버깅이 완료되면, 다음 단계는 back4app 서비스 사용을 위한 모범 사례 를 구현하여 성능과 유지 관리를 최적화하는 것입니다 back4app 서비스 사용을 위한 모범 사례 back4app을 사용할 때 따를 수 있는 몇 가지 모범 사례입니다 프론트엔드 백엔드 상호작용 최적화 프론트엔드와 back4app의 백엔드 간의 효율적인 통신은 원활한 사용자 경험을 보장합니다 여러 작업을 수행할 때는 배치 요청 을 사용하여 네트워크 오버헤드를 줄이세요 const tasks = \[task1, task2, task3]; parse object saveall(tasks); 읽기 작업을 위해, 캐싱 활성화 및 인덱스 쿼리 설정 을 back4app 대시보드에서 설정하여 빈번한 요청의 속도를 높이세요 항상 응답 크기를 최소화하기 위해 필요한 필드만 요청하세요 query select("title", "completed"); 환경 및 확장성 민감한 키, 예를 들어 애플리케이션 id 및 javascript 키 , 을 하드코딩하는 대신 환경 변수에 저장하세요 vite , 를 사용하는 경우 env 파일을 생성하세요 vite parse app id=your app id vite parse js key=your js key 생산 환경에서는 자동 확장 을 back4app 웹 배포에 활성화하여 증가하는 트래픽을 처리하세요 데이터베이스 사용량을 모니터링하고 성능 모니터링 도구를 사용하여 쿼리를 최적화하세요 강화된 보안 및 성능 인증된 사용자만 데이터 수정이 가능하도록 클래스 수준 권한 (clps) 을 제한하세요 사용자 역할에 따라 읽기/쓰기 권한을 동적으로 설정하세요 task setacl(new parse acl(parse user current())); 복잡한 비즈니스 로직을 프론트엔드에서 오프로드하기 위해 클라우드 코드 를 사용하여 api 노출을 줄이고 성능을 향상시키세요 마지막으로, 남용을 방지하고 데이터 무결성을 보장하기 위해 요금 제한 및 요청 검증 을 활성화하세요 결론 이제 react 프론트엔드를 설정하고 back4app의 백엔드와 통합하며 컨테이너화된 워크플로를 통해 배포하여 전체 스택 할 일 목록 애플리케이션을 구축했습니다 이 과정은 로컬 개발에서 클라우드 배포로의 명확한 경로를 보여주며, 원활한 프론트엔드 백엔드 상호작용을 보장합니다 앞으로는 고급 사용자 관리, 실시간 업데이트 및 제3자 통합과 같은 향상을 고려하세요 추가 학습을 위해 back4app 문서 https //www back4app com/docs 및 커뮤니티 지원 리소스를 탐색하세요