1. import๋ก ์ธํ ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
Intro
ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ ์ฐจ ์ปค์ง์๋ก ๋ถ๋ฆฌ๋๋ ํ์ผ๋ค๋ ๋์ด๋๊ณ import export ๊ด๊ณ๊ฐ ๋ณต์กํด์ง ์ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ์ด๋ค ํ ํ์ผ์ ๋ค๋ฅธ ํ์ผ์ด ์๋ก ์ฐธ์กฐํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ค์ ๋ก ํ๋ก์ ํธ์์๋ ์ ๋ ์ ๋ง ๊ฐ๋์ฉ import ๋๋ ๋ชจ๋ ํ์ผ์ ์ธ์ํ์ง ๋ชปํด ์ ์ ์๋ ๋นจ๊ฐ์ค ์๋ฌ๊ฐ ๋ฌ ์ ์ด ์๋๋ฐ, โ์ํ ์ฐธ์กฐ (circular dependency) ๋ฌธ์ โ ์ ์ฐ๊ด์ด ์์์๋ ์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
๋ฐ๋ผ์ ์ํ ์ฐธ์กฐ๊ฐ ๋ฌด์์ธ์ง ์ธ์ํ๊ณ ์ํ ์ฐธ์กฐ๋ฅผ ํด๊ฒฐ/์๋ฐฉํ๊ธฐ ์ํ ๊ฐ๋จํ ํจํด๋ค์ ์๊ฐํด๋ณด๊ฒ ์ต๋๋ค.
์ํ ์ฐธ์กฐ๋?
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์์คํ
์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ ์ฐธ์กฐ๋ฅผ ํ์ฉํฉ๋๋ค. ์ํ ์ฐธ์กฐ๋ ์๋ก๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํ๋ ์ํ๋ฅผ ์ด์ผ๊ธฐํฉ๋๋ค. JS ์์๋ ์ด๋ฅผ ์์คํ
์์ ๊ฑธ๋ฌ๋ด์ง ์๊ณ , ํ์ชฝ์ export ๋ฅผ ๋น ๊ฐ์ฒด๋ก ๋ง๋ค์ด ๋ฒ๋ฆฝ๋๋ค.
์๋ ์์๋ ์ํ ์ฐธ์กฐ์ ๋ํ์ ์์์ ๋๋ค.
// index.js
import "./a.js";
// a.js
import { sayHello } from "./b.js";
export const NAME = "mike";
console.log("module_a");
sayHello();
// b.js
import { NAME } from "./a.js";
console.log("module_b");
export const sayHello = () => {
console.log("hello~!", NAME);
};
์ฌ๊ธฐ์ b.js ์์ sayHello() ํจ์๋ฅผ ์ฝ๋ ํํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
export const sayHello = () => {
console.log("hello~!", aModuleObject.Name);
};
NAME ์ a ๋ชจ๋์ ๊ฐ์ฒด๋ผ๊ณ ์ฝ์ ์ ์๋ ์ด์ ๋ a.js ์์ NAME ๋ณ์๋ฅผ ๋ด๋ณด๋ด๋ ์์ ์ด sayHello() ํธ์ถ๋ถ ์ด์ ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ง์ฝ NAME ๋ณ์ ๋ด๋ณด๋ด๋ ์์ ์ sayHello() ํธ์ถ๋ถ ์ดํ๋ก ๋ณด๋ด๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ค์ด ๊ฒน์น๊ฒ ๋๋ฉด, ์ํ ์ฐธ์กฐ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ฒ ๋๋ค๊ณ ์ค๋ช
ํฉ๋๋ค.
์ํ ์ฐธ์กฐ์์ ๋ฌธ์ ๊ฐ ๋ฌ์๋ ์์์ฐจ๋ฆฌ๊ธฐ ํ๋ ์ด์
- ESM ์์๋ ๋ชจ๋์์ ์๋ ์์ฑ์ ๊ฐ์ ธ์ฌ๋ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. โ ๋ช ์์ ์ผ๋ก ์๋ฌ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ํ ์ฐธ์กฐ ์ค๋ฅ๋ฅผ ๋น ๋ฅด๊ฒ ์ธ์ํ ์ ์์ต๋๋ค.
- commonJS ์์๋ ๋ชจ๋์์ ์๋ ์์ฑ์ ๊ฐ์ ธ์ค๋ฉด ์ผ๋ฐ์ ์ธ ๊ฐ์ฒด์ฒ๋ผ
undefined๊ฐ ๋ฐํ๋๊ณ ์๋ฌ๋ฅผ ๋ฐ์์ํค์ง ์์ต๋๋ค. โ ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ์์์ฐจ๋ฆฌ์ง ๋ชปํฉ๋๋ค. (commonJS์ ์ฌ์ฉํ๋ ์นํฉ์ ๊ฒฝ์ฐ ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๊ธฐ ํ๋ญ๋๋ค.)
๊ฐ์ฅ ๋ช ์์ ์ธ ํด๊ฒฐ ๋ฐฉ๋ฒ - ๋ด๋ถ ๋ชจ๋ ํจํด(Internal module pattern)
๊ฐ์ฅ ๋ช ์์ ์ธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ชจ๋์ ํ๊ฐ ์์๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ ์ํ๋ ํ์ผ์ ๋ง๋๋ ๊ฒ ์ ๋๋ค.
๋ฐ๋ผ์, ๋ชจ๋์ ๊ฐ์ ธ์ฌ๋ ํญ์ ๊ทธ ํ์ผ๋ก๋ถํฐ ๊ฐ์ ธ์ค๋ ํํ๋ฅผ ๊ฐ์ถ๊ฒ ๋ฉ๋๋ค.
ํต์ฌ์ ๋ค๋ฅธ ๋ชจ๋๋ค์ ์ง์ ์ ์ผ๋ก ๋ถ๋ฌ์ค์ง ์๋๋ก ํ๋ ๊ฒ ์ ๋๋ค.
์์ ์์์ ๋ชจ๋์์ ์์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด modules.js ํ์ผ์ ์ ์ํ ์ ์์ต๋๋ค.
// modules.js
export * from "./b.js";
export * from "./a.js";
๋ชจ๋ ํธ์ถ๋ถ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฌ๋ผ์ง ๊ฒ์ ๋๋ค.
//index.js
import { NAME, sayHello } from "./modules.js";
//a.js
import { sayHello } from "./modules.js";
//b.js
import { NAME } from "./modules.js";
์์ฝ
- ์ํ ์ฐธ์กฐ๋ ์๋ก๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํ๋ ํํ์ ๋๋ค. (a๋ชจ๋ โ b๋ชจ๋)
- ์ํ ์ฐธ์กฐ๋ CommonJS ํ๊ฒฝ์์ ์ฝ๊ฒ ๋ฐ๊ฒฌํ์ง ๋ชปํฉ๋๋ค.
- ๋ด๋ถ์ ์ผ๋ก ๋ชจ๋ ํ๊ฐ ์์๋ฅผ ์ ์ํ๋ ํ์ผ์ ๋ฐ๋ก ๋ง๋ค์ด ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
--
2. Cache-Control, Expires๋ฅผ ๋น ๋จ๋ฆฌ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ๊น?
http ์บ์๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ค์ ํ๊ณ ์ ์ดํจ์ผ๋ก์จ ์น ์ฑ๋ฅ์ ๋์ผ ์ ์๋ค๋ ์ฌ์ค์ด ์์ต๋๋ค.
ํ์ฌ ์ฐ๋ฆฌ ํ๋ก ํธ์๋ ํธ๋์์ ์บ์ ์ค์ ์ ์ง์ ๋ค๋ฃจ์ง๋ ์์ต๋๋ค. ๊ทธ๋ ์ง๋ง ์์ผ๋ก์ ์น ์ฑ๋ฅ๊ณผ ์ดํด๋ฅผ ์ํด ๋ค์ํ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ ์บ์๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๋๊ฒ์ ๊ผญ ํ์ํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ธ๋ผ์ฐ์ ์บ์ ๊ด๋ จ ํค๋์ธ Cache-Control , Exprires ๋ฅผ ๋น ๋จ๋ฆฌ๋ฉด ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง, ๋ํ ๋ธ๋ผ์ฐ์ ์บ์ ์ค์ ์ด ์ ์ค์ํ์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์น ์บ์
- ์ค์ ์์
์ ํ๋ฉฐ ๋น๋๋ ์ฌํญ์ด ์ ์ฉ์ด ์๋ ๋
์บ์ ์ญ์ ํด๋ผ๊ฐํ ์๋ก๊ณ ์นจ ํด๋ผ๋ฑ๋ฑ์ ๋ง์ ๋ค์ ์ ์ด ์์ ๊ฒ๋๋ค.(cc. ์ต์๋น๋) ์ด๊ฒ๋ค๋ ๋ธ๋ผ์ฐ์ ์บ์์ ๊ด๋ จ๋ ์ฌํญ์ด๋ผ๊ณ ๋ณผ ์ ์์ฃ . - ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ HTTP ์์ฒญ์ ํตํด ํ์ํ ๋ฆฌ์์ค (HTML, CSS, JS, ์ด๋ฏธ์ง ๋ฑ)๋ฅผ ๋ถ๋ฌ์ต๋๋ค. ๋คํธ์ํฌ๋ฅผ ํตํด ์ด ๊ณผ์ ์ ์ํํ๋๊ฑด ๋๋ฆฌ๊ณ ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค.
- ์ฌ๊ธฐ์ ๋ฐ์ํ ์ ์๋ ๋ถํ์ํ ๋คํธ์ํฌ ์ฌ์์ฒญ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์น ์บ์ฑ์ ์ฌ์ฉํฉ๋๋ค.
Cache-ControlExpries๋ฑ๊ณผ ๊ฐ์ ์ฐ๋ฆฌ๊ฐ ์์ฃผ ๋ด์จ ํค๋๋ ์บ์ ๋์๊ณผ ๊ด๋ จ๋ ํค๋๋ก, ์๋ฒ์ ๋น์ฉ์ ์ค์ด๊ณ ํด๋ผ์ด์ธํธ์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
Cache-Control, Expires ํค๋๋ฅผ ๊ธฐ์ ํ์ง ์์ ๊ฒฝ์ฐ
- ๋๊ตฐ๊ฐ ์๋ํ๋ ์๋ํ์ง ์์๋
Cache-ControlExpiresํค๋ ๋ชจ๋ ๊ธฐ์ ํ์ง ์์ ๊ฒฝ์ฐ, ๋ธ๋ผ์ฐ์ ๋ ์ด๋ป๊ฒ ๋์ํ ๊น์? - ๋ํ์ ์ธ ๋ธ๋ผ์ฐ์ ์ธ ํฌ๋กฌ์ ์บ์ ๋์์ ์ดํด๋ณด๊ธฐ ์ํด Chromium์ ์ฝ๋๋ฅผ ํ์ธํด๋ณด์์ต๋๋ค.
HttpResponseHeaders::GetFreshnessLifetimes(const Time& response_time) const {
FreshnessLifetimes lifetimes;
if (HasHeaderValue("cache-control", "no-cache") ||
HasHeaderValue("cache-control", "no-store") ||
HasHeaderValue("pragma", "no-cache")) {
return lifetimes;
}
...
if ((response_code_ == net::HTTP_OK ||
response_code_ == net::HTTP_NON_AUTHORITATIVE_INFORMATION ||
response_code_ == net::HTTP_PARTIAL_CONTENT) &&
!must_revalidate) {
// TODO(darin): Implement a smarter heuristic.
Time last_modified_value;
if (GetLastModifiedValue(&last_modified_value)) {
// The last-modified value can be a date in the future!
if (last_modified_value <= date_value) {
lifetimes.freshness = (date_value - last_modified_value) / 10; //์ฌ๊ธฐ!
return lifetimes;
}
}
}
- Chromium์
http_response_headers.cc๋ฅผ ์ดํด๋ณด๋ freshness(์ ํจ์ฑ)์ด(date_value - last_modfied_value) / 10๋ก ํ ๋น๋๋ ๊ฒ ๊ฐ์ต๋๋ค. - ์ด๋ Date์ LastModified์ ์ฐจ์ด๊ฐ์ 10๋ถ์ 1๋ก ์ถ์ ํ์ฌ ์ ํจ์ฑ(freshness) ๊ณ์ฐ์ ํ๋ค๋ ๊ฒ์
๋๋ค. MDN ๋ฌธ์๋ฅผ ๋ณด๋
heuristic์ด๋ผ๋ ๋์์ผ๋ก ์บ์ ํค๋๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ์น ์คํฉ์ ๊ธฐ๋ฐ์ผ๋ก ๋๋ต์ ์ผ๋ก ์บ์ ์๋์ ํฉ๋๋ค.
๊ทธ๋ผ ์บ์๋ ์์์ ๋์ํ๋ ๋ฌธ์ ๊ฐ ์๋๊ฑธ๊น?
ํด๋ฆฌ์คํฑ ์บ์๋ ๋ฌธ์ ๊ฐ ๋ง์ด ์๊ฒจ๋ ์ ์์ต๋๋ค. ์ปจํ ์ธ ๋ฐฐํฌ๋ฅผ ํ๋๋ผ๋ ์น ๋ฐฐํฌํ ํน์ ๊ธฐ๊ธฐ์์ ์ด์ ์บ์ ๋ ์ฝํ ์ธ ๊ฐ ๋ ธ์ถ๋ ์ ์๊ณ , ๋ณ๊ฒฝ์ฌํญ์ด ์ค์ ๋ก ์ ์ฉ๋๋๋ฐ ๋ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
๊ฐ๋จํ ํด๊ฒฐ์ฑ ์ผ๋ก๋ ์ฌ์ฉ์๊ฐ ์บ์๋ฅผ ๋น์ ๋ฆฌ์์ค๋ฅผ ์๋ก ๊ฐ์ ธ์ค๋๋ก ํ๋ ๊ฒ ์ ๋๋ค.
์ค์ ๊ฐ๋ฐ์ ์ฐฝ์ ์ด๊ณ ์๋ก๊ณ ์นจ ๋ฒํผ์ ์ฐํด๋ฆญํ๋ฉด โ์บ์ ๋น์ฐ๊ธฐ ๋ฐ ๊ฐ๋ ฅ ์๋ก๊ณ ์นจโ ์ ์ ํํ ์ ์์ต๋๋ค.

๊ทธ๋ฌ๋ ๊ทผ๋ณธ์ ์ผ๋ก ์บ์ฑ์ ๊ดํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ๋ช ์์ ์ผ๋ก ํค๋๋ฅผ ์ค์ ํ์ฌ ์บ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ๋๊ฒ ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค. ์บ์ ์ ํจ์๊ฐ์ ์ฌ์ฉํ์ฌ ์ ํํ ์๊ฐ์ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ์ ์จ๋ณด๋ฉด ์ข์๊ฒ๊ฐ์ต๋๋ค.
์ค์ ํ ์ค์์๋ html์ ๋ฐฐํฌ ์ฃผ๊ธฐ์ ์ฒดํฌ๋์ด์ผ ํ๋ ๋ฆฌ์์ค์ด๊ธฐ ๋๋ฌธ์ Cache-Control ๊ฐ์ผ๋ก max-age=0, s-maxage=31536000 ์ ์ค์ ํ๋ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฌ๋ JavaScript ๋ CSS ํ์ผ์ ํ๋ก ํธ์๋ ์น ์๋น์ค๋ฅผ ๋น๋ํ ๋๋ง๋ค ์๋ก ๋ณ๊ฒฝ์ฌํญ์ด ์ ์ฉ๋ ์ ์๋๋ก ์์ ๋ฒ์ ๋ฒํธ๋ฅผ ๋ถ์ฌํด ์ค์ ํฉ๋๋ค.
โ ๋ง์ฝ ํ ์ค์ ์บ์ ์ค์ ์ ๋ํด ๋ ์์ธํ ์๊ณ ์ถ๋ค๋ฉด ์ฌ๊ธฐ๋ฅผ ํด๋ฆญ
์์ฝ
- ๋ธ๋ผ์ฐ์ ์บ์ ์ค์ ์ ๋ฐ๋ก ํ์ง ์์ ๊ฒฝ์ฐ ํฌ๋กฌ, ์ฌํ๋ฆฌ ๋ฑ์ ๋ธ๋ผ์ฐ์ ๋ ์์์ ์บ์ ๋์์ ํด์ค๋๋ค.
- ์๋์ผ๋ก ์บ์ ์ค์ ์ด ๋๋ค๋๊ฑด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ ์ง์ ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํ์ธํด์ฃผ๋๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๊ฐ๊ฐ์ ํน์ฑ์ ๋ฐ๋ผ ์บ์๋ฅผ ์ฌ์ธํ ์ ์ดํจ์ผ๋ก ์์ ํ๊ณ ๋น ๋ฅด๊ฒ HTTP ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ ์ ์์ผ๋ฉฐ, ํธ๋ํฝ ๋น์ฉ์ ์ ๊ฐํ ์ ์์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ
ใ กใ ก
3. CI/CD๊ฐ ํ์ ์ ํ์ํ ์ด์
ํ์ ๊ฒฝํ์ด ๋ถ์กฑํ์ ๋๋ ์์ ํ ๋ด์ฉ์ ํ ๋ถ๊ธฐ์ ํตํฉํ๊ณ ํด๋น ์์ ์ด ๋ฐฐํฌ๋ ๋๊น์ง์ ํ์ดํ๋ผ์ธ์ ์๋์ผ๋ก ๊ฒ์ฆํด์ผ ํ๋ ๊ธฐ์ต์ด ์์ต๋๋ค.
๊ทธ๋ฌ๋ Github Action์ด๋ผ๋ CI/CD ํด์ ํตํด ํ์ ๊ฒฝํ์ ๊ฐ์ ํ๋ฉด์, ๋ธ๋์น๋ฅผ ๋ณํฉํ๊ธฐ ์ CI์์ ํ ์คํธ๋ฅผ ์ํํ๊ณ ๋ฐฐํฌ ๊ณผ์ (CD)์ ์๋ํํ ์ ์๊ฒ ๋์์ต๋๋ค.
CI/CD ์ค๋ช
CI/CD๋ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ ๋น ๋ฅด๊ณ ์์ ์ ์ผ๋ก ์ ๊ณตํ๊ธฐ ์ํด ๋น๋, ํ ์คํธ ๋ฐ ๋ฐฐํฌ๋ฅผ ์๋ํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ์ง์์ ์ธ ํตํฉ๊ณผ ์ง์์ ์ธ ๋ฐฐํฌ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ๊ฐ๊ฐ์ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- CI - ๊ณต์ ์ ์ฅ์๋ด์์ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ๋น๋ ๋ฐ ํ ์คํธ๋ฅผ ํตํฉํ๋ค.
- CD - ๋ณ๊ฒฝ ์ฌํญ์ ํ๋ก๋์ ํ๊ฒฝ์ ์ ๋ฌ, ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐฐํฌ ์๋ํ ํ๋ค.
๋ฐ๋ผ์ CI/CD ํ์ดํ๋ผ์ธ์ ๋ณดํต ๋ ๊ฐ์ง ์น์ ์ผ๋ก ๋๋์ด ์งํ๋ฉ๋๋ค.
- build โtest โ artifact / staging โ production
CI/CD ์ ์์ธํ ์ํฌํ๋ก์ฐ ์์๋ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
###CI/CD์ ์ด์
Google DevOps ๋ณด๊ณ ์์ ๋ฐ๋ฅด๋ฉด, CI/CD๋ฅผ ์ฌ์ฉํ๋ ์กฐ์ง์ ๋ค๋ฅธ ์กฐ์ง๋ณด๋ค ๋ฐฐํฌ๋ฅผ 208๋ฐฐ ๋ ์์ฃผํ๊ณ ๋ฆฌ๋ ํ์์ด 106๋ฐฐ ๋ ๋น ๋ฅด๋ค๊ณ ํฉ๋๋ค. ๊ทธ ์ธ์ ์ด์ ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฝ๋๋ฒ ์ด์ค๊ฐ ์ธ์ ๋ ์ง ์์ ์ ์ธ ์ํ ์ ์ง
- ์๋ํ๋๊ณ ์ง์์ ์ธ ํ ์คํธ ๊ฐ๋ฅ (๋น์ฉ ์ ๊ฐ ํจ๊ณผ)
- ๋ฆด๋ฆฌ์ค ์๋ ๋จ์ถ
- ์ค๋ฅ ๊ฒฉ๋ฆฌ, ์ฅ์ ์ง์ ๊ฐ์
- ์ค๋ฒํค๋ ๋น์ฉ ์ ๊ฐ
###ํ์ ๋์ ๋๊ณ ์๋ cicd ํํฉ
์ ํฌ ํธ๋์์๋ Github Actions๋ฅผ ์ด์ฉํ์ฌ CI/CD๋ฅผ ์คํํ๊ณ ์์ต๋๋ค.
Github Actions๋ ํน์ ๋ฆฌํฌ์งํ ๋ฆฌ์์ ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ GitHub Action Runner์์ ์์ ์ ์คํํ๋ ๊ตฌ์กฐ์ ๋๋ค.
Runner ๋จธ์ ๊ตฌ์ถ ์ดํ, ๋ฆฌํฌ์งํ ๋ฆฌย .github/workflowsย ๋๋ ํ ๋ฆฌ์ ์ํฌํ๋ก์ฐ YAML ํ์ผ์ ์์ฑํ๊ธฐ๋ง ํ๋ฉด ๋ณ๋์ ์ค์น๋ ์ธํ
์์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ฌ๊น์ง ์ ์๋ ์ํฌํ๋ก์ฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Lint Check
์ฝ๋ ๋ฒ ์ด์ค์ ์์ ์ฑ, ๋ฐฐํฌ ๊ณผ์ ์์์ ์๋ฌ๋ฅผ ์ต์ํํ๊ธฐ ์ํด ๋์ ๋์์ต๋๋ค. Pull Request๊ฐ ๋ฑ๋ก๋๋ฉด ์๋์ผ๋ก eslint ํ ์คํธ๋ฅผ ์งํํ๊ณ eslint๋ฅผ ํต๊ณผํ์ง ๋ชปํ PR์ merge ํ์ง ๋ชปํ๋๋ก ์ ์ด๋ฉ๋๋ค.
- Type Check
๋ง์ฐฌ๊ฐ์ง๋ก ์ฝ๋ ๋ฒ ์ด์ค์ ์์ ์ฑ, ๋ฐฐํฌ ๊ณผ์ ์์์ ์๋ฌ๋ฅผ ์ต์ํํ๊ธฐ ์ํด ๋์ ๋์์ต๋๋ค. TypeScript ํ์ผ์ ๋ํด ํ์ ๊ฒ์ฌ๋ฅผ ์ํํ๊ณ , ์ฝ๋์ ์ค๋ฅ๊ฐ ์๋์ง ํ์ธํฉ๋๋ค. ์ด๋ํ ํ ์คํธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด merge ํ ์ ์์ต๋๋ค.
- Pick Reviewer
PR ๋ฆฌ๋ทฐ์ด๋ฅผ ์ปค์คํ ํ๊ธฐ ์ํด ๋์ ๋์์ต๋๋ค. PR์ด ์ด๋ฆฌ๋ฉด ์ ํด์ง ๊ตฌ์ฑ ์์์ ๋๋ค์ผ๋ก ๋ฆฌ๋ทฐ์ด๊ฐ ๋ฐฐ์ ๋๋ฉฐ, ์ด ๊ณผ์ ์ ์ฌ๋์ผ๋ก ์๋ฆผ์ด ์ฐ๋๋ฉ๋๋ค.
ํ์ฌ๋ ๊ฐ์ ๋๋ฉ์ธ ํ 1๋ช ๊ณผ ๋ค๋ฅธ ๋๋ฉ์ธ ํ 1๋ช ๊ตฌ์ฑ์ผ๋ก ์ค์ ๋์ด์์ต๋๋ค.
์ด๊ธฐ์๋ PR Lint test ์คํ์ ์ฃผ๋ชฉ์ ์ผ๋ก ๋์ ๋์์ง๋ง, ์ด ๊ณผ์ ์์ Runner ๋จธ์ ๊ตฌ์ถ ๋ฟ๋ง ์๋๋ผ PR์ ์ปค๋ฐ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ์ค๋ณต ์คํ๋๊ฑฐ๋, PR ๋ณธ๋ฌธ์ด ๋ณ๊ฒฝ๋์ด๋ ๋ฆฐํธ ํ ์คํธ๊ฐ ์คํ๋๋ ๋ฑ ๊ฐ์ ์ด ํ์ํ ๋ถ๋ถ์ด ์์์ต๋๋ค.
๋ฐ๋ผ์ Lint Test ์ด์ธ์ ๊ฐ๋ฐ ํจ์จ์ฑ์ ๋์ฌ์ค ๋ง ํ ๋ค์ํ Action๋ค์ ์ฐพ์๊ณ , ๊ฒํ ํด๋ณด๋ฉด ์ข์ ๊ฒ๋ค์ ๋ชจ์๋ดค์ต๋๋ค.
- develop ๋ธ๋์น์ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ด merge๋๋ ์ฆ์ ์๋์ผ๋ก ์ ํจ์ค ๋น๋ ํธ๋ฆฌ๊ฑฐ
- ์บ์ฑ ๋ฐ์ดํฐ ํ์ฉํ์ฌ ์ํฌํ๋ก์ฐ ๋ถํ์ํ ์์ ์ต์ ํ
- ์ฌ์ฉํ์ง ์๋ ์ฝ๋ ์๋ ๋ ๊ฑฐ์ ์ฒดํฌ
์์ฝ
- CI/CD ์ ๋ต์ ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ผ์ดํ์ฌ์ดํด ์ ๋ฐ์์ ํจ์จ์ฑ๊ณผ ์์ ์ฑ์ ์ฆ๋์ํต๋๋ค.
- ์ ํฌ ํ์์๋ Lint Check๋ฅผ ์์ฃผ๋ก ์ฌ์ฉํ๊ณ ์์ง๋ง, ๋ ํจ์จ์ ์ธ ํ๋ก์ธ์ค๋ฅผ ๋์ ํ ์ ์์ต๋๋ค.
References CI/CD(CI CD, ์ง์์ ํตํฉ/์ง์์ ๋ฐฐํฌ): ๊ฐ๋ , ํด, ๊ตฌ์ถ, ์ฐจ์ดCI/CD๋?
https://resources.github.com/ci-cd/
https://www.martinfowler.com/articles/originalContinuousIntegration.html
https://it.donga.com/101955/
https://medium.com/naver-place-dev/github-actions๋ฅผ-ํ์ฉํ-๊ฐ๋ฐ-ํจ์จํ-7df7a14b8843
--