๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๊ฐœ๋ฐœ

react + express ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ ํ›„๊ธฐ (heroku ์ด์šฉ)

ํ˜„์žฌ react์™€ express๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰์ค‘์ธ๋ฐ ๊ฑฐ์˜ ์™„์„ฑ๋˜์–ด๊ฐ€์„œ ๋ฏธ๋ฆฌ ์—ฐ์Šต์‚ผ์•„ ๋ฐฐํฌ๋ฅผ ํ•ด๋ณด์•˜๋‹ค. ํ˜ผ์ž์„œ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์€ ์ฒ˜์Œ์ด๋ผ ์ˆ˜๋งŽ์€ ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚ฌ๊ณ  ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๊ฝค ๋ณต์žกํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ๊ณผ์ • ์ˆœ์„œ๋ฅผ ๊ฐ„๋‹จํžˆ ๊ธฐ๋กํ•ด๋ณธ๋‹ค. 


#. ํ”„๋กœ์ ํŠธ ์„ธํŒ… 

๋จผ์ € heroku๋ฅผ ์ด์šฉํ•ด ๋ฐฐํฌํ•˜๋Š”๋ฐ ๊นƒํ—ˆ๋ธŒ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๋ฅผ ์—ฐ๋™ํ•ด์•ผํ•จ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. ๊ธฐ์กด์— client์™€ server๋ฅผ ๊ฐ๊ฐ์˜ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๊ฐœ๋ฐœํ–ˆ์–ด์„œ ๋ชจ๋‘ ํด๋ก ํ•ด์„œ ํ•˜๋‚˜๋กœ ํ•ฉ์ณค๋‹ค.

 

1) server ํด๋” ์•ˆ์— server.js ํŒŒ์ผ์˜ ์ˆ˜์ •์ด ํ•„์š”ํ–ˆ๋‹ค. '/' ๊ฒฝ๋กœ์— get ์š”์ฒญ ์‹œ client ํด๋”์˜ index.html ํŒŒ์ผ์„ ๋ณด์—ฌ์ฃผ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์กด์— PORT ๊ฐ’์ด 5000์œผ๋กœ ๊ณ ์ •๊ฐ’์ด์˜€๋Š”๋ฐ heroku์—์„œ ์—ฐ ํฌํŠธ๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก process.env.PORT๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. 

// server.js

import express form 'express';
import path from "path";

const PORT = process.env.PORT || 5000;
const __dirname = path.resolve();

app.use(express.static(path.join(__dirname + "/.." + "/client/build")));
app.get("/", (req, res)=> res.sendFile(path.join(__dirname + "/.." + "/client/build"));

 

2) ์ตœ์ƒ๋‹จ ํด๋”์— npm init์„ ํ†ตํ•ด package.json ํŒŒ์ผ์„ ์ƒ์„ฑ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ๋จผ์ € client ํด๋”๋กœ ์ด๋™ํ•ด ํŒŒ์ผ์„ ๋นŒ๋“œํ•˜๊ณ , server ํด๋”์—์„œ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์ž‘์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ์ด๋‹ค.

// package.json

"scripts": {
    "heroku-prebuild": "cd client && npm ci && npm run build ",
    "start": "cd server && npm ci  && npm run start",
    "test": "echo \"Error: no test specified\" && exit 1"
  },

 

 

#. Heroku ์„ธํŒ… ๋ฐ DB ์—ฐ๊ฒฐ

heroku์— ๊ฐ€์ž…์„ ํ•˜๊ณ  app์„ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊นƒํ—ˆ๋ธŒ๋ฅผ ์—ฐ๋™์‹œํ‚ค๊ณ  Resources ํƒญ์œผ๋กœ ์ด๋™ํ•ด JawsDB MySQL์„ ์„ค์น˜ํ•œ๋‹ค. JawsDB MySQL์„ ์„ค์น˜ํ•˜๋Š” ์ด์œ ๋Š” ๊ธฐ์กด์— ๋‚ด ๋…ธํŠธ๋ถ์— ์žˆ๋˜ DB๋ฅผ ์™ธ๋ถ€์—์„œ๋„ 24์‹œ๊ฐ„ ์•„๋ฌด๋•Œ๋‚˜ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋‹ค. ์ฒ˜์Œ์—” ClearDB MySQL์„ ์ด์šฉํ–ˆ๋Š”๋ฐ ClearDB MySQL๋Š” json ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ์ธ์‹ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ JawsDB MySQL๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค. (์ด๊ฒƒ ์ €๊ฒƒ ์ˆ˜์ •ํ•ด๋ณด๋ฉด์„œ ์ถ”์ธกํ•ด๋ณด๊ธฐ๋กœ๋Š” JawsDB MySQL๊ณผ ClearDB MySQL์˜ characterset ์„ค์ • ๊ฐ’์ด ๋‹ฌ๋ž๋Š”๋ฐ ์ด๊ฑฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™๋‹ค)

 

๋‹ค์Œ ๋‚ด ๋…ธํŠธ๋ถ์— ์žˆ๋˜ DB๋ฅผ JawsDB MySQL์— ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์„ ํ–ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ DB ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด๋„ ๋˜์ง€๋งŒ ๋‚˜๋Š” ๊ธฐ์กด์˜ DB ํŒŒ์ผ์„ export, import ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ๋‹ค. mysql workbench๋ฅผ ์ด์šฉํ•ด ์†์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ heroku ์‚ฌ์ดํŠธ์—์„œ setting ํƒญ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋“ค์„ ๋ชจ๋‘ ์ €์žฅํ•ด์คฌ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋ชจ๋“  ์„ธํŒ…์ด ์™„๋ฃŒ๋œ ํ›„ deploy ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋ฐฐํฌ๋ฅผ ์‹คํ–‰ํ•ด์„œ ๋‚ด ํ”„๋กœ์ ํŠธ๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐํฌ๋œ URL์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.