โน๏ธ ํ๋ก์ ํธ ๊ฐ์ด๋
๐ 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 ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ถ๋ฌ์ค๊ณ ์ ์ ํ๋ ๊ตฌ์กฐ๋ฅผ ์ด๋ป๊ฒ ์ก์์ผ ํ ์ง์ ๋ํ ์ด์ผ๊ธฐ๊ฐ ๋์๊ณ , ํจ๊ป ๊ณ ๋ฏผํ๋ฉฐ ์๋์ ๊ฐ์ ๋ ๊ฐ์ง ๋ฐฉํฅ์ ๋์ถํ ์ ์์๋ค.
- DB์๋ POM ๊ตฌ์กฐ๋ฅผ ์ ์ฉํด๋ณด๋ ๋ฐฉ์
- DB๋ง๋ค ํด๋์ค๋ฅผ ๋ง๋ค๊ณ
- query๋ฅผ locator์ฒ๋ผ ์ ์ํ๋ฉฐ
- ๊ฐ ํด๋์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ๋๋ก ๊ตฌ์ฑ
- 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๊ฐ์ ๋์ ๋งค์ผ ์์ ๋ฃ๊ณ , ํจ๊ป ๊ณต๋ถํ๊ณ , ๊ณ ์ํ๋ ๋ชจ๋ ๋ถ๋ค์ด ์์ผ๋ก๋ ํ๋ณตํ๊ฒ, ๊ทธ๋ฆฌ๊ณ ์ ๋์ จ์ผ๋ฉด ์ข๊ฒ ๋ค. ์ง์ฌ์ผ๋ก!