Knex: Knex๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•.

์— ๋งŒ๋“  2017๋…„ 05์›” 21์ผ  ยท  28์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: knex/knex

(์›๋ž˜ # 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) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋‹ฟ๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ ์›์ž ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€.

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•„๋‹ˆ์š”-์•„๋ฌด๊ฒƒ๋„ ์–ป์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ถœ์ฒ˜์˜ ์—ฐ๋Œ€์ˆœ์œผ๋กœ ์š”์•ฝ :

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 ํŠธ๋žœ์žญ์…˜์ด ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ง€์นจ๊ณผ์ด๋ฅผ ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ์ ˆํ•˜๊ฒŒ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ง€์นจ์„ ๊ตฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  28 ๋Œ“๊ธ€

"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 ๋Š” ๋‚˜์œ ํ…Œ์ŠคํŠธ ๊ด€ํ–‰์„ ๋ฉ‹์ง€๊ฒŒ ์š”์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

๋‹ค์Œ๊ณผ ๊ฐ™์ด "๋‹จ์œ„"ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์‹œ์Šคํ…œ ์‹œ์ž‘, DB ์ดˆ๊ธฐํ™” ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹คํ–‰

  2. ๊ฐ ํ…Œ์ŠคํŠธ ์ „์— ๋ชจ๋“  ํ…Œ์ด๋ธ”๊ณผ ์‹œํ€€์Šค๋ฅผ ์ž๋ฆ…๋‹ˆ๋‹ค (knex-db-manager ํŒจํ‚ค์ง€ ์‚ฌ์šฉ).

  3. ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์‚ฝ์ž… (๋‹จ์ผ ๋ช…๋ น์œผ๋กœ ์ค‘์ฒฉ ๋œ ๊ฐ์ฒด ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์‚ฝ์ž… ํ•  ์ˆ˜์žˆ๋Š” knex ๊ธฐ๋ฐ˜ objection.js ORM์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ฐ ํ–‰์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์‚ฝ์ž…์„ ์ˆ˜ํ–‰ ํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก ์‚ฝ์ž…์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์— ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ํ…Œ์ด๋ธ” ๋‹น ํ•˜๋‚˜์˜ ์‚ฝ์ž… ๋งŒ)

  4. 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๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/bas080/knest

์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ @ 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

์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. beforeEach trx๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. ์–ด๋–ป๊ฒŒ ๋“  ์ฃผ์ž…ํ•˜์‹ญ์‹œ์˜ค. ๋‚ด ์˜ˆ์—์„œ require('./db') sould return trx value.
  3. ํ…Œ์ŠคํŠธ๋ฅผํ•˜์‹ญ์‹œ์˜ค.
  4. 'afterEach'์—์„œ trx๋ฅผ ๋กค๋ฐฑํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ 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๋ฅผ ์ž๋ฅด๊ณ  ๋‹ค์‹œ ์ฑ„์šฐ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ์ ๋‹นํ•˜๋ฉด ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋ช‡ ๋ฐ€๋ฆฌ ์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

npow picture npow  ยท  3์ฝ”๋ฉ˜ํŠธ

zettam picture zettam  ยท  3์ฝ”๋ฉ˜ํŠธ

mtom55 picture mtom55  ยท  3์ฝ”๋ฉ˜ํŠธ

rarkins picture rarkins  ยท  3์ฝ”๋ฉ˜ํŠธ

nklhrstv picture nklhrstv  ยท  3์ฝ”๋ฉ˜ํŠธ