

Node.js์ npm์ด ์ค์น๋ ์ํ์์ ์งํํฉ๋๋ค.
node -v
npm -v
ํฐ๋ฏธ๋์์ ์ ๋ช
๋ น์ผ๋ก ๋ฒ์ ์ ํ์ธํ๊ณ ํ์ํ๋ฉด ์ต์ ๋ฒ์ ์ผ๋ก ์
๋ฐ์ดํธํฉ๋๋ค.
๊ฐ๋ฐ ํด๋๋ฅผ ์ ํฉ๋๋ค.
๋จผ์ Vite๋ฅผ ์ด์ฉํด React ํ๋ก์ ํธ์ ๋ผ๋๋ฅผ ๋ง๋ญ๋๋ค.
ํฐ๋ฏธ๋์์ ์๋์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ์ธ์. my-p5-app๋ฅผ ์ํ๋ ํ๋ก์ ํธ ์ด๋ฆ์ผ๋ก ๋ฐ๊ฟ๋๋ค.
npm create vite@latest my-p5-app -- --template react
์์ฑ๋ ํด๋๋ก ์ด๋ํ ํ, React์ ํ์ํ ๊ธฐ๋ณธ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค.
cd my-p5-app
npm install
์ด๋ ๊ฒ ํ๋ฉด ๊ธฐ๋ณธ ํด๋๊ฐ ์์ฑ๋์ด React์ ์ค๋น๋ ๋๋ฉ๋๋ค.
์ด์ p5.js๋ฅผ React์์ ์ฌ์ฉํ ์ ์๋๋ก ์ฐ๊ฒฐํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค.
p5๋ p5.js์ ๋ณธ์ฒด์ด๊ณ , react-p5๋ React ์ปดํฌ๋ํธ์์ p5.js๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
npm install p5 react-p5
src ํด๋ ์์ components ํด๋ ์์ฑ์ด ํด๋์ ์ปดํฌ๋ํธ๋ค์ ๋ชจ์๋ก๋๋ค.
Sketch.js ํ์ผ์ ์์ฑํ๊ณ ์ฝ๋ ์์ฑsrc/components ํด๋ ์์ Sketch.js ํ์ผ์ ์์ฑํ๊ณ , ์๋ ์ฝ๋๋ฅผ ๋ถ์ฌ๋ฃ์ผ์ธ์. ์ด ์ฝ๋๊ฐ ๋ฐ๋ก ์ฌ์ฉ์๋์ p5.js ๋ก์ง์ React ์ปดํฌ๋ํธ๋ก ๊ฐ์ผ ํํ์
๋๋ค.
// src/components/Sketch.js
import React from 'react';
import dynamic from 'next/dynamic'; // Next.js๊ฐ ์๋ ๊ฒฝ์ฐ ์ด ์ค์ ํ์ ์์ต๋๋ค.
import Sketch from 'react-p5';
// window ๊ฐ์ฒด์ ์ ๊ทผํ๊ธฐ ์ํด dynamic import๋ฅผ ์ฌ์ฉํ ์๋ ์์ง๋ง,
// Vite ํ๊ฒฝ์์๋ ์ผ๋ฐ import๋ก๋ ์ ๋์ํฉ๋๋ค.
// ์๋ ์ฝ๋๋ Vite/Create React App ํ๊ฒฝ์ ๋ง์ถ ์ผ๋ฐ์ ์ธ ํํ์
๋๋ค.
export default function SketchComponent() {
// p5.js์ setup ํจ์
const setup = (p5, canvasParentRef) => {
p5.createCanvas(p5.windowWidth, p5.windowHeight).parent(canvasParentRef);
};
// p5.js์ draw ํจ์
const draw = (p5) => {
p5.background(30, 30, 30);
p5.fill(90, 200, 200);
p5.noStroke();
p5.ellipse(p5.width / 2, p5.height / 2, 500, 500);
};
// p5.js์ windowResized ํจ์
const windowResized = (p5) => {
p5.resizeCanvas(p5.windowWidth, p5.windowHeight);
};
return (
<Sketch setup={setup} draw={draw} windowResized={windowResized} />
);
}
react-p5์ <Sketch> ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.setup, draw, windowResized ๊ฐ์ p5.js ํจ์๋ค์ <Sketch> ์ปดํฌ๋ํธ์ props๋ก ๋๊ฒจ์ค๋๋ค.p5.createCanvas, p5.background ๋ฑ ๋ชจ๋ p5.js ๊ธฐ๋ฅ์ ์ ๊ทผํด์ผ ํฉ๋๋ค. (์ด๊ฒ์ด ๋ฐ๋ก ์ธ์คํด์ค ๋ชจ๋์ ํต์ฌ์
๋๋ค!)setup ํจ์์ ๋ ๋ฒ์งธ ์ธ์์ธ canvasParentRef๋ p5.js ์บ๋ฒ์ค๊ฐ ๊ทธ๋ ค์ง ๋ถ๋ชจ ์์๋ฅผ ์ง์ ํด์ค๋๋ค.์ด์ ๋ฐฉ๊ธ ๋ง๋ SketchComponent๋ฅผ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฉ์ธ ํ๋ฉด์ ๋์๋ณด๊ฒ ์ต๋๋ค.
src/App.jsx ํ์ผ ์์ // src/App.jsx
import React from 'react';
import SketchComponent from './components/Sketch'; // ๋ฐฉ๊ธ ๋ง๋ ์ค์ผ์น ์ปดํฌ๋ํธ import
import './css/style.css'; // ์ฌ์ฉ์๋์ CSS ํ์ผ import
function App() {
return (
<div className="App">
<SketchComponent />
</div>
);
}
export default App;
<SketchComponent />๋ง ๋จ๊น๋๋ค.import './css/style.css'; ๊ฒฝ๋ก๊ฐ ์ค์ ํ์ผ ์์น์ ๋ง๋์ง ํ์ธํ์ธ์. (๋ง์ฝ src/css ํด๋ ์์ ์๋ค๋ฉด import './css/style.css';๊ฐ ๋ง์ต๋๋ค.)ํฐ๋ฏธ๋์์ ์๋์ ๋ช ๋ น์ผ๋ก ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์คํํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค.
npm run dev
ํฐ๋ฏธ๋์ Local: http://localhost:5173/ ๊ณผ ๊ฐ์ ์ฃผ์๊ฐ ๋ํ๋ฉ๋๋ค. ์ด๊ฑธ Cmd+ํด๋ฆญ ํด์ ์น ๋ธ๋ผ์ฐ์ ๋ก ์ฝ๋๋ค.
my-p5-app/ โโโ .gitignore โโโ index.html โโโ package.json โโโ package-lock.json โโโ public/ โโโ src/ โ โโโ components/ โ โ โโโ Sketch.js <-- ์ฐ๋ฆฌ๊ฐ ๋ง๋ p5.js ์ปดํฌ๋ํธ โ โโโ css/ โ โ โโโ style.css โ โโโ App.jsx <-- ์ค์ผ์น๋ฅผ ๋ ๋๋งํ๋ ๋ฉ์ธ ์ปดํฌ๋ํธ โ โโโ main.jsx <-- React ์ฑ์ ์์ํ๋ ํ์ผ โโโ vite.config.js
์ด์ ์ด ํ๊ฒฝ์์ ์์ ๋กญ๊ฒ React์ ์ํ ๊ด๋ฆฌ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ค๊ณผ p5.js๋ฅผ ์ฐ๋ํ ์ ์์ต๋๋ค.