programmers์ ๊ณผ์ ํ ์คํธ๋ ์ฝ๋๋ฅผ ์ ์ถํ๋ฉด ์๋์ผ๋ก ์๋ฒ๋ฅผ ๊ตฌ์ฑํ์ฌ ์คํํด ๋ณผ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
์๋ ๋ด์ฉ์ ํ์ธํ์ฌ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ๊ณ ์ฝ๋๋ฅผ ์ ์ถํด ์ฃผ์ธ์.
์ฐธ๊ณ : ์ด ํ ํ๋ฆฟ์ ์น ์ดํ๋ฆฌ์ผ์ด์ ๋ชจ๋์ธ express.js ์ SQL์ ์ํ ORM(Object-Relational Mapping) ๋ชจ๋์ธ sequelize.js ๊ฐ ๋ฏธ๋ฆฌ ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
programmers์ ๊ณผ์ ํ
์คํธ๋ ๋ด๋ถ์ ์ผ๋ก heroku buildpack์ ํตํด ์ ์ถํ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. ๋ฐ๋ผ์ Procfile ์ด๋ผ๋ ํน๋ณํ ํ์ผ์ด ํ๋ก์ ํธ์ ํฌํจ๋์ด ์์ด์ผ ํฉ๋๋ค. ์ด Procfile์๋ ์ฑ ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ ๋ช
๋ น์ด ์ง์ ๋์ด ์์ด์ผ ํฉ๋๋ค.
Procfile์ ํ๋ก์ธ์ค ์ ํ์ ๊ฐ๋ณ ๋ผ์ธ์ ์ ์ธํฉ๋๋ค. ๊ฐ ๋ผ์ธ์ ๋ค์ ํ์์ผ๋ก ๋์ด ์์ด์ผ ํฉ๋๋ค.
<ํ๋ก์ธ์ค ์ ํ>: <๋ช
๋ น>
Procfile ์ ์ฌ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ ํ๋ก์ธ์ค ์ ํ์ ์ ์ธ ํ ์ ์์ต๋๋ค.
-
web: ์น ์๋ฒ ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ ๋ช ๋ น์ ์ง์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด
node.js์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ ํ ์ ์์ต๋๋ค.web: npm start์ฐธ๊ณ :
yarn์ ์ฌ์ฉํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ, Procfile ํ์ผ์web: npm start๋ฅผ ์์ ํด์ฃผ์ธ์. -
migrate: programmers์ ๊ณผ์ ํ ์คํธ๋ ์ฝ๋๋ฅผ ์คํ ์, ๋งค๋ฒ ์๋ก์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๋ฅผ ์คํํฉ๋๋ค. ๋ฐ๋ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ ์์ฑํ๋ ๋ช ๋ น์ ์ด ์ ํ์ ์ ์ ํด์ผํฉ๋๋ค.
migrate: ./node_modules/.bin/sequelize db:migrate์ฃผ์!: migrate ์ ํ์ ๋ฐ๋์ ์ ์๋์ด ์์ด์ผ ํฉ๋๋ค. ๋ง์ฝ ์๋ฒ ์คํ์ ์๋์ผ๋ก db๊ฐ sync๋์ด ์ด ๋ช ๋ น์ด ํ์์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ์ํด์ฃผ์ธ์.
migrate: /bin/true์ฐธ๊ณ :
sequelize์ธ์ ๋ค๋ฅธ SQL ๋ชจ๋์ ์ด์ฉํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ, ๋ง์ด๊ทธ๋ ์ด์ cli ๋ช ๋ น์ด๋ฅผmigrate:์ ์์ฑํด ์ฃผ์ด์ผ ํฉ๋๋ค. -
seed: ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ ฅํ๊ธฐ ์ํ ๋ช ๋ น์ ์ง์ ํฉ๋๋ค. migrate ์ดํ์ ์คํ๋ฉ๋๋ค.
seed: ./node_modules/.bin/sequelize db:seed:all -
์ด์ธ์ ๋ค๋ฅธ ํ๋ก์ธ์ค ์ ํ์ ์ง์ํ์ง ์์ต๋๋ค.
programmers์ ๊ณผ์ ํ ์คํธ์์๋ ํ์ฌ MySQL๋ง ์ง์ํ๋ฉฐ, ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง์ ์ง์ํ์ง ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๋ จ๋์ด ์ ์๋์ด ์๋ ํ๊ฒฝ ๋ณ์๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-
MySQL ์ ์ host:
MYSQL_ROOT_HOST=mysql-server -
MySQL ์ ์ :
MYSQL_USER=root -
MySQL ์ ์ ์ ๋น๋ฐ๋ฒํธ:
MYSQL_ROOT_PASSWORD=password -
์ฌ์ ์ ์์ฑ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค:
MYSQL_DATABASE=my_database
์ฐธ๊ณ : ์ด ํ ํ๋ฆฟ์
config/config.json์ "production"์ ์ ์๋์ด ์๋ ๊ฐ๋ค์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
programmers์์ ๊ณผ์ ๋ฅผ ์๋์ผ๋ก ์คํํ ๋์๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ํด ์๋ฒ ์คํ ์ Procfile ํ์ผ์ migrate์ ์ ์๋์ด ์๋ ๋ช ๋ น์ ์คํํฉ๋๋ค.
์ฃผ์!: sequelize ์ธ์ ๋ค๋ฅธ ๋ชจ๋์ ์ฌ์ฉํ ๊ฒฝ์ฐ Procfile ํ์ผ์ migrate์ ์ฌ์ฉ ๋ชจ๋์ ๋ง์ด๊ทธ๋ ์ด์ cli ๋ช ๋ น์ด๋ก ์์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ํ ๋ชจ๋๋ก sequelize.js ์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ๋ค์ ํฐ๋ฏธ๋ ๋ช
๋ น์ด๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ์ผ์ ๋ง๋ค ์ ์์ต๋๋ค. ๋ง์ด๊ทธ๋ ์ด์
ํ์ผ์ migrations ๋๋ ํ ๋ฆฌ์ ์์ฑ๋ฉ๋๋ค.
$ node_modules/.bin/sequelize migration:create
์ฐธ๊ณ : ์์ ๋ช ๋ น์ด๋ก ๋ง๋ค์ด์ง ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์ด ์ด ํ ํ๋ฆฟ์
migrations/2019XXXXXXXXX-create-item.js์ ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
๋ง์ด๊ทธ๋ ์ด์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ ฅํ๊ธฐ ์ํด Procfile ํ์ผ์ seed ์ ์ ์๋ ๋ช ๋ น์ ์ํํฉ๋๋ค.
์ฐธ๊ณ : ์์ ํ์ผ์ด ์ด ํ ํ๋ฆฟ์
seeders/2019XXXXXXXXX-insert-items.js์ ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
์คํ ์, ๋งค๋ฒ ์๋ก์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๊ฐ ์คํ๋๋ฉฐ, ์คํ์ด ์ข ๋ฃ๋๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์ ๋ฐ์ดํฐ๋ ์ญ์ ๋ฉ๋๋ค.
-
Port ๋ฒํธ๋ PORT ํ๊ฒฝ ๋ณ์ ๋๋ 5000 ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
-
์์กด์ฑ ๋ชจ๋๋ค์ด ์ ์๋์ด ์๋
package.json๊ฐ ๋ฐ๋์ ์ ์ฅ์์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ์์ด์ผ ํฉ๋๋ค. -
์ ์ฅ์์๋ ํ๋์ ํ๋ก์ ํธ๋ง ์์ด์ผ ํฉ๋๋ค. ์คํ์ ์ ์ฅ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ์๋
package.jsonํ์ผ๋ง ์ฐธ์กฐํ์ฌ ์คํํฉ๋๋ค.์ฃผ์!: ์ ์ฅ์์ api ์๋ฒ์ web ์๋ฒ๊ฐ ๊ฐ์ด ์๋ค๋์ง ํ๋ฉด ์๋ฉ๋๋ค.
-
programmers์์ ๊ณผ์ ์คํ ๋ฐ ์ ์ถ ์์๋
NODE_ENV๋ production ์ผ๋ก ์คํ ๋ฉ๋๋ค.์ฃผ์!: ๋ฐ๋ผ์
devDependencies์ ์ ์๋์ด ์๋ ์์กด์ฑ ๋ชจ๋์ ์ค์น๋์ง ์์ผ๋ฏ๋ก ์คํ์ ํ์ํ ๋ชจ๋์dependencies์ ์ ์๋์ด ์์ด์ผ ํฉ๋๋ค. -
.gitignore์ ์๋ ํญ๋ชฉ๋ค์ด ํฌํจ์์ผ ์ฃผ์ธ์.node_modules๋๋ ํ ๋ฆฌ์.envํ์ผ์ด ์ ์ฅ์์ ํฌํจ๋์ด์๋ ์๋ฉ๋๋ค./node_modules npm-debug.log /*.env์ฐธ๊ณ :
typescript๋webpack์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ปดํ์ผ์ ๊ฒฐ๊ณผ ๋๋ ํ ๋ฆฌ (/dist๋ฑ)๋ ํฌํจ๋์ด์๋ ์๋ฉ๋๋ค. -
console.log๋ฑ stdout์ผ๋ก ์ถ๋ ฅ๋ ๋ก๊ทธ๋ ํ๋ฉด์ ํ์๋ฉ๋๋ค. -
programmers์์ ์คํ๋ ์๋ฒ๋ ์ต๋ 10๋ถ ๋ค์๋ ์๋์ผ๋ก ์ข ๋ฃ๋ฉ๋๋ค.
-
๋ณธ์ธ์ github ๊ณ์ ์ private ์ ์ฅ์๋ฅผ ์์ฑํด์ ๊ณผ์ ๋ฅผ master ๋ธ๋์น์ push ํด์ฃผ์ธ์.
์ฃผ์!: ์ ์ฅ์๊ฐ public์ผ๋ก ๋์ด ์๋ ๊ฒฝ์ฐ์๋ programmers์์ ๊ณผ์ ๋ฅผ ์คํ/์ ์ถํ ์ ์์ต๋๋ค.
-
github ์ ์ฅ์ ํ์ด์ง์ Setting > Collaborators ์์ programmers-gitbot ์ Collaborator๋ก ์ถ๊ฐ ํด์ฃผ์ธ์.
-
์คํ์ github ์ ์ฅ์์ url์ ์ ๋ ฅํ์๊ณ [๋น๋(build)] ๋ฒํผ์ ๋๋ฅด๋ฉด ์๋์ผ๋ก ์๋ฒ๋ฅผ ๊ตฌ์ฑํ์ฌ ์คํ ํฉ๋๋ค. ์คํ ํ์๋ [์ต์ข ์ ์ถ] ๋ฒํผ์ด ํ์ฑํ๋์ด ๊ณผ์ ๋ฅผ ์ ์ถ ํ ์ ์์ต๋๋ค.
-
[์ต์ข ์ ์ถ] ํ๋ฉด ํ ์คํธ๊ฐ ์ข ๋ฃ๋๋ฉฐ, ์ดํ ๋ค์ ์ ์ถ์ด ๋ถ๊ฐ๋ฅํ๋ ์ถฉ๋ถํ ์คํ์ ํด๋ณด์๊ณ ์ ์ถํ์๊ธฐ ๋ฐ๋๋๋ค!!
์ฃผ์!: [์ต์ข ์ ์ถ] ๋๋ฉด ์ ์ถ ๋น์์ master ๋ธ๋์น์ commit์ผ๋ก ์ ์ถ์ด ๊ณ ์ ๋๋ฏ๋ก ์ ์ถ ์ดํ ์ ์ฅ์์ commit์ push ํด๋ ์ ์ถ๋ฌผ์๋ ๋ฐ์๋์ง ์์ต๋๋ค.
-
git fetch failed! please check your repository.
์๋ชป๋ ์ ์ฅ์ ์ฃผ์๋ฅผ ์ ๋ ฅํ๊ฑฐ๋ force commit์ผ๋ก ํด๋น commit์ด ์์ด์ง ๊ฒฝ์ฐ ๋ฐ์ํฉ๋๋ค.
-
-----> Unable to select a buildpack
์ ์ฅ์ root ๋๋ ํ ๋ฆฌ์
package.jsonํ์ผ์ ์ฐพ์ ์ ์์ต๋๋ค.package.jsonํ์ผ์ ํ์ธํด์ฃผ์ธ์. -
npm ERR! ํน์ error An unexpected error occurred
npm install ํน์ yarn install ์ค ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ก๊ทธ์ ํ์๋ ํด๋น ๋ชจ๋์ ํ์ธํด์ฃผ์ธ์.
-
ERROR: connect ECONNREFUSED 127.0.0.1:3306
MySQL host๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. MySQL host๋ MYSQL_ROOT_HOST ํ๊ฒฝ๋ณ์ ํน์ "mysql-server" ์ด์ฌ์ผ ํฉ๋๋ค.
์ฃผ์!: programmers์์ ๊ณผ์ ์คํ ์ MySQL host๋ 127.0.0.1(localhost)๊ฐ ์๋๋ผ mysql-server์์ ์ ์ํด์ฃผ์ธ์.
-
ERROR: Access denied for user 'root'@'172.17.0.3' (using password: YES)
MySQL ์ ์ ํน์ ๋น๋ฐ๋ฒํธ๋ฅผ ์๋ชป ์ ๋ ฅํ์ต๋๋ค. ์ ์ ๋ MYSQL_USER ํ๊ฒฝ ๋ณ์ ํน์ "root", ๋น๋ฐ๋ฒํธ๋ MYSQL_ROOT_PASSWORD ํ๊ฒฝ ๋ณ์ ํน์ "password" ์ด์ฌ์ผ ํฉ๋๋ค.
์ฃผ์!: ์ด ๋ก๊ทธ์์ ๋์ค๋ ip ์ฃผ์๋ฅผ ๊ณ ์ ์ผ๋ก ์ฌ์ฉํ์ง ๋ง์ธ์. MySQL host์ ip ์ฃผ์๋ ๋์ ์ผ๋ก ๋ณํ ์ ์์ต๋๋ค.
-
ERROR: Unknown database
database๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. database๋ MYSQL_DATABASE ํ๊ฒฝ ๋ณ์ ํน์ "my_database" ์ด์ฌ์ผ ํฉ๋๋ค.
-
Proc entrypoint migrate does not exist. Please check your Procfile
์ ์ฅ์ root ๋๋ ํ ๋ฆฌ์ Procfile ํ์ผ์ ์ฐพ์ ์ ์๊ฑฐ๋ Procfile์ migrate๊ฐ ์ ์๋์ด ์์ง ์์ ๊ฒฝ์ฐ ๋ฐ์ํฉ๋๋ค.
-
ํ์ด์ง๊ฐ ์๋ํ์ง ์์ต๋๋ค.
์๋ฒ ์คํ์ ์คํจํ๊ฑฐ๋ ์๋ฒ๊ฐ ์คํ๋์ง 10๋ถ์ด ์ง๋ ์ข ๋ฃ๋์์ต๋๋ค. Procfile์ web์ ํ์ธํ์ฌ ์๋ฒ ์คํ์ ์ด์์ด ์๋์ง ํ์ธํ์ธ์. ์ด์์ด ์์ผ๋ฉด [์ด๊ธฐํ] ํ ๋ค์ ์คํํ์ธ์.
programmers์์ ์คํ๋ ๊ณผ์ ๋ ๋ค์ ํ๊ฒฝ์์ ๋์ํฉ๋๋ค.
OS ๋ฒ์ : ubuntu 16.04
๋ฉ๋ชจ๋ฆฌ ์ ํ: 1024 MiB
MySQL ๋ฒ์ : 8.0.17
node.js ๋ฒ์ : 10.14.1
npm ๋ฒ์ : 6.4.1
yarn ๋ฒ์ : 1.12.3