[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 15~16์ฃผ์ฐจ] 2์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ํšŒ๊ณ 

2025. 5. 20. 17:41ยท๐Ÿ“‚ Quality Assurance Study/๐Ÿ”ฅ ์—˜๋ฆฌ์Šค SW QAํŠธ๋ž™

โ„น๏ธ ํ”„๋กœ์ ํŠธ ๊ฐ€์ด๋“œ


๐Ÿ“š 5/4 - ๊ฐœ์ธ ๊ณต๋ถ€ (RealWorld ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ ๋ฐ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •)

 
๐Ÿ’ก RealWorld

RealWorld ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค์–‘ํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๋ฐ ๋ฐฑ์—”๋“œ ๊ธฐ์ˆ  ์Šคํƒ์œผ๋กœ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ์˜ˆ์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋‹จ์ˆœํ•œ "Todo" ์•ฑ ๋ฐ๋ชจ๋ฅผ ๋„˜์–ด ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ์ง€์‹๊ณผ ๊ด€์ ์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ๊ฐ€์ด๋“œ์—์„œ๋Š” Node.js ๊ธฐ๋ฐ˜ ๋ฐฑ์—”๋“œ์™€ React ๊ธฐ๋ฐ˜ ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌํ˜„์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฐœ์ ์œผ๋กœ ํ˜ธ์ŠคํŒ…๋˜๋Š” ๋ฐ๋ชจ ๋ฒ„์ „์ด ์กด์žฌํ•˜๋ฉฐ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋„ ์ง์ ‘ ์„ค์ •ํ•˜์—ฌ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RealWorld ํ”„๋กœ์ ํŠธ๋Š” ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๋œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
 โœ… ํ”„๋ก ํŠธ์—”๋“œ: ๋‹ค์–‘ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ(React, Angular, Vue ๋“ฑ)๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ณธ ๊ฐ€์ด๋“œ์—์„œ๋Š”
   React + Redux ๊ตฌํ˜„์ฒด(https://github.com/gothinkster/react-redux-realworld-example-app)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
 โœ… ๋ฐฑ์—”๋“œ: ๋‹ค์–‘ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ(Node/Express, Django, Rails ๋“ฑ)๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ณธ ๊ฐ€์ด๋“œ์—์„œ๋Š”
   Node.js + Express ๊ตฌํ˜„์ฒด(https://github.com/gothinkster/node-express-realworld-example-app)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
 โœ… API: API ๋ช…์„ธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ OpenAPI (Swagger) ํ˜•์‹ ๋˜๋Š” Postman ์ปฌ๋ ‰์…˜ ํ˜•ํƒœ๋กœ๋„ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
   ์ธ์ฆ ๋ฐฉ์‹์œผ๋กœ๋Š” ํ—ค๋”์— JWT ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 
Notion์— ๊ณต์ง€๋œ QA ๋Œ€์ƒ ์„œ๋น„์Šค ๊ธ€์„ ์ฝ์–ด๋ณด๋Š”๋ฐ.. RealWorld ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜? ์ด๊ฒŒ ๋Œ€์ฒด ๋ญ”๋ฐ? ์ฒ˜์Œ ๋ดค์„ ๋• ์†”์งํžˆ ์ข€ ๋‹นํ™ฉ์Šค๋Ÿฌ์› ๊ณ , ์„ค๋ช…์„ ์ฝ์–ด๋„ ํฌ๊ฒŒ ์™€๋‹ฟ์ง€ ์•Š์•˜๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒŒ ์•ž์œผ๋กœ ์ง„ํ–‰ํ•  ํŒ€ ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ ๋Œ€์ƒ ์„œ๋น„์Šค๋ผ๋ฉด, ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋Š” ๊ฒŒ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋”ฐ๋กœ ์‹œ๊ฐ„์„ ๋‚ด์–ด ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.
 
RealWorld ํ”„๋กœ์ ํŠธ๋Š” ์ผ์ข…์˜ ์กฐ๋ฆฝ์‹ ๋ชจ๋ธํ•˜์šฐ์Šค ๊ฐ™์€ ๊ฐœ๋…์ด๋‹ค. ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๋ฒฝ, ๋ฌธ, ์ฐฝ๋ฌธ ๊ฐ™์€ ๋ถ€ํ’ˆ(ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๊ตฌํ˜„์ฒด)์„ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ  ์Šคํƒ์œผ๋กœ ์ค€๋น„ํ•ด๋‘๊ณ , ์šฐ๋ฆฌ๋Š” ๊ทธ์ค‘์—์„œ ์–ด๋–ค ๊ฑธ ์กฐํ•ฉํ•ด์„œ ์ง‘์„ ์™„์„ฑํ• ์ง€๋งŒ ์ •ํ•˜๋ฉด ๋œ๋‹ค. ์ง์ ‘ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ฒฝ๋Œ์„ ์Œ“์ง€ ์•Š์•„๋„, ์–ด๋–ค ๊ตฌ์กฐ๋กœ ์™„์„ฑ๋˜๋Š”์ง€ ์ฒดํ—˜ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ์‹ค์Šต์šฉ ํ‚คํŠธ์ธ ์…ˆ์ด๋‹ค. ๊ธฐ๋Šฅ๋„ ๋‹จ์ˆœํ•œ "Todo" ์•ฑ ์ˆ˜์ค€์ด ์•„๋‹ˆ๋ผ, ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž…, ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ, ์ข‹์•„์š” ๋“ฑ ์‹ค์ œ ์„œ๋น„์Šค์— ๊ฐ€๊นŒ์šด ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌด์—‡๋ณด๋‹ค ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๋œ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ์–ด์„œ, ์‹ค๋ฌด ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฒดํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ํ•ต์‹ฌ์ด๋‹ค.
 
์›๋ž˜๋Š” ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์ฒด ์ค‘์—์„œ ์›ํ•˜๋Š” ๊ฑธ ๊ณจ๋ผ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ฐฑ์—”๋“œ๋Š” Node.js + Express, ํ”„๋ก ํŠธ์—”๋“œ๋Š” React + Redux๋กœ ์ •ํ•ด์ ธ ์žˆ์—ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ๋ถ€ํ’ˆ๋“ค์„ ๋กœ์ปฌ ํ™˜๊ฒฝ์— ๊ฐ€์ ธ์™€ ์กฐ๋ฆฝ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ์กฐ๋ฆฝ์ด ๋๋‚˜๊ณ  ๋‚˜๋ฉด, ํ„ฐ๋ฏธ๋„์— npm run์„ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ผ์€ ์ด ์™„์„ฑ๋œ ์›น์‚ฌ์ดํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ QA ๊ด€์ ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์ž๋™ํ™”๋ฅผ ์ ์šฉํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค. ์ƒˆ๋กœ ์ง“๋Š” ๊ฑด ์•„๋‹ˆ์ง€๋งŒ, ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š”์ง€ ๋‚ด๋ถ€๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๋ฉฐ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ์ธ ์…ˆ์ด๋‹ค.
 
๐Ÿ’ก ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •
์šฐ์„  RealWorld ๋ฐฑ์—”๋“œ๊ฐ€ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ PostgreSQL ์„ค์น˜ ๋ฐ ์ดˆ๊ธฐ ์‚ฌ์šฉ์ž/๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ์„ ์ง„ํ–‰ํ–ˆ๋‹ค.
 
๊ทธ๋Ÿฐ ๋’ค, ์‹œ์ž‘ ๋ฉ”๋‰ด์—์„œ SQL Shell (psql)์„ ์‹คํ–‰ํ•˜๋‹ˆ ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋ฐ”๋กœ ๋–ด๋‹ค. 

Server [localhost]: → Enter
Database [postgres]: → Enter
Port [5432]: → Enter
Username [postgres]: → Enter
Password: → ์„ค์น˜ ์‹œ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ

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

โœ… ์ƒˆ ์‚ฌ์šฉ์ž ์ƒ์„ฑ (๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ผญ ๊ธฐ์–ตํ•˜์„ธ์š”!)
CREATE USER {์‚ฌ์šฉ์ž ์ด๋ฆ„} WITH PASSWORD 'your_secure_password';
โœ… ์ƒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ (์†Œ์œ ์ž๋ฅผ ๋ฐฉ๊ธˆ ๋งŒ๋“  ์‚ฌ์šฉ์ž๋กœ ์ง€์ •)
CREATE DATABASE {๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„} OWNER {์‚ฌ์šฉ์ž ์ด๋ฆ„};
โœ… ์ƒ์„ฑํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ถŒํ•œ ๋ถ€์—ฌ (์„ ํƒ ์‚ฌํ•ญ, ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„์š”)
GRANT ALL PRIVILEGES ON DATABASE {๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„} TO {์‚ฌ์šฉ์ž ์ด๋ฆ„};
โœ… psql ์ข…๋ฃŒ
\q

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ, ๋‹ค์‹œ SQL Shell (psql)์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฐฉ๊ธˆ ์ƒ์„ฑํ•œ ์‚ฌ์šฉ์ž ๊ณ„์ •๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ ‘์†ํ•˜๋ฉด ๋˜๋Š” ๊ตฌ์กฐ๋‹ค.
 
๐Ÿ’ก PostgreSQL
PostgreSQL์„ ์„ค์น˜ํ•˜๋ฉด, ๋‚ด ์ปดํ“จํ„ฐ ์•ˆ์—์„œ PostgreSQL ์„œ๋ฒ„๊ฐ€ ๋กœ์ปฌ๋กœ ์‹คํ–‰๋œ๋‹ค. ์ฆ‰, ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์™ธ๋ถ€ ํด๋ผ์šฐ๋“œ๋‚˜ ์ธํ„ฐ๋„ท ์–ด๋”˜๊ฐ€๊ฐ€ ์•„๋‹ˆ๋ผ, ๋‚ด PC ์•ˆ์—์„œ ๋Œ์•„๊ฐ€๋Š” ๋…๋ฆฝ์ ์ธ ์„œ๋ฒ„์ธ ์…ˆ์ด๋‹ค. ๋งˆ์น˜ Nginx๋‚˜ Apache์ฒ˜๋Ÿผ, PostgreSQL๋„ ํ•˜๋‚˜์˜ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์ด๋ฉฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ localhost:5432 ํฌํŠธ์—์„œ ์ž‘๋™ํ•œ๋‹ค.
 
์ด ์„œ๋ฒ„์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๊ฐ€ ๋ฐ”๋กœ psql์ด๋‹ค. psql์—์„œ CREATE DATABASE๋‚˜ CREATE USER ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, ๊ทธ ์ •๋ณด๋Š” ๋กœ์ปฌ์— ์„ค์น˜๋œ PostgreSQL ์„œ๋ฒ„์˜ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค. ์ฆ‰, ์ด ๋ฐ์ดํ„ฐ๋Š” RDS๋‚˜ Supabase ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ์ž‘๋™ ์ค‘์ธ PostgreSQL ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
 
๊ฒฐ๋ก ์ ์œผ๋กœ ๋งํ•˜์ž๋ฉด, PostgreSQL์„ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ์ˆœ๊ฐ„, ๋‚ด ์ปดํ“จํ„ฐ์—๋Š” ‘๋‚˜๋งŒ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„’๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋กœ ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฒˆ RealWorld ๋ฐฑ์—”๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ญ์‹œ ๋กœ์ปฌ ํ™˜๊ฒฝ์— ์„ค์น˜๋œ PostgreSQL์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ณ„๋„์˜ ์™ธ๋ถ€ ์„œ๋ฒ„๋‚˜ ํด๋ผ์šฐ๋“œ DB์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ง€๊ธˆ ์ด ์ปดํ“จํ„ฐ ์•ˆ์—์„œ PostgreSQL ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ๊ณ , ๊ทธ ์•ˆ์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๊ด€๋ฆฌ๋˜๋Š” ๊ตฌ์กฐ๋ผ๋Š” ์ ์„ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.


๐Ÿ“Œ 5/7 - 1์ผ์ฐจ ํšŒ๊ณ  (๊ธฐ๋Šฅ ํŒŒ์•… ๋ฐ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ์ž‘์„ฑ ์‹œ์ž‘)

 
ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „, ๋กœ์ปฌ ํ™˜๊ฒฝ ์„ค์ •์€ ๋ฏธ๋ฆฌ ์™„๋ฃŒํ•ด๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒ€๋ช…, ํŒ€์žฅ, ์ขŒ์šฐ๋ช…, ํ˜‘์—… ํˆด ๋“ฑ์„ ์šฐ์„ ์ ์œผ๋กœ ์ •ํ–ˆ๋‹ค.
 
๐Ÿ› ๏ธ ํ”„๋กœ์ ํŠธ ํ˜‘์—… ํˆด ๊ฒฐ์ •

  • TC/์‹œ๋‚˜๋ฆฌ์˜ค: Google Spreadsheet 
  • ์ด์Šˆ ๊ด€๋ฆฌ: Jira
  • ๋ฌธ์„œ ์ •๋ฆฌ: Notion & Confluence
  • ์ฝ”๋“œ ๊ด€๋ฆฌ: GitLab & GitHub Desktop

 

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

 

"DB ๋‚ด์šฉ์„ ์–ด๋–ป๊ฒŒ ํ™•์ธํ•˜์ง€?" ํ•˜๋Š” ๊ถ๊ธˆ์ฆ์— psql์„ ์ด๊ฒƒ์ €๊ฒƒ ๋งŒ์ ธ๋ณด๋˜ ์ค‘, ๋Šฅ๋ ฅ์ž ํŒ€์› ๋ถ„๊ป˜์„œ PostgreSQL ์„ค์น˜ ์‹œ ์ž๋™์œผ๋กœ ํ•จ๊ป˜ ์„ค์น˜๋˜๋Š” pgAdmin 4๋ฅผ ์ด์šฉํ•˜๋ฉด ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ์…จ๋‹ค.

Servers > PostgreSQL > Databases > realworld > Schemas > public > Tables

๋•๋ถ„์— ํ•™๋ถ€์™€ ์ž๊ฒฉ์ฆ์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ๋ฐฐ์› ๋˜ SQL ๋ช…๋ น์–ด๋ฅผ ํ™œ์šฉํ•ด ์‹ค์ œ DB ์กฐ์ž‘๊นŒ์ง€ ๊ฐ€๋Šฅํ–ˆ๋‹ค. 1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋กœ์ปฌ DB๊ฐ€ ์•„๋‹ˆ์–ด์„œ ์กฐ์ž‘์€์ปค๋…• ์กฐํšŒ๋„ ์–ด๋ ค์› ๋Š”๋ฐ, ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด ํ›จ์”ฌ ์ˆ˜์›”ํ–ˆ๋‹ค.
 

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Swagger ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์•„์„œ, ์ฒ˜์Œ์—๋Š” API ๋ช…์„ธ๋ฅผ ์ง์ ‘ ํ™•์ธํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค. ์ˆ˜์—… ์‹œ๊ฐ„์— ๋ฐฐ์šด Postman์„ ์‹ค์ „์ฒ˜๋Ÿผ ์จ๋ณด๊ณ  ์‹ถ๋˜ ๋งˆ์Œ์ด ์ปธ๊ธฐ ๋•Œ๋ฌธ์—, ์•ฝ๊ฐ„ ์•„์‰ฌ์šด ์ƒํ™ฉ์ด์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋Šฅ๋ ฅ์ž ํŒ€์› ๋ถ„๊ป˜์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ์…จ๋‹ค! npm run dev ์‹คํ–‰ ์ „์— swagger-ui/dist/index.html์— <script> ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„, npm run dev๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Swagger UI ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ–ˆ๋‹ค.
 

ํ„ฐ๋ฏธ๋„์—๋Š” ์œ„์™€ ๊ฐ™์€ ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉฐ Swagger UI ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  • Loopback์€ http://localhost:3200/์ฒ˜๋Ÿผ ๋‚ด ์ปดํ“จํ„ฐ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ์ด๊ณ ,
  • On Your Network๋Š” ๊ฐ™์€ ๋„คํŠธ์›Œํฌ(์˜ˆ: ๊ณต์œ ๊ธฐ)์— ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๊ธฐ๊ธฐ์—์„œ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” IP ์ฃผ์†Œ์ด๋‹ค.
     

์ด๋ ‡๊ฒŒ Swagger UI ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋œ ๋’ค, ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:3200/์— ์ ‘์†ํ•œ ํ›„ ์•„๋ž˜์˜ URL์„ ์ž…๋ ฅํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ Swagger UI๋ฅผ ํ†ตํ•ด API ๋ช…์„ธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ฌผ๋ก  ๊ณต์‹ GitHub ์ €์žฅ์†Œ์—์„œ๋Š” Postman CLI ์ปฌ๋ ‰์…˜(Conduit.postman_collection.json)๊ณผ ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ(run-api-tests.sh)๋„ ์ œ๊ณต๋˜์–ด, ํ„ฐ๋ฏธ๋„ ๊ธฐ๋ฐ˜ ์ž๋™ API ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋‚˜๋Š” ์ง์ ‘ ๋ช…์„ธ๋ฅผ ๋ณด๋ฉฐ API ์š”์ฒญ์„ ์กฐ์ž‘ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ์‹์ด ํ›จ์”ฌ ๋งŒ์กฑ์Šค๋Ÿฌ์› ๋‹ค.

https://raw.githubusercontent.com/gothinkster/realworld/main/api/openapi.yml

 

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

  • ๊ธฐ๋Šฅ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ vs. ์‹œ๋‚˜๋ฆฌ์˜ค ํ๋ฆ„ ํ…Œ์ŠคํŠธ ์ค‘, ์‹ค๋ฌด์—์„œ ์‹œ๋‚˜๋ฆฌ์˜ค ํ๋ฆ„ ํ…Œ์ŠคํŠธ๊ฐ€ ๋” ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ์ 
  • JD ์šฐ๋Œ€์‚ฌํ•ญ์— ‘์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋ฐ˜ ์ž๋™ํ™” ๊ตฌํ˜„’์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ์ 

์œ„๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์˜ ์ž๋™ํ™” ์ฝ”๋“œ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค ํ๋ฆ„์„ ๋”ฐ๋ฅด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.


๐Ÿ“Œ 5/8 - 2์ผ์ฐจ ํšŒ๊ณ  (ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ์ž‘์„ฑ ์™„๋ฃŒ & ๊ธฐ๋ณธ ์ฝ”๋“œ ๊ตฌ์กฐ ์„ค๊ณ„)

 
"์ธ๊ธฐ ํƒœ๊ทธ ์ˆœ์œ„๋Š” ์–ด๋–ค ๊ธฐ์ค€์ผ๊นŒ?" ๊ถ๊ธˆ์ฆ์ด ๋“ค์–ด ์ง์ ‘ DB๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด์•˜๋‹ค. Tag์™€ _ArticleToTag ํ…Œ์ด๋ธ”์„ ๋ณด๋‹ˆ, ์•„๋ž˜์™€ ๊ฐ™์ด ์ •๋ ฌ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€๋‹ค.

  • 1์ˆœ์œ„๋Š” ํšŸ์ˆ˜ ๊ธฐ์ค€ ๋‚ด๋ฆผ์ฐจ์ˆœ,
  • 2์ˆœ์œ„๋Š” ์•ŒํŒŒ๋ฒณ ์—ญ์ˆœ (์˜ˆ: bca)

๊ทธ๋Ÿฐ๋ฐ ํŒ€์›๋ถ„์˜ ํ™˜๊ฒฝ์—์„œ๋Š” 2์ˆœ์œ„ ์ •๋ ฌ(์•ŒํŒŒ๋ฒณ ์—ญ์ˆœ)์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š” ํ˜„์ƒ์ด ์žˆ์—ˆ๋‹ค. ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•˜๋˜ ์ฐฐ๋‚˜, ๋Šฅ๋ ฅ์ž ํŒ€์›๋ถ„๊ป˜์„œ ์ง์ ‘ ํƒœ๊ทธ ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์ฐพ์•„์ฃผ์…จ๋‹ค. (๊ฒฝ๋กœ: backend\src\app\routes\tag) 
 
โฌ‡๏ธ tag.controller.ts

๋”๋ณด๊ธฐ
import { NextFunction, Request, Response, Router } from 'express';
import auth from '../auth/auth';
import getTags from './tag.service';

const router = Router();

/**
 * Get top 10 popular tags
 * @auth optional
 * @route {GET} /api/tags
 * @returns tags list of tag names
 */
router.get('/tags', auth.optional, async (req: Request, res: Response, next: NextFunction) => {
  try {
    const tags = await getTags(req.auth?.user?.id);
    res.json({ tags });
  } catch (error) {
    next(error);
  }
});

export default router;

 
โฌ‡๏ธ tag.service.ts

๋”๋ณด๊ธฐ
import prisma from '../../../prisma/prisma-client';
import { Tag } from './tag.model';

const getTags = async (id?: number): Promise<string[]> => {
  const queries = [];
  queries.push({ demo: true });

  if (id) {
    queries.push({
      id: {
        equals: id,
      },
    });
  }

  const tags = await prisma.tag.findMany({
    where: {
      articles: {
        some: {
          author: {
            OR: queries,
          },
        },
      },
    },
    select: {
      name: true,
    },
    orderBy: {
      articles: {
        _count: 'desc',
      },
    },
    take: 10,
  });

  return tags.map((tag: Tag) => tag.name);
};

export default getTags;

 
ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ,

  • take: 10 = ์ธ๊ธฐ ํƒœ๊ทธ 10๊ฐœ๋งŒ ๋…ธ์ถœ
  • orderBy: { articles: { _count: 'desc', }, } = ์‚ฌ์šฉ ํšŸ์ˆ˜ ๊ธฐ์ค€ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ

ํ•˜์ง€๋งŒ 2์ˆœ์œ„ ์ •๋ ฌ(์•ŒํŒŒ๋ฒณ ์—ญ์ˆœ)์— ๋Œ€ํ•œ ๋กœ์ง์€ ๊ตฌํ˜„๋˜์–ด ์žˆ์ง€ ์•Š์•˜๊ณ , ์ด์™€ ๊ด€๋ จํ•ด ์ฝ”์น˜๋‹˜ ๋ฐ GPT์—๊ฒŒ ์งˆ๋ฌธํ•œ ๊ฒฐ๊ณผ, ์ •๋ ฌ ์กฐ๊ฑด์ด ๋ช…ํ™•ํžˆ ๋ช…์‹œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, DB์—์„œ ์ž„์˜๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹ต๋ณ€์„ ์–ป์—ˆ๋‹ค. ๊ฒฐ๊ตญ 1์ˆœ์œ„ ์ •๋ ฌ ๋กœ์ง(_count ๊ธฐ์ค€ ๋‚ด๋ฆผ์ฐจ์ˆœ)๋งŒ ์ฝ”๋“œ์— ๋ช…ํ™•ํžˆ ๊ตฌํ˜„๋˜์–ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ…Œ์ŠคํŠธํ•  ๋•Œ๋Š” ์ด ๋ถ€๋ถ„๋งŒ ํ™•์ธํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์—ˆ๋‹ค.
 

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„  ํ…Œ์ŠคํŠธ ์ค‘ ์‹ค์ œ DB ๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, "์–ด๋–ป๊ฒŒ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์„๊นŒ?" ๊ณ ๋ฏผ์ด ๋งŽ์•˜๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ํŒ€์›๊ณผ ํ•จ๊ป˜ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ psycopg2-binary ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด DB ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ํ™•์ธํ–ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ํ…Œ์ŠคํŠธ์—์„œ ํ•„์š”ํ•œ DB ๊ฐ’์„ ์ž๋™์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์„ ๋งˆ๋ จํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
 

๊ฐ™์€ ํŒ€์› ๋ถ„๊ณผ ํ•จ๊ป˜ DB ๊ตฌ์กฐ์™€ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์— ๋Œ€ํ•ด ํ™”์ดํŠธ๋ณด๋“œ๋ฅผ ํ™œ์šฉํ•ด ์ง์ ‘ ๋…ผ์˜ํ•ด๋ณธ ๊ฒฝํ—˜์ด ์ •๋ง ์ข‹์•˜๋‹ค. ๋ง‰๋ง‰ํ–ˆ๋˜ ๋ถ€๋ถ„์„ ์„œ๋กœ ์•„์ด๋””์–ด๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ ์ •๋ฆฌํ•ด๊ฐ€๋Š” ๊ณผ์ •์ด ์žฌ๋ฐŒ๊ธฐ๋„ ํ•˜๊ณ , ํ•จ๊ป˜ ๊ณ ๋ฏผํ•œ๋‹ค๋Š” ์ ์—์„œ ๋“ ๋“ ํ•˜๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ DB ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์ •์ œํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์žก์•„์•ผ ํ• ์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™”๊ณ , ํ•จ๊ป˜ ๊ณ ๋ฏผํ•˜๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ๋ฐฉํ–ฅ์„ ๋„์ถœํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  1. DB์—๋„ POM ๊ตฌ์กฐ๋ฅผ ์ ์šฉํ•ด๋ณด๋Š” ๋ฐฉ์‹
    • DB๋งˆ๋‹ค ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ 
    • query๋ฅผ locator์ฒ˜๋Ÿผ ์ •์˜ํ•˜๋ฉฐ
    • ๊ฐ ํด๋ž˜์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์ œํ•˜๋„๋ก ๊ตฌ์„ฑ
  2. query ํŒŒ์ผ๊ณผ format ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•œ ๊ตฌ์กฐ
    • query๋“ค์„ ์ •์˜ํ•œ ํŒŒ์ผ๊ณผ
    • DB ์—ด ๊ตฌ์กฐ ๋ฐ ํฌ๋งท์„ ์ •์˜ํ•œ ํŒŒ์ผ์„ ๋”ฐ๋กœ ๊ตฌ์„ฑ
    • get_db() ๊ฐ™์€ ๊ณตํ†ต ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ •์ œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜

 

์ด์— ๋Œ€ํ•ด ์˜คํ”ผ์Šค ์•„์›Œ ์‹œ๊ฐ„์— ์ฝ”์น˜๋‹˜๊ป˜ ์—ฌ์ญค๋ดค๋”๋‹ˆ, ๋‹จ 1์ดˆ์˜ ๋ง์„ค์ž„๋„ ์—†์ด "DB๋Š” POM ๊ตฌ์กฐ๋กœ ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค"๊ณ  ๋‹จํ˜ธํ•˜๊ฒŒ ๋ง์”€ํ•˜์…จ๋‹ค. ๋Œ€์‹  2๋ฒˆ ๋ฐฉ์‹(query ํŒŒ์ผ๊ณผ format ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ)์ด ๋” ์ ์ ˆํ•ด ๋ณด์ธ๋‹ค๊ณ  ์กฐ์–ธํ•ด์ฃผ์…”์„œ, ๋‚˜ ์—ญ์‹œ ํ•ด๋‹น ๊ตฌ์กฐ๋ฅผ ํ•œ ๋ฒˆ ์‹œ๋„ํ•ด๋ณผ ์ƒ๊ฐ์ด๋‹ค.
 

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

ํŒ€์›๋“ค์ด ๊ฐ์ž ๋‹ด๋‹นํ•œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ์ค‘ DB ์ฟผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์ •๋ฆฌํ•˜๋Š” ๋™์•ˆ, ๋‚˜๋Š” ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ์ ์ธ ์ฝ”๋“œ ํ‹€์„ ๊ตฌ์„ฑํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ–ˆ๋‹ค. ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ conftest.py, BasePage, HomePage, LoginPage ๋“ฑ์„ ๊ตฌํ˜„ํ–ˆ๊ณ , ํŠนํžˆ ๋กœ๊ทธ์ธ ํ•จ์ˆ˜๊นŒ์ง€ ์™„์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‚ด์ผ๋ถ€ํ„ฐ๋Š” ๋ณธ๊ฒฉ์ ์œผ๋กœ ๊ฐ์ž ๋งก์€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ž๋™ํ™” ์ฝ”๋“œ ์ž‘์„ฑ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.


๐Ÿ“Œ 5/9 - 3์ผ์ฐจ ํšŒ๊ณ  (ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ์ฝ”๋“œ ๋ณธ๊ฒฉ ์ž‘์„ฑ ์‹œ์ž‘)

 

์ฒ˜์Œ์—๋Š” util ํด๋” ๋‚ด setupLogger ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ, ๊ฐ ํŽ˜์ด์ง€ ํด๋ž˜์Šค(BasePage, HomePage ๋“ฑ)์˜ ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ณ„ log ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์—ˆ๋‹ค. ์ฆ‰, BasePage์˜ ์ƒ์„ฑ์ž์—์„œ logger๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ์ด๋ฅผ ํ•˜์œ„ ํŽ˜์ด์ง€๋“ค์ด ์ƒ์†๋ฐ›๋Š” ๊ตฌ์กฐ์˜€๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ๋‹ค์–‘ํ•œ Page ๊ฐ์ฒด๋“ค์ด ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•˜๋‚˜์˜ ์‹œ๋‚˜๋ฆฌ์˜ค ์‹คํ–‰ ์ค‘์—๋„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ log ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋Š” ๋น„ํšจ์œจ์ ์ธ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋กœ๊ทธ๊ฐ€ ์‹œ๋‚˜๋ฆฌ์˜ค ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด ๋‹จ์œ„๋กœ ๋ถ„์‚ฐ๋˜๋ฉฐ, ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ์ข…ํ•ฉ์ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.
 

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์กฐ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐœ์„ ํ–ˆ๋‹ค. BasePage์—์„œ๋Š” ๋” ์ด์ƒ logger๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ , ๋Œ€์‹  ๊ฐ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค ์ƒ๋‹จ์—์„œ ์ „์—ญ์ ์œผ๋กœ setupLogger๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ logger๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ๋‹ค. ์ด๋•Œ logger ์ด๋ฆ„์€ __qualname__์„ ์‚ฌ์šฉํ•ด ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค ๋‹จ์œ„๋กœ ์„ค์ •ํ–ˆ๋‹ค. ์ด ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ๋งˆ๋‹ค log ํŒŒ์ผ์ด ํ•˜๋‚˜์”ฉ ์ƒ์„ฑ๋˜๊ณ , ๋กœ๊ทธ๊ฐ€ Page ๊ฐ์ฒด๋งˆ๋‹ค ๋ถ„์‚ฐ๋˜์ง€ ์•Š์œผ๋ฉฐ ์‹œ๋‚˜๋ฆฌ์˜ค ๋‹จ์œ„๋กœ ํ†ตํ•ฉ๋˜๋„๋ก ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์‚ฌ์†Œํ•ด ๋ณด์ด์ง€๋งŒ ์ค‘์š”ํ•œ ๊ตฌ์กฐ ๊ฐœ์„  ๋•๋ถ„์— ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ํ•ด์„์ด ํ›จ์”ฌ ๋ช…ํ™•ํ•ด์กŒ๊ณ , ๋กœ๊ทธ ๊ด€๋ฆฌ์˜ ํšจ์œจ์„ฑ๋„ ํฌ๊ฒŒ ํ–ฅ์ƒ๋˜์—ˆ๋‹ค.
 

์šฐ๋ฆฌ๋Š” ํ˜„์žฌ POM ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ํด๋ž˜์Šคํ™”ํ•˜๊ณ , ๊ฐ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ํ•ด๋‹น ํŽ˜์ด์ง€์™€ ๊ด€๋ จ๋œ ์š”์†Œ ์ •์˜ ๋ฐ ์‚ฌ์šฉ์ž ํ–‰์œ„ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌ์„ฑํ•ด๋‘๊ณ  ์žˆ๋‹ค. ์ดˆ๊ธฐ์—๋Š” ์ƒ๋‹จ์— ํ•ญ์ƒ ๊ณ ์ •๋˜์–ด ์žˆ๋Š” Home, Sign in, Sign up, New Post, Settings ๋ฒ„ํŠผ๋“ค์„ HomePage ๋‚ด๋ถ€์— ์ •์˜ํ•ด๋‘์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์š”์†Œ๋“ค์€ ์‚ฌ์‹ค ๋ชจ๋“  ํŽ˜์ด์ง€์— ๊ณตํ†ต์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” UI ์š”์†Œ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , HomePage์—๋งŒ ์ •์˜๋˜์–ด ์žˆ์œผ๋‹ˆ ๋งˆ์น˜ ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ „์šฉ ์š”์†Œ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋ถ€์ž์—ฐ์Šค๋Ÿฌ์šด ๊ตฌ์กฐ๊ฐ€ ๋˜์—ˆ๋‹ค. ๊ณตํ†ต UI ์š”์†Œ๋ฅผ ํŠน์ • ํŽ˜์ด์ง€์—๋งŒ ๋ฌถ์–ด๋‘๋Š” ๊ฒƒ์€ ๊ตฌ์กฐ์ ์œผ๋กœ๋„ ์–ด์ƒ‰ํ•˜๊ณ , ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ๋„ ๋น„ํšจ์œจ์ ์ด๋ผ๋Š” ํŒ๋‹จ์ด ๋“ค์—ˆ๋‹ค.
 

์ด์— ๋”ฐ๋ผ ํ•ด๋‹น ์š”์†Œ๋“ค์„ ๋ณ„๋„์˜ Header ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•˜์ž๋Š” ๋…ผ์˜๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด๋ฃจ์–ด์กŒ๊ณ , ์˜คํ”ผ์Šค ์•„์›Œ ์‹œ๊ฐ„์— ์ฝ”์น˜๋‹˜๊ป˜ ํ”ผ๋“œ๋ฐฑ์„ ์š”์ฒญ๋“œ๋ ธ๋‹ค. ์ฝ”์น˜๋‹˜๊ป˜์„œ๋Š” ๊ตฌ์กฐ์ƒ Header, Body, Footer๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉํ–ฅ์ด ๋ฐ”๋žŒ์งํ•˜๋ฉฐ, Header๋ฅผ ๋ณ„๋„๋กœ ๊ตฌ์„ฑํ•˜๋ฉด ์žฌ์‚ฌ์šฉ์ด ์šฉ์ดํ•˜๊ณ , ํ˜„์žฌ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์™€๋„ ์ž˜ ๋งž๋Š”๋‹ค๊ณ  ๋ง์”€ํ•ด์ฃผ์…จ๋‹ค. ๋˜ํ•œ ํŽ˜์ด์ง€์— ๋”ฐ๋ผ Header ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด, Header๋„ ์œ ์—ฐํ•˜๊ฒŒ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋กœ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๋Š” ์กฐ์–ธ์„ ์ฃผ์…จ๋‹ค.
 
์ด์— ๋”ฐ๋ผ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ pages ํด๋” ํ•˜์œ„์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐœ์„ ํ–ˆ๋‹ค.

  • header/: ์ƒ๋‹จ ๊ณ ์ • UI ์š”์†Œ๋“ค์„ ๊ด€๋ฆฌ
  • body/: ํŽ˜์ด์ง€๋ณ„ ์ฃผ์š” ๋‚ด์šฉ ๊ตฌ์„ฑ
  • footer/: ํ•˜๋‹จ ๊ณ ์ • UI ์š”์†Œ๋“ค์„ ๊ด€๋ฆฌ

๋˜ํ•œ, BasePage๋Š” ๊ฐ ํŽ˜์ด์ง€ ํด๋ž˜์Šค๋“ค์ด ์ƒ์†๋ฐ›๋Š” ๊ณตํ†ต ๊ธฐ๋Šฅ ๋ฐ ์„ค๊ณ„๋„ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” ํŒŒ์ผ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํŠน์ • ๋ ˆ์ด์•„์›ƒ(header/body/footer)์— ์ง์ ‘ ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ pages ํด๋” ๋ฐ”๋กœ ์•„๋ž˜์— ์œ„์น˜์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

 

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


๐Ÿ“š 5/10 - ๊ฐœ์ธ ๊ณต๋ถ€ (LINE QA๋ถ„๊ณผ ์ปคํ”ผ์ฑ— & ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ์ฝ”๋“œ ์ž‘์„ฑ)

 
์•ฝ ํ•œ ๋‹ฌ ์ „, ๋ฉ‹์Ÿ์ด ์‚ฌ์ž์ฒ˜๋Ÿผ 10๊ธฐ ํ™œ๋™ ๋‹น์‹œ ํ•จ๊ป˜ํ–ˆ๋˜ ์„ ๋ฐฐ๋‹˜๊ป˜์„œ LINE์—์„œ ๊ทผ๋ฌด ์ค‘์ธ QA ์ง€์ธ์„ ์†Œ๊ฐœํ•ด์ฃผ์‹œ๊ฒ ๋‹ค๋ฉฐ ์ž๋ฆฌ๋ฅผ ๋งˆ๋ จํ•ด๋ณด๊ฒ ๋‹ค๊ณ  ์—ฐ๋ฝ์„ ์ฃผ์…จ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์š”์ฆ˜ ๋„ˆ๋ฌด ๋ฐ”๋นด๋‹ค. ๋‹น์žฅ 10๋ถ„ ๊ฑฐ๋ฆฌ์— ์‚ฌ๋Š” ์‚ฌ์ดŒ ์–ธ๋‹ˆ๊ฐ€ ๋ฐฅ ์‚ฌ์ฃผ๊ฒ ๋‹ค๋Š” ์•ฝ์†์กฐ์ฐจ ์„ ๋œป ๋‚ ์งœ๋ฅผ ๋ชป ์žก์„ ์ •๋„๋กœ ์ˆ˜์—…๊ณผ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ์ผ์ •์— ์ •์‹ ์ด ์—†์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ์„ ๋ฐฐ๋‹˜์˜ ์†Œ์ค‘ํ•œ ์ œ์•ˆ๋„ ๋ฐ”์˜๊ฒŒ ์ง€๋‚ด๋Š” ์‚ฌ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์žŠ๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋˜ ์ค‘ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋˜ ๋„์ค‘, ์„ ๋ฐฐ๋‹˜๊ป˜์„œ ๋‹ค์‹œ ์—ฐ๋ฝ์„ ์ฃผ์…จ๊ณ , ๊ทธ ์ˆœ๊ฐ„ ‘์•„ ๋งž๋‹ค!’ ํ•˜๊ณ  ๊ธฐ์–ต์ด ๋– ์˜ฌ๋ž๋‹ค. ์ •๋ง ๊นœ์ง ๋†€๋ž์ง€๋งŒ ๋™์‹œ์— ๊ธฐ์œ ๋งˆ์Œ์œผ๋กœ ๋ฐ”๋กœ ๋‹ต์žฅ์„ ๋“œ๋ ธ๋‹ค. ์•ฝ์† ์žฅ์†Œ๋กœ ํ–ฅํ•˜๊ธฐ ์ „, ์ด ๊ธฐํšŒ๋ฅผ ์ ˆ๋Œ€ ํ—ˆํˆฌ๋ฃจ ๋„˜๊ธฐ๊ณ  ์‹ถ์ง€ ์•Š์•„์„œ ํ‰์†Œ ๊ถ๊ธˆํ–ˆ๋˜ QA ์‹ค๋ฌด ๊ด€๋ จ ์งˆ๋ฌธ๋“ค์„ ์ •๋ฆฌํ•ด๋ณด๊ณ  ๊ฐ€๊ธฐ๋กœ ๋งˆ์Œ๋จน์—ˆ๋‹ค.

๊ฑด๋Œ€์ž…๊ตฌ์—ญ์—์„œ ํ•จ๊ป˜ ์‹์‚ฌ๋ฅผ ํ•œ ๋’ค, ๊ทผ์ฒ˜ ํ• ๋ฆฌ์Šค๋กœ ์ž๋ฆฌ๋ฅผ ์˜ฎ๊ฒจ ๋‚ด ์ด๋ ฅ์„œ์™€ ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ํ•จ๊ป˜ ๋ณด๋ฉฐ ์ง์ ‘ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์…จ๋‹ค. ๊ทธ ์™ธ์—๋„ ๋‚ด๊ฐ€ ์ค€๋น„ํ•ด๊ฐ„ ๋‹ค์–‘ํ•œ ์งˆ๋ฌธ๋“ค์— ๋Œ€ํ•ด ์„ฑ์‹ฌ์„ฑ์˜๊ป ๋‹ต๋ณ€์„ ํ•ด์ฃผ์…จ๊ณ , ์งง์€ ์‹œ๊ฐ„์ด์—ˆ์ง€๋งŒ ์ •๋ง ์•Œ์ฐจ๊ณ  ๊ฐ์‚ฌํ•œ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ํ—ค์–ด์ง€๊ธฐ ์ „์—๋Š” “ํŽธํ•˜๊ฒŒ ์—ฐ๋ฝํ•ด๋„ ๋œ๋‹ค”๋ฉฐ ๋ช…ํ•จ๋„ ๊ฑด๋„ค์ฃผ์…จ๋Š”๋ฐ, ๊ทธ ๋ช…ํ•จ์ด ๋ผ์ธ ๋กœ๊ณ ๊ฐ€ ๋“ค์–ด๊ฐ„ ๋‘ํˆผํ•˜๊ณ  ๊ท€์—ฌ์šด ๋ช…ํ•จ์ด๋ผ ํ•œ์ฐธ์„ ๋“ค์—ฌ๋‹ค๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค. ์‹ค๋ฌด์ž์™€ ์ง์ ‘ ๋งˆ์ฃผํ•˜๊ณ  ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒฝํ—˜ ์ž์ฒด๊ฐ€ ๋„ˆ๋ฌด ํฐ ์ž๊ทน์ด ๋˜์—ˆ๊ณ , ์ด ๊ธฐํšŒ๋ฅผ ๋ฐœํŒ ์‚ผ์•„ ๋” ์—ด์‹ฌํžˆ ์ค€๋น„ํ•ด๋‚˜๊ฐ€์•ผ๊ฒ ๋‹ค๊ณ  ๋‹ค์งํ–ˆ๋‹ค.
 

์ดˆ๊ธฐ์—๋Š” BasePage์˜ ์ƒ์„ฑ์ž ๋‚ด๋ถ€์—์„œ driver.get()์„ ํ˜ธ์ถœํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ด์ƒํ•œ ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค. BasePage๋ฅผ ์ƒ์†๋ฐ›๋Š” Page ํด๋ž˜์Šค๋“ค์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ ๋งค๋ฒˆ driver.get()์„ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด์„œ, ์›น์‚ฌ์ดํŠธ ๋ฉ”์ธ ํ™”๋ฉด์ด ์—ฌ๋Ÿฌ ๋ฒˆ ๊นœ๋นก์ด๊ณ  ์ง€์ง€์ง ๊ฑฐ๋ฆฌ๋Š” ๋“ฏํ•œ ํ˜„์ƒ์ด ๋‚˜ํƒ€๋‚ฌ๋‹ค. ์ฒ˜์Œ์—๋Š” ์™œ ๊ทธ๋Ÿฐ์ง€ ๋ชฐ๋ž์ง€๋งŒ, ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค ์•ˆ์—์„œ ์—ฌ๋Ÿฌ Page ๊ฐ์ฒด๋“ค์„ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๋– ์˜ฌ๋ฆฌ๋ฉฐ ์›์ธ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ฆ‰, ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋‹ค์–‘ํ•œ Page ๊ฐ์ฒด๋“ค์„ ํ•œ ๋ฒˆ์— ์ƒ์„ฑํ•˜๋‹ค ๋ณด๋‹ˆ, ๊ฐ์ฒด ์ƒ์„ฑ = ์ƒ์„ฑ์ž ์‹คํ–‰ = driver.get() ์ค‘๋ณต ํ˜ธ์ถœ ์ด๋ผ๋Š” ๊ตฌ์กฐ๋กœ ์ธํ•ด ํŽ˜์ด์ง€ ์ง„์ž…์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณต๋˜๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค.
 
์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, driver.get()์„ BasePage๊ฐ€ ์•„๋‹Œ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค ์ชฝ์œผ๋กœ ์˜ฎ๊ธฐ๊ธฐ๋กœ ํ–ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์—์„œ fixture๋ฅผ autouse=True๋กœ ์„ค์ •ํ•ด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „ ํ•œ ๋ฒˆ๋งŒ driver.get()์ด ์‹คํ–‰๋˜๋„๋ก ๊ฐœ์„ ํ•˜์˜€๋‹ค. ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ๋‚˜๋‹ˆ, ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ ํŽ˜์ด์ง€๊ฐ€ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ๋กœ๋”ฉ๋˜๊ณ , ํ…Œ์ŠคํŠธ ํ๋ฆ„๋„ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€๋˜์—ˆ๋‹ค. ์ด๋ฒˆ ๊ฒฝํ—˜์„ ํ†ตํ•ด, ๊ณตํ†ต ๋กœ์ง์„ ๋ฌด์กฐ๊ฑด ๋ถ€๋ชจ ํด๋ž˜์Šค์— ๋‘๋Š” ๊ฒƒ๋งŒ์ด ์ตœ์„ ์€ ์•„๋‹ˆ๋ฉฐ, ์‹ค์ œ ์‹คํ–‰ ํƒ€์ด๋ฐ๊ณผ ๊ฐ์ฒด ์ƒ๋ช… ์ฃผ๊ธฐ๊นŒ์ง€ ๊ณ ๋ คํ•œ ์„ค๊ณ„๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๋Š” ์ ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค.


๐Ÿ“š 5/11 - ๊ฐœ์ธ ๊ณต๋ถ€ (DB ์กฐ์ž‘ Util ํ•จ์ˆ˜ ๊ตฌํ˜„ & ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ์ฝ”๋“œ ์ž‘์„ฑ)

 

๋‚ด๊ฐ€ ๋งก์€ ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๋Š” ๋‹ค๋ฅธ ํŒ€์› ๋ถ„๋“ค์ด ๊ตฌํ˜„์„ ๋งˆ์ณ์•ผ๋งŒ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๊ฐœ๋ฐœ์„ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์˜€๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ, ๊ธฐ๋Šฅ ์˜์กด์„ฑ์ด ์—†๋Š” ์ž‘์—…์€ ๋ฌด์—‡์ด ์žˆ์„๊นŒ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ์˜ˆ์ „์— ์ด์•ผ๊ธฐ ๋‚˜์™”๋˜ DB ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์ •์ œํ•˜๋Š” ์œ ํ‹ธ ํ•จ์ˆ˜ ๊ตฌํ˜„์„ ๋– ์˜ฌ๋ ธ๋‹ค. ํŒ€์› ๋ถ„๊ป˜์„œ ์•Œ๋ ค์ฃผ์‹  psycopg2 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด DB ์—ฐ๊ฒฐ ๋ฐ ์ฟผ๋ฆฌ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. ๋จผ์ €, ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์— DB ๋‚ด ๋ฐ์ดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ž๋Š” ํŒ€์›๋“ค๊ณผ์˜ ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ๊ณ , ์ด๋Š” ํ…Œ์ŠคํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๋‚˜ ์—ญ์‹œ ๊ธ์ •์ ์œผ๋กœ ๋™์˜ํ–ˆ๋‹ค. ์ง์ ‘ ํ…Œ์ŠคํŠธํ•ด๋ณธ ๊ฒฐ๊ณผ, User ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋“ค๋„ ์—ฐ์‡„์ ์œผ๋กœ ์ œ๊ฑฐ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ User ํ…Œ์ด๋ธ”์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ๋ฐ€์–ด๋ฒ„๋ฆฌ๋Š” ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. ๋˜ํ•œ, ์ธ๊ธฐ ํƒœ๊ทธ(Popular Tags) ์ˆœ์œ„ ๋กœ์ง์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์ดˆ ๋ฐ์ดํ„ฐ๋ฅผ DB์— seedingํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.
 
๊ทธ๋ฆฌ๊ณ  "ํŠน์ • ํƒœ๊ทธ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๋“ฑ์žฅํ–ˆ๋Š”์ง€"๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋กœ์ง์„ ๊ตฌ์ƒํ–ˆ๋‹ค. Tag ํ…Œ์ด๋ธ”์€ tag_id, name์œผ๋กœ, _ArticleToTag ํ…Œ์ด๋ธ”์€ tag_id, article_id๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ  ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ tag_id๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‘ ํ…Œ์ด๋ธ”์„ join ์‹œํ‚ค๋ฉด tag_id, tag_name, article_id๊ฐ€ ํฌํ•จ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋„˜๊ฒจ๋ฐ›์€ ํƒœ๊ทธ ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ๊ฒŒ์‹œ๊ธ€ ์ˆ˜๋ฅผ countํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์ด๋ฅผ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•˜์—ฌ Popular Tag ์ˆœ์œ„ ๋ฐ˜์˜์ด ์‹ค์ œ๋กœ ์ž˜ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด DB ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ  ํ…Œ์ŠคํŠธ ๋ชฉ์ ์— ๋งž๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๋‹ค๋ฃจ๋Š” ๊ฐ๊ฐ์„ ํ‚ค์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
 

ํ•˜๋ฃจ ์ข…์ผ ํ”„๋กœ์ ํŠธ ์ž‘์—…์— ๋ชฐ๋‘ํ•  ์˜ˆ์ •์ด์—ˆ๊ณ , ๊ณง ๋Œ€๊ตฌ๋กœ ๋‚ด๋ ค๊ฐˆ ๊ณ„ํš์ด๋ผ ์„œ์šธ์— ์žˆ๋Š” ๋™์•ˆ ํ•œ ๋ฒˆ์ฏค ๋งŒ๋‚˜์ž๊ณ  ์—ฐ๋ฝ์„ ์ฃผ์…จ๋˜ ๋ถ„๋“ค๊ป˜ ์—ฐ๋ฝ์„ ๋Œ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ๊ทธ์ค‘์—๋Š” ์‚ฌ์ดŒ ์–ธ๋‹ˆ๋„ ์žˆ์—ˆ๊ณ , ๋ฉ‹์Ÿ์ด ์‚ฌ์ž์ฒ˜๋Ÿผ ํ™œ๋™์„ ํ†ตํ•ด ์•Œ๊ฒŒ ๋œ ๋˜ ๋‹ค๋ฅธ ์„ ๋ฐฐ๋‹˜๋„ ๊ณ„์…จ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์„ ๋ฐฐ๋‹˜๊ป˜์„œ๋Š” "์ง€๊ธˆ ๋ฐ”๋กœ ๋ณด์ž!"๋ฉฐ ๊ฐ‘์ž‘์Šค๋Ÿฝ๊ฒŒ ์—ฐ๋ฝ์„ ์ฃผ์…จ๊ณ  ์ž ๊น ๊ณ ๋ฏผํ–ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ๋ง‰๋ฐ”์ง€์ธ 17์ผ๋ณด๋‹ค๋Š” ์˜ค๋Š˜์ด ๋‚ซ๊ฒ ๋‹ค ์‹ถ์–ด์„œ ๋Œ€์ถฉ ๋ชจ์ž๋ฅผ ๋ˆŒ๋Ÿฌ์“ฐ๊ณ  ๊ฑด๋Œ€์ž…๊ตฌ๋กœ ํ–ฅํ–ˆ๋‹ค. ์‚ฌ์‹ค ์ €๋…์œผ๋กœ ๋งˆ๋ผ์ƒน๊ถˆ๋ฅผ ์ด๋ฏธ ์•„์ฃผ ์•ผ๋ฌด์ง€๊ฒŒ ๋จน๊ณ  ์™€์„œ ๋ฐฐ๊ฐ€ ๋ถ€๋ฅด๋‹ค๊ณ  ๋ง์”€๋“œ๋ ธ๋Š”๋ฐ, ์„ ๋ฐฐ๋‹˜๊ป˜์„œ "๊ฐ„๋‹จํ•˜๊ฒŒ ์–‘๊ผฌ์น˜ ๋จน์ž~" ํ•˜์…”์„œ, ๋ณด๊ณ  ์‹ถ์€ ๋งˆ์Œ์— ๊ฒฐ๊ตญ ๋ฐ”๋กœ ๋‚˜๊ฐ€๊ฒŒ ๋˜์—ˆ๋‹ค!
 
๋Œ€ํ•™๊ต 2ํ•™๋…„ ์ดํ›„๋กœ ์ฒ˜์Œ ๋ต™๋Š” ์ž๋ฆฌ์˜€์ง€๋งŒ, ์ •๋ง ๋„ˆ๋ฌด ํŽธํ–ˆ๊ณ , ์—ฌ์ „ํžˆ ์ข‹์€ ๋ถ„์ด์…จ๋‹ค. ์ด ๋‚  ํ‹ฐ์Šคํ† ๋ฆฌ ๊ตฌ๋…๋„ ํ•จ๊ป˜ ํ–ˆ๋Š”๋ฐ, ํ˜น์‹œ ์ด ๊ธ€ ๋ณด๊ณ  ๊ณ„์‹ ๋‹ค๋ฉด.. "์ €์—๊ฒŒ๋Š” ์•„์ €์”จ ์•„๋‹ˆ๊ณ , ์ฐ ์–ด๋ฅธ 'ํƒœ๋ฌด ์ด์ˆ˜ํ˜'์ž…๋‹ˆ๋‹ค ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹" ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆ„๋Š” ๋™์•ˆ ์ทจ์ค€์ƒ์ธ ๋‚ด๊ฒŒ ์ •๋ง ํฐ ํž˜์ด ๋˜๋Š” ๋ง์”€์„ ๋งŽ์ด ํ•ด์ฃผ์…จ๊ณ , ์ด๋ ฅ์„œ์™€ ํฌํŠธํด๋ฆฌ์˜ค๊ฐ€ ์™„์„ฑ๋˜๋ฉด ๊ผญ ๋ณด๋‚ด๋‹ฌ๋ผ๋ฉฐ ์ง์ ‘ ๋ด์ฃผ์‹œ๊ฒ ๋‹ค๋Š” ๋ง์”€๊นŒ์ง€ ํ•ด์ฃผ์…จ๋‹ค. ์ด๋Ÿฐ ์ˆœ๊ฐ„๋งˆ๋‹ค ๋А๋‚€๋‹ค. ๋‚˜๋Š” ์ •๋ง ์ธ๋ณต์ด ๋งŽ์€ ์‚ฌ๋žŒ์ด๋ผ๋Š” ๊ฒƒ. ๋”ฐ๋œปํ•œ ๋งˆ์Œ๊ณผ ์ง„์‹ฌ ์–ด๋ฆฐ ์กฐ์–ธ, ๊ทธ๋ฆฌ๊ณ  ํŽธํ•œ ๊ณต๊ธฐ๊นŒ์ง€ ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌํ•œ ํ•˜๋ฃจ์˜€๋‹ค. ์ € ์ทจ์—…ํ•˜๋ฉด ๊ผญ ๋ง›์žˆ๋Š” ๊ฑฐ ์‚ฌ๋“œ๋ฆฌ๊ฒ ๋‹ค๋Š” ์•ฝ์†, ๋ฐ˜๋“œ์‹œ ์ง€ํ‚ฌ๊ฒŒ์š”! ๐Ÿ˜†


๐Ÿ“Œ 5/12 - 4์ผ์ฐจ ํšŒ๊ณ  (DB ๋ณด์•ˆ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ๊ณ ๋ คํ•œ ์ฟผ๋ฆฌ ๋ถ„๋ฆฌ & ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ์ฝ”๋“œ ์™„์„ฑ)

 

DB ์œ ํ‹ธ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๊ธฐ๋Šฅ์ ์ธ ๋ถ€๋ถ„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ณด์•ˆ์ ์ธ ์ธก๋ฉด๋„ ํ•จ๊ป˜ ๊ณ ๋ คํ–ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” f-string์„ ์‚ฌ์šฉํ•ด์„œ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ–ˆ์ง€๋งŒ, ์ด ๋ฐฉ์‹์€ SQL Injection์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณด์•ˆ์ƒ ๋” ์•ˆ์ „ํ•œ %s ํฌ๋งท ๋ฐฉ์‹์œผ๋กœ ์ „๋ถ€ ๋ฐ”๊ฟจ๋‹ค. ๋˜ ํ•˜๋‚˜ ์‹ ๊ฒฝ ์ผ๋˜ ๋ถ€๋ถ„์€ ์ฟผ๋ฆฌ๋ฌธ ์ž์ฒด๋ฅผ ์ฝ”๋“œ ์•ˆ์— ์ง์ ‘ ํฌํ•จ์‹œํ‚ค๋Š” ๊ตฌ์กฐ์˜€๋‹ค. ํ…Œ์ด๋ธ” ์ด๋ฆ„์ด๋‚˜ ์ปฌ๋Ÿผ ๊ตฌ์กฐ ๋“ฑ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ๊ทธ๋Œ€๋กœ ๋“œ๋Ÿฌ๋‚˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด ์—ญ์‹œ ๋ณด์•ˆ์ƒ ์ข‹์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฃผ์š” ์ฟผ๋ฆฌ๋ฌธ์€ ์ „๋ถ€ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ–ˆ๊ณ , ํ•ด๋‹น ์ฟผ๋ฆฌ ํŒŒ์ผ์€ .gitignore์— ๋“ฑ๋กํ•ด์„œ GitHub์— ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌํ•ด๋‘์—ˆ๋‹ค. ์ž๋™ํ™” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ๋ณด์•ˆ๊นŒ์ง€ ํ•จ๊ป˜ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ณผ์ •์ด์—ˆ๊ณ , ์‹ค๋ฌด์—์„œ๋„ ์ด๋Ÿฐ ์‹œ๊ฐ์ด ๊ผญ ํ•„์š”ํ•˜๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.
 

์ด๋ฒˆ์— ๋งˆ์ดํ”„๋กœํ•„ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ๊ฐ€์žฅ ๊ณ ๋ฏผ๋๋˜ ๋ถ€๋ถ„์€, ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ ˆ์ฐจ๊นŒ์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋ชจ๋‘ ํฌํ•จ์‹œ์ผœ์•ผ ํ•˜๋Š”๊ฐ€์˜€๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒŒ์‹œ๊ธ€์ด ์—†์„ ๋•Œ ๋ณด์—ฌ์•ผ ํ•  ๋ฌธ๊ตฌ๋ฅผ ๋จผ์ € ํ™•์ธํ•œ ๋’ค, ์‹ค์ œ๋กœ ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•˜๊ณ  ๋‹ค์‹œ ๋Œ์•„์™€ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์ด ์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œ๋˜๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ํ๋ฆ„์„ ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ์—์„œ ๋‹ค๋ฃจ๊ณ  ์‹ถ์—ˆ๋‹ค.
 
๊ธฐ๋Œ€ ๊ฒฐ๊ณผ๋Š” ์กฐ๊ฑด(๊ฒŒ์‹œ๊ธ€ ์กด์žฌ ์œ ๋ฌด)์— ๋”ฐ๋ผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜๋‰˜๋‹ˆ๊นŒ, ๊ทธ์— ๋งž์ถฐ ๋‘ ๊ฐ€์ง€ ์ƒํ™ฉ ๋ชจ๋‘๋ฅผ ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒŒ ์ž์—ฐ์Šค๋Ÿฝ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด๋ฅผ ์œ„ํ•œ ์ ˆ์ฐจ๊นŒ์ง€ ์–ด๋””๊นŒ์ง€ ์ƒ์„ธํ•˜๊ฒŒ ๊ธฐ์ˆ ํ•ด์•ผ ํ•˜๋А๋ƒ์˜€๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 'My Feed ํƒญ ์ง„์ž… -> “No articles are here... yet.” ํ…์ŠคํŠธ ํ™•์ธ -> New Post ๋ฒ„ํŠผ ํด๋ฆญ -> ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ -> MyProfile ๋งํฌ ํด๋ฆญ -> My Feed ํƒญ ํด๋ฆญ -> ๋ฐฉ๊ธˆ ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€ ๋…ธ์ถœ ํ™•์ธ'๊ณผ ๊ฐ™์€ ์ผ๋ จ์˜ ๊ณผ์ •์„ ์ „๋ถ€ ์ ˆ์ฐจ์— ๋‹ด๋Š” ๊ฒŒ ๋งž๋Š”์ง€ ๊ณ„์† ๊ณ ๋ฏผํ–ˆ๋‹ค.
 
์ด๋Ÿฐ ๊ณ ๋ฏผ์€ ๊ฒฐ๊ตญ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๋ชฉ์ ์ด ๋ฌด์—‡์ธ๊ฐ€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์œผ๋กœ ์ด์–ด์กŒ๋‹ค. ์ฝ”์น˜๋‹˜๊ป˜์„œ ํ•ด์ฃผ์‹  “ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์ฝ”๋“œ ์ž‘์„ฑ์˜ ๋„ค๋น„๊ฒŒ์ดํ„ฐ ์—ญํ• ์„ ํ•˜๋ฉฐ, ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ๋ฅผ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ์„ ์ •๋„์˜ ํ๋ฆ„๋งŒ ์žกํ˜€ ์žˆ๋‹ค๋ฉด ๊ดœ์ฐฎ๋‹ค”๋Š” ๋ง์ด ๊ต‰์žฅํžˆ ์™€๋‹ฟ์•˜๋‹ค. ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ฒ˜์Œ ์ž‘์„ฑํ•˜๋‹ค ๋ณด๋‹ˆ ์ฒ˜์Œ์—๋Š” ๋ชจ๋“  ๊ณผ์ •์„ ๋‹ค ์ ์–ด์•ผ ํ•  ๊ฒƒ์ฒ˜๋Ÿผ ๋А๊ปด์กŒ์ง€๋งŒ, ๊ฒฐ๊ตญ ์ค‘์š”ํ•œ ๊ฑด ์ฝ๊ธฐ ์‰ฌ์šด ํ๋ฆ„๊ณผ ํ…Œ์ŠคํŠธ ๋ชฉ์ ์— ๋งž๋Š” ๊ตฌ์„ฑ์ด๋ผ๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค.
 
๊ทธ๋ž˜์„œ ์ ˆ์ฐจ ๋ถ€๋ถ„์—๋Š” ํ•ด๋‹น ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„, ์ฆ‰ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์—ˆ๋‹ค๋Š” ์ „์ œ ํ•˜์— ์‹คํ–‰๋˜๋Š” ํ•ต์‹ฌ ์ ˆ์ฐจ๋งŒ ๊ฐ„๋‹จํžˆ ์ ๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ด ๋ฐฉ์‹์ด ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚ด๋ฉด์„œ๋„ ์‹œ๋‚˜๋ฆฌ์˜ค ํ๋ฆ„์„ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์„œ, ์ง€๊ธˆ ๋‚ด ์ˆ˜์ค€์—์„œ๋Š” ๊ฐ€์žฅ ์ ์ ˆํ•œ ๊ตฌ์กฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋ฌผ๋ก  ์•„์ง์€ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ์ž‘์„ฑ์ด ์ต์ˆ™ํ•˜์ง„ ์•Š์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ์ง์ ‘ ๋ถ€๋”ชํžˆ๋ฉฐ ํ•˜๋‚˜์”ฉ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ฏผํ•ด๋ณด๋Š” ๊ณผ์ • ์ž์ฒด๊ฐ€ ์ •๋ง ๋งŽ์€ ๊ฑธ ๋ฐฐ์šฐ๊ฒŒ ํ•ด์ค€๋‹ค.
 

์ฒ˜์Œ์—๋Š” HomePage์— Your Feed ํƒญ, Global Feed ํƒญ, Popular Tags์™€ ๊ฐ™์€ ์š”์†Œ๋“ค์„ ์ •์˜ํ•˜๊ณ , Article ๊ด€๋ จ ์š”์†Œ๋Š” ArticlePage๋กœ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๊ด€๋ฆฌํ–ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” Article ๊ด€๋ จ ์š”์†Œ๊ฐ€ ๋‹จ์ˆœํžˆ Home ํŽ˜์ด์ง€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, MyProfile ํŽ˜์ด์ง€ ๋‚ด์—์„œ๋„ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. ์ฆ‰, ํŠน์ • ํŽ˜์ด์ง€์—๋งŒ ์ข…์†๋œ ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ํŒ๋‹จ๋˜์–ด ๊ณตํ†ต ์š”์†Œ์ฒ˜๋Ÿผ ๋ณ„๋„๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒŒ ๋” ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
 
๊ทธ๋Ÿฐ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ์ ์  ๊ณ ๋ฏผ์ด ์ƒ๊ธฐ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Your Feed ํƒญ ํด๋ฆญ -> ํ•ด๋‹น ํƒญ ๊ฒŒ์‹œ๊ธ€ ํ™•์ธ์ด๋ผ๋Š” ๋‹จ์ˆœํ•œ ํ๋ฆ„์„ ํ…Œ์ŠคํŠธํ•  ๋•Œ๋„, HomePage์™€ ArticlePage ๊ฐ์ฒด๋ฅผ ๋ชจ๋‘ ์ƒ์„ฑํ•ด์•ผ๋งŒ ํ–ˆ๋‹ค. ๊ตฌ์กฐ์ ์œผ๋กœ๋Š” ๋ถ„๋ฆฌํ•œ ๊ฒŒ ๋งž์ง€๋งŒ, ์‹ค์ œ ์‚ฌ์šฉ ์‹œ์—๋Š” ์˜คํžˆ๋ ค ๋‹จ์ผ ํ๋ฆ„์„ ์œ„ํ•ด ๋‘ ๊ฐ์ฒด๋ฅผ ์™”๋‹ค ๊ฐ”๋‹ค ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ถˆํŽธํ•จ์ด ์ƒ๊ธด ๊ฒƒ์ด๋‹ค. ์ฒ˜์Œ์—๋Š” “ํ•ด๋‹น ํŽ˜์ด์ง€์—๋งŒ ์กด์žฌํ•˜๋Š” ์š”์†Œ, ํ•ด๋‹น ์š”์†Œ๋ฅผ ํ†ตํ•œ ํ–‰๋™๋งŒ ์ •์˜ํ•œ๋‹ค”๋Š” ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๊ทธ ๊ธฐ์ค€์ด ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ํ๋ฆ„์„ ๋Š์–ด๋†“๋Š” ๋А๋‚Œ๋„ ๋“ค์—ˆ๋‹ค.
 
๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ๋˜ ๋‹ค๋ฅธ ๊ณ ๋ฏผ๋„ ์ƒ๊ฒผ๋‹ค. ์ด๊ฑธ ๊ณผ์—ฐ page๋ผ๊ณ  ๋ถˆ๋Ÿฌ๋„ ๋˜๋Š” ๊ฑธ๊นŒ? ์‚ฌ์‹ค ArticlePage์— ๋“ค์–ด๊ฐ„ ์š”์†Œ๋“ค์€ ํ•˜๋‚˜์˜ ๋…๋ฆฝ๋œ ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹ˆ๋ผ, ๋‹ค์–‘ํ•œ ํŽ˜์ด์ง€ ๋‚ด์— ๊ณตํ†ต์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ ๋ฟ์ธ๋ฐ ๊ตณ์ด page๋ผ๋Š” ์ด๋ฆ„์„ ๋ถ™์ด๋Š” ๊ฒŒ ๋งž๋Š”๊ฐ€? ํ•˜๋Š” ์˜๋ฌธ์ด ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ •๋ง ์ด์ƒํ•˜๊ฒŒ๋„, ํ•˜๋‚˜์— ๋Œ€ํ•œ ์˜๋ฌธ์ด ๋“ค๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๊ทธ๊ฒŒ ๊ผฌ๋ฆฌ์— ๊ผฌ๋ฆฌ๋ฅผ ๋ฌผ๊ณ  ๊ณ„์† ์ด์–ด์ง€๋ฉด์„œ ๋จธ๋ฆฟ์†์ด ๋„ˆ๋ฌด ๋ณต์žกํ•ด์กŒ๋‹ค. ์ •๋‹ต์ด ์—†๋Š” ๋ฌธ์ œ์ผ์ˆ˜๋ก “์–ด๋–ค ๊ฒŒ ๋” ์ข‹์„๊นŒ?”, “์–ด๋–ค ๊ตฌ์กฐ๊ฐ€ ๋” ํšจ์œจ์ ์ผ๊นŒ?”๋ผ๋Š” ์ƒ๊ฐ์ด ๋์—†์ด ์ด์–ด์กŒ๊ณ , ๊ฒฐ๊ตญ์—๋Š” ๊ณ ๋ฏผ ์ž์ฒด๋ฅผ ์ž ์‹œ ๋ฉˆ์ถ”๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ผ๋‹จ์€ ์ง€๊ธˆ ๊ตฌ์กฐ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ธฐ๋กœ ํ–ˆ์ง€๋งŒ, ์–ด๋–ค ๊ตฌ์กฐ๊ฐ€ ๋” ๋‚˜์€ ์„ ํƒ์ผ์ง€๋Š” ์•„์ง๋„ ํ™•์‹ ์ด ์—†๋‹ค. ํ…Œ์ŠคํŠธ ๊ตฌ์กฐ ์„ค๊ณ„๋ผ๋Š” ๊ฒŒ ์ด๋ ‡๊ฒŒ ๋Š์ž„์—†๋Š” ์งˆ๋ฌธ๊ณผ ์„ ํƒ์˜ ์—ฐ์†์ด๋ผ๋Š” ๊ฑธ ์ด๋ฒˆ์— ์ •๋ง ์ฒด๊ฐํ•˜๊ณ  ์žˆ๋‹ค.

๊ทธ๋ž˜๋„ ์˜ค๋Š˜์€ DB ๊ตฌ์กฐ์™€ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์— ๋Œ€ํ•ด ํŒ€์› ๋ถ„๋“ค๊ณผ ํ•จ๊ป˜ ์ด์•ผ๊ธฐ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด์„œ ์ •๋ง ์ข‹์•˜๋‹ค. ์„œ๋กœ์˜ ์˜๊ฒฌ์„ ๊ณต์œ ํ•˜๋ฉฐ “์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋ณด์•ˆ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์„๊นŒ?”, “์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด ๊ตฌ์กฐ๊ฐ€ ๋ ๊นŒ?”๋ฅผ ํ•จ๊ป˜ ๊ณ ๋ฏผํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ๊ทธ ๊ณผ์ •์—์„œ ์ •๋ง ์œ ์˜๋ฏธํ•œ ๋…ผ์˜๊ฐ€ ์˜ค๊ฐ”๋‹ค. ๋•๋ถ„์— ํ•˜๋‚˜์˜ ๋ฐฉํ–ฅ์„ฑ์„ ์ˆ˜๋ฆฝํ•˜๊ณ , ์‹ค์ œ ์ฝ”๋“œ์— ์ ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ๋„ ํฐ ์ˆ˜ํ™•์ด์—ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค ๋ชจ๋‘๊ฐ€ ๋‚ฉ๋“ํ•˜๊ณ  ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ ์ ์ด ๋ฟŒ๋“ฏํ–ˆ๋‹ค.
 
๋˜ํ•œ, ๋‚ด๊ฐ€ ๋‹ด๋‹นํ•œ ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๋Š” ๋‹ค๋ฅธ ๋ถ„๋“ค์˜ ์„ ํ–‰ ์ž‘์—…์ด ์žˆ์–ด์•ผ ์‹œ๋‚˜๋ฆฌ์˜ค ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ–ˆ๋Š”๋ฐ, ํŒ€์› ๋ถ„๋“ค๊ป˜์„œ ํ•ด๋‹น ํ•จ์ˆ˜๋“ค์„ ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•ด์ฃผ์‹  ๋•๋ถ„์— ์˜ค๋Š˜์€ ์ธ์ฆ(๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž…), ํ•„ํ„ฐ, ๋งˆ์ดํ”„๋กœํ•„ ๊ธฐ๋Šฅ์˜ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋ชจ๋‘ ์™„์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‚ด์ผ์€ ๋‹ค๋ฅธ ๋ถ„๋“ค์˜ ์ฝ”๋“œ๋ฅผ ๋ฆฌ๋ทฐํ•˜๊ณ , ๋‚จ์•„ ์žˆ๋Š” ์˜์—ญ์ด ์žˆ๋‹ค๋ฉด ๊ทธ ๋ถ€๋ถ„์— ํˆฌ์ž…๋˜์–ด ํ•จ๊ป˜ ๋งˆ๋ฌด๋ฆฌ ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.


๐Ÿ“Œ 5/13 - 5์ผ์ฐจ ํšŒ๊ณ  (Allure ์ ์šฉ, ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„ ๊ตฌ์กฐ ๊ฐœ์„ )

 

์˜ค๋Š˜์€ Jenkins ์—ฐ๋™์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ์ง€์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ–ˆ๋‹ค. ํ˜„์žฌ ๋Œ€์ƒ ์„œ๋น„์Šค๋Š” PostgreSQL DB๋ฅผ ์„ค์น˜ํ•˜๊ณ , backend์™€ frontend๋ฅผ ๊ฐ๊ฐ Git์—์„œ cloneํ•œ ๋’ค, ์˜์กด์„ฑ ์„ค์น˜ ๋ฐ DB ์—ฐ๊ฒฐ, ๊ทธ๋ฆฌ๊ณ  npx nx serve api, npm start ๋“ฑ์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰, Jenkins์—์„œ๋„ ๋กœ์ปฌ๊ณผ ๋™์ผํ•œ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•˜๋‹ค. ๋ฌธ์ œ๋Š” ์ด ๋กœ์ปฌ ํ™˜๊ฒฝ์„ Jenkins์˜ VM ์ƒ์—์„œ ์–ด๋–ป๊ฒŒ ๊ทธ๋Œ€๋กœ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ฐ์ด ์ž˜ ์˜ค์ง€ ์•Š์•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ๋– ์˜ฌ๋ฆฐ ๋ฐฉ๋ฒ•์€ ๋‹จ์ˆœํžˆ VM์— ๋กœ์ปฌ๊ณผ ๋™์ผํ•˜๊ฒŒ ํ™˜๊ฒฝ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์„ธํŒ…ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด์—ˆ์ง€๋งŒ, ์ด๊ฒŒ ๊ณผ์—ฐ ์ตœ์„ ์ผ๊นŒ ํ•˜๋Š” ์˜๋ฌธ์ด ๊ณ„์† ๋“ค์—ˆ๋‹ค.
 
๊ทธ๋ž˜์„œ ๋ ˆ์ด์„œ ๋ถ„๋“ค๊ณผ ๋งค๋‹ˆ์ € ๋ถ„๋“ค์ด ๊ณ„์‹  ์ฑ„๋„์— ํ•ด๋‹น ์ƒํ™ฉ์„ ๊ณต์œ ํ•˜๊ณ  ์กฐ์–ธ์„ ๊ตฌํ–ˆ๋‹ค. ๋‹คํ–‰ํžˆ Jenkins ์—ฐ๋™์„ ์ด๋ฏธ ์„ฑ๊ณตํ•˜์‹  ํ•œ ๋ ˆ์ด์„œ ๋ถ„๊ป˜์„œ ์ง์ ‘ ์—ฐ๋ฝ์„ ์ฃผ์…จ๊ณ , ๋ณธ์ธ์˜ ๊ตฌ์„ฑ ๋ฐฉ์‹์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด์ฃผ์…จ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๋ฐฉ์‹์€ 1๋ฒˆ์ด์—ˆ์ง€๋งŒ, ๊ทธ ๋ถ„์€ ์ „ํ˜€ ๋‹ค๋ฅธ ๋ฐฉ์‹์ธ 2๋ฒˆ์œผ๋กœ ๊ตฌํ˜„ํ•˜์…จ๋‹ค๊ณ  ํ•œ๋‹ค. ์‚ฌ์‹ค ๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ์•„์ง ๋‚˜์—๊ฒŒ๋Š” ์ƒ์†Œํ•˜๊ณ  ๊ฐ๋„ ์ž˜ ์˜ค์ง€ ์•Š๋Š”๋‹ค. ๋กœ์ปฌ์—์„œ ์ง์ ‘ ํ•ด๋ณด๊ณ  ์ฐจ๊ทผ์ฐจ๊ทผ ์ตํžˆ๋Š” ์ˆ˜๋ฐ–์— ์—†์„ ๊ฒƒ ๊ฐ™์€๋ฐ, ๋‹น์žฅ ๋ฌด์—‡๋ถ€ํ„ฐ ์–ด๋–ป๊ฒŒ ์†๋Œ€์•ผ ํ• ์ง€ ๋ง‰๋ง‰ํ•˜๋‹ค.
 

์ผ๋‹จ Jenkins ์—ฐ๋™์€ ์ž ์‹œ ๋’ค๋กœ ๋ฏธ๋ฃจ๊ณ , 1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ์ดํ›„์— ๋ฐฐ์› ๋˜ Allure ๋ฆฌํฌํŠธ ๊ธฐ๋Šฅ์„ ์ ์šฉํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. Allure๋Š” ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด๊ธฐ ์ข‹๊ฒŒ ์ •๋ฆฌํ•ด์ฃผ๋Š” ๋ฆฌํฌํŠธ ๋„๊ตฌ๋กœ, ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ณ„ ์‹คํ–‰ ๊ฒฐ๊ณผ, ๋กœ๊ทธ, ์Šคํ… ๋“ฑ์„ ํ•œ๋ˆˆ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.
 
์šฐ์„  allure-pytest ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•œ ๋’ค, pytest.ini ํŒŒ์ผ์˜ addopts ํ•ญ๋ชฉ์— --alluredir=reports/allure-results ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค. ์ดํ›„ Allure ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด ๋ฆฌํฌํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ ค ํ–ˆ๋Š”๋ฐ, ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์•Œ๊ณ  ๋ณด๋‹ˆ Allure๋Š” ๋‹จ์ˆœํ•œ ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๋กœ์ปฌ์— ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ ํ˜•ํƒœ๋กœ๋„ ์„ค์น˜๊ฐ€ ๋˜์–ด ์žˆ์–ด์•ผ ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณ„๋„๋กœ Allure CLI๋ฅผ ์„ค์น˜ํ•˜๊ณ  ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋“ฑ๋กํ•œ ํ›„์—์•ผ ๋ช…๋ น์–ด๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ–ˆ๋‹ค.
 
ํ•œ ๊ฐ€์ง€ ์•„์‰ฌ์šด ์ ์€, reports/allure-results ํด๋”์— ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ๊ณ„์† ๋ˆ„์ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด์ „ ๊ฒฐ๊ณผ๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ์„œ, ๋ฆฌํฌํŠธ๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํด๋”๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•ด์ฃผ๋Š” ๊ฒŒ ๊ฐ€์žฅ ๊น”๋”ํ•œ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™๋‹ค. 
 

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ ์šฉํ•˜๊ธฐ ์ „์˜ Allure ๋ฆฌํฌํŠธ๋Š” ์™ผ์ชฝ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ๋‹ค์†Œ ๋ฐ‹๋ฐ‹ํ•˜๊ณ , ์–ด๋–ค ํ…Œ์ŠคํŠธ๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ง๊ด€์ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค. ์šฐ๋ฆฌ ํŒ€์€ ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„์ง€ ๋…ผ์˜ํ–ˆ๊ณ , ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์ค€์„ ์ •ํ•ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

  • @allure.suite: ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ (์˜ˆ: test_settings.py)
  • @allure.sub_suite: ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ์„ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋Š” ์šฉ๋„ (์˜ˆ: SETTING TEST)
  • @allure.title: ์‹œ๋‚˜๋ฆฌ์˜ค ID + ๋Œ€๋ถ„๋ฅ˜ - ์ค‘๋ถ„๋ฅ˜ ํ˜•์‹์œผ๋กœ ๊ตฌ์„ฑ
  • @allure.description: ํ•ด๋‹น ํ…Œ์ŠคํŠธ์˜ ๋ชฉ์ ๊ณผ ๋‚ด์šฉ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…

์ด๋ ‡๊ฒŒ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ ์šฉํ•œ ๊ฒฐ๊ณผ, ์˜ค๋ฅธ์ชฝ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ๋ฆฌํฌํŠธ๊ฐ€ ํ›จ์”ฌ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌ๋˜์—ˆ๊ณ , ํ…Œ์ŠคํŠธ์˜ ๋ชฉ์ ๊ณผ ๋‚ด์šฉ์„ ์ง๊ด€์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ์‹ฌ์ง€์–ด @pytest.mark.parametrize๋กœ ์ „๋‹ฌ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๊นŒ์ง€ ์ถœ๋ ฅ๋˜์–ด, ์–ด๋–ค ๊ฐ’์œผ๋กœ ํ…Œ์ŠคํŠธํ–ˆ๋Š”์ง€๋„ ํ•œ๋ˆˆ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์™œ ์ด์ œ์•ผ ์ด ๊ธฐ๋Šฅ์„ ์•Œ๊ฒŒ ๋œ ๊ฑด์ง€ ์•„์‰ฌ์šธ ์ •๋„์˜€๋‹ค. ์ง„์ž‘์— ์ ์šฉํ–ˆ์œผ๋ฉด ํ…Œ์ŠคํŠธ ๋ฆฌํฌํŠธ๋ฅผ ๋ณด๋Š” ์‹œ๊ฐ„์ด ํ›จ์”ฌ ์ค„์—ˆ์„ ํ…๋ฐ..!
 

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

  • ํ…Œ์ŠคํŠธ ์‹œ์ž‘ ์‹œ: โ–ถ๏ธ
  • ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ ์ถฉ์กฑ ์‹œ: โœ…
  • ํ…Œ์ŠคํŠธ ์™„๋ฃŒ ์‹œ: ๐ŸŽ‰

์ด๋ ‡๊ฒŒ ํ†ต์ผํ•œ ๋’ค์— ๊ฐ์ž ์ž‘์„ฑํ•œ ๋กœ๊ทธ ํŒŒ์ผ๋“ค์„ ๋ชจ์•„๋ณด๋‹ˆ, ์ „์ฒด์ ์œผ๋กœ ํ›จ์”ฌ ์ •๋ˆ๋œ ๋А๋‚Œ์ด ๋“ค์—ˆ๋‹ค. ๊ฐ€๋…์„ฑ๋„ ํ™•์‹คํžˆ ์ข‹์•„์กŒ๊ณ , ๋ฌด์—‡๋ณด๋‹ค ๋กœ๊ทธ๋งŒ ๋ด๋„ ํ…Œ์ŠคํŠธ ํ๋ฆ„์ด ํ•œ๋ˆˆ์— ๋“ค์–ด์™€์„œ ๊ฝค ๋ฟŒ๋“ฏํ–ˆ๋‹ค. ์ž‘์€ ๋ณ€ํ™”์ง€๋งŒ ํŒ€ ์ „์ฒด์˜ ํ€„๋ฆฌํ‹ฐ๊ฐ€ ์˜ฌ๋ผ๊ฐ„ ๋А๋‚Œ์ด๋ผ ๋งŒ์กฑ์Šค๋Ÿฝ๋‹ค.
 

์˜ค๋Š˜ ์˜คํ›„ 7์‹œ, ์˜คํ”ผ์Šค ์•„์›Œ ์‹œ๊ฐ„์— ์ฝ”์น˜๋‹˜์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๊ฐ€ ์ง„ํ–‰๋˜์—ˆ๋‹ค. ์ฝ”์น˜๋‹˜๊ป˜์„œ๋Š” ์ง€๋‚œ 5/9์— ์ฃผ์‹  ํ”ผ๋“œ๋ฐฑ๊ณผ ๊ด€๋ จํ•ด, ์šฐ๋ฆฌ ์กฐ๊ฐ€ header/, body/, footer/ ๊ตฌ์กฐ๋ฅผ ๋‹ค์†Œ ์ž˜๋ชป ์ดํ•ดํ•œ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ๋ง์”€ํ•˜์‹œ๋ฉฐ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์„ ์งš์–ด์ฃผ์…จ๋‹ค. ํŠนํžˆ page๊ฐ€ ์•„๋‹ˆ๋ผ component ๋‹จ์œ„๋กœ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ์„ค๋ช…์„ ๋“ค์€ ์ˆœ๊ฐ„, ์–ด์ œ ๋А๊ผˆ๋˜ ๋‹ต๋‹ตํ•จ์ด ๋‹จ๋ฒˆ์— ํ•ด์†Œ๋˜์—ˆ๋‹ค. ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ถ„๋ฆฌ๋œ ๋ถ€ํ’ˆ๋“ค์„ ์กฐํ•ฉํ•ด ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด ํ•ต์‹ฌ์ด์—ˆ๋‹ค. ๊ธฐ์กด์—๋Š” HomePage๊ฐ€ Header, HomePage, ArticlePage๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์ง€๋งŒ, ์ด์ œ๋Š” ์ด๋ฅผ HeaderComponent, ArticleTabComponent, PopularTagsComponent, ArticleComponent์ฒ˜๋Ÿผ ๋…๋ฆฝ๋œ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๋ณด๊ณ  ์กฐ๋ฆฝํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ์ •ํ™•ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. "์•„ํ•˜, ์ปดํฌ๋„ŒํŠธํ™”๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋˜๋Š” ๊ฑฐ์˜€๊ตฌ๋‚˜!" ์ดํ•ด๊ฐ€ ๋˜์ž๋งˆ์ž ๋จธ๋ฆฟ์†์ด ํ™˜ํ•ด์กŒ๊ณ , ๋‹ค๋ฅธ ๋ถ„๋“ค์ด Jenkins๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” ๋™์•ˆ ๋‚˜๋Š” ์‹œ๊ฐ„์„ ๋“ค์—ฌ ํ•ด๋‹น ๊ตฌ์กฐ๋ฅผ ์ „๋ฉด์ ์œผ๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค.


๐Ÿ“Œ 5/14 - 6์ผ์ฐจ ํšŒ๊ณ  (Jira๋ฅผ ํ™œ์šฉํ•œ ์ด์Šˆ ์ •๋ฆฌ & Pytest ๊ฒฐ๊ณผ ์š”์•ฝ์„ Slack์— ์ž๋™ ์ „์†ก)

 

 

AI ์—…๋ฌด ๊ด€๋ฆฌ ๋ฐ ์ƒ์‚ฐ์„ฑ ๋„๊ตฌ

์—…๋ฌด๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ์ƒˆ๋กœ์šด ์„ธ์ƒ, Slack ์ „ ์„ธ๊ณ„์—์„œ ๊ฐ€์žฅ ์‚ฌ๋ž‘๋ฐ›๋Š” ์—…๋ฌด์šฉ ์šด์˜ ์ฒด์ œ์— ์ธ๋ ฅ, ํ”„๋กœ์ ํŠธ, ๋„๊ตฌ, AI๋ฅผ ํ•œ๋ฐ ๋ชจ์•„๋ณด์„ธ์š”

slack.com

์‹ค๋ฌด์—์„œ ํ‡ด๊ทผํ•˜๊ธฐ ์ „์— ์ž๋™ํ™” ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ ค๋†“๊ณ  Slack์„ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋‹ค ๊ฐ™์ด ํ™•์ธํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ๋ฅผ ๋“ค์€ ์ ์ด ์žˆ์—ˆ๊ณ , ๊ทธ๋•Œ๋ถ€ํ„ฐ Slack ์—ฐ๋™์„ ๊ผญ ํ•œ ๋ฒˆ ์จ๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค. ๋งˆ์นจ ๋‹ค๋ฅธ ํŒ€์› ๋ถ„๋“ค์ด Jenkins ์—ฐ๋™์„ ์‹œ๋„ํ•˜๋Š” ๋™์•ˆ, ๋‚˜๋Š” Slack ์—ฐ๋™์„ ๋จผ์ € ๋„์ „ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. Slack ์—ฐ๋™์„ ์œ„ํ•ด ๋จผ์ € Slack ์•ฑ์„ ์ƒ์„ฑํ•˜๊ณ , ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ฅผ ์„ ํƒํ•œ ๋’ค Incoming Webhooks ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ–ˆ๋‹ค. ์ดํ›„ ์ „์†กํ•˜๊ณ ์ž ํ•˜๋Š” ์ฑ„๋„์„ ์ง€์ •ํ•˜๊ณ  Webhook URL์„ ๋ฐœ๊ธ‰๋ฐ›์•˜๋‹ค.
 

์ž๋™ํ™” ํ…Œ์ŠคํŠธ์™€ ๊ด€๋ จํ•ด์„œ๋Š”, pytest.ini ํŒŒ์ผ์— --alluredir=reports/allure-results ์˜ต์…˜์„ ๋„ฃ์–ด ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ allure result๊ฐ€ ์ƒ์„ฑ๋˜๋„๋ก ์„ค์ •ํ–ˆ๋‹ค. ๋‹ค๋งŒ ์ด ํด๋”๋Š” ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋ˆ„์ ๋˜์–ด ์Œ“์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ…Œ์ŠคํŠธ ์„ธ์…˜ ์‹œ์ž‘ ์ „์— clear_allure_dirs()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ธฐ์กด ๊ฒฐ๊ณผ ํด๋”๋ฅผ ์ดˆ๊ธฐํ™”ํ–ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์„ธ์…˜์ด ์ข…๋ฃŒ๋œ ํ›„์—๋Š” generate_allure_report()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฆฌํฌํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ send_test_result_to_slack() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด Slack์— ํ…Œ์ŠคํŠธ ์š”์•ฝ ๊ฒฐ๊ณผ๋ฅผ ์ „์†กํ–ˆ๋‹ค.
 

Slack ๋ฉ”์‹œ์ง€์—๋Š” allure-report/widgets/summary.json ํŒŒ์ผ์„ ์ฐธ๊ณ ํ•˜์—ฌ ํ…Œ์ŠคํŠธ์˜ ํ†ต๊ณผ, ์‹คํŒจ, ์Šคํ‚ต ์ˆ˜์™€ ์ „์ฒด ํ…Œ์ŠคํŠธ ์ˆ˜๋ฅผ ํฌํ•จ์‹œ์ผฐ๊ณ , ๋ˆ„๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋„ ํ•จ๊ป˜ ๋‹ด์•˜๋‹ค. ์—ฌ๊ธฐ์— ๋”ํ•ด, ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค ์ด๋ฆ„๊นŒ์ง€ Slack์œผ๋กœ ์ „์†ก๋˜๋„๋ก ๊ตฌ์„ฑํ•ด ์–ด๋–ค ํ…Œ์ŠคํŠธ๊ฐ€ ๋ฌธ์ œ์˜€๋Š”์ง€๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค. ์ฒ˜์Œ์—” Slack ์—ฐ๋™์ด ๊ฝค ๋ณต์žกํ•  ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๋ง‰์ƒ Webhook ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ฒฐํ•ด๋ณด๋‹ˆ ์ƒ๊ฐ๋ณด๋‹ค ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ด๋ผ ๋†€๋ž๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚  ๋•Œ๋งˆ๋‹ค ํŒ€์›๋“ค์˜ ํœด๋Œ€ํฐ์—์„œ Slack ์•Œ๋ฆผ์ด ์šธ๋ฆฌ๋Š” ๊ฑธ ๋ณด๋ฉฐ ๋‹ค๋“ค ๊ธฐ๋ปํ•˜๋Š” ๋ชจ์Šต์— ๋ฟŒ๋“ฏํ•จ์„ ๋А๋‚„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ฌผ๋ก , Allure HTML ๋ฆฌํฌํŠธ๋ฅผ Slack์— ์ฒจ๋ถ€ํ•˜๊ฑฐ๋‚˜ ๋งํฌ๋กœ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ, ํ˜„์žฌ๋Š” ๋ฆฌํฌํŠธ๊ฐ€ ์‹คํ–‰์ž์˜ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ผ ํŒ€์› ๋ชจ๋‘๊ฐ€ ๋™์ผํ•œ ๋งํฌ๋ฅผ ์—ด์–ด๋ณผ ์ˆ˜ ์—†๋‹ค๋Š” ์ ์€ ์•„์‰ฌ์›€์œผ๋กœ ๋‚จ์•˜๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ์š”์•ฝํ•ด Slack์— ์ž๋™ ์ „์†กํ•˜๋Š” ๊ธฐ๋Šฅ ํ•˜๋‚˜๋งŒ์œผ๋กœ๋„ ํ˜‘์—… ์‹œ ํˆฌ๋ช…์„ฑ์ด ๋†’์•„์ง€๊ณ , ์‹คํŒจ ์ผ€์ด์Šค๋ฅผ ๋น ๋ฅด๊ฒŒ ์บ์น˜ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ฝค ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๊ฐœ์„ ์ด์—ˆ๋‹ค.

Jira๋Š” ์•„์ง๊นŒ์ง€ ์–ด๋ ต๊ฒŒ ๋А๊ปด์ง„๋‹ค. ๋ญ”๊ฐ€ ์ด๋ฏธ ์„ธํŒ…๋œ ํฌ๋งท์„ ๋ฐ”ํƒ•์œผ๋กœ๋Š” ๊ทธ์— ๋งž์ถฐ ๋š๋”ฑ๋š๋”ฑ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ, ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ๋นˆ ๋„ํ™”์ง€ ์œ„์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์‹œ์ž‘ํ•ด์•ผ ํ• ์ง€ ๋ง‰๋ง‰ํ•˜๋‹ค. ์‹ค๋ฌด ๊ฒฝํ—˜์ด ๋ถ€์กฑํ•ด์„œ ๊ทธ๋Ÿฐ์ง€, ํ™”๋ฉด๋งŒ ๋ฐ”๋ผ๋ณด๊ณ  ๋ฉํ•ด์งˆ ๋•Œ๊ฐ€ ๋งŽ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ ํŒ€์˜ ๋Šฅ๋ ฅ์ž ํŒ€์› ๋ถ„๊ป˜์„œ ์ฒด๊ณ„์ ์œผ๋กœ ์ •๋ฆฌ๋œ Jira ์ด์Šˆ ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค์–ด์ฃผ์‹  ๋•๋ถ„์—, ๋‚˜๋Š” ๊ทธ ํฌ๋งท์— ๋งž์ถฐ ๋ฐœ๊ฒฌํ•œ ์ด์Šˆ๋“ค์„ ํ•˜๋‚˜์”ฉ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์ด ์ž˜ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์„œ ๋ฌธ์„œํ™” ๊ณผ์ •์ด ํ•œ๊ฒฐ ์ˆ˜์›”ํ–ˆ๊ณ , ๋†“์น  ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ๋“ค๋„ ๋น ์ง์—†์ด ์ฒดํฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ Confluence์—์„œ ๋ฌธ์„œ๊ฐ€ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์ˆ˜์ •๋˜๋ฉด, ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด Slack์„ ํ†ตํ•ด Jira์™€ ์ž๋™์œผ๋กœ ์—ฐ๋™๋˜๋„๋ก ์„ค์ •๊นŒ์ง€ ํ•ด์ฃผ์…”์„œ ๋†€๋ž๋‹ค. ์ด์ œ๋Š” ๋ˆ„๊ตฐ๊ฐ€ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ๋”ฐ๋กœ ๊ณต์œ ํ•˜์ง€ ์•Š์•„๋„, Slack ์•Œ๋ฆผ์„ ํ†ตํ•ด ๋ฐ”๋กœ ํ™•์ธํ•˜๊ณ  Jira์—์„œ ํ๋ฆ„์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด ํ˜‘์—…์˜ ํšจ์œจ์ด ๋ˆˆ์— ๋„๊ฒŒ ์˜ฌ๋ผ๊ฐ”๋‹ค.
 

์™€.. ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ ๊ฐ™์•„์„œ ๋ฏธ๋ค„๋‘์—ˆ๋˜ Jenkins๋ฅผ, ์˜ค๋Š˜ ๋‚ด๊ฐ€ Slack ์—ฐ๋™๊ณผ Postman์„ ๋งŒ์ ธ๋ณด๋Š” ๋™์•ˆ ์šฐ๋ฆฌ ํŒ€์˜ ๋Šฅ๋ ฅ์ž ํŒ€์›๋ถ„๊ป˜์„œ ๊ตฌํ˜„์— ์„ฑ๊ณตํ•˜์…จ๋‹ค! ์ต์ˆ™ํ•œ ์†๋†€๋ฆผ์œผ๋กœ ์™ธ๊ณ„์–ด ๊ฐ™์€ ๋ช…๋ น์–ด๋“ค์„ CLI์— ์™€๋‹ค๋‹ค ์ž…๋ ฅํ•˜์‹œ๋Š” ๋ชจ์Šต์ด ์ •๋ง ๋„ˆ๋ฌด ๋ฉ‹์กŒ๋‹ค. ํŒ€์› ๋ถ„๊ป˜์„œ ์‚ฌ์šฉํ•œ ๋ฐฉ์‹์€ ๋‚ด๊ฐ€ ์ฒ˜์Œ์— ์ƒ๊ฐํ–ˆ๋˜ '์ง์ ‘ ํŒŒ์ผ๋“ค์„ VM์— ์„ค์น˜ํ•˜๋Š” ๋ฐฉ์‹'์ด ์•„๋‹ˆ์—ˆ๋‹ค. ๋Œ€์‹ , ๋‹ค๋ฅธ ํŒ€์˜ ๋ ˆ์ด์„œ ๋ถ„๊ป˜์„œ ์•Œ๋ ค์ฃผ์‹  ๋ฐฉ๋ฒ•์ธ Docker ๊ธฐ๋ฐ˜์˜ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์„ ํƒํ•˜์…จ๋‹ค. ์ฆ‰, DB, ๋ฐฑ์—”๋“œ, ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์„ ๊ฐ๊ฐ ๋ณ„๋„์˜ ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ตฌ์„ฑํ•˜๊ณ , ์ด ์„ธ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•˜๋‚˜์˜ docker-compose.yml ํŒŒ์ผ๋กœ ์ •์˜ํ•˜์—ฌ docker-compose up ๋ช…๋ น์–ด ํ•œ ์ค„๋กœ ํ™˜๊ฒฝ์„ ์‹คํ–‰ํ•˜๊ณ , docker-compose down์œผ๋กœ ๊น”๋”ํ•˜๊ฒŒ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•˜์‹  ๊ฒƒ์ด๋‹ค. ์•„์ง ์ด ๋‹จ๊ณ„์—์„œ๋Š” ๊ฐ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ํ†ต์‹ ์ด ์™„์ „ํžˆ ์ด๋ฃจ์–ด์ง„ ์ƒํƒœ๋Š” ์•„๋‹ˆ์—ˆ์ง€๋งŒ, ์›น ๋Œ€์ƒ ์„œ๋น„์Šค๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋„์šฐ๋Š” ๋ฐ์—๋Š” ์„ฑ๊ณตํ•˜์‹  ์…ˆ์ด์—ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ํŒ€์›๋ถ„๊ป˜์„œ ์ •๋ฆฌํ•ด์ฃผ์‹  ํŒŒ์ผ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ง์ ‘ ๋กœ์ปฌ์—์„œ ์‹ค์Šตํ•˜๋ฉฐ ์ตํ˜€๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.


๐Ÿ“Œ 5/15 - 7์ผ์ฐจ ํšŒ๊ณ  (Postman์„ ํ™œ์šฉํ•œ API ํ…Œ์ŠคํŠธ ์ž๋™ํ™” & API ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ)

 

API ํ…Œ์ŠคํŠธ๋Š” Swagger UI๋ฅผ ํ™œ์šฉํ•ด ์ง์ ‘ URL์„ ์ง€์ •ํ•˜๊ณ  ์š”์ฒญ body๋ฅผ ๊ตฌ์„ฑํ•œ ๋’ค ์š”์ฒญ์„ ์ „์†กํ–ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, 201 OK ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ๊ณ  ๋กœ์ปฌ DB์—๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค. ์˜คํ”ผ์Šค ์•„์›Œ์—์„œ ์ฝ”์น˜๋‹˜๊ป˜์„œ๋„ '์‘๋‹ต ๊ตฌ์กฐ๋งŒ ์ž˜ ๋“ค์–ด์˜ค๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค'๊ณ  ๋ง์”€ํ•˜์…”์„œ, ์ด ์ •๋„ ๊ตฌํ˜„์œผ๋กœ 1์ฐจ ๋ชฉํ‘œ๋Š” ๋‹ฌ์„ฑํ•œ ์…ˆ์ด๋‹ค. ์•ž์œผ๋กœ๋Š” newman์„ ์‚ฌ์šฉํ•ด ์ž๋™ ์‹คํ–‰๊นŒ์ง€ ํ•ด๋ณด๊ณ  ์‹ถ์–ด์„œ, ์šฐ์„ ์€ Postman collection์„ ์ž˜ ๊ตฌ์„ฑํ•ด๋ณด๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•  ๊ณ„ํš์ด๋‹ค.
 

Postman์—๋„ ํ˜‘์—… ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋Š” ๊ฑธ ์ฒ˜์Œ ์•Œ์•˜๋‹ค. ํŒ€์›์ด๋ž‘ ๊ฐ™์ด ์ž‘์—…ํ•˜๋‹ˆ๊นŒ ํ™•์‹คํžˆ ์†๋„๊ฐ€ ํ›จ์”ฌ ๋นจ๋ž๋‹ค! ๋‚ด๊ฐ€ ์›๋ž˜ ๊ฐœ์ธ ์›Œํฌ์ŠคํŽ˜์ด์Šค์—์„œ ์ž‘์—…ํ•˜๋˜ collection๋„ ํŒ€ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒŒ ์ •๋ง ๊ฐ„๋‹จํ–ˆ๋Š”๋ฐ, ๊ทธ๋ƒฅ 'Move' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์„œ ์›ํ•˜๋Š” ์œ„์น˜๋งŒ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋์ด์—ˆ๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค API ํ…Œ์ŠคํŠธ์—์„œ ํ™•์ธํ•  ๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ง€ ์•Š์•˜๋‹ค. ์ฒดํฌํ•  ํ•ญ๋ชฉ๋„ ๋งŽ์ง€ ์•Š๊ณ , ํ๋ฆ„๋งŒ ์ž˜ ์žก์œผ๋ฉด ๊ธˆ๋ฐฉ ๋๋‚˜๋Š” ๋А๋‚Œ์ด์—ˆ๋‹ค.
 
์ฒ˜์Œ์—๋Š” ํšŒ์›๊ฐ€์ž…์ด ์„ฑ๊ณตํ•˜๋ฉด ์‘๋‹ต์œผ๋กœ ์˜ค๋Š” token ๊ฐ’์„ ์ปฌ๋ ‰์…˜ ๋ณ€์ˆ˜์— ์ €์žฅํ–ˆ๋Š”๋ฐ, ์•Œ๊ณ  ๋ณด๋‹ˆ ๋กœ๊ทธ์ธํ•  ๋•Œ๋งˆ๋‹ค ํ† ํฐ ๊ฐ’์ด ๋ฐ”๋€Œ๋Š” ๊ตฌ์กฐ์˜€๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ธ์ฆ ์‹œ์Šคํ…œ์ด JWT(Json Web Token) ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ณ , ์ด ํ† ํฐ์€ ๋กœ๊ทธ์ธ ์‹œ์ ์— ์‚ฌ์šฉ์ž์˜ ๊ณ ์œ  ์ •๋ณด + ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๋“ฑ์„ ๋ฐ”ํƒ•์œผ๋กœ ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ณด์•ˆ ์ƒ์˜ ์ด์œ ๋กœ ๋งค๋ฒˆ ๋กœ๊ทธ์ธ ์‹œ ์ƒˆ๋กœ์šด ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•ด์„œ ์ด์ „ ํ† ํฐ์ด ์œ ์ถœ๋˜๋”๋ผ๋„ ์žฌ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฒŒ๋” ๋ง‰๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ฒฐ๊ตญ ๋กœ๊ทธ์ธ ํ›„์— ์‘๋‹ต์œผ๋กœ ๋ฐ›์€ token ๊ฐ’์„ ๋‹ค์‹œ ์ปฌ๋ ‰์…˜ ๋ณ€์ˆ˜์— ์ €์žฅํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊ฟจ๊ณ , ์ดํ›„ ํŒ”๋กœ์šฐ/์–ธํŒ”๋กœ์šฐ์ฒ˜๋Ÿผ ์ธ์ฆ์ด ํ•„์š”ํ•œ ์š”์ฒญ์—์„œ๋Š” Authorization ํ—ค๋”์— Bearer {{TOKEN}} ํ˜•์‹์œผ๋กœ ๊ฐ’์„ ๋„˜๊ฒจ์ฃผ์—ˆ๋”๋‹ˆ ์ •์ƒ์ ์œผ๋กœ ์ž˜ ๋™์ž‘ํ–ˆ๋‹ค.
 

๊ทธ๋ฆฌ๊ณ  Articles, Comments, Favorites API ๋ชจ๋‘ URL์— {slug}๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์—ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ด ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผํ–ˆ์ง€๋งŒ, Postman์˜ ์š”์ฒญ์€ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค๋Š” ์ ์„ ๋– ์˜ฌ๋ฆฌ๊ณ , ๊ทธ ํ๋ฆ„์„ ํ™œ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์šฐ์„  Article ๊ด€๋ จ API, ์ฆ‰ POST ์š”์ฒญ์„ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋˜๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค. Swagger๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ Article์„ ์ƒ์„ฑํ•  ๋•Œ ์‘๋‹ต๊ฐ’์— slug๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๊ฐ’์„ pm.environment.set("SLUG", response.article.slug)์™€ ๊ฐ™์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ €์žฅํ•ด๋‘๊ณ , ์ดํ›„ Comments๋‚˜ Favorites API์—์„œ๋Š” {{SLUG}} ํ˜•ํƒœ๋กœ ๋™์ ์œผ๋กœ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค. API ์ž๋™ํ™” ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋А๋‚€ ์ ์€, ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๊ฐ’๋ณด๋‹ค๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๋ถ„๋ฆฌํ•ด ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด ์œ ์ง€๋ณด์ˆ˜๋‚˜ ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ ํ›จ์”ฌ ๋›ฐ์–ด๋‚˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ๊ฐ„์— ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์ ์—์„œ๋„ ๋งค์šฐ ์œ ์šฉํ–ˆ๋‹ค. ์‚ฌ์‹ค ์ดˆ๋ฐ˜์—๋Š” token, slug ๊ฐ’์„ ์ปฌ๋ ‰์…˜ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•˜๊ณ , CLI ์‹คํ–‰ ์‹œ์—๋Š” ์ปฌ๋ ‰์…˜ ํŒŒ์ผ๋งŒ ์ถ”์ถœํ–ˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‚˜์ค‘์— ์•Œ๊ฒŒ ๋œ ๊ฑด, Postman CLI์—์„œ๋Š” ์ปฌ๋ ‰์…˜ ๋ณ€์ˆ˜๋งŒ์œผ๋กœ๋Š” ๊ฐ’์„ ์ฝ์–ด์˜ค์ง€ ๋ชปํ•œ๋‹ค๋Š” ์ ์ด์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ธ‰ํ•˜๊ฒŒ ๋ชจ๋“  ๊ฐ’์„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์˜ฎ๊ฒจ ์ €์žฅํ–ˆ๊ณ , ์ดํ›„์—๋Š” ์ปฌ๋ ‰์…˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊นŒ์ง€ ํ•จ๊ป˜ ์ถ”์ถœํ•ด CLI์—์„œ๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ์ž˜ ์ž‘๋™๋˜๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค.

 

์˜ค๋Š˜์€ Collection ๊ตฌ์„ฑ๊ณผ API ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ๊นŒ์ง€ ์™„๋ฃŒํ–ˆ๋‹ค. ์‚ฌ์‹ค API ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฑด ์ด๋ฒˆ์ด ์ฒ˜์Œ์ด๋ผ, ํฌ๋งท๋„ ์ •ํ™•ํžˆ ๋ชจ๋ฅด๊ฒ ๊ณ  ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ ๋งž๋Š”์ง€๋„ ์ž˜ ๊ฐ์ด ์˜ค์ง€ ์•Š์•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์š”์ฒญ ๋ฐ์ดํ„ฐ๋Š” body์— ์–ด๋–ค ๊ฐ’์„ ๋„ฃ์—ˆ๋Š”์ง€๊นŒ์ง€ ์ƒ์„ธํžˆ ์ ๋Š” ๊ฒŒ ๋งž๋Š”์ง€, ์˜ˆ์ƒ ์‘๋‹ต์—๋Š” ๊ฐ์ฒด์˜ ํ‚ค์™€ ๊ฐ’์„ ๋ชจ๋‘ ๋‹ค ๋ช…์‹œํ•ด์•ผ ํ•˜๋Š”์ง€ ๋“ฑ ์—ฌ๋Ÿฌ๋ชจ๋กœ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์ด ๋งŽ์•˜๋‹ค. ์‹ค์ œ๋กœ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ด๋Ÿฐ ์ •๋ณด๋“ค์ด ์ด๋ฏธ ์ผ๋ถ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด์„œ, ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—๊นŒ์ง€ ๋˜‘๊ฐ™์ด ์ ๋Š” ๊ฑด ์ค‘๋ณต์ด๋ผ๋Š” ์ƒ๊ฐ๋„ ๋“ค์—ˆ๋‹ค. ์˜คํ”ผ์Šค ์•„์›Œ์—์„œ ์ฝ”์น˜๋‹˜๊ป˜์„œ๋„ '๊ฒฐ๊ณผ๊ฐ’์„ ๋ฆฌํฌํŒ…ํ•ด์„œ ๋ฝ‘์•„๋‚ผ ๊ฑฐ๋ผ๋ฉด, ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ ์–ด๋–ค ๋ถ€๋ถ„์„ ๊ฒ€์ฆํ–ˆ๋Š”์ง€๋งŒ ๊ฐ„๋‹จํžˆ ๋ช…์‹œํ•ด๋„ ๋œ๋‹ค'๊ณ  ํ•˜์…”์„œ, ๋„ˆ๋ฌด ๋””ํ…Œ์ผํ•œ ๋ถ€๋ถ„๊นŒ์ง€ ์–ต์ง€๋กœ ์ฑ„์›Œ ๋„ฃ์ง€ ์•Š๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ง€๊ธˆ ์ž‘์„ฑํ•œ ์ˆ˜์ค€์—์„œ๋„ ๋‚˜๋ฆ„๋Œ€๋กœ ๋งŒ์กฑ์Šค๋Ÿฝ๊ณ , ์ถ”ํ›„ ๋ฆฌํฌํŠธ๋‚˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์–ผ๋งˆ๋“ ์ง€ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
 

์ด ๋‚ ์€ ์—˜๋ฆฌ์Šค Lab ์˜ˆ์•ฝ์ด ์ „๋ถ€ ์ฐจ ์žˆ์–ด์„œ, ํ‰์†Œ์— ํ˜ผ์ž ์ž์ฃผ ๊ณต๋ถ€ํ•˜๋˜ ๊ณต์œ  ์˜คํ”ผ์Šค์˜ ํšŒ์˜์‹ค์„ ๋นŒ๋ ค ์ž‘์—…ํ–ˆ๋‹ค. ์‚ฌ์‹ค ์ด ๊ณต๊ฐ„์„ ์˜ˆ์•ฝํ•˜๊ธฐ๊นŒ์ง€๋„ ์ด๋Ÿฐ์ €๋Ÿฐ ์ผ์ด ๋งŽ์•˜์ง€๋งŒ, ์–ด์จŒ๋“  ์กฐ์šฉํ•œ ๊ณต๊ฐ„์—์„œ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฑด ๋‹คํ–‰์ด์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋‚  ์ฒ˜์Œ์œผ๋กœ BHC ์‚ฌ์žฅ๋‹˜๊ป˜ ์ถ”์ฒœ๋ฐ›์€ ‘๋ง›์ดˆํ‚น’์„ ๋จน์–ด๋ดค๋Š”๋ฐ, ๊ทธ๋™์•ˆ ๋งค๋ฒˆ ๋ฟŒ๋งํด๋งŒ ๋จน๋‹ค๊ฐ€ ์ƒ‰๋‹ค๋ฅธ ๋ง›์„ ๋ฐœ๊ฒฌํ•œ ๊ธฐ๋ถ„์ด์—ˆ๋‹ค.
 
์˜†์ž๋ฆฌ์—์„œ๋Š” Jenkins ์—ฐ๋™์„ ๋งก์€ ํŒ€์›๋ถ„์ด ๊ณ„์† ๋จธ๋ฆฌ๋ฅผ ์ฅ์–ด์งœ๋ฉฐ ๊ณ ๊ตฐ๋ถ„ํˆฌํ•˜๊ณ  ๊ณ„์…จ๋‹ค. ์›๋ž˜ Jenkins๋ฅผ ๊ผญ ํ•œ๋ฒˆ ๋‹ค๋ค„๋ณด๊ณ  ์‹ถ์–ด ํ•˜์…จ๊ณ , ์ตœ๊ทผ์— Docker ๊ฐ•์˜๋„ ๋“ค์œผ์‹  ํ„ฐ๋ผ “์ด๋ฒˆ ๊ธฐํšŒ์— ๊ผญ ๋„์ „ํ•ด๋ณด๊ฒ ๋‹ค”๋ฉฐ ์ง์ ‘ ๋งก์•„์ฃผ์‹œ๊ธฐ๋กœ ํ–ˆ๋˜ ์ƒํ™ฉ์ด์—ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋ชจ์Šต์„ ๋ณด๋‹ˆ ํ•œํŽธ์œผ๋กœ๋Š” ๋ฏธ์•ˆํ•˜๋ฉด์„œ๋„, ์ •๋ง ๊ณ ๋ง™๊ณ  ๋“ ๋“ ํ•œ ๋งˆ์Œ์ด ๋“ค์—ˆ๋‹ค. ์‚ฌ์‹ค Jenkins๋Š” ์„ธ ๋ช…์ด ๋™์‹œ์— ๋‹ฌ๋ผ๋ถ™์–ด๋„ ํ•˜๋ฃจ๊ฐ€ ๋‹ค ๊ฐˆ ์ •๋„๋กœ ๋‚œ์ด๋„๊ฐ€ ๋†’์€ ์˜์—ญ์ด๋ผ, ๋‚˜๋Š” Postman ํ…Œ์ŠคํŠธ ์ชฝ์„ ๋งก๊ธฐ๋กœ ํ–ˆ๋‹ค.
 
์ฒ˜์Œ์—๋Š” Postman์ด๋ผ๋Š” ํˆด ์ž์ฒด๊ฐ€ ์ต์ˆ™ํ•˜์ง€ ์•Š์•˜๊ณ , Swagger ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ ๋„ ๋ฌด์—‡์„ ๊ฒ€์ฆํ•ด์•ผ ํ•˜๋Š”์ง€, ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ ํ๋ฆ„์„ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ• ์ง€์กฐ์ฐจ ๋ง‰๋ง‰ํ•œ ์ƒํƒœ์˜€๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๊ทธ๋™์•ˆ ํ•ด๋ดค๋˜ ๊ฑด ๋Œ€๋ถ€๋ถ„ ์—ฐ์Šต์šฉ API๋‚˜ ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ ๋Œ€์ƒ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•œ API ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฑด ์ด๋ฒˆ์ด ์ฒ˜์Œ์ด๋ผ ๋‚ฏ์„ค๊ณ  ์–ด๋ ค์šด ์ ์ด ๋งŽ์•˜๋‹ค. ํ•˜์ง€๋งŒ ๊ณ„์† ์†์„ ๋Œ€๋‹ค ๋ณด๋‹ˆ ์ ์ฐจ ๊ฐ์„ ์žก๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ , ๊ทธ ๋•๋ถ„์— ํ•˜๋ฃจ ๋งŒ์— Postman ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ๊ณผ API ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ •๋ฆฌ ์ž‘์—…์„ ๋ชจ๋‘ ๋งˆ๋ฌด๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


๐Ÿ“Œ 5/16 - 8์ผ์ฐจ ํšŒ๊ณ  (Newman์„ ํ†ตํ•œ report ์ƒ์„ฑ & API ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์š”์•ฝ์„ Slack์— ์ž๋™ ์ „์†ก)

 

Docker๋ฅผ ํ™œ์šฉํ•ด Jenkins ์—ฐ๋™์— ๋„์ „ํ•˜์‹œ๋Š” ํŒ€์›๋ถ„์˜ ์ฒœ์žฌ์„ฑ์„ ๋„์ €ํžˆ ๋”ฐ๋ผ๊ฐ€๊ธฐ ํž˜๋“ค์–ด์„œ, ์ „๋‚  ์ƒˆ๋ฒฝ 3์‹œ๊นŒ์ง€ Docker์™€ Jenkins์— ๋Œ€ํ•ด GPT์™€ ํ•จ๊ป˜ ๊ณต๋ถ€ํ–ˆ๋‹ค. 1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ Jenkins๋ฅผ ์—ฐ๋™ํ–ˆ์—ˆ๋Š”์ง€๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ, ํ˜„์žฌ 2์ฐจ ํ”„๋กœ์ ํŠธ์—์„œ ๊ทธ๋•Œ์™€๋Š” ๋ญ๊ฐ€ ๋‹ค๋ฅธ์ง€, Jenkins ์—ฐ๋™์„ ์œ„ํ•œ ๋ฐฉ๋ฒ•์—๋Š” ์–ด๋–ค ์„ ํƒ์ง€๊ฐ€ ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ฐ ๋ฐฉ๋ฒ•๋“ค์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ์ง€ ํ•˜๋‚˜ํ•˜๋‚˜ ์ •๋ฆฌํ•ด๊ฐ€๋ฉฐ ๊ฐœ๋…์„ ์Œ“์•˜๋‹ค. ํŠนํžˆ Docker๋ฅผ ํ†ตํ•ด ๋ฐฑ์—”๋“œ, ํ”„๋ก ํŠธ์—”๋“œ, DB๋ฅผ ๊ฐ๊ฐ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋„์šฐ๊ณ , ์ด๋ฅผ docker-compose.yml๋กœ ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ๋„ ์ง‘์ค‘์ ์œผ๋กœ ํ•™์Šตํ–ˆ๋‹ค. ํ™˜๊ฒฝ ๊ตฌ์„ฑ ํ๋ฆ„์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๊ณ , ์ •๋ฆฌ๋Š” ํŒ€์›๋ถ„์ด ์ถ”์ฒœํ•ด์ฃผ์‹  ์˜ต์‹œ๋””์–ธ์œผ๋กœ ํ–ˆ๋‹ค. ์ด๊ฑฐ ์จ๋ณด๋‹ˆ๊นŒ ๊ดœํžˆ ์ฝ”์น˜๋‹˜ ๋œ ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค ใ…‹ใ…‹ ์•„, ๋ฌผ๋ก  ๊ทธ๋ ‡๊ฒŒ ์ƒˆ๋ฒฝ 3์‹œ๊นŒ์ง€ ๊ณต๋ถ€ํ•œ ๋•๋ถ„์— ๋‹ค์Œ ๋‚  ๋Šฆ์ž  ์ž์„œ ์ง€๊ฐํ•œ ๊ฑด ์•ˆ ๋น„๋ฐ€์ด๋‹ค..
 

์ด ๋‚ ์€ ๊ฐ™์€ ํŒ€์›๋ถ„๊ณผ ํ•จ๊ป˜ ์™„์„ฑํ•œ Postman Collection์„ ์ „์ฒด์ ์œผ๋กœ ์‹คํ–‰ํ•ด๋ณด๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋“ค์„ ํ•จ๊ป˜ ์ฐพ์•„๋‚˜๊ฐ”๋‹ค. ํ•จ๊ป˜ ํ•˜๋‚˜์”ฉ ์˜ค๋ฅ˜์˜ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ณ  ๊ณ ์ณ๋‚˜๊ฐ€๋ฉฐ Failed ์ˆ˜๊ฐ€ ์ ์  ์ค„์–ด๋“œ๋Š” ๊ฑธ ๋ณด๋Š” ๊ณผ์ •์ด ์ •๋ง ์ฆ๊ฑฐ์› ๋‹ค. ๋งˆ์ง€๋ง‰์— Failed ์ˆ˜๊ฐ€ 0์ด ๋˜์—ˆ์„ ๋•Œ์˜ ๊ทธ ์พŒ๊ฐ์€ ์•„๋งˆ๋„ ์žŠ์ง€ ๋ชปํ•  ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŒ€์›๋ถ„๊ป˜์„œ 'Newman ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚œ ๋’ค์—๋„ Slack์— ์ž๋™์œผ๋กœ ๊ฒฐ๊ณผ ์•Œ๋ฆผ์ด ์ „์†ก๋˜๋ฉด ๋„ˆ๋ฌด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค'๊ณ  ํ•˜์…”์„œ, ๋ฐ”๋กœ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ์˜ˆ์ „์— ์ž‘์„ฑํ•ด๋‘” pytest ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ Slack์— ์ „์†กํ•˜๋Š” ์ฝ”๋“œ์™€ ๊ตฌ์กฐ๊ฐ€ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์•„์„œ, ์ด๋ฒˆ์—๋„ GPT์˜ ๋„์›€์„ ๋ฐ›์•„ ๊ธˆ๋ฐฉ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
 

์ด ๋‚ ์€ ํŒ€์›๋ถ„๋“ค๊ณผ ํ•จ๊ป˜ Jenkins์—์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ์ด์œ ๋ฅผ ๋๊นŒ์ง€ ํŒŒํ—ค์ณ๋ณธ ๋‚ ์ด์—ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฐ ํ…Œ์ŠคํŠธ ๊ฐ„ ์˜์กด์„ฑ์„ ์—†์• ๊ธฐ ์œ„ํ•ด DB๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ํšŒ์›๊ฐ€์ž…๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์ง€๋งŒ, ์ด์ƒํ•˜๊ฒŒ๋„ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๊ณ  ๋‹จ ํ•˜๋‚˜๋งŒ ํ†ต๊ณผํ–ˆ๋‹ค. ๊ทธ ์œ ์ผํ•œ ์„ฑ๊ณต ์ผ€์ด์Šค๋Š” ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ํ…Œ์ŠคํŠธ์˜€๋‹ค. ์ด ํ…Œ์ŠคํŠธ๋Š” ํšŒ์›๊ฐ€์ž… ์—†์ด ๋ฒ„ํŠผ ํด๋ฆญ ํ›„ URL ๋ณ€๊ฒฝ๋งŒ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.
 
์ด ์ฐจ์ด์ ์ด ํžŒํŠธ์˜€๋‹ค. ์šฐ๋ฆฌ๋Š” ํšŒ์›๊ฐ€์ž… ๋กœ์ง์— print()๋ฌธ๊ณผ ์Šคํฌ๋ฆฐ์ƒท ์ €์žฅ, DOM ๊ตฌ์กฐ ๋ฐ˜ํ™˜๊นŒ์ง€ ๋„ฃ์–ด๊ฐ€๋ฉฐ ์›์ธ์„ ์ถ”์ ํ•ด๋‚˜๊ฐ”๋‹ค. ํšŒ์›๊ฐ€์ž… ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ธฐ ์ „๊ณผ ๋ˆ„๋ฅธ ํ›„์˜ print()๊ฐ€ ๋ชจ๋‘ ์ถœ๋ ฅ๋˜์—ˆ๊ณ , ํด๋ฆญ ์ด๋ฒคํŠธ๋„ ๋ฌธ์ œ์—†์ด ๋ฐœ์ƒํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ํšŒ์›๊ฐ€์ž…์ด ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋งˆ์ง€๋ง‰ assert์—์„œ ๊ณ„์† ์‹คํŒจ๊ฐ€ ๋‚ฌ๋‹ค. ์Šคํฌ๋ฆฐ์ƒท์„ ๋ณด๋ฉด ํ•ญ์ƒ ํšŒ์›๊ฐ€์ž… ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ์งํ›„, ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ์—์„œ ์บก์ฒ˜๊ฐ€ ๋˜๊ณ  ์žˆ์—ˆ๋‹ค.
 
์ด์ƒํ–ˆ๋‹ค. ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฌธ์ œ ์—†์ด ํšŒ์›๊ฐ€์ž…์ด ์ž˜ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” 'ํด๋ฆญ์€ ๋˜์ง€๋งŒ, ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š”๋‹ค'๋Š” ์ ์—์„œ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ํ†ต์‹  ๋ฌธ์ œ์ผ ๊ฐ€๋Šฅ์„ฑ์„ ์˜์‹ฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ, ํ˜น์€ ๋ฐฑ์—”๋“œ์™€ DB ๊ฐ„ ์—ฐ๊ฒฐ ์ค‘ ์–ด๋”˜๊ฐ€๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค๋Š” ์ถ”์ธก์ด์—ˆ๋‹ค. ์˜คํ”ผ์Šค ์•„์›Œ ์‹œ๊ฐ„์— ์ด ์ƒํ™ฉ์„ ์ฝ”์น˜๋‹˜๊ป˜ ๋ง์”€๋“œ๋ ธ๊ณ , ์ฝ”์น˜๋‹˜๊ป˜์„œ๋Š” IP ๋ฐ ๋„คํŠธ์›Œํฌ ๊ด€๋ จ ์„ค์ • ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์กฐ์–ธ์„ ์ฃผ์…จ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋กœ ๊ทธ๋•Œ, Jenkins๋ฅผ ๋‹ด๋‹นํ•˜์…จ๋˜ ํŒ€์›๋ถ„๊ป˜์„œ ์กฐ์šฉํžˆ ๋ง์”€ํ•˜์…จ๋‹ค. '์ € ํ•œ ๋ฒˆ๋งŒ ๋ฏฟ์–ด์ฃผ์„ธ์š”.' ๊ทธ๋Ÿฌ๋”๋‹ˆ ๊ณผ๊ฐํ•˜๊ฒŒ VM ๋‚ด์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ๋ฐ€์–ด๋ฒ„๋ฆฌ์…จ๊ณ , ์–ผ๋งˆ ํ›„ ๊ฐ‘์ž๊ธฐ ๋ฐ•์ˆ˜๋ฅผ ์น˜์…จ๋‹ค. ํ™”๋ฉด์„ ๋ณด๋‹ˆ.. Jenkins ๊ฒฐ๊ณผ์— ๋–  ์žˆ๋Š” 'PASSED'. ์ง„์งœ ๊ทธ ์ˆœ๊ฐ„, ์šฐ๋ฆฌ ๋ชจ๋‘ ์ž๋ฆฌ์—์„œ ๋ฒŒ๋–ก ์ผ์–ด๋‚˜ ํ•˜์ดํŒŒ์ด๋ธŒ๋ฅผ ์น˜๊ณ , ์‹ ๋‚œ ๋งˆ์Œ์— ๋น„๋ฅผ ๋šซ๊ณ  ๊ทผ์ฒ˜ ํŽธ์˜์ ์œผ๋กœ ๋‹ฌ๋ ค๊ฐ€ ๋จธ๋ฆฌ๋ฅผ ์‹ํ˜”๋‹ค.
 
๊ทธ๋Š”... ์ง„์งœ ์‹ ์ด์—ˆ๋‹ค. ์ด ๋ณต์žกํ•œ ์—ฐ๋™์„ ํ˜ผ์ž์„œ ํ•ด๋‚ด์‹œ๋‹ค๋‹ˆ! ์ดํ›„์—๋Š” ์–ด๋–ค ๊ณผ์ •์„ ๊ฑฐ์ณค๋Š”์ง€ ์ฐจ๊ทผ์ฐจ๊ทผ ์„ค๋ช…๋„ ํ•ด์ฃผ์…จ๊ณ , ์ •๋ง ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ๋‹ค. ๋‹ค๋งŒ ๋“ฃ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ํฐ ๊ทธ๋ฆผ์ด ์™„์ „ํžˆ ๊ทธ๋ ค์ง€์ง€ ์•Š์•„, ์ง์ ‘ ๊ณต์œ ๋ฐ›์€ Dockerfile๊ณผ docker-compose.yml์„ ๋ฐ”ํƒ•์œผ๋กœ ํ˜ผ์ž ๋‹ค์‹œ ํ•œ ๋ฒˆ ํ•ด๋ณด๋ฉด์„œ ์ตํžˆ๊ธฐ๋กœ ํ–ˆ๋‹ค. ์„ค๋ช… ์ค‘์—๋Š” ๊ณต์ธ IP, ์‚ฌ์„ค IP, ๊ทธ๋ฆฌ๊ณ  Docker ๋„คํŠธ์›Œํฌ ๊ตฌ์กฐ ์ด์•ผ๊ธฐ๊นŒ์ง€ ๋‚˜์™”๋Š”๋ฐ..  ๊ทธ ์ˆœ๊ฐ„ ํ™•์‹คํžˆ ๋А๊ผˆ๋‹ค. ์•„, ๋‚˜๋Š” ์•„์ง๋„ ๋ชจ๋ฅด๋Š” ๊ฒŒ ๋„ˆ๋ฌด ๋งŽ๊ตฌ๋‚˜. ๋ฐฐ์šฐ๊ธด ํ–ˆ์ง€๋งŒ ๋‹ค ๊นŒ๋จน์€ ๊ฒƒ ๊ฐ™๊ณ , ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์€ ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์ฑ„์›Œ๋‚˜๊ฐ€์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.


๐Ÿ“… 5/17 - ํŒ€ ๋ชจ์ž„ (ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ๋ถ„๋ฆฌ & Jenkins All Passed) 

  

Jenkins์—์„œ run_prisma_seed() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ๋ชจ๋‘ ์‹คํŒจํ–ˆ๋‹ค. ์ด์œ ๋ฅผ ๋ถ„์„ํ•ด๋ณด๋‹ˆ, Backend์™€ Jenkins๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์ด ์›์ธ์ด์—ˆ๋‹ค. run_prisma_seed() ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” npx prisma db seed ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ, cwd ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด backend ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ํ•ด๋‹น ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ์ฆ‰, ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋Š” ์ž˜ ๋™์ž‘ํ•˜์ง€๋งŒ, Jenkins ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—๋Š” backend ๋””๋ ‰ํ† ๋ฆฌ ์ž์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— seed ๋ช…๋ น์–ด๊ฐ€ ์‹คํŒจํ•˜๋Š” ๊ตฌ์กฐ์˜€๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Prisma CLI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ , faker ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ง์ ‘ DB์— ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค. Tag, User, Article, _ArticleToTag ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๋žœ๋ค ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์ค€ ๊ฒฐ๊ณผ, ๊ธฐ์กด์— ์‹คํŒจํ•˜๋˜ ํ…Œ์ŠคํŠธ๋“ค์ด ๋ชจ๋‘ ์ •์ƒ์ ์œผ๋กœ ํ†ต๊ณผ๋˜์—ˆ๋‹ค!
 

๊ทธ ํ›„์—, ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ ํ•˜๋‚˜์”ฉ ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ค„์—ฌ๋‚˜๊ฐ”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์นจ๋‚ด, All Passed! ๐ŸŽ‰ ๊ทธ ๊ฒฐ๊ณผ ๋’ค์—๋Š” ๋ฌด๋ ค 10์‹œ๊ฐ„์˜ ์‹œํ–‰์ฐฉ์˜ค์™€ ๋””๋ฒ„๊น… ๊ณผ์ •์ด ์ˆจ์–ด ์žˆ๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด, ์˜ค๋ฅ˜๋ฅผ ํŒŒ์•…ํ•  ๋•Œ๋Š” print()๋ฌธ๊ณผ ์Šคํฌ๋ฆฐ์ƒท ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฑธ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋А๊ผˆ๋‹ค. ํŠนํžˆ print()๋ฌธ์„ ํ†ตํ•ด ํ˜„์žฌ ์–ด๋–ค ๊ฐ’์ด ๋‹ด๊ฒจ ์žˆ๋Š”์ง€, ํŠน์ • ๋กœ์ง์ด ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์€ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ํฐ ๋„์›€์ด ๋˜์—ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค๋„, ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ ๋จธ๋ฆฌ๋ฅผ ๋งž๋Œ€๊ณ  ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐ€๋Š” ๊ณผ์ •์ด ์ •๋ง ์ฆ๊ฑฐ์› ๋‹ค. ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•˜๋‚˜์”ฉ ์ค„์–ด๋“ค ๋•Œ๋งˆ๋‹ค ๋ชจ๋‘๊ฐ€ ํ•จ๊ป˜ ๊ธฐ๋ปํ•˜๊ณ , ๋””๋ฒ„๊น… ์ค‘์— "์ด ๋ถ€๋ถ„์ด ์›์ธ์ผ ์ˆ˜ ์žˆ๋‹ค"๋ฉฐ ์˜๊ฒฌ์„ ๋‚˜๋ˆ„๋Š” ๊ณผ์ • ๋˜ํ•œ ๋งค์šฐ ์œ ์ตํ–ˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด์„œ, ํŒ€์›Œํฌ์™€ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์˜ ํž˜์„ ์˜จ๋ชธ์œผ๋กœ ๋А๋‚€ ์‹œ๊ฐ„์ด์—ˆ๋‹ค.
 

์˜ค๋Š˜์˜ ์›ƒ์Œ๋ฒจ ์—ํ”ผ์†Œ๋“œ. ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ๋ถ„๋ฆฌ ์ž‘์—…์„ ๋งก์•„์„œ, user_data.py ๋‚ด์— ์žˆ๋˜ ์œ ํšจํ•œ ์‚ฌ์šฉ์ž ๊ณ„์ •๊ณผ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ์œ ํšจํ•œ ์‚ฌ์šฉ์ž ๊ณ„์ •์€ ๋ณด์•ˆ์ƒ .gitignore์— ์ถ”๊ฐ€ํ•ด ๊ด€๋ฆฌํ•ด์•ผ ํ•˜์ง€๋งŒ, ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•˜๋Š” ๋”๋ฏธ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๊ตณ์ด ๊ฐ์ถœ ํ•„์š”๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ด์ „๋ถ€ํ„ฐ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ๋‚ด์— ํ•˜๋“œ์ฝ”๋”ฉ๋œ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด์„œ, ์ด๋ฒˆ ๊ธฐํšŒ์— ์ •๋ฆฌํ•˜๋ ค ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ user_data.py์—๋Š” ์œ ํšจํ•œ ์‚ฌ์šฉ์ž ๊ณ„์ •๋งŒ ๋‚จ๊ธฐ๊ณ , ํ…Œ์ŠคํŠธ์šฉ ๋ฐ์ดํ„ฐ๋Š” ์ƒˆ๋กœ ๋งŒ๋“  dummy_data.py๋กœ ์˜ฎ๊ธฐ๊ธฐ๋กœ ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ.. ๊ทธ ํŒŒ์ผ ์ด๋ฆ„์„ dummy_daya.py๋กœ ์ €์žฅํ•ด๋ฒ„๋ฆฐ ๊ฒƒ์ด๋‹ค. ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ ๊ณ„์† ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์„œ ๋ฉ˜๋ถ• ์ƒํƒœ์˜€๋Š”๋ฐ, ์›์ธ์„ ์ฐพ๊ณ  ๋‚˜์„œ์•ผ ์˜คํƒ€๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ์ด๊ฑธ ํŒ€์›๋“ค์—๊ฒŒ ๋งํ•˜์ž๋งˆ์ž, ๋ชจ๋‘๊ฐ€ ๋™์‹œ์— ๋นต ํ„ฐ์กŒ๊ณ  ๋„ˆ๋ฌด ์›ƒ๊ฒจ์„œ ๋ฐฐ๊ฐ€ ์•„ํ”Œ ์ •๋„๋กœ ์›ƒ์—ˆ๋˜ ์ˆœ๊ฐ„์ด์—ˆ๋‹ค. ์ž‘์€ ์‹ค์ˆ˜์˜€์ง€๋งŒ, ๋•๋ถ„์— ํŒ€ ๋ถ„์œ„๊ธฐ๊ฐ€ ํ•œ์ธต ๋” ๋ฐ์•„์กŒ๋‹ค. ๐Ÿ˜†


๐Ÿ“š 5/18 - ๊ฐœ์ธ ๊ณต๋ถ€ (Docker ํ•™์Šต ๋ฐ ์ž๋™ํ™” ํ๋ฆ„ ์ •๋ฆฌ)

 

์ •๋ง ๊ฑฐ์˜ 2๋…„ ๋งŒ์— ๋งŒ๋‚œ ๋™๊ธฐ ์นœ๊ตฌ! ์„œ๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ์˜ค๋žœ๋งŒ์— ์—ฐ๋ฝ์ด ๋‹ฟ์•˜๊ณ , ์นœ๊ตฌ๊ฐ€ ๋™์•„๋ฆฌ ์ผ๋กœ ์„œ์šธ์— ์˜จ๋‹ค๋Š” ์†Œ์‹์„ ๋“ฃ๊ณ  ๋งŒ๋‚˜๊ฒŒ ๋˜์—ˆ๋‹ค! ์˜ค๋žœ๋งŒ์— ๋งŒ๋‚œ ๋งŒํผ ํ•  ์–˜๊ธฐ๋„ ์ •๋ง ๋งŽ์•˜๋‹ค. ๋‘˜ ๋‹ค ์ทจ์ค€์ƒ์ด๋‹ค ๋ณด๋‹ˆ, ์„œ๋กœ์˜ ์ง„๋กœ ๊ณ ๋ฏผ๊ณผ ๊ทผํ™ฉ, ํ”„๋ก ํŠธ์—”๋“œ์™€ QA์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋กœ ๋Œ€ํ™”๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค. ๊ฐ์ž ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋„ ๋ณด์—ฌ์ฃผ๋ฉฐ "์•„, ์ด๋Ÿฐ ๊ฑธ ํ•˜๊ณ  ์žˆ๊ตฌ๋‚˜", "๋„ˆ๊ฐ€ ์ค€๋น„ํ•˜๋Š” ์ง๋ฌด๋Š” ์ด๋Ÿฐ ๊ฑธ ๋งŒ๋“œ๋Š” ๊ฑฐ๊ตฌ๋‚˜" ํ•˜๋ฉฐ ์„œ๋กœ์˜ ๋ถ„์•ผ์— ๋Œ€ํ•ด ์•Œ์•„๊ฐ€๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค. ๊ทธ๋Ÿฌ๋˜ ์ค‘, ๋™๊ธฐ๊ฐ€ ๋ฌด๋ ค 1๋…„ ๋งŒ์— ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ฒŒ ๋๋‹ค๋Š” Viewport ๊ฐœ๋…์„ ์„ค๋ช…ํ•ด์ค˜์„œ ๊ทธ ์ด์•ผ๊ธฐ๋„ ๋“ฃ๊ณ , ์ƒˆ๋กญ๊ฒŒ ์‹œ์ž‘ํ•˜๊ฒŒ ๋œ ๋™์•„๋ฆฌ ์–˜๊ธฐ๋„ ๋‚˜๋ˆ„๋ฉฐ, ์‚ฌ๋žŒ๋“ค์ด ๊ฐ€์ง„ ์ŠคํŽ™์„ ๋ณด๋ฉฐ “์™€ ๋Œ€๋‹จํ•˜๋‹ค”๋Š” ๋ฐ˜์‘๋„ ๋‚˜์™”๋‹ค. ์‰ฌ๋Š” ์‹œ๊ฐ„์— ์œ ํŠœ๋ธŒ ๋ณด๋ฉด ๊ดœํžˆ ์ฃ„์ฑ…๊ฐ์ด ๋“ ๋‹ค๋Š” ์–˜๊ธฐ๊นŒ์ง€ ํ•˜๋ฉด์„œ, ๊ณต๊ฐํ•˜๊ณ  ์›ƒ์Œ์ด ๋Š์ด์ง€ ์•Š์•˜๋˜ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์—ญ์‹œ ISTJ์™€ ESTJ๋Š” ๋‹ฎ์€ ์ ์ด ๋งŽ๋‹ค. ์ƒ๊ฐํ•˜๋Š” ๋ฐฉ์‹๋„, ์‚ด์•„๊ฐ€๋Š” ๋ฆฌ๋“ฌ๋„ ๋น„์Šทํ•ด์„œ ๋” ์ž˜ ํ†ตํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. "๋‹ค์Œ์—” ๋Œ€๊ตฌ์—์„œ ๋˜ ๋งŒ๋‚˜์ž!"๊ณ  ์•ฝ์†ํ•˜๋ฉฐ ์•„์‰ฌ์šด ๋งˆ์Œ์„ ์•ˆ๊ณ  ํ—ค์–ด์กŒ๋‹ค. +TMI ํ•˜๋‚˜ ๋”! ์นดํŽ˜ ์ง์›๋ถ„์ด ๋‚ด ์‚ฌํˆฌ๋ฆฌ๋ฅผ ๋“ฃ๊ณ  ์›ƒ์œผ๋ฉด์„œ ๋ง์„ ๊ฑฐ์…จ๋‹ค ใ…‹ใ…‹ ๊ทธ๋ ‡๊ฒŒ ํ‹ฐ๊ฐ€ ๋‚˜๋‚˜๋ด..ใ…Žใ…Ž
 

๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜, ๋Šฅ๋ ฅ์ž ํŒ€์›๋ถ„๊ป˜์„œ "ํ† ์Šค์—์„œ๋Š” Slack์— /test (๋ชจ๋“ˆ๋ช…)์„ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ๋ชจ๋“ˆ๋งŒ ํ…Œ์ŠคํŠธ๊ฐ€ ๋Œ์•„๊ฐ€๊ฒŒ ํ•œ๋‹ค"๊ณ  ํ•˜์‹œ๋ฉด์„œ, ์šฐ๋ฆฌ๋„ ๊ทธ๊ฑธ ๋„์ „ํ•ด๋ณด์ž๋ฉฐ ์ง์ ‘ ๊ตฌํ˜„์— ๋‚˜์„ฐ๋‹ค. ๊ทธ๋ฆฌ๊ณ .. ์ง„์งœ๋กœ ์„ฑ๊ณตํ•˜์…จ๋‹ค! ๐ŸŽ‰ Slack์—์„œ /test๋ฅผ ์ž…๋ ฅํ•˜๋ฉด Jenkins๊ฐ€ ์ž๋™์œผ๋กœ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์—ฐ๋™๋œ ๊ฒƒ์ด๋‹ค. ์ •๋ง ์‹ ๊ธฐํ–ˆ๋‹ค. ํ˜„์—…์—์„œ ์“ฐ์ด๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณด๋‹ˆ, ํ•˜๋‚˜ํ•˜๋‚˜ ๋ถ™์ผ ๋•Œ๋งˆ๋‹ค ์ž๋™ํ™”์˜ ํŽธ์˜์„ฑ๊ณผ ํšจ์œจ์„ฑ์ด ์–ผ๋งˆ๋‚˜ ํฐ์ง€ ์‹ค๊ฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์™œ ์š”์ฆ˜ CI์™€ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๊ฐ€ ํ•„์ˆ˜ ์š”์†Œ๋กœ ์ž๋ฆฌ ์žก์•˜๋Š”์ง€, ๋ผˆ์ €๋ฆฌ๊ฒŒ ๋А๊ปด์ง€๋Š” ํ•˜๋ฃจ์˜€๋‹ค.
 

ํŒ€์›๋ถ„์ด ๊ตฌํ˜„ํ•˜์‹  ๋ชจ๋“  ๊ณผ์ •์„ ๋‚˜๋„ ์Šค์Šค๋กœ ๊ณต๋ถ€ํ•ด๋ณด์•˜๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •ํ•œ network, subnet, gateway, IPv4Address, port ๋“ฑ์˜ ๊ฐœ๋…์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ํ•™์Šตํ–ˆ๋‹ค. ์ง์ ‘ ๊ผฌ๋ฆฌ์— ๊ผฌ๋ฆฌ๋ฅผ ๋ฌผ๋ฉฐ ๊ฐœ๋…๋“ค์„ ์ฐจ๊ทผ์ฐจ๊ทผ ์ •๋ฆฌํ•ด๋ณด๋‹ˆ, ํŒ€์›๋ถ„๊ป˜์„œ Docker๋ฅผ ํ™œ์šฉํ•ด ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ VM์— ๊ตฌ์„ฑํ•˜์‹  ์ „์ฒด ํ๋ฆ„์„ ๋Œ€๋ถ€๋ถ„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‹ค๋งŒ, ๊ฐœ๋…์ ์œผ๋กœ๋งŒ ์•„๋Š” ๊ฒƒ์— ๊ทธ์น˜์ง€ ์•Š๊ณ , ์ง์ ‘ ์†์œผ๋กœ ํ•ด๋ณด๋Š” ๊ฒฝํ—˜๋„ ๊ผญ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์‹œ๊ฐ„์ด ์—ฌ์œ ๋กญ๋‹ค๋ฉด ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„ ์ค‘์—, ๋งŒ์•ฝ ๊ทธ๊ฒŒ ์–ด๋ ต๋‹ค๋ฉด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚œ ํ›„ ๋Œ€๊ตฌ๋กœ ๋Œ์•„๊ฐ€ ๊ผญ ํ˜ผ์ž ๋‹ค์‹œ ์‹œ๋„ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค. ์ด ๋ชจ๋“  ๊ณผ์ •์„ ์•ฝ 3์ผ ๋™์•ˆ ์‚ฐ์ „์ˆ˜์ „ ๊ฒช์œผ๋ฉฐ ๋ฌต๋ฌตํžˆ ๊ตฌํ˜„ํ•ด๋‚ด์‹  ํŒ€์›๋ถ„๊ป˜ ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌํ–ˆ๊ณ , ๋‹ค์‹œ ํ•œ ๋ฒˆ ์กด๊ฒฝ์Šค๋Ÿฌ์›€์„ ๋А๊ผˆ๋‹ค. ๋˜ํ•œ, Jenkins ๊ด€๋ จ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ํŒŒ์ผ์„ ํŒ€์›๋ถ„๋“ค๊ณผ ๊ณต์œ ํ–ˆ๋Š”๋ฐ, ๋ชจ๋‘ ๊ฐ์‚ฌํ•˜๋‹ค๋ฉฐ ํ•จ๊ป˜ ์ฝ์–ด๋ณด์•˜๋‹ค. ๋‚ด๊ฐ€ ์ง์ ‘ ์ •๋ฆฌํ•œ ๊ธ€๋กœ ๋‹ค ๊ฐ™์ด ๊ณต๋ถ€ํ•˜๋‹ˆ ์ง„์งœ ‘ํ•˜๋‚˜์˜ ํŒ€’์ด ๋œ ๊ฒƒ ๊ฐ™์•„ ๋ฟŒ๋“ฏํ–ˆ๋‹ค.
 

์˜ค๋Š˜์€ ์‚ฌ์ดŒ ์–ธ๋‹ˆ๊ฐ€ ์˜ค๊ฒน์‚ด์— ๋ฒ ๋ผ๊นŒ์ง€ ์‚ฌ์ฃผ๊ณ  ์ง‘๊นŒ์ง€ ๋ฐ๋ ค๋‹ค์คฌ๋‹ค. ๊ฐ๋™ ํŒŒํ‹ฐ.. ๋•๋ถ„์— ํ•˜๋ฃจ๋Š” Docker ๊ด€๋ จ ๊ณต๋ถ€๋งŒ ๊ฐ„๋‹จํžˆ ํ•˜๊ณ , OTT๋ฅผ ๋ณด๋ฉฐ ํ–‰๋ณตํ•˜๊ฒŒ ์‰ฌ๋Š” ์ค‘์ด์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋Šฆ์€ ์‹œ๊ฐ„, ๋™๊ธฐ์—๊ฒŒ ์ „ํ™”๊ฐ€ ๊ฑธ๋ ค์™”๋‹ค. SW ๋งˆ์—์ŠคํŠธ๋กœ์— ์ฐธ์—ฌ ์ค‘์ธ๋ฐ, ์ฐฝ์—…์„ ์‹œ์ž‘ํ–ˆ๋‹ค๋ฉฐ ๋‚˜์—๊ฒŒ “๊ณ ๊ฐ์ด ๋˜์–ด๋‹ฌ๋ผ”๋Š” ์ œ์•ˆ์ด์—ˆ๋‹ค! ์š”์ฆ˜์€ AI์˜ ๋ฐœ์ „ ๋•๋ถ„์—, ๋ธ”๋กœ๊ทธ ๊ธ€์ด๋“  ์—์„ธ์ด๋“  AI ์—†์ด ๊ธ€์„ ์“ฐ๋Š” ์‚ฌ๋žŒ์ด ๋“œ๋ฌผ ์ •๋„๋กœ ์ž‘์„ฑ ํ™˜๊ฒฝ์ด ํŽธํ•ด์กŒ๋‹ค. ๋‚˜ ์—ญ์‹œ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์•„์ด๋””์–ด์™€ ์˜๊ฒฌ์€ ๋‚ด๊ฐ€ ๋‹ด๋˜, ๋ฌธ์žฅ ๋‹ค๋“ฌ๊ธฐ๋Š” ์ฃผ๋กœ AI์—๊ฒŒ ๋งก๊ธฐ๋Š” ํŽธ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์นœ๊ตฌ๋Š” ์ด AI ํ๋ฆ„์„ ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐ€, ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ LLM์„ ํ™œ์šฉํ•ด '๋‚˜๋งŒ์˜ ๋ธŒ๋žœ๋”ฉ'์„ ๋งŒ๋“ค๊ณ , ๋ธ”๋กœ๊ทธ๋‚˜ Thread ๊ธ€์ฒ˜๋Ÿผ ์ฝ˜ํ…์ธ  ๊ธฐ๋ฐ˜ ์ˆ˜์ตํ™”๋ฅผ ๋„์™€์ฃผ๋Š” ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ƒํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  “์ด๋Ÿฐ ๋ฐฉํ–ฅ์„ฑ์— ๊ด€์‹ฌ์ด ์žˆ๋А๋ƒ”๊ณ  ๋ฌป๋Š” ์ „ํ™”์˜€๋‹ค. ์–ด์ฐจํ”ผ ๊ณง ๋ถ€ํŠธ์บ ํ”„ ์ˆ˜๋ฃŒ์ด๊ธฐ๋„ ํ•˜๊ณ , ํ•ฉ๋ฒ•์  ๋ฐฑ์ˆ˜ ๊ธฐ๊ฐ„์ด ๋  ์˜ˆ์ •์ด๊ธฐ๋„ ํ•ด์„œ “์ข‹์ง€! ์žฌ๋ฐŒ์„ ๊ฒƒ ๊ฐ™์•„!” ํ•˜๋ฉฐ ์ฐธ์—ฌํ•˜๊ฒ ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์‹ฌ์ง€์–ด ๋‚ด๊ฐ€ ๋‘ ๋ฒˆ์งธ ๊ณ ๊ฐ์ด๋ผ๋Š” ์‚ฌ์‹ค์— ๊ดœํžˆ ๋” ํฅ๋ฏธ๊ฐ€ ์ƒ๊ฒผ๋‹ค. ๋งŽ๊ด€๋ถ€!


๐Ÿ“Œ 5/19 - 9์ผ์ฐจ ํšŒ๊ณ  (JMeter์„ ํ™œ์šฉํ•œ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” & ์‹œ์—ฐ ์˜์ƒ ์ œ์ž‘ ๋ฐ ๋ฐœํ‘œ ์ค€๋น„)

 

์˜ค๋Š˜์€ ๋‹ค๋ฅธ ํŒ€์› ๋ถ„๋“ค์ด ๊ฐ์ž ๋งก์€ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜์‹œ๋Š” ๋™์•ˆ, ๋‚˜๋Š” ํ˜ผ์ž JMeter์— ๋„์ „ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ์ ์€, JSON Extractor๋กœ ์ถ”์ถœํ•œ ๋ณ€์ˆ˜๋Š” ํ•ด๋‹น Thread Group ๋‚ด์—์„œ๋งŒ ์œ ํšจํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ JSON Extractor ์•„๋ž˜์— JSR223 PostProcessor๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์•„๋ž˜์™€ ๊ฐ™์ด ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค. ์ดํ›„ ๋‹ค๋ฅธ Thread Group์ด๋‚˜ ์ƒ˜ํ”Œ๋Ÿฌ์—์„œ ์ด ๊ฐ’์„ ์ฐธ์กฐํ•  ๋•Œ๋Š” ${__P(TOKEN_GLOBAL)} ํ˜•ํƒœ๋กœ ํ˜ธ์ถœํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

def token = vars.get("token")
props.put("TOKEN_GLOBAL", token) 

 

์ฒ˜์Œ์—๋Š” ํ•˜๋‚˜์˜ Test Plan ์•ˆ์— ๋ชจ๋“  ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ๊ฐ์˜ Thread Group์œผ๋กœ ๊ตฌ์„ฑํ–ˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Thread Group์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ‘๋ ฌ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„์ง Sign Up์ด 50๋ฒˆ ๋‹ค ๋Œ๊ธฐ๋„ ์ „์— Sign In์ด ๋จผ์ € ์‹คํ–‰๋˜์–ด ๋กœ๊ทธ์ธ์— ์‹คํŒจํ•˜๊ณ (์ฆ‰, ๊ฐ€์ž…๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜๊ฒŒ ๋จ), Sign In์ด ๋๋‚˜๊ธฐ๋„ ์ „์— Article POST ์š”์ฒญ์ด ๋จผ์ € ์‹คํ–‰๋˜๋ฉด์„œ token ๋ฐœ๊ธ‰ ์ „์ด๋ผ Authorization์—์„œ token ๊ฐ’์„ ์ œ๋Œ€๋กœ ์ฝ์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฒŒ์–ด์กŒ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฐ๊ตญ ๊ฐ ํ…Œ์ŠคํŠธ๋ฅผ Thread Group ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๊ฐ๊ฐ .jmx ํŒŒ์ผ๋กœ ๋”ฐ๋กœ ๋‚˜๋ˆ„๊ธฐ๋กœ ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ๋‚˜๋ˆ„๋ฉด ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค. JMeter์—์„œ .jmx ํŒŒ์ผ์ด ๋ถ„๋ฆฌ๋˜๋ฉด ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ด์ „์— ์ €์žฅํ•ด๋‘” token ๊ฐ’์„ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ์—์„œ ๋ฐ”๋กœ ์ฝ์–ด์˜ฌ ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด ๋ฌธ์ œ๋Š” token ๊ฐ’์„ csv ํŒŒ์ผ๋กœ ์ €์žฅํ•ด๋‘๊ณ , ์ดํ›„ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ๊ทธ ํŒŒ์ผ์„ ๋‹ค์‹œ ์ฝ์–ด์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค. ๋ฒˆ๊ฑฐ๋กญ๊ธด ํ–ˆ์ง€๋งŒ, ์‹คํ–‰ ์ˆœ์„œ ๋ณด์žฅ๊ณผ ์˜์กด์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์กฐ์น˜์˜€๋‹ค.
 

๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋Š” HTML ๋ฆฌํฌํŠธ ์ƒ์„ฑ๊ณผ Slack ์ „์†ก๊นŒ์ง€ ๋ชจ๋‘ ์ž˜ ์ž‘๋™ํ–ˆ์ง€๋งŒ, ๋ฌธ์ œ๋Š” dev ํ™˜๊ฒฝ์ด์—ˆ๋‹ค. ์ฆ‰, Jenkins์—์„œ๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜๋‹ค. ์•„๋ฌด๋ฆฌ ์‚ดํŽด๋ด๋„ ๊ฒฝ๋กœ ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋ณด์˜€๊ณ , ๋ช‡ ์‹œ๊ฐ„์„ ๋ถ™์žก๊ณ  ์žˆ์–ด๋„ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋Ÿฌ๋˜ ์ค‘, ์–ด๋А๋ง ์˜คํ›„ 7์‹œ. ์˜คํ”ผ์Šค ์•„์›Œ ์‹œ๊ฐ„์ด ๋‹ค๊ฐ€์™”๋‹ค. ์˜ค๋Š˜์€ 5ํŒ€ ๋ถ„๋“ค๊ณผ ํ•จ๊ป˜ ์˜คํ”ผ์Šค ์•„์›Œ๋ฅผ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ, ์ •๋ง ๋œป๊นŠ์€ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ๊ฐ์ž ์ž๊ธฐ์†Œ๊ฐœ๋ฅผ ๋‚˜๋ˆ„๊ณ  ์•ž์œผ๋กœ์˜ ๋ชฉํ‘œ๋ฅผ ๊ณต์œ ํ•œ ๋’ค, ์ฝ”์น˜๋‹˜๊ป˜์„œ ์ด๋ ฅ์„œ์™€ ํฌํŠธํด๋ฆฌ์˜ค ์ž‘์„ฑ ๊ฟ€ํŒ๊นŒ์ง€ ์ „์ˆ˜ํ•ด์ฃผ์…จ๋‹ค. ๋•๋ถ„์— ์˜ค๋Š˜ ํ•˜๋ฃจ๊ฐ€ ์•„์ฃผ ์•Œ์ฐผ๋‹ค. ์ด์ œ ๋‚จ์€ ๊ณผ์ œ๋Š” ํ•˜๋‚˜. ๋‚ด์ผ ๋ฐœํ‘œ ์ „๊นŒ์ง€, ๊ณผ์—ฐ jmeter์˜ dev ํ™˜๊ฒฝ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ...?


๐Ÿ“Œ 5/20 - 10์ผ์ฐจ ํšŒ๊ณ  (ํ”„๋กœ์ ํŠธ ๋ฐœํ‘œ ๋ฐ ํšŒ๊ณ )

 

์˜ค๋Š˜์€ ๋“œ๋””์–ด ํ”„๋กœ์ ํŠธ์˜ ๋งˆ์ง€๋ง‰ ๋‚ ์ด๋‹ค. ๋ฐœํ‘œ ์ œ์ถœ์„ ์œ„ํ•ด ์ž๋ฃŒ๋ฅผ ์ •๋ฆฌํ•˜๊ณ , ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ ๋ฐœํ‘œ ์ž๋ฃŒ๋ฅผ ๋งŒ๋“ค๊ณ , ๋˜ ๊ทธ ์ž๋ฃŒ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ , ๋ฐœํ‘œ ๋Œ€๋ณธ๊นŒ์ง€ ์ž‘์„ฑํ•˜๋‹ค ๋ณด๋‹ˆ ๋‹ค๋ฅธ ์ผ์—๋Š” ์†์„ ๋Œˆ ์‹œ๊ฐ„์ด ์—†์—ˆ๋‹ค. ์˜ค๋Š˜ ํ•˜๋ฃจ๋Š” ์˜ค๋กœ์ง€ ๋ฐœํ‘œ ํ•˜๋‚˜์—๋งŒ ์ง‘์ค‘ํ•˜๊ธฐ๋กœ ํ–ˆ๊ณ , ์‹ค์ œ๋กœ ๋ฐœํ‘œ ์ค€๋น„์— ๋ชจ๋“  ์—๋„ˆ์ง€๋ฅผ ์Ÿ์•„๋ถ€์—ˆ๋‹ค. ํŠนํžˆ ํŒ€์› ํ•œ ๋ถ„์ด ํŽธ์ง‘์„ ๋‹ด๋‹นํ•ด์ฃผ์…จ๋Š”๋ฐ, ์ƒ๊ฐ๋ณด๋‹ค ๋„ˆ๋ฌด ์ž˜ํ•˜์…”์„œ ์ •๋ง ๊นœ์ง ๋†€๋ž๋‹ค ใ…‹ใ…‹ใ…‹ใ…‹ ์™„์ „ ๋Šฅ๋ ฅ์ž!
 

๋ฐœํ‘œ๋ฅผ ๋งก์•„์ฃผ์…จ๋˜ ํŒ€์›๋ถ„๊ป˜์„œ ๋ฐœํ‘œ ์ „์—๋Š” ์ •๋ง ๋งŽ์ด ๋–จ๋ ค ํ•˜์…จ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ง‰์ƒ ์‹ค์ „์ด ๋˜์ž, ๊ณ„์† ๊ฐํƒ„ํ•˜๋ฉด์„œ ๋“ค์„ ์ˆ˜๋ฐ–์— ์—†์—ˆ๋‹ค. ์–ด์ฉœ ๊ทธ๋ ‡๊ฒŒ ์ฐจ๋ถ„ํ•˜๊ณ  ๋˜๋ ทํ•˜๊ฒŒ ๋ฐœํ‘œ๋ฅผ ์ž˜ํ•˜์‹œ๋Š”์ง€.. ๋ฐœํ‘œ๊ฐ€ ๋๋‚œ ํ›„์—๋„ ๋‚ด๋‚ด ์นญ์ฐฌ์„ ๋“œ๋ ธ๋‹ค. ๊ทธ๋งŒํผ ๋„ˆ๋ฌด ๊ณ ๋งˆ์› ๊ณ , ๋“ ๋“ ํ–ˆ๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ์ •๋ง ‘๋ฒ„์Šค๋ฅผ ํƒ„’ ๊ธฐ๋ถ„์ด์—ˆ๋‹ค. “๋‚ด๊ฐ€ ํ•œ ๊ฑด ๋ญ์ง€..?” ์‹ถ์„ ์ •๋„๋กœ, ๋‘ ๋ถ„๊ป˜ ๋„ˆ๋ฌด ๊ฐ์‚ฌ๋“œ๋ ธ๋‹ค. ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚œ ํ›„, ํ˜ผ์ž ๋Ÿฌ๋‹ํ•˜๋Ÿฌ ๊ฐˆ ๋•Œ๋งˆ๋‹ค ๋Š˜ ๋งŒ์„์ด๋˜ ๊ณฑ์ฐฝ์ง‘์— ํ•œ ๋ฒˆ์ฏค์€ ๊ฐ€๋ณด๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ๊ฐ™์ด ๊ฐˆ ์‚ฌ๋žŒ์ด ์—†์—ˆ๋‹ค. ์ด ์–˜๊ธฐ๋ฅผ ํ–ˆ๋”๋‹ˆ, ๋งˆ์ง€๋ง‰ ๋‚ ์—” ๊ผญ ๊ฐ™์ด ๊ฐ€์ž๊ณ  ์•ฝ์†ํ•ด์ฃผ์…จ๋‹ค. ๊ทธ๋ž˜์„œ ํ•จ๊ป˜ ๊ฐ”๊ณ .. ์ง„์งœ ๋„ˆ๋ฌด ๋ง›์žˆ์—ˆ๋‹ค! ๋ฉ”๋‰ด ์ด๋ฆ„๋„ ํ•˜ํ•„์ด๋ฉด “์‚ผ์ด์‚ฌ”๋ผ๋‹ˆ ใ…‹ใ…‹ใ…‹ใ…‹ ์šฐ๋ฆฌ ์…‹์ด ๋”ฑ ์‚ผ์ด์‚ฌ ๊ฐ™์•„์„œ ๋” ์˜๋ฏธ ์žˆ์—ˆ๋‹ค. 1์‹œ๊ฐ„ ๋งŒ์— ์ธ๋‹น ์†Œ์ฃผ 2๋ณ‘์”ฉ.. ์ˆ ๋„ ์ž˜ ๋“œ์‹œ๋”๋ผ. ๋Œ€์ฒด ๋ชปํ•˜๋Š” ๊ฒŒ ๋ญ˜๊นŒ ์‹ถ์„ ์ •๋„์˜€๋‹ค. ๊ณฑ์ฐฝ์„ ๋จน์œผ๋ฉฐ ํšŒ๊ณ ๋„ ํ•จ๊ป˜ ํ–ˆ๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด, ์•ž์œผ๋กœ์˜ ์ธ์ƒ์— ๋Œ€ํ•ด, ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๊ฒฐ๊ณผ๋ฌผ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆ„๋‹ค ๋ณด๋‹ˆ ์‹œ๊ฐ„์ด ์ •๋ง ๊ธˆ๋ฐฉ ํ˜๋ €๋‹ค.


๐ŸŽฏ 2์ฐจ ํ”„๋กœ์ ํŠธ ์ตœ์ข… ํšŒ๊ณ 

 
โœ… POM ๊ตฌ์กฐ ์ ์šฉ๊ณผ ์ปดํฌ๋„ŒํŠธํ™”

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ํฐ ๋ฐœ์ „์ด๋ผ๊ณ  ๋А๋‚€ ๋ถ€๋ถ„์€ ๊ตฌ์กฐ์ ์ธ ์ธก๋ฉด์ด์—ˆ๋‹ค. ํŠนํžˆ POM(Page Object Model) ๊ตฌ์กฐ๋ฅผ ์ ์šฉํ•œ ๊ฒƒ์ด ๊ฐ€์žฅ ์˜๋ฏธ ์žˆ์—ˆ๊ณ , ์—ฌ๊ธฐ์— ๋”ํ•ด ํŽ˜์ด์ง€๋ฅผ header, body, footer๋กœ ๋‚˜๋ˆ„์–ด ๋ฐ”๋ผ๋ณด๋ฉด์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ component ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ์ ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ ์ด ์ธ์ƒ ๊นŠ์—ˆ๋‹ค. ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์€ BasePage์— ์ •์˜ํ•˜๊ณ , ๊ฐœ๋ณ„ ํŽ˜์ด์ง€์—์„œ๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€ ์ „์šฉ ์š”์†Œ๋“ค๊ณผ ํ•จ๊ป˜ BasePage์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด ๋™์ž‘์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ๋•๋ถ„์— ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜์—์„œ๋Š” ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋งŒ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด, ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ ์ธก๋ฉด์—์„œ ํฌ๊ฒŒ ๋ฐœ์ „ํ•œ ๊ตฌ์กฐ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
 

โœ… ์‹œ๋‚˜๋ฆฌ์˜ค ํ˜•์‹ ํ…Œ์ŠคํŠธ ์ ์šฉ ๊ฒฝํ—˜

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

โœ… Docker ํ™˜๊ฒฝ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์ดํ•ด

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๋‚ด๊ฐ€ ์•Œ๊ณ  ์žˆ๋˜ Docker๋Š” ๊ทนํžˆ ์ผ๋ถ€๋ถ„์— ๋ถˆ๊ณผํ–ˆ๋‹ค๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค. ์ด์ „๊นŒ์ง€๋Š” Jenkins ์„ค์น˜ ๋“ฑ์„ ์œ„ํ•ด Dockerfile์„ ๊ฐ„๋‹จํžˆ ๋งŒ๋“ค๊ณ , ํฌํŠธ ์„ค์ • ๋“ฑ์ด ๊ท€์ฐฎ์•„ docker-compose.yml์„ ์จ๋ณธ ์ •๋„์˜€๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฒˆ์—๋Š” ํ”„๋ก ํŠธ์—”๋“œ, ๋ฐฑ์—”๋“œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊นŒ์ง€ ์ „์ฒด ํ™˜๊ฒฝ์„ Docker๋กœ ๊ตฌ์„ฑํ–ˆ๊ณ , docker-compose๋ฅผ ํ™œ์šฉํ•ด ๋„คํŠธ์›Œํฌ ๋ฐ ํฌํŠธ๋ฅผ ์„ธ์„ธํ•˜๊ฒŒ ์ง€์ •ํ•˜์—ฌ docker-compose up -d ํ•œ ์ค„๋กœ ํ†ตํ•ฉ ์‹คํ–‰ ๋ฐ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ์ฒดํ—˜ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด ๊ฒฝํ—˜์„ ํ†ตํ•ด Docker์˜ ์‹ค๋ฌด์  ํ™œ์šฉ ๋ฐฉ์‹์— ๋Œ€ํ•ด ๊ฐ์„ ์žก์„ ์ˆ˜ ์žˆ์—ˆ๊ณ , ์‹ค์ œ๋กœ ๊ด€๋ จ ์„œ์ ์„ ๊ตฌ๋งคํ•ด์„œ ๋” ๊นŠ์ด ๊ณต๋ถ€ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค ์ •๋„๋กœ ๋งค๋ ฅ์ ์ธ ๊ธฐ์ˆ ์ด์—ˆ๋‹ค.
 

โœ… API & ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๋„๊ตฌ ํ™œ์šฉ ๊ฒฝํ—˜

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ๋Œ€์ƒ์œผ๋กœ Postman๊ณผ JMeter๋ฅผ ์ฒ˜์Œ์œผ๋กœ ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณด๋Š” ๊ฒฝํ—˜์„ ํ–ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋‘ ํˆด ๋ชจ๋‘ ์ต์ˆ™ํ•˜์ง€ ์•Š์•„์„œ API ํ…Œ์ŠคํŠธ ํ•˜๋‚˜๋ฅผ ์™„์„ฑํ•˜๋Š” ๋ฐ๋„ ๋ช‡ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ •๋„๋กœ ๋ง‰๋ง‰ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ ํ˜‘์—…ํ•˜๊ณ , ์ฝ”์น˜๋‹˜๊ณผ์˜ ๋Œ€ํ™”๋ฅผ ํ†ตํ•ด "์‘๋‹ต ํ™•์ธ ์ •๋„๋งŒ ํ•ด๋„ ์ถฉ๋ถ„ํ•˜๋‹ค"๋Š” ํŒ์„ ์–ป๊ณ  ๋‚˜์„œ๋ถ€ํ„ฐ๋Š” ๋ถ€๋‹ด ์—†์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ ์  ๊ฐ์ด ์žกํžˆ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ๋น ๋ฅด๊ฒŒ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋งˆ๋ฌด๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
 
JMeter๋Š” ์•„์ง ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ์˜ ๋ฐฉํ–ฅ์„ฑ์— ๋Œ€ํ•ด ๊ฐ์ด ๋ถ€์กฑํ•œ ์ƒํƒœ๋‹ค. ๋‹ค๋ฅธ ํŒ€์—์„œ ์ง„ํ–‰ํ•œ ์ŠคํŒŒ์ดํฌ ํ…Œ์ŠคํŠธ, ๋‚ด๊ตฌ์„ฑ ํ…Œ์ŠคํŠธ, ๋ฒค์น˜๋งˆํ‚น ๋“ฑ์˜ ์‹œ๋„๋Š” ์ •๋ง ์ธ์ƒ ๊นŠ์—ˆ๊ณ , "์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋„ ์ด๋ ‡๊ฒŒ ์ฒด๊ณ„์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ตฌ๋‚˜"๋ผ๋Š” ๊ฑธ ๋А๋‚„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ˆœํžˆ ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… 50ํšŒ, ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ/์กฐํšŒ 50ํšŒ, ๋Œ“๊ธ€ ์ž‘์„ฑ 50ํšŒ ๋“ฑ ๋‹จ์ˆœํ•œ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋งŒ ๋– ์˜ฌ๋ ธ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํฌ์ธํŠธ๊ฐ€ ํ›จ์”ฌ ๋‹ค์–‘ํ•˜๋‹ค๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค.
 
๊ทธ๋ฆฌ๊ณ  ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋Š” ์ž˜ ๋™์ž‘ํ•˜๋˜ JMeter๊ฐ€ Jenkins ํ™˜๊ฒฝ(dev)์—์„œ๋Š” ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ฒฝ๋กœ ๋ฌธ์ œ์ธ ๊ฑด ํ™•์‹คํ•ด ๋ณด์˜€์ง€๋งŒ, ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋ถ€์กฑํ–ˆ๊ณ  ๊ฒฐ๊ตญ ๋๋‚ด ๊ณ ์น˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ์ ์ด ๋„ˆ๋ฌด ์•„์‰ฌ์› ๋‹ค. JMeter๋Š” ๋‚ด๊ฐ€ ํ˜ผ์ž ๋งก์•˜๊ณ , ๊ทธ๋‚  ์ฒ˜์Œ ๋‹ค๋ค„๋ณธ ํˆด์ด๋ผ ํ•˜๋ฃจ ๋งŒ์— ์™„์„ฑํ•˜๊ธฐ์—” ๋งŽ์ด ๋ฒ…์ฐผ๋‹ค. ์•„๋ฌด๋ฆฌ ๊ทธ๋ ‡๊ฒŒ ๋ณ€๋ช…์„ ํ•ด๋„ ๊ฒฐ๊ตญ์€ ๋‚ด๊ฐ€ ์ฑ…์ž„์ง€๊ณ  ๋๋‚ด์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๊ฐ€์žฅ ๋ฏธ์•ˆํ–ˆ๋‹ค. ํšŒ๊ณ ๋ฅผ ํ•˜๋ฉด์„œ๋„ ๊ณ„์† ํŒ€์›๋ถ„๋“ค๊ป˜ ๋ฏธ์•ˆํ•˜๋‹ค๊ณ  ๋ง์”€๋“œ๋ ธ๋Š”๋ฐ, ๊ทธ๋Ÿด ๋•Œ๋งˆ๋‹ค "๊ดœ์ฐฎ๋‹ค"๊ณ  ๋”ฐ๋œปํ•˜๊ฒŒ ๋งํ•ด์ฃผ์‹œ๋Š” ๋ชจ์Šต์— ์˜คํžˆ๋ ค ๋” ๋ฏธ์•ˆํ•œ ๋งˆ์Œ์ด ์ปค์กŒ๋‹ค.
 

โœ… Slack ํ™œ์šฉ

์‹ค๋ฌด ๊ฒฝํ—˜์ด ์žˆ์œผ์‹  ํŒ€์›๋ถ„๊ป˜์„œ “ํ˜„์—…์—์„œ๋Š” ํ‡ด๊ทผ ์ „์— ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ ค๋†“๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Slack์„ ํ†ตํ•ด ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ ํ™•์ธํ•˜๊ณค ํ–ˆ๋‹ค.” ๋ผ๊ณ  ๋ง์”€ํ•ด์ฃผ์…จ๋‹ค. ๊ทธ ๋ง์„ ๋“ฃ๊ณ  ๋‚˜๋„ ๋ญ”๊ฐ€ ๊ผญ ํ•œ ๋ฒˆ ๋„์ „ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์‚ฌ์‹ค ์ง€๋‚œ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์‹œ๋„ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ์ง€๋งŒ, ์‹œ๊ฐ„ ๋ถ€์กฑ์œผ๋กœ ๊ฒฐ๊ตญ ํ•ด๋ณด์ง€ ๋ชปํ–ˆ๋˜ ๊ฒŒ ์•„์‰ฌ์›€์œผ๋กœ ๋‚จ์•„ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋“œ๋””์–ด ๊ทธ ๊ธฐ๋Šฅ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋†€๋ผ์šด ๊ฑด, ์ƒ๊ฐ๋ณด๋‹ค ๋„ˆ๋ฌด ๊ฐ„๋‹จํ–ˆ๋‹ค๋Š” ์ ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•œ ์„ค์ •๋งŒ์œผ๋กœ๋„ ์ด๋ ‡๊ฒŒ ํฐ ํšจ์œจ์„ ๊ฐ€์ ธ๋‹ค์ค„ ์ˆ˜ ์žˆ๋‹ค๋‹ˆ! ์ง„์งœ ์‹ค๋ฌด์—์„œ ์™œ ์ด๊ฑธ ์“ฐ๋Š”์ง€ ์ฒด๊ฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์‹ค์ œ๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚œ ํ›„ Slack์œผ๋กœ ์•Œ๋ฆผ์ด ์ „์†ก๋˜์ž, ํŒ€์›๋“ค ๋ชจ๋‘ “์™€ ์ง„์งœ ์‹ค๋ฌด ๊ฐ™์•„!”๋ผ๋ฉฐ ๊ฐํƒ„ํ–ˆ๊ณ , ๋‚˜๋„ ๊ทธ ๋ฐ˜์‘์— ๊ต‰์žฅํžˆ ๋ฟŒ๋“ฏํ–ˆ๋‹ค. ๋ฌผ๋ก  GPT์˜ ๋„์›€์„ ๋งŽ์ด ๋ฐ›๊ธด ํ–ˆ์ง€๋งŒ, ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณด๊ณ  ๊ทธ ๊ณผ์ •์„ ์ดํ•ดํ•œ ๊ฒƒ ์ž์ฒด์— ๋Œ€ํ•ด ์ •๋ง ํฐ ๋งŒ์กฑ๊ฐ์„ ๋А๊ผˆ๋‹ค.

โœ… ๋”ฐ๋œปํ–ˆ๋˜, ๊ทธ๋ฆฌ๊ณ  ์—ด์ •์ ์ด์…จ๋˜ ํŒ€์›๋ถ„๋“ค

๋ถ€ํŠธ์บ ํ”„ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•œ๋‹ค๊ณ  ๋ฌด์ž‘์ • ์„œ์šธ๋กœ ์˜ฌ๋ผ์˜จ ๋‚˜. ์ฒ˜์Œ์—” ๊ฑฑ์ •๋„ ์žˆ์—ˆ์ง€๋งŒ, ์ด๋ฒˆ ๋ถ€ํŠธ์บ ํ”„๋ฅผ ๋“ค์œผ๋ฉด์„œ, ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ •๋ง ์ข‹๊ณ  ๋”ฐ๋œปํ•œ ๋ถ„๋“ค์„ ๋งŽ์ด ๋งŒ๋‚  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ญ๋ผ๊ณ .. ๋งค๋ฒˆ ์‘์›ํ•ด์ฃผ์‹œ๊ณ , ์นญ์ฐฌํ•ด์ฃผ์‹œ๊ณ , ๊ฒฉ๋ คํ•ด์ฃผ์…”์„œ ๋ชธ ๋‘˜ ๋ฐ”๋ฅผ ๋ชฐ๋ž๋‹ค. ๊ธฐ์ฐจ ํƒ€๊ณ  ๋Œ€๊ตฌ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ธธ์— “๊ธฐ์ฐจ ํƒ€์…จ์–ด์š”? ์กฐ์‹ฌํžˆ ๊ฐ€์„ธ์š””๋ผ๋Š” ์—ฐ๋ฝ์„ ๋ฐ›์•˜์„ ๋•Œ, ์ •๋ง ํ˜ผ์ž ์šธ์ปฅํ•ด์„œ ๋ˆˆ๋ฌผ์ด ๋‚ฌ๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ ์˜ค์ „ 10์‹œ๋ถ€ํ„ฐ ์˜คํ›„ 11์‹œ๊นŒ์ง€ ํ•จ๊ป˜ํ•˜๋‹ค ๋ณด๋‹ˆ, ๋„ˆ๋ฌด ๋น ๋ฅด๊ฒŒ ์ •์ด ๋“ค์–ด๋ฒ„๋ฆฐ ๊ฒƒ ๊ฐ™๋‹ค. ๋‘ ๋ถ„ ๋‹ค ๋ฐฐ๋ ค์‹ฌ ๋„˜์น˜๊ณ , ๋”ฐ๋œปํ•˜์‹œ๊ณ , ํ•ญ์ƒ ์˜๊ฒฌ์„ ์ ๊ทน์ ์œผ๋กœ ๋‚ด์ฃผ์‹œ๊ณ , ๋ฌด์—‡๋ณด๋‹ค๋„ ์—ด์ •์ ์ด์…จ๋‹ค. ์ž์‹ ์ด ๋งก์€ ์ผ์€ ์ง‘์—์„œ๋„, ์ฃผ๋ง์—๋„, ๋๊นŒ์ง€ ์ฑ…์ž„์ง€๊ณ  ๋งˆ๋ฌด๋ฆฌํ•˜๋Š” ๋ชจ์Šต์— ์ง„์‹ฌ์œผ๋กœ ๊ฐ๋™ํ–ˆ๋‹ค. ํŠนํžˆ ํ•œ๊ฐ•์—์„œ Docker ์ž‘์—…ํ•˜์‹œ๋˜ ์‚ฌ์ง„์€.. ์•„๋งˆ ํ‰์ƒ ์žŠ์ง€ ๋ชปํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์‚ฌ์‹ค Jenkins ์—ฐ๋™์ด ๋„ˆ๋ฌด ์–ด๋ ค์›Œ ๋ณด์—ฌ์„œ ์—„๋‘๊ฐ€ ์•ˆ ๋‚ฌ๋Š”๋ฐ, ๊ทธ๊ฑธ ๋๊นŒ์ง€ ์ฑ…์ž„์ง€๊ณ  ํ•ด๊ฒฐํ•ด์ฃผ์‹  ๊ฒƒ๋„, ๋ฐœํ‘œ ๋ถ€๋‹ด์ด ์ปธ์„ ํ…๋ฐ ๋ฉ‹์ง€๊ฒŒ ๋งˆ๋ฌด๋ฆฌํ•ด์ฃผ์‹  ๊ฒƒ๋„ ๋„ˆ๋ฌด๋„ˆ๋ฌด ๊ฐ์‚ฌ๋“œ๋ฆฐ๋‹ค.

 

์„œ์šธ์— ๋จธ๋ฌด๋Š” ๋™์•ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ์‹ค๋ ฅ๋„ ์–ป์—ˆ์ง€๋งŒ, ๋ฌด์—‡๋ณด๋‹ค ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ๋”ฐ๋œปํ•œ ๊ธฐ์–ต์„ ํ•จ๊ป˜ ์•ˆ๊ณ  ๊ฐ„๋‹ค. ์‹ฌ์ง€์–ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚œ ๋’ค์—๋„ ํŽธํ•˜๊ฒŒ ์—ฐ๋ฝํ•˜์ž๋ฉฐ ์„œ๋กœ ์นด์นด์˜คํ†ก ํ”„๋กœํ•„๊นŒ์ง€ ์ฃผ๊ณ ๋ฐ›์•˜๋‹ค. ๊ทธ๋งŒํผ ๋งˆ์Œ์ด ์ž˜ ํ†ตํ•˜๊ณ , ์˜ค๋ž˜ ๊ธฐ์–ต์— ๋‚จ์„ ๋ถ„๋“ค์ด๋‹ค. ์ง€๋‚œ 4๊ฐœ์›” ๋™์•ˆ ๋งค์ผ ์ˆ˜์—… ๋“ฃ๊ณ , ํ•จ๊ป˜ ๊ณต๋ถ€ํ•˜๊ณ , ๊ณ ์ƒํ–ˆ๋˜ ๋ชจ๋“  ๋ถ„๋“ค์ด ์•ž์œผ๋กœ๋„ ํ–‰๋ณตํ•˜๊ฒŒ, ๊ทธ๋ฆฌ๊ณ  ์ž˜ ๋˜์…จ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค. ์ง„์‹ฌ์œผ๋กœ!

 

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿ“‚ Quality Assurance Study > ๐Ÿ”ฅ ์—˜๋ฆฌ์Šค SW QAํŠธ๋ž™' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™] ์•ฝ 4๊ฐœ์›”๊ฐ„์˜ ์—ฌ์ •, ์ˆ˜๋ฃŒ ํ›„๊ธฐ  (0) 2025.05.25
[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 2์ฐจ ์Šคํ„ฐ๋””] ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ํšŒ๊ณ  (4/18~5/5)  (6) 2025.05.05
[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 1์ฐจ ์Šคํ„ฐ๋””] ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ  (2/10~3/14)  (2) 2025.05.05
[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 14์ฃผ์ฐจ] ํ•™์Šต ๋‚ด์šฉ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ  (๊ณ ๊ธ‰ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ ๋ฐ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”)  (0) 2025.05.02
[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 13์ฃผ์ฐจ] ํ•™์Šต ๋‚ด์šฉ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ  (์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ์™€ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ)  (0) 2025.04.24
'๐Ÿ“‚ Quality Assurance Study/๐Ÿ”ฅ ์—˜๋ฆฌ์Šค SW QAํŠธ๋ž™' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™] ์•ฝ 4๊ฐœ์›”๊ฐ„์˜ ์—ฌ์ •, ์ˆ˜๋ฃŒ ํ›„๊ธฐ
  • [์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 2์ฐจ ์Šคํ„ฐ๋””] ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ํšŒ๊ณ  (4/18~5/5)
  • [์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 1์ฐจ ์Šคํ„ฐ๋””] ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ  (2/10~3/14)
  • [์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 14์ฃผ์ฐจ] ํ•™์Šต ๋‚ด์šฉ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ  (๊ณ ๊ธ‰ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ ๋ฐ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”)
YeonSu02
YeonSu02
Email : rkddustn2519@naver.com
  • YeonSu02
    IsLiife2
    YeonSu02
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ N
      • ๐Ÿ“‚ Computer Science
      • ๐Ÿ“‚ Unity Engine Study
        • ๐Ÿ“„ Unity ์ธํ”„๋Ÿฐ ๊ฐ•์˜
        • ๐Ÿ“„ Unity ์œ ํŠœ๋ธŒ ๊ฐ•์˜
        • ๐Ÿ“„ Unity ์ฐธ๊ณ 
        • ๐Ÿ’ป Game Development
      • ๐Ÿ“‚ Quality Assurance Study
        • ๐Ÿ”ฅ ์—˜๋ฆฌ์Šค SW QAํŠธ๋ž™
        • ๐Ÿ“„ QA ๊ณต๋ถ€
        • ๐Ÿ“š QA ์ฑ… ๋ฆฌ๋ทฐ
      • ๐Ÿ“‚ Program Language Study
        • ๐Ÿ“„ C# ๊ณต๋ถ€
        • ๐Ÿ“„ ํŒŒ์ด์ฌ ๊ณต๋ถ€
        • ๐Ÿ“„ JavaScript ๊ณต๋ถ€
        • ๐Ÿ“„ TypeScript ๊ณต๋ถ€
      • ๐Ÿ“‚ Additional Study N
        • ๐Ÿ“„ Git
        • ๐Ÿ“„ Docker
        • ๐Ÿ“„ Jenkins
        • ๐Ÿ“„ Firebase
        • ๐Ÿ“„ Economy N
        • ๐Ÿ“„ License
      • ๐Ÿ“‚ Experience
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
  • ๋งํฌ

    • GitHub
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ •์ฒ˜๊ธฐ ์‹ค๊ธฐ
    ํ…Œ์ŠคํŒ…์ž๊ฒฉ์ฆ
    ์—˜๋ฆฌ์ŠคํŠธ๋ž™
    ์ž๊ฒฉ์ฆ
    istqb-ctfl
    ์ปดํ™œ
    qa ๊ฐ•์˜
    ๊ตญ๋น„๋ถ€ํŠธ์บ ํ”„ ์ถ”์ฒœ
    qa ๋ถ€ํŠธ์บ ํ”„
    ์—˜๋ฆฌ์ŠคํŠธ๋ž™ ํ›„๊ธฐ
    qa ์ฑ…
    ์ •์ฒ˜๊ธฐ ํ•„๊ธฐ
    ๋ถ€ํŠธ์บ ํ”„ ์ถ”์ฒœ
    ์ •์ฒ˜๊ธฐ ๋…ํ•™
    qa์ž๊ฒฉ์ฆ
    ์—‘์…€
    qa ์ง๋ฌด ๊ต์œก
    ์ปดํ“จํ„ฐํ™œ์šฉ๋Šฅ๋ ฅ
    QA
    qa ์ฑ… ๋ฆฌ๋ทฐ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
YeonSu02
[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 15~16์ฃผ์ฐจ] 2์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ํšŒ๊ณ 
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”