TDD ๋ฏธ์…˜ ์‹œ์ž‘๐Ÿ”

seuls2ยท2023๋…„ 5์›” 30์ผ

tdd ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ

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

์ฃผ์ œ ์„ ์ •

์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ์ฃผ์ œ๋กœ, ์ธ๋„ค์ผ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์›น์œผ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.
๋ฒจ๋กœ๊ทธ ๊ธ€์„ ์˜ฌ๋ฆด ๋•Œ๋งˆ๋‹ค ์ธ๋„ค์ผ ์ด๋ฏธ์ง€๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ, ์ผ์ผ์ด ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ƒ๊ฐ๋ณด๋‹ค ๊ท€์ฐฎ๊ธฐ๋„ ํ•˜๊ณ  ๋ฒˆ๊ฑฐ๋กœ์›Œ์„œ ์ธ๋„ค์ผ ์ƒ์„ฑ ์›น์„ ์ง์ ‘ ๋งŒ๋“ค๋ฉด ์ž์ฃผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ณ ,
๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ์นœ๊ตฌ๋“ค ์ค‘ ์ธ๋„ค์ผ์ด ํ•„์š”ํ•œ ์นœ๊ตฌ๊ฐ€ ์žˆ์œผ๋ฉด ์‚ฌ์ดํŠธ๋ฅผ ๊ฐ™์ด ๊ณต์œ ํ•ด์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„ ์ด๋ ‡๊ฒŒ ์ฃผ์ œ๋ฅผ ์„ ์ •ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค ๐Ÿ˜บ

ํ…Œ์ŠคํŠธ ๋ช…์„ธ ์ž‘์„ฑ

์šฐ์„  ์ฑŒ๋ฆฐ์ง€ 1์ฃผ์ฐจ ๋ฏธ์…˜์œผ๋กœ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๋ฐ ๋ช…์„ธ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.
(๊ณต์œ ๋ฅผ ์œ„ํ•ด ๋…ธ์…˜์œผ๋กœ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜์˜€๋‹ค)
1์ฃผ์ฐจ ๋ฏธ์…˜

์šฐ์„  ํ…Œ์ŠคํŠธ ๋ช…์„ธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์œ„์ฃผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ™”๋ฉด UI๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค.

๊ฐœ๋ฐœํ™˜๊ฒฝ ๋ฐ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ๋„๊ตฌ

ํ”„๋ก ํŠธ์—”๋“œ๋Š” React, TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๊ณ 
ํ…Œ์ŠคํŠธ๋„๊ตฌ๋กœ๋Š” ๋™์ค€๋‹˜๊ป˜์„œ ๊ฐ€์ด๋“œํ•ด์ฃผ์‹  Cypress๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.
Cypress๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ ํ”„๋ŸฐํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋ผ๊ณ  ํ•œ๋‹ค.
cypress ๊ณต์‹ ์‚ฌ์ดํŠธ

npm install cypress --save-dev
npx cypress open

๋กœ ์„ค์น˜ ๋ฐ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋œ๋‹ค.
๋‚˜๋Š” cypress๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ๋˜๋Š” ๊ฒƒ๋„ ํ…Œ์ŠคํŠธํ•ด๋ณด์•„์•ผ ํ•ด์„œ

npm i cypress-file-upload

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ–ˆ๋‹ค.

ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋ถ€ํ„ฐ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ธฐ


์›น์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์€ "์ธ๋„ค์ผ์— ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์ด๋ฏธ์ง€ ํฌ๋งท์œผ๋กœ ์ €์žฅํ•œ๋‹ค." ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋ถ€ํ„ฐ ๋จผ์ € ๊ตฌํ˜„ํ•˜๊ณ , ์ฐจ๋ก€๋กœ ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋ช…์„ธ๋กœ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ–ˆ๋‹ค.

์‹œํ–‰์ฐฉ์˜ค์™€ ๋А๋‚€์ 

1. html ๐Ÿ‘‰ ์ด๋ฏธ์ง€ํ™”์‹œํ‚ค๊ธฐ

html์„ ์ด๋ฏธ์ง€ํ™”์‹œํ‚ค๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ html2canvas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
ํ•ต์‹ฌ๊ธฐ๋Šฅ์„ ๋จผ์ € ๋งŒ๋“ค๊ณ , css๋ฅผ ์ ์šฉํ•˜๋ฉด์„œ๋ถ€ํ„ฐ input ์•ˆ์˜ ํ…์ŠคํŠธ๋“ค์ด ๋‹ค์šด๋กœ๋“œ๋ฐ›์€ ์ด๋ฏธ์ง€์—์„œ ์ œ๋Œ€๋กœ ๋ณด์ด์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

๊ฒ€์ƒ‰ํ•ด๋ณธ ๊ฒฐ๊ณผ html2canvas๋Š” html์˜ css๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๊ณ , ๋‚˜์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค๊ณ  ํ–ˆ๋‹ค๐Ÿ˜ฟ
๊ทธ๋ฆฌ๊ณ  ๋Œ€์ฒด์ œ๋กœ ์‚ฌ์šฉํ• ๋งŒํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ๋‹ค๊ฐ€
Hereโ€™s Why Iโ€™m Replacing html2canvas With html-to-image in Our React App ๊ธ€์„ ๋ฐœ๊ฒฌํ–ˆ๊ณ , html-to-image ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ฒ€์ฆํ•ด๋ณธ ๊ฒฐ๊ณผ ํ…์ŠคํŠธ ์ž˜๋ฆผ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
์ด ๋ฌธ์ œ๋กœ ์ƒ๊ฐ๋ณด๋‹ค ์‹œ๊ฐ„์„ ๋งŽ์ด ์†Œ์š”ํ•˜๊ฒŒ ๋˜์–ด์„œ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์ „ ์‹œ๊ฐ„์— ๊ธ‰๊ธ‰ํ•ด ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์ „์กฐ์‚ฌ์™€ ์‚ฌ์ „ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋ฐฐ์› ๊ณ , ์‚ฌ์šฉํ•˜๊ธฐ ์ ํ•ฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ์ง€ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์˜ ์ค‘์š”์„ฑ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋А๋ผ๊ฒŒ ๋˜์—ˆ๋‹ค.

2. TDD

TDD ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ์ฒ˜์Œ ๊ฒฝํ—˜ํ•ด๋ณด์•˜๋Š”๋ฐ, ์ง์ ‘ ๊ฒฝํ—˜ํ•ด๋ณด๋ฉด์„œ ๋ช‡ ๊ฐ€์ง€ ๋А๋‚€์ ๋“ค์ด ์žˆ๋‹ค.

  • ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ช…ํ™•ํ•ด์ง„๋‹ค
    ์–ด๋–ค ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋‹ค๊ฐ€ ๊ทธ ๊ธฐ๋Šฅ์— ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ๋“ค์„ ๋” ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์–ด์งˆ ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ด๋•Œ ์ •ํ•ด์ง„ ๋ช…ํ™•ํ•œ ๋ชฉํ‘œ ์—†์ด ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ๊ผญ ํ•„์š”ํ•œ ์ฃผ๊ธฐ๋Šฅ์ด ๋’ท์ „์ด ๋˜๊ณ , ๋ถ€๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋Š”๋ฐ ์ง‘์ค‘ํ•˜๊ฒŒ ๋˜๊ธฐ๋„ ํ•œ๋‹ค. TDD๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ํ…Œ์ŠคํŠธ ๋ช…์„ธ ์ž‘์„ฑ์„ ํ†ตํ•ด ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์šฐ์„ ์ ์œผ๋กœ ๊ณ ๋ฏผํ•ด๋ณด๊ณ , ๊ทธ ์ดํ›„ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ๋“ค์„ ํ•˜๋‚˜์”ฉ ๊ณ ๋ฏผํ•ด๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์ˆ˜์›”ํ•ด์ง€๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

  • ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง์— ๋Œ€ํ•œ ๋ถˆ์•ˆ๊ฐ์ด ๊ฐ์†Œํ•œ๋‹ค
    ๋ฆฌํŒฉํ† ๋ง์„ ํ•  ๋•Œ, ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ ๋‚˜์„œ ํ˜น์—ฌ๋‚˜ ์ž˜ ๋™์ž‘ํ•˜๋˜ ๊ธฐ๋Šฅ์ด ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ• ๊นŒ๋ด ๋ถˆ์•ˆํ–ˆ๋˜ ์ ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ์ƒํƒœ์—์„œ๋Š” ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ๊ธฐ์กด ๋™์ž‘์ด ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”์ง€ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„๊ทธ๋ฅผ ์‚ฌ์ „์— ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด๋ฒˆ ๊ฒฝํ—˜์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์ž๋™ํ™”์˜ ์ด์ ๋“ค์„ ์ง์ ‘ ๋А๊ปด๋ณผ ์ˆ˜ ์žˆ์—ˆ๊ณ ,
cypress๋ผ๋Š” ๋„๊ตฌ์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๊ณ  ์‹ถ๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—๋„ ์ ์šฉํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.
์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ํ† ์ดํ”„๋กœ์ ํŠธ๊ณ  ๋ฐฑ์—”๋“œ์™€ ์—ฐ๋™๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„์€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ณด๋‹ค ํฐ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์ผ ๋•Œ๋Š” ์–ด๋–ค ์‹์œผ๋กœ ํ…Œ์ŠคํŠธ ๋ช…์„ธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„์ง€ ์‚ฌ๋ก€๋ฅผ ์ฐพ์•„๋ณด์•„์•ผ๊ฒ ๋‹ค.๐Ÿง

profile
๊ณต๋ถ€ ๊ธฐ๋ก์šฉ ( แต•ยทฬฎแต• )โ™ฉ

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