๐ŸŒŸ React + p5.js + Vite ํ”„๋กœ์ ํŠธ ์…‹์—…

BamgasiJMยท2025๋…„ 11์›” 1์ผ

p5.js Art

๋ชฉ๋ก ๋ณด๊ธฐ
3/65
post-thumbnail

์‚ฌ์ „ ์ค€๋น„

Node.js์™€ npm์ด ์„ค์น˜๋œ ์ƒํƒœ์—์„œ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

node -v
npm -v

ํ„ฐ๋ฏธ๋„์—์„œ ์œ„ ๋ช…๋ น์œผ๋กœ ๋ฒ„์ „์„ ํ™•์ธํ•˜๊ณ  ํ•„์š”ํ•˜๋ฉด ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ ํด๋”๋ฅผ ์ •ํ•ฉ๋‹ˆ๋‹ค.


1๋‹จ๊ณ„: Vite + React ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

๋จผ์ € Vite๋ฅผ ์ด์šฉํ•ด React ํ”„๋กœ์ ํŠธ์˜ ๋ผˆ๋Œ€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

1. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

ํ„ฐ๋ฏธ๋„์—์„œ ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”. my-p5-app๋ฅผ ์›ํ•˜๋Š” ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

npm create vite@latest my-p5-app -- --template react

2. ํ”„๋กœ์ ํŠธ ํด๋”๋กœ ์ด๋™ํ•œ ํ›„ ํŒจํ‚ค์น˜ ์„ค์น˜

์ƒ์„ฑ๋œ ํด๋”๋กœ ์ด๋™ํ•œ ํ›„, React์— ํ•„์š”ํ•œ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

cd my-p5-app
npm install

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ธฐ๋ณธ ํด๋”๊ฐ€ ์ƒ์„ฑ๋˜์–ด React์˜ ์ค€๋น„๋Š” ๋๋‚ฉ๋‹ˆ๋‹ค.


2๋‹จ๊ณ„: p5.js์™€ React Wrapper ์„ค์น˜

์ด์ œ p5.js๋ฅผ React์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

p5.js ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ react-p5 ์„ค์น˜

p5๋Š” p5.js์˜ ๋ณธ์ฒด์ด๊ณ , react-p5๋Š” React ์ปดํฌ๋„ŒํŠธ์—์„œ p5.js๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ž˜ํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

npm install p5 react-p5

3๋‹จ๊ณ„: p5.js ์Šค์ผ€์น˜ ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

1. src ํด๋” ์•ˆ์— components ํด๋” ์ƒ์„ฑ

์ด ํด๋”์— ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ชจ์•„๋‘ก๋‹ˆ๋‹ค.

2. 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 ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์˜ต๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด p5.createCanvas, p5.background ๋“ฑ ๋ชจ๋“  p5.js ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ธ์Šคํ„ด์Šค ๋ชจ๋“œ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค!)
  • setup ํ•จ์ˆ˜์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž์ธ canvasParentRef๋Š” p5.js ์บ”๋ฒ„์Šค๊ฐ€ ๊ทธ๋ ค์งˆ ๋ถ€๋ชจ ์š”์†Œ๋ฅผ ์ง€์ •ํ•ด์ค๋‹ˆ๋‹ค.

4๋‹จ๊ณ„: ๋ฉ”์ธ App ์ปดํฌ๋„ŒํŠธ์— ์Šค์ผ€์น˜ ์ถ”๊ฐ€ํ•˜๊ธฐ

์ด์ œ ๋ฐฉ๊ธˆ ๋งŒ๋“  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;
  • ๊ธฐ์กด์— ์žˆ๋˜ Vite ๋กœ๊ณ ๋‚˜ ํ…์ŠคํŠธ๋“ค์€ ๋ชจ๋‘ ์ง€์šฐ๊ณ , <SketchComponent />๋งŒ ๋‚จ๊น๋‹ˆ๋‹ค.
  • import './css/style.css'; ๊ฒฝ๋กœ๊ฐ€ ์‹ค์ œ ํŒŒ์ผ ์œ„์น˜์™€ ๋งž๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. (๋งŒ์•ฝ src/css ํด๋” ์•ˆ์— ์žˆ๋‹ค๋ฉด import './css/style.css';๊ฐ€ ๋งž์Šต๋‹ˆ๋‹ค.)

5๋‹จ๊ณ„: ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰

ํ„ฐ๋ฏธ๋„์—์„œ ์•„๋ž˜์˜ ๋ช…๋ น์œผ๋กœ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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๋ฅผ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

profile
Coding Art with Blender / oF / Processing / p5.js / nannou

0๊ฐœ์˜ ๋Œ“๊ธ€