(์๋ # 1659์ ๊ฒ์๋์์ผ๋ฉฐ ์ถ๊ฐ ๋ ผ์๋ฅผ ์ํด ์ฌ๊ธฐ๋ก ์ด๋ํ์ต๋๋ค.)
๋๋ ์ด๊ฒ์ ๋ํด ๋ค์ ์ด๋ก์ต๋๋ค. knex ๋ฌธ์๋ ํธ๋์ญ์ ์ ๊ธฐ๋ณธ์ ์ธ ๋ถ๋ถ์ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.ํ์ง๋ง Google์์ "๋จ์ ํ ์คํธ๋ฅผ ์ํด knex.js ์ฌ์ฉ"๊ณผ "ava.js + knex"๋ฐ "ava.js + ๋ฐ์ดํฐ๋ฒ ์ด์ค"๋ฅผ ๊ฒ์ ํ ๋ , ์ข์ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค ์์๋ ํน๋ณํ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์ ์์ ๋จ์ ํ ์คํธ๋ฅผ ๋ํํ๋ ๊ฒ์ด ๊ฐ ํ ์คํธ ํ DB๋ฅผ ์ฌ์ค์ ํ๋ ์ผ๋ฐ์ ์ธ ๊ธฐ์ ์ธ Ruby ๊ฒฝํ์ผ๋ก ๋๋์๊ฐ์ต๋๋ค.
@odigity ํ ์คํธ๊ฐ ์ฐ๊ฒฐ ํ ๋์ ํ๋์ ์ฐ๊ฒฐ ๋ง ์ฌ์ฉํ๊ณ ์ฑ์ ์ค์ ์ฌ์ฉ์ ๋ํ๋ด์ง ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒํ๋ ๊ฒ์ ์ ์ํ์ง ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋์๊ฒ ์ผ์ด ๋ฌ์ง๋ง ํ ์คํธ ํ DB ์ ๋ฆฌ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ๊ฐ๋จํ ํ ๋ฒ ์ฐ๊ธฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค๋ฉด ๊ธฐ๊บผ์ด ๋ฐ์ ๋ค์์ต๋๋ค. (ํ์คํ๊ฒ ํ ์ต์ / ์ต๋๋ฅผ 1๋ก ์ค์ ํ์ต๋๋ค.) ๋์ ์ฐ๊ฒฐ์ ์ง์ํ๋ฉด์์ด๋ฅผ ์ํ ํ ์์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์ ๋ ์์ฉ ํ ๊ฒ์ ๋๋ค.
๋ํ ํ ์คํธ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ ์คํธ ์ฝ๋ ๋ด์์ ์์๋ ๋์ผํ ํธ๋์ญ์ ์์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ง ์๋ ํ ๊ตฌํํ๋ ๊ฒ์ด ๊ฑฐ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค (ํ ์คํธ์์ ํธ๋์ญ์ ์ ์์ํ ๋ค์ ์ฑ์ ์์ํ๊ณ ์์ฑ ๋ ํธ๋์ญ์ ์ ์ฑ์ ์ ๋ฌํ์ฌ ๋์ผํ ํธ๋์ญ์ ์ ๋ํ ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ์ค์ฒฉ ๋ ํธ๋์ญ์ ์ด ์ฑ๊ธํ๊ฒ ๋์ ํ ์ ์์ต๋๋ค ...).
๋ด๊ฐ ๊ธฐ๋ / ๊ธฐ๋ํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1) ๊ฐ ๋จ์ ํ
์คํธ์์ trx
๋ฅผ ์์ฑํ๋ ํธ๋์ญ์
์ ๋ง๋ญ๋๋ค.
2) ๊ทธ๋ฐ ๋ค์ ํ
์คํธํ๋ ค๋ ๋ชจ๋์ด ํ์ํ๊ณ trx
๊ฐ์ฒด๋ฅผ ๋ชจ๋ ์์ฑ์์ ์ ๋ฌํ์ฌ ๋ชจ๋์์ ์ฌ์ฉํ๋ฏ๋ก ํธ๋์ญ์
๋ด์์ ๋ชจ๋ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
3) ๋ชจ๋ ๋ฉ์๋๊ฐ ๋ฐํ ๋ ํ (๋๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด) DB์ ๊ฒฐ๊ณผ ์ํ์ ๋ํด ๋ด ์ฃผ์ฅ์ ์คํ ํ ๋ค์ trx.rollback()
๋ฅผ ํธ์ถํ์ฌ ์ฒ์๋ถํฐ ๋ค์ ํ
์คํธ๋ฅผ ์ค๋นํ๊ธฐ ์ํด ๋ชจ๋ ๊ฒ์ ์คํ ์ทจ์ํฉ๋๋ค.
๊ทธ๋์, ๊ทธ๊ฒ์ด ์ ๊ฐ ์ด๋ฃจ๊ณ ์ํ๋ ๊ฒ์ด๊ณ , ์๋ ๊ทธ๊ฒ์ ์ด๋ฃจ๋ ค๊ณ ํ๋ ๋ฐฉ์์ ๋๋ค. ๋ค์์ ๋ํด ๋ ์์ธํ ์๊ณ ์ถ์ต๋๋ค.
1) Knex.js๊ฐ ์ด๋ป๊ฒ ์๋ํ๊ณ ์ฌ์ฉ ํด์ผํ๋์ง ์คํดํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
2) ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฟ๋ ์ฝ๋์ ๋ํ ์์ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ชจ๋ฒ ์ฌ๋ก.
"knex.js๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ"์ ๋ค์ ์๋ํ๊ณ ํฅ๋ฏธ๋ก์ด ๊ฒฐ๊ณผ๋ฅผ ์ป๊ณ ์์๊ธฐ ๋๋ฌธ์ ์ด์ ฏ๋ฐค ์ธํฐ๋ท ๊ฒ์์ ์ ๋๋ก ์ํํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ง๊ธ ์ฝ์ด ๋ณด๊ฒ ์ต๋๋ค. ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋ฐฐ์ฐ๋ฉด ๋ค์ ๊ฒ์ ํ ๊ฒ์ ๋๋ค.
์๋์-์๋ฌด๊ฒ๋ ์ป์ง ๋ชปํ์ต๋๋ค. ์ถ์ฒ์ ์ฐ๋์์ผ๋ก ์์ฝ :
2016-04-21 https://medium.com/@jomaora/knex -bookshelf-mocks-and-unit-tests-cca627565d3
์ ๋ต : mock-knex๋ฅผ ์ฌ์ฉํ์ญ์์ค. DB๋ฅผ ๋ชจ์ํ๊ณ ์ถ์ง ์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ๋์์ ๋ณด์ฅํ๊ธฐ ์ํด ์ค์ MySQL DB์ ๋ํด ๋ด ๋ฉ์๋๋ฅผ ํ
์คํธํ๊ณ ์ถ์ต๋๋ค.ํ์ง๋ง ์ด์จ๋ mock-knex
์ดํด ๋ณด์์ต๋๋ค ... ์ต์
์ ์ค๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ผ ์ ์์ต๋๋ค. ๋๋ ๋ง๋ ์ ์ด ์์ต๋๋ค. :(
2016-04-28 http://mherman.org/blog/2016/04/28/test-driven-development-with-node/
์ ๋ต : ๊ฐ ํ ์คํธ ํ DB๋ฅผ ๋กค๋ฐฑ / ์ฌ ๋ง์ด๊ทธ๋ ์ด์ / ์ฌ ์๋ํฉ๋๋ค. ์ด๋ ๊ฐ ํ ์คํธ์ ๋ํด ์์ฒญ๋ ์ค๋ฒ ํค๋์ฒ๋ผ ๋ณด์ด๋ฉฐ ๋งค์ฐ ๋๋ฆฌ๊ฒ ์คํ๋ฉ๋๋ค. ๊ฐ ํ ์คํธ์ DB ์ด๋ฆ์ ๋ํ UUID๋ฅผ ์์ฑํ์ฌ ๋์์ฑ์ ๋ฌ์ฑ ํ ์ ์์ง๋ง ํธ๋์ญ์ ์ ์ฐ์ํจ์ ๋นํด ๋์ฐํ ์๋ฃจ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
2015-09-23 http://stackoverflow.com/a/32749601/210867
์ ๋ต : ํ ์คํธ์ sqlite๋ฅผ ์ฌ์ฉํ๊ณ ๊ฐ ํ ์คํธ์ ๋ํด DB๋ฅผ ์์ฑ / ํ๊ธฐํฉ๋๋ค. ์์ ์ ๊ทผ ๋ฐฉ์์ด ๋ง์์ ๋ค์ง ์๋ ๋ ๊ฐ์ง ์ด์ ๋ฅผ ๋ชจ๋ ๋ค๋ฃจ์์ต๋๋ค.
๋ฐ๋ผ์ ... ์ ์์ ๊ตฌํ๊ณ Knex ํธ๋์ญ์ ์ด ์ค์ ๋ก ์๋ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ถ๊ฐ ์ง์นจ๊ณผ์ด๋ฅผ ๋ด ์ฌ์ฉ ์ฌ๋ก์ ์ ์ ํ๊ฒ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ถ๊ฐ ์ง์นจ์ ๊ตฌํ๊ณ ์์ต๋๋ค.
@odigity ๋ ๋์ ํ ์คํธ ๊ดํ์ ๋ฉ์ง๊ฒ ์์ฝํ์ต๋๋ค ๐
๋ค์๊ณผ ๊ฐ์ด "๋จ์"ํ ์คํธ๋ฅผ ์ํํฉ๋๋ค.
์์คํ ์์, DB ์ด๊ธฐํ ๋ฐ ๋ง์ด๊ทธ๋ ์ด์ ์คํ
๊ฐ ํ ์คํธ ์ ์ ๋ชจ๋ ํ ์ด๋ธ๊ณผ ์ํ์ค๋ฅผ ์๋ฆ ๋๋ค (knex-db-manager ํจํค์ง ์ฌ์ฉ).
ํ ์คํธ ์ผ์ด์ค์ ํ์ํ ๋ฐ์ดํฐ ์ฝ์ (๋จ์ผ ๋ช ๋ น์ผ๋ก ์ค์ฒฉ ๋ ๊ฐ์ฒด ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ฝ์ ํ ์์๋ knex ๊ธฐ๋ฐ objection.js ORM์ ์ฌ์ฉํ๋ฉฐ, ๊ฐ ํ์ ๋ํด ๋ณ๋์ ์ฝ์ ์ ์ํ ํ ํ์๊ฐ ์๋๋ก ์ฝ์ ์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ต๋๋ค. ํ ์ด๋ธ์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ํ ์ด๋ธ ๋น ํ๋์ ์ฝ์ ๋ง)
1 ๊ฐ์ ํ ์คํธ๋ฅผ ์คํํ๊ณ 2 ๋จ๊ณ๋ก ์ด๋
e2e ํ ์คํธ์์๋ saveState / restoreState (pg_restore / pg_dump ์ฌ์ฉ) ๋ฉ์๋๋ฅผ ๊ตฌํํ์ฌ ํ ์คํธ ์คํ ์ค์ ํน์ ์ํ๋ก ๋กค๋ฐฑ ํ ์ ์์ผ๋ฏ๋ก 20 ์คํ ํ ์ผ๋ถ ํ ์คํธ๊ฐ ์คํจ ํ ๋๋ง๋ค ํ ์คํธ ์คํ์ ๋ค์ ์์ํ ํ์๊ฐ ์์ต๋๋ค. ๋ช ๋ถ์ ํ ์คํธ.
์ด์ ์์ํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค. ๊ฐ๋จํ๊ณ ๊ฐ๋จํ๊ณ ๋ฐ์ ํด์ผํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ชจ๋ ํ ์ด๋ธ ์๋ฅด๊ธฐ์ ๋ํ ๋น ๋ฅธ ๋์์ผ๋ก ํธ๋์ญ์ ์์ ํ ์คํธ๋ฅผ ๋ํํ๊ณ ๋กค๋ฐฑํ๋ ์ ๋ต์ ๊ณ ๋ ค ํ์ต๋๊น? ๊ตฌํ์ ํ์ ํ ์ ์๋ค๋ฉด ๊ทธ๊ฒ์ ๋์๊ฒ ์ด์์ ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋์ผํ ํ๋ก์ธ์ค์์ db์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ํ ์คํธ ์ฝ๋์์ ํธ๋์ญ์ ์ ์์ฑ ํ ๋ค์ ํด๋น ํธ๋์ญ์ ์ knex-instance๋ก ๋ฑ๋ก ํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค (knex ์ธ์คํด์ค์ ํธ๋์ญ์ ์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ๋ณด์ด์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ํธ๋์ญ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ knex ์ธ์คํด์ค์ ๊ฐ์ ์ธ์คํด์ค).
๊ทธ๋ฐ ๋ค์ ์ผ๋ฐ ํ๋ง ๋ knex ์ธ์คํด์ค ๋์ ํธ๋์ญ์ ์ ๊ฐ์ ธ์ค๊ณ ์ด๋ฅผ ํตํด ์ฟผ๋ฆฌ๋ฅผ ์์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์์ํฉ๋๋ค.
OP์์ ์ค๋ช ํ ๊ฒ๊ณผ ๊ฑฐ์ ๋์ผํฉ๋๋ค. ๋น์ ์ด ๊ทธ๊ฒ์ ์ค๋ช ํ๋ ๋ฐฉ๋ฒ์ ์คํ ๊ฐ๋ฅํ๊ฒ ๋ค๋ฆฝ๋๋ค.
๋ช ๋ ์ ์ ํ ์คํธ์์ DB๋ฅผ ์ฌ์ค์ ํ๊ธฐ ์ํด ํธ๋์ญ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ง๋ง ์ฑ์์ ์๋ํ๋ ๊ฒ๊ณผ ๊ฑฐ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ํ ์คํธ์์ ์๋ํ๊ธฐ ์ํด ์ฐ๊ฒฐ ํ๋ง์ ์ํ๊ธฐ ๋๋ฌธ์ ๊ฑฐ๋ถํ์ต๋๋ค + ์๋ฅด๊ธฐ / ์ด๊ธฐํ๊ฐ ์ถฉ๋ถํ ๋น ๋ฆ ๋๋ค.
ํ๋์ ์ผ๊ด ์ฒ๋ฆฌ์์ ์คํ๋๋ ๋ชจ๋ ์ฟผ๋ฆฌ๊ฐ ๋์ผํ ์ฐ๊ฒฐ์ ์ฌ์ฉํ์ฌ ๋จ์ผ ํธ๋์ญ์ ์ผ๋ก ๋ํ ๋ ์ ์๋๋ก ํธ๋์ญ์ ๊ธฐ๊ฐ ๋์ ์ฐ๊ฒฐ ์ ํธ๋๋ฅผ ๋ฌ์ฑ ํ ์์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์๋ฅด๊ธฐ ์ ๋ต์ ํจ๊ณผ๊ฐ ์์ง๋ง ๋งค์ฐ ๋ฌด์ฐจ๋ณ ์ ์ ๋๋ค. ํ์ฌ ๊ฐ ํ ์คํธ ํ์ผ์ test.after.always () ํํฌ๊ฐ์์ด ํด๋น ํ์ผ์ ํ ์คํธ์ ์ํฅ์๋ฐ๋ ํ ์ด๋ธ (์ผ๋ฐ์ ์ผ๋ก ํ์ผ ๋น ํ๋์ ํ ์ด๋ธ)์ ์๋ผ๋ด์ง๋ง ๊ทธ๋ก ์ธํด ๋ง๊ฐ์ง ์์๋ ๊ฐ์ฅ์๋ฆฌ ์ฌ๋ก๋ฅผ ์๊ฐํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋์ผํ ํ ์ด๋ธ์ ํฐ์นํ๋ ์๋ก ๋ค๋ฅธ ํ ์คํธ ํ์ผ์ ๋ ํ ์คํธ๊ฐ ๊ฑฐ์ ๋์์ ์คํ๋๋ ๊ฒฝ์ฐ ๋ ๋ฒ์งธ ํ์ผ์ ํ ์คํธ๊ฐ ์คํ๋๋ ๋์ ํ ํ์ผ์ ์๋ฅด๊ธฐ ํํฌ๊ฐ ์์๋์ด ํด๋น ํ ์คํธ๋ฅผ ๋ง์น ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก, Knex์์ ํธ๋์ญ์
์ด ์ ํํ ์ด๋ป๊ฒ ์๋ํ๋์ง ์์ง ๋ช
ํํ์ง ์์ต๋๋ค. knex.transaction()
๋ก trx
๋ฅผ ์์ฑํ๋ฉด trx
์ฌ์ฉํ์ฌ ์คํ๋๋ ๋ชจ๋ ์ฟผ๋ฆฌ๊ฐ ์๋์ผ๋ก ํธ๋์ญ์
์ ์ผ๋ถ๊ฐ๋ฉ๋๊น? ์๋์ผ๋ก ์ปค๋ฐ / ๋กค๋ฐฑํด์ผํฉ๋๊น? (๋ฐ์ ์ค๋ฅ๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.)
ํ๋์ ์ผ๊ด ์ฒ๋ฆฌ์์ ์คํ๋๋ ๋ชจ๋ ์ฟผ๋ฆฌ๊ฐ ๋์ผํ ์ฐ๊ฒฐ์ ์ฌ์ฉํ์ฌ ๋จ์ผ ํธ๋์ญ์ ์ผ๋ก ๋ํ ๋ ์ ์๋๋ก ํธ๋์ญ์ ๊ธฐ๊ฐ ๋์ ์ฐ๊ฒฐ ์ ํธ๋๋ฅผ ๋ฌ์ฑ ํ ์์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๋๋ ์ด๊ฒ์ ์ดํดํ์ง ๋ชปํ๋ค
์๋ฅด๊ธฐ ์ ๋ต์ ํจ๊ณผ๊ฐ ์์ง๋ง ๋งค์ฐ ๋ฌด์ฐจ๋ณ ์ ์ ๋๋ค. ํ์ฌ ๊ฐ ํ ์คํธ ํ์ผ์ test.after.always () ํํฌ๊ฐ์์ด ํด๋น ํ์ผ์ ํ ์คํธ์ ์ํฅ์๋ฐ๋ ํ ์ด๋ธ (์ผ๋ฐ์ ์ผ๋ก ํ์ผ ๋น ํ๋์ ํ ์ด๋ธ)์ ์๋ผ๋ด์ง๋ง ๊ทธ๋ก ์ธํด ๋ง๊ฐ์ง ์์๋ ๊ฐ์ฅ์๋ฆฌ ์ฌ๋ก๋ฅผ ์๊ฐํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋์ผํ ํ ์ด๋ธ์ ํฐ์นํ๋ ์๋ก ๋ค๋ฅธ ํ ์คํธ ํ์ผ์ ๋ ํ ์คํธ๊ฐ ๊ฑฐ์ ๋์์ ์คํ๋๋ ๊ฒฝ์ฐ ๋ ๋ฒ์งธ ํ์ผ์ ํ ์คํธ๊ฐ ์คํ๋๋ ๋์ ํ ํ์ผ์ ์๋ฅด๊ธฐ ํํฌ๊ฐ ์์๋์ด ํด๋น ํ ์คํธ๋ฅผ ๋ง์น ์ ์์ต๋๋ค.
ํธ๋์ญ์ ์ ์ฌ์ฉํ์ฌ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ค์ ํ๋๋ผ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ฌ ํ ์คํธ๋ฅผ ๋ณ๋ ฌ๋ก ์คํํ ์ ์์ต๋๋ค. ID ์ํ์ค๊ฐ โโ๋ค๋ฅด๋ฉฐ ํธ๋์ญ์ ์ด ๊ต์ฐฉ ์ํ๊ฐ ๋ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก, Knex์์ ํธ๋์ญ์ ์ด ์ ํํ ์ด๋ป๊ฒ ์๋ํ๋์ง ์์ง ๋ช ํํ์ง ์์ต๋๋ค. knex.transaction ()์ผ๋ก trx๋ฅผ ์์ฑํ๋ฉด trx๋ฅผ ์ฌ์ฉํ์ฌ ์คํ๋๋ ๋ชจ๋ ์ฟผ๋ฆฌ๊ฐ ์๋์ผ๋ก ํธ๋์ญ์ ์ ์ผ๋ถ๊ฐ๋ฉ๋๊น? ์๋์ผ๋ก ์ปค๋ฐ / ๋กค๋ฐฑํด์ผํฉ๋๊น? (๋ฐ์ ์ค๋ฅ๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.)
์ด๊ฒ์ ๋ฌธ์์์ ์ฐพ์ ์ ์์ต๋๋ค. knex.transaction(callback)
์ฝ๋ฐฑ์์ promise๋ฅผ ๋ฐํํ์ง ์์ผ๋ฉด ์๋์ผ๋ก ์ปค๋ฐ / ๋กค๋ฐฑํด์ผํฉ๋๋ค. ์ฝ๋ฐฑ์ด promise๋ฅผ ๋ฐํํ๋ฉด commit / rollback์ด ์๋์ผ๋ก ํธ์ถ๋ฉ๋๋ค. ๊ทํ์ ๊ฒฝ์ฐ์๋ ์๋์ผ๋ก ๋กค๋ฐฑํด์ผ ํ ๊ฒ์
๋๋ค.
ํธ๋์ญ์ ์ ์ฌ์ฉํ์ฌ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ค์ ํ๋๋ผ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ฌ ํ ์คํธ๋ฅผ ๋ณ๋ ฌ๋ก ์คํํ ์ ์์ต๋๋ค. ID ์ํ์ค๊ฐ โโ๋ค๋ฅด๋ฉฐ ํธ๋์ญ์ ์ด ๊ต์ฐฉ ์ํ๊ฐ ๋ ์ ์์ต๋๋ค.
์ฝ์ ํ๋ ๊ฐ ๋ ์ฝ๋์ ๋ํด ๋ฌด์์๋ก ID๋ฅผ ์์ฑํ๊ณ ์์ต๋๋ค. ์ถฉ๋์ ๊ฐ๋ฅํ์ง๋ง ๊ฐ๋ฅ์ฑ์ ๋ฎ์ผ๋ฉฐ ์ธ์ ๊ฐ ํ ๋ฒ ๋ฐ์ํ๋ฉด ๊ณ ๊ฐ ๋๋ฉด ์ฝ๋๊ฐ ์๋ ํ ์คํธ ์ผ๋ฟ์ ๋๋ค.
๋์์ฑ์ ๊ดํด์๋ ๋จ์ผ ํธ๋์ญ์
์ผ๋ก ๊ทธ๋ฃนํํด์ผํ๋ ๋ชจ๋ ์ฟผ๋ฆฌ๋ ๋์ผํ DB ์ฐ๊ฒฐ์ ์ฌ์ฉํด์ผํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.์ด ์ฐ๊ฒฐ์ Knex ํ ํฌ๊ธฐ๋ฅผ 1๋ก ์ค์ ํ์ฌ ์ํ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ A์์ ํ
์คํธ๋ฅผ ์ํํด์ผํฉ๋๋ค. .serial
์์ ์๋ฅผ ์ฌ์ฉํ์ฌ ์ง๋ ฌ ํ์ผ. ๊ทธ๋ฌ๋ Ava๊ฐ ๋ณ๋์ ํ์ ํ๋ก์ธ์ค์์ ๊ฐ ํ
์คํธ ํ์ผ์ ์คํํ๊ธฐ ๋๋ฌธ์ ํ
์คํธ ํ์ผ (์ฑ๋ฅ์ ๊ฐ์ฅ ์ค์ํ ์์) ๊ฐ์ ๋์์ฑ
๊ทธ๋ฅ ๊ฐ๋ด์ผ ํ ๊ฒ ๊ฐ์์.
๋๋ ๊ทธ๊ฒ์ ์๋ํ๋ค!
https://gist.github.com/odigity/7f37077de74964051d45c4ca80ec3250
ํ๋ก์ ํธ์์ ๋จ์ ํ ์คํธ๋ฅผ ์ํด Ava๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง์ด ์์ ์์๋ ๊ฐ๋ ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ด์ / ์ดํ ํํฌ๊ฐ์๋ ๋ชจ์ ๋จ์ ํ ์คํธ ์๋๋ฆฌ์ค๋ฅผ ๋ฐฉ๊ธ ๋ง๋ค์์ต๋๋ค.
ํํฌ ์
before
ํํฌ์์ ๋ฐํ ํ ์ Promise๋ฅผ ๋ง๋ค๊ณ resolve
๋ฉ์๋๋ฅผ ์บก์ฒํ์ฌ transaction()
์ฝ๋ฐฑ์์ ํธ์ถ ํ ์ ์๋๋กํฉ๋๋ค.after
ํํฌ์ ์ก์ธ์ค ํ ์์๋ ์์น์ tx
ํธ๋ค์ ์ ์ฅํฉ๋๋ค.resolve
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ "ํ
์คํธ ํ๋ ์ ์ํฌ"์ before
ํํฌ๊ฐ ์๋ฃ๋์์์ ์๋ฆฌ๊ณ ํ
์คํธ๋ฅผ ์์ํ ์ ์์ต๋๋ค.ํ
์คํธ โ ์ ์ฅ๋ tx
ํธ๋ค์ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ ์ฝ์
์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค.
ํํฌ ์ดํ โ ์ ์ฅ๋ tx
ํธ๋ค์ ์ฌ์ฉํ์ฌ ํธ๋์ญ์
์ ๋กค๋ฐฑํ๋ฏ๋ก ํ
์คํธ ์ค์ ์ด๋ฃจ์ด์ง ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ทจ์ํฉ๋๋ค. ๋ฐ์ดํฐ๋ ์ปค๋ฐ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํ
์คํธ์ ํ๋์์ ๋ณด๊ฑฐ๋ ๋ฐฉํด ํ ์๋ ์์ต๋๋ค.
Knex
Knex๋ฅผ ์ฌ์ฉํ๋ฉด ์ฐ๊ฒฐ ํ ํฌ๊ธฐ์ ๋ํ ์ต์ ์ ์ง์ ํ ์ ์์ต๋๋ค. ํธ๋์ญ์ ์ ๋ชจ๋ ์ฟผ๋ฆฌ๊ฐ ๋์ผํ ์ฐ๊ฒฐ์์ ์คํ๋๋๋กํด์ผํ๋ ๊ฒฝ์ฐ (์ฐ๋ฆฌ๊ฐ ์ํํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค) ํ ํฌ๊ธฐ๋ฅผ 1๋ก ์ค์ ํ์ฌ์ด๋ฅผ ๋ฌ์ฑ ํ ์ ์์ต๋๋ค.
_ํ์ง๋ง ๊ธฐ๋ค๋ ค ..._ ์์ค ์์์ด ๋๊ธ์ ํ์ธํ์ธ์.
// We need to make a client object which always acquires the same
// connection and does not release back into the pool.
function makeTxClient(trx, client, connection) {
๋ด๊ฐ ์ด๊ฒ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด ํ์ด 1๋ณด๋ค ํฌ๋๋ผ๋ ํธ๋์ญ์ ์ ๋ชจ๋ ์ฟผ๋ฆฌ๊ฐ ๋์ผํ ์ฐ๊ฒฐ์ ํต๊ณผํ๋๋ก Knex๋ฅผ ์ ๋ขฐํ ์ ์์์ ์๋ฏธํฉ๋๋ค! ๋ฐ๋ผ์ ์๋๋ฆฌ์ค๋ฅผ ์ํด์ด ํน์ ์์ค์ ๋์์ฑ์ ํฌ์ ํ ํ์๊ฐ ์์ต๋๋ค.
BTW โ ๋ฌธ์๋ ์๋ง๋์ด ํ์์ ์ด๊ณ ๋๋ผ์ด ์ฌ์ค์ ๋ฐ์ํด์ผํฉ๋๋ค.
Ava
_Knex ์ ์ฉ์ด ์๋๋ผ Ava ์ ์ฉ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๋๋ฆฌ ์ฌ์ฉ๋๋ ํ๋ ์ ์ํฌ์ด๋ฉฐ ๋๋ถ๋ถ์ ํ๋ ์ ์ํฌ์ ๊ด๋ฒ์ํ๊ฒ ์ ์ฉ ํ ์ ์์ต๋๋ค ._
Ava๋ ๊ฐ ํ
์คํธ ํ์ผ์ ๋ณ๋์ ํ๋ก์ธ์ค์์ ๋์์ ์คํํฉ๋๋ค. ๊ฐ ํ๋ก์ธ์ค ๋ด์์ ๋ชจ๋ ํ
์คํธ๋ฅผ ๋์์ ์คํํฉ๋๋ค. --serial
CLI ์ต์
(๋ชจ๋ ํญ๋ชฉ์ ์ง๋ ฌํ) ๋๋ test
๋ฉ์๋์ .serial
์์ ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ง ํํ์ ๋์์ฑ์ ๋นํ์ฑํ ํ ์ ์์ต๋๋ค (๋๋จธ์ง๋ฅผ ๋์์ ์คํํ๊ธฐ ์ ์ ํ์๋ ํ
์คํธ๋ฅผ ์ง๋ ฌํ ํจ). ).
์์ฝ
์ด ๋ชจ๋ ์ฌ์ค์ ์ข ํฉํ๋ฉด :
ํธ๋์ญ์ ์์ ๊ฐ ํ ์คํธ๋ฅผ ๋ํ ํ ์ ์์ผ๋ฏ๋ก (a) ํ ์คํธ ๋ฐ์ดํฐ ์ถฉ๋ ๋ฐฉ์ง (b) ์๋ฅด๊ธฐ ๋๋ ๋ค์ ๋ง์ด๊ทธ๋ ์ด์ ์์ด ์๋ ํ ์คํธ ํ ์ ๋ฆฌ๊ฐ ๋ณด์ฅ๋ฉ๋๋ค. ์ฌ์ค,์ด ์ ๋ต์ ์ฌ์ฉํ๋ฉด ๋ด ํ ์คํธ DB์๋ ํ์ ์๋ ๋ฐ์ดํฐ ์ธ์๋ ๋ง ๊ทธ๋๋ก ๋จ์ผ ๋ ์ฝ๋๊ฐ ์ ์ง๋์ง ์์ต๋๋ค.
๊ฐ ํ ์คํธ ํ์ผ์ด ๋ณ๋์ ํ๋ก์ธ์ค์์ ์คํ๋๋ฏ๋ก ์์ฒด Knex ์ฐ๊ฒฐ ํ์ ๊ฐ๊ฒ๋๋ฏ๋ก Ava์ ํ ์คํธ ํ์ผ ๊ฐ ๋์์ฑ์ ์ด์ ์ ๊ณ์ ๋๋ฆด ์ ์์ต๋๋ค.
๋ด ์ฐ๊ฒฐ ํ์ธ์ง ํ์ธ ๋ง์ฝ ๋ด๊ฐ ์๋ฐ์ ๋ด testfile ์ ๋์์ฑ์ ํํ์ ๊ณ์ํ ์> = ํ์ผ์ ํ ์คํธ์ ์. ์ด๊ฒ์ ํ๋์ ํ์ผ์ ์์ฒญ๋ ์์ ํ ์คํธ๋ฅผ ๋ฃ์ง ์๋ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ์ด์จ๋ ํผํ๋ ค๊ณ ๋ ธ๋ ฅํฉ๋๋ค. ๋ํ ํ์ 1-10๊ณผ ๊ฐ์ ๋ฒ์๋ก ์ค์ ํ ์ ์์ผ๋ฏ๋ก ํ์ํ์ง ์์ ์ฐ๊ฒฐ์ ๋ง๋ค์ง ์์ง๋ง ํ ์คํธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐ ํ ๋๋ง๋ค ๊ฐ ํ ์คํธ ํ์ผ์์ ์์๋ฅผ ์กฐ์ ํ ํ์๊ฐ ์์ต๋๋ค.
๋๋ ๋์์ ๋์๊ฒ ์๋ก์ด ์๋ง์ ๊ธฐ์ ์ ๊ต์ฐจ์ ์ ์์ ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์๊ฐ์ ์ป๊ณ ์ถ์ดํฉ๋๋ค ...
@odigity yup, BEGIN
์ฟผ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ ์ ์ฉ ์ฐ๊ฒฐ์ ๋ํ ํธ๋ค ์ผ๋ฟ์
๋๋ค (์ค์ ๋ก SQL์ ํธ๋์ญ์
์ ์ผ๋ฐ์ ์ผ๋ก BEGIN์ด ์ถ๊ฐ ๋ ๋์ผํ ์ฐ๊ฒฐ๋ก๊ฐ๋ ์ฟผ๋ฆฌ์
๋๋ค).
knex๊ฐ ํธ๋์ญ์ ์ ๋ํ ์ฐ๊ฒฐ์ ํ ๋นํ์ง ์์ผ๋ฉด ํธ๋์ญ์ ์ด ์ ํ ์๋ํ์ง ์์ต๋๋ค.
uuid ํค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ๋์์ง ์์ต๋๋ค. ์ค์ ๋ก ํ์ด ๋ง์ง ์์ผ๋ฉด ์ถฉ๋์ด ๋ณ๊ฒฝ ๋ ๊ฐ๋ฅ์ฑ์ด ๊ฑฐ์ ์์ต๋๋ค. ( "128 ๋นํธ UUID๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ '์์ผ ํจ๊ณผ'๋ ๊ฐ ํค์ 128 ๋นํธ ์ํธ๋กํผ๊ฐ์๋ ๊ฒฝ์ฐ ์ฝ 2 ^ 64 ๊ฐ์ ํค๋ฅผ ์์ฑ ํ ํ ์ถฉ๋์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์์ ์๋ ค์ค๋๋ค.")
๋ต์ ์์ ๋ธ ๊ฒ ๊ฐ์ผ๋ ์ด๊ฑธ ๋ซ์ผ์ธ์ ๐
๋ค์ ์ด์ด์ ๋ฏธ์ํ์ง๋ง ์ด์ ์์์น ๋ชปํ ๋์์ ๊ด์ฐฐํ๊ณ ์์ต๋๋ค. ํนํ, ์๋ํ์ง ์์์ผ ํ ๋ ์๋ํ๋ฏ๋ก ๋ด ์ดํด์ ์์ ์ด ํ์ํฉ๋๋ค.
ํ ํฌ๊ธฐ๋ฅผ 1๋ก ์ค์ ํ๊ณ ํธ๋์ญ์ ์ ์ฐ ๋ค์์ด๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด ์ฐ๊ฒฐ์ ์ป์ ์ ์๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ด๊ณผ๋ฉ๋๋ค. ์ด๋ ํด๋น ์ฐ๊ฒฐ์ด ์ด๋ฏธ ํธ๋์ญ์ ์ ์ํด ์ ๊ฒจ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ฌ๋ ํ ํฌ๊ธฐ๋ฅผ 1๋ก ์ค์ ํ๊ณ 4 ๊ฐ์ ํ ์คํธ๋ฅผ ๋์์ ์คํํ๋ฉด ๊ฐ ํ ์คํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ชจ๋ ์๋ํฉ๋๋ค. ์๋ํ์ง ์์์ผํฉ๋๋ค. ์ต์ํ ๋ช ๊ฐ๋ ์ฐ๊ฒฐ ๋ถ์กฑ์ผ๋ก ์ธํด ์ ๊ฒผ์ด์ผํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ ์์ ์ผ๋ก ์๋ํฉ๋๋ค.
Knex์๋ ๋น์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ฐ๊ฒฐ์ด์๋ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ๋ฅผ์ํ ๊ธฐ๋ณธ ์ ๊ณต ๋๊ธฐ์ด์ด ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด tx๊ฐ ์๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ ์ ํธ๋์ญ์ ์ด ์๋ฃ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ฒซ ๋ฒ์งธ ์์ ๊ฐ ์คํจํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์๋๋ฉด Knex๋ ์ด๋ป๊ฒ ๋ ์ฌ๋ฌ ๋์ ํธ๋์ญ์ ์ ๋จ์ผ ์ฐ๊ฒฐ๋ก ๋ค์คํํฉ๋๊น?
์๋๋ฉด Knex๊ฐ ์ค์ ๋ก 2 ์ฐจ, 3 ์ฐจ ๋ฐ 4 ์ฐจ ํธ์ถ์์ ํ์ ํธ๋์ญ์ ์ ์์ฑํ๊ณ ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์๋ง๋ ๋ฌด์์๋ก ์์๋๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ๊ฒ์ ๋๋ค ...
@odgity ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ธก ๊ต์ฐฉ ์ํ๊ฐ ์์ต๋๋ค (์ฑ์ด ์ฐ๊ฒฐ ๋๊ธฐ ์ค ๋ฉ์ถค ๋ฐ ์ฐ๊ฒฐ ์๊ฐ ์ด๊ณผ ํธ๋ฆฌ๊ฑฐ ํ๋).
๋ ๋ฒ์งธ ๊ฒฝ์ฐ ํ ์คํธ๋ ์ค์ ๋ก ์ง๋ ฌ๋ก ์คํ๋ฉ๋๋ค. ํ๋๋ฅผ ์ ์ธํ ๋ชจ๋ ์ฌ๋์ด ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ณ๋ ฌ๋ก ์ํํ๋ ํ ์คํธ๊ฐ ์ถฉ๋ถํ๊ฑฐ๋ ํ ์คํธ ์ผ์ด์ค๊ฐ ์ ๋ง ๋๋ฆฐ ๊ฒฝ์ฐ acquireConnectionTimeout์ด ๋ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ ํธ๋ฆฌ๊ฑฐ๋์ด์ผํฉ๋๋ค.
๋จ์ผ ์ฐ๊ฒฐ์์ ํธ๋์ญ์ ์ ๋ค์คํ ํ ์ ์์ต๋๋ค. ์ค์ฒฉ ํธ๋์ญ์ ์ ํธ๋์ญ์ ๋ด๋ถ์ ์ ์ฅ ์ ์ ์ฌ์ฉํ์ฌ knex์์ ์ง์๋ฉ๋๋ค. ํ์์ ์๋ก์ด ํธ๋์ญ์ ์ ์์ฒญํ๋ ๊ฒฝ์ฐ๋ ๋ฐ์ํ์ง ์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค. ์ ๋ง ๋์์ด๋ฉ๋๋ค.
์ด๋ฆฐ ํธ๋์ญ์ ์์ ์ฐ๊ฒฐ์ ๊ฐ์ ธ์ฌ ๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ์ด์ ์ ๋ํด ์ฌ์ ํ ์ฝ๊ฐ ํผ๋ ์ค๋ฝ์ง๋ง ๋ ๋ฒ์งธ ์ ํธ๋์ญ์ ์ ์ด๋ ค๊ณ ์๋ํ๋ฉด ์ฐธ์์ฑ์๊ฒ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์๋ฃ๋ฉ๋๋ค.
DEBUG = knex : * ํ๊ฒฝ ๋ณ์๋ก ์ฝ๋๋ฅผ ์คํํ๋ฉด ํ์ด ์ด๋ค ์ผ์ํ๋์ง ์ ์ ์์ต๋๋ค. Knex๋ ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ "I couldnt get connection"์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผํฉ๋๋ค. ๋ฐ๋ผ์ ๋ ๋ฒ์งธ ์ฐ๊ฒฐ์ด ํ๋ ๋ ๋๊น์ง ํธ๋์ญ์ ์ด ๋๊ธฐ์ค์ธ ๊ฒฝ์ฐ ๋ ์ฐ๊ฒฐ์ด ์๋ก๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ค์ ๊ต์ฐฉ ์ํ์ ๋๋ค (ํ์ง๋ง ์ด๊ฒ์ด ๊ทํ์ ๊ฒฝ์ฐ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค).
์ด ์ค๋ ๋๊ฐ ๋งค์ฐ ์ ์ฉํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค๋ ์์คํ ์ํ๋ฅผ ์ค์ผ์ํค์ง ์๋ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐ ๊ด์ฌ์ด ์๋ค๋ ๊ฒ์ ์๊ฒ๋์ด ๊ธฐ์ฉ๋๋ค. ๋๋ ์ฌ๋๋ค์ด ํ ์คํธ๊ฐ ์๋ฃ๋ ํ ๋กค๋ฐฑ๋๋ knex๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋์ ๋ํ ํ ์คํธ๋ฅผ ์์ฑํ ์์๋ ํ๋ก์ ํธ๋ฅผ ์์ํ์ต๋๋ค.
์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ @ bas080 ์ ํ ์คํธ ํ ์์๋ ํญ๋ชฉ์ ์ ํํฉ๋๋ค (ํ ์คํธ๊ฐ ๋จ์ผ ํธ๋์ญ์ ๋ง ์ฌ์ฉํ๋๋ก ํ์ฉ). ๋ค์ค ์ฐ๊ฒฐ / ๋์ ํธ๋์ญ์ ์ ์ฌ์ฉํ๋ ์ฝ๋ ํ ์คํธ๋ฅผ ๋ฐฉ์งํฉ๋๋ค. ๋ํ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์์ ์ ์ปค๋ฐ์ ์ํํ๋ ์ฝ๋๋ฅผ ํ ์คํธ ํ ์ ์์ต๋๋ค (์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ ์๋).
ํธ๋์ญ์ ์ ์ฌ์ฉํ์ฌ ํ ์คํธ๋ฅผ ์คํ ํ ํ ์ํ๋ฅผ ์ฌ์ค์ ํ๋ ๊ฒ์ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ํจํด์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ฐ์กฐํ๊ณ ์ถ์ ๊ฒ์ ํด๋น ์ ๊ทผ ๋ฐฉ์ ๋ง ์ฌ์ฉํ๋ฉด ํน์ ํญ๋ชฉ์ ํ ์คํธ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋๋ ํญ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ๊ฐ ํ ์คํธ ํ ๋๋ ์๋ก ์์กดํ๋ ์ผ๋ถ ํ ์คํธ ์ธํธ ํ์ DB๋ฅผ ์๋ฅด๊ณ ๋ค์ ์ฑ์ฐ๋ ๊ฒ์ ์ ํธํ์ต๋๋ค (50ms ์ด์์ฒ๋ผ ์ฑ์ฐ๊ธฐ๊ฐ ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ์์ ์ด์ ๋ก์ด ์์ ์ ์ํํฉ๋๋ค).
์๋ ,์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ด์ด์ ๋ฏธ์ํ์ง๋ง knex์ cli๊ฐ ๊ฐ์ง ๋ฐ์ดํฐ๋ก ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ _seedํ๋ ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ์์ ํ์ต๋๋ค.
๋จ์ ํ
์คํธ์ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ ์ฒด์ธ์ ๋์ toString()
๋ฅผ ์ฌ์ฉํ์ฌ SQL ๋ํผ์์ Knex๊ฐ ์คํ ํ ์ฟผ๋ฆฌ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์๋์ง ํ์ธํ์ต๋๋ค. ํตํฉ ํ
์คํธ๋ฅผ ์ํด ์ด๋ฏธ ์์ ๋์ด๋ ์ ๋ต์ ์ฌ์ฉํ์ต๋๋ค. ์ฆ, ๋ชจ๋ ํ
์คํธ ์ ์ ๋กค๋ฐฑ-> ๋ง์ด๊ทธ๋ ์ด์
-> ์๋๋ฅผ ์ํํ๋ ๊ฒ์
๋๋ค. ์๋ ๋ฐ์ดํฐ๋ฅผ ์๊ฒ ์ ์งํ ์ ์์ผ๋ฉด ๋๋ฌด ๋๋ฆด ์ ์์ง๋ง ๋ค๋ฅธ ์ฌ๋์๊ฒ๋ ์ ํฉ ํ ์ ์์ต๋๋ค.
์ฆ, ๋ชจ๋ ํ ์คํธ ์ ์ ๋กค๋ฐฑ-> ๋ง์ด๊ทธ๋ ์ด์ -> ์๋๋ฅผ ์ํํฉ๋๋ค.
๊ทธ๋ ๊ฒํ๋ ๊ฒ์ ์ ๋ง ๋์ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ง์ด๊ทธ๋ ์ด์ ์ ์๋ค๋ก ์คํํ๋ ๋ฐ ์๋ฐฑ ๋ฐ๋ฆฌ ์ด๊ฐ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋๋ฌด ๋๋ฆฝ๋๋ค. ์ ์ฒด ํ ์คํธ ์ค์ํธ์ ๋ํด ๋ง์ด๊ทธ๋ ์ด์ ์ ํ ๋ฒ๋ง ์คํ ํ ๋ค์ ํ ์คํธ ์ ์ ๋ชจ๋ ํ ์ด๋ธ์ ์๋ผ ๋ด๊ณ ์ ์ ํ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ฑ์์ผํฉ๋๋ค. ์ ์ฒด ์คํค๋ง๋ฅผ ๋กค๋ฐฑ / ์ฌ ์์ฑํ๋ ๊ฒ๋ณด๋ค 100 ๋ฐฐ ๋ ๋น ๋ฅด๊ฒ ์ํ ํ ์ ์์ต๋๋ค.
knex-cleaner ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ํ ์ด๋ธ์ ์ฝ๊ฒ
knexCleaner
.clean(knex, { ignoreTables: ['knex_migrations', 'knex_migrations_lock'] })
.then(() => knex.seed.run())
๊ฐ ํ
์คํธ ์ค์ํธ ์คํ์ ์์ํ ๋ ๋ง์ด๊ทธ๋ ์ด์
์ ์คํํ๋ ๊ฒฝ์ฐ ignoreTables
๋ถ๋ถ์ โโ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค. ํ
์คํธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
์ ์คํํ๋ ๊ฒฝ์ฐ์๋ง ํ์ํฉ๋๋ค.
@ricardograca ์ธ๋ ํค๊ฐ์๋ ์ผ์ด์ค๋ฅผ ์ ์ฒ๋ฆฌํฉ๋๊น? (์ญ์ ์์๊ฐ ์๋ชป๋์ด ์ฒญ์๊ฐ ์คํจํ์ง ์์์ ์๋ฏธ)
๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์์ ํ๊ธฐ ์ฝ์ต๋๋ค (๋จ์ผ ์ฟผ๋ฆฌ๋ก ๋ชจ๋ ํ ์ด๋ธ์ ์๋ผ ๋ด๋ฉด๋ฉ๋๋ค). :)
@elhigu ์ด๋ป๊ฒ ํ ์ ์์ต๋๊น?
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค. https://github.com/Vincit/knex-db-manager/blob/master/lib/PostgresDatabaseManager.js#L95
@kibertoad ์, ์ธ๋ ํค ์ ์ฝ ์กฐ๊ฑด์ ์ ์ฒ๋ฆฌํ๊ณ ๋ชจ๋ ๊ฒ์ ์ญ์ ํฉ๋๋ค.
@odigity ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ํ ์คํธํ๋ฉด
// controller.js
const users = require('./usersModel.js');
module.exports.addUser = async ({ token, user }) => {
// check token, or other logic
return users.add(user);
};
// usersModel.js
const db = require('./db');
module.exports.add = async user => db('users').insert(user);
// db.js
module.exports = require('knex')({ /* config */});
๋๋ ๋ชจ๋ ํจ์๊ฐ ํธ๋์ญ์
์ ์ค์ ์ฟผ๋ฆฌ ๋น๋๋ก ์ ๋ฌํ๊ธฐ ์ํด ์ถ๊ฐ ์ธ์ (์ trx
)๋ฅผ ๊ฐ์ ธ์ผํฉ๋๋ค.
https://knexjs.org/#Builder -transacting
์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
beforeEach
trx๋ฅผ ๋ง๋ญ๋๋ค.require('./db')
sould return trx value.ํ์ง๋ง knex๋ก ๊ฐ๋ฅํ ๊น์?
์ฝ๋๊ฐ ๋ค๋ฅธ ํธ๋์ญ์
์ ์ฌ์ฉํ๋ฉด ์ด๋ป๊ฒ๋ฉ๋๊น?
๋ ๋ค๋ฅธ ์ต์ : ์ฟผ๋ฆฌ ์คํ์ ์์ํ๋ ๊ธฐ๋ฅ์ด์์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํ ์คํธ ํธ๋์ญ์ ์์ ๊ฐ์ ์คํ๋๋๋ก ์ฌ์ ์ ํ ์ ์์ต๋๋ค.
knex ์ฝ๋๋ฅผ ์ฝ์ ํ์ด ๋ฐฉ๋ฒ์ ์๋ํฉ๋๋ค.
test.beforeEach(async t => {
// if we use new 0.17 knex api knex.transaction().then - we can not handle rollback error
// so we need to do it in old way
// and add empty .catch to prevent unhandled rejection
t.context.trx = await new Promise(resolve => db.transaction(trx => resolve(trx)).catch(() => {}));
t.context.oldRunner = db.client.runner;
db.client.runner = function(builder) {
return t.context.oldRunner.call(t.context.trx.client, builder);
};
t.context.oldRaw = db.raw;
db.raw = function(...args) {
return t.context.oldRaw.call(this, ...args).transacting(t.context.trx);
};
});
test.afterEach(async t => {
db.raw = t.context.oldRaw;
db.client.runner = t.context.oldRunner;
await t.context.trx.rollback();
});
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ฝ๊ฐ ์๋ํฉ๋๋ค. ๊ทธ๋์ .raw
๋ฐ .client.runner
๋ฉ์๋๋ฅผ ์ฌ์ ์ํฉ๋๋ค. .client.runner
.then
๋ ์ฟผ๋ฆฌ ์์ฑ๊ธฐ๋ฅผ db
๋ knex ํด๋ผ์ด์ธํธ knex({ /* config */})
์
๋๋ค.
๋ด๊ฐ ์ด๋ฏธ ์ฌ๊ธฐ์์ ์ค๋ช ํ๋ฏ์ด @Niklv ; ํธ๋์ญ์ ์ ์ฌ์ฉํ์ฌ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ค์ ํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๋์ ์๊ฐ์ด๋ฉฐ ๋ฐ ํจํด์ผ๋ก ๊ฐ์ฃผ ํ ์๋ ์์ต๋๋ค. ๊ทธ๋์ knex ๋ด๋ถ๋ฅผ ์ฌ์ ์ํฉ๋๋ค. ๋ชจ๋ ํ ์คํธ ๋๋ ํ ์คํธ ์ธํธ์์ db๋ฅผ ์๋ฅด๊ณ ๋ค์ ์ฑ์ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํ ์คํธ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์ ๋นํ๋ฉด ์ํํ๋ ๋ฐ ๋ช ๋ฐ๋ฆฌ ์ด๊ฐ ๊ฑธ๋ฆฌ์ง ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋์-์๋ฌด๊ฒ๋ ์ป์ง ๋ชปํ์ต๋๋ค. ์ถ์ฒ์ ์ฐ๋์์ผ๋ก ์์ฝ :
2016-04-21 https://medium.com/@jomaora/knex -bookshelf-mocks-and-unit-tests-cca627565d3
์ ๋ต : mock-knex๋ฅผ ์ฌ์ฉํ์ญ์์ค. DB๋ฅผ ๋ชจ์ํ๊ณ ์ถ์ง ์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ๋์์ ๋ณด์ฅํ๊ธฐ ์ํด ์ค์ MySQL DB์ ๋ํด ๋ด ๋ฉ์๋๋ฅผ ํ ์คํธํ๊ณ ์ถ์ต๋๋ค.ํ์ง๋ง ์ด์จ๋
mock-knex
์ดํด ๋ณด์์ต๋๋ค ... ์ต์ ์ ์ค๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ผ ์ ์์ต๋๋ค. ๋๋ ๋ง๋ ์ ์ด ์์ต๋๋ค. :(2016-04-28 http://mherman.org/blog/2016/04/28/test-driven-development-with-node/
์ ๋ต : ๊ฐ ํ ์คํธ ํ DB๋ฅผ ๋กค๋ฐฑ / ์ฌ ๋ง์ด๊ทธ๋ ์ด์ / ์ฌ ์๋ํฉ๋๋ค. ์ด๋ ๊ฐ ํ ์คํธ์ ๋ํด ์์ฒญ๋ ์ค๋ฒ ํค๋์ฒ๋ผ ๋ณด์ด๋ฉฐ ๋งค์ฐ ๋๋ฆฌ๊ฒ ์คํ๋ฉ๋๋ค. ๊ฐ ํ ์คํธ์ DB ์ด๋ฆ์ ๋ํ UUID๋ฅผ ์์ฑํ์ฌ ๋์์ฑ์ ๋ฌ์ฑ ํ ์ ์์ง๋ง ํธ๋์ญ์ ์ ์ฐ์ํจ์ ๋นํด ๋์ฐํ ์๋ฃจ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
2015-09-23 http://stackoverflow.com/a/32749601/210867
์ ๋ต : ํ ์คํธ์ sqlite๋ฅผ ์ฌ์ฉํ๊ณ ๊ฐ ํ ์คํธ์ ๋ํด DB๋ฅผ ์์ฑ / ํ๊ธฐํฉ๋๋ค. ์์ ์ ๊ทผ ๋ฐฉ์์ด ๋ง์์ ๋ค์ง ์๋ ๋ ๊ฐ์ง ์ด์ ๋ฅผ ๋ชจ๋ ๋ค๋ฃจ์์ต๋๋ค.
๋ฐ๋ผ์ ... ์ ์์ ๊ตฌํ๊ณ Knex ํธ๋์ญ์ ์ด ์ค์ ๋ก ์๋ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ถ๊ฐ ์ง์นจ๊ณผ์ด๋ฅผ ๋ด ์ฌ์ฉ ์ฌ๋ก์ ์ ์ ํ๊ฒ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ถ๊ฐ ์ง์นจ์ ๊ตฌํ๊ณ ์์ต๋๋ค.