ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉ ํ ์คํธ ๋ฌธ์ ๋ฅผ ํ๊ณ ๊นํ๋ธ ๋ ํฌ์งํ ๋ฆฌ์ ํ์ด๋ฅผ ์ฌ๋ฆฌ๋ ์คํฐ๋๋ฅผ ์งํํ๊ณ ์์๋ค.
์คํฐ๋๋ ์๋์ ๊ฐ์ด ์งํ๋๋ค.
1. ๋ฌธ์ ๋ฅผ ํ๊ณ ํต๊ณผํ๋ค.
2. ํต๊ณผ๋ ํ์ด๋ฅผ [๋ ๋ฒจ/๋ฌธ์ ๋ช .js] ํ์ผ ํ์์ผ๋ก ํธ์ํ๋ค.
3. README์ ํ์ด ๋งํฌ๋ฅผ ์ถ๊ฐํ๋ค.
๋งค์ผ ํ๋ฃจ์ ํ ๋ฌธ์ ์ด์์ ํธ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๊ณ ์์ ๊ฐ์ ํ๋์ด ๋ฐ๋ณต๋๋ ์ฐฐ๋ .. ์ด์ฉ์ง ์์ฒญ๋ ๊ท์ฐฎ๋ค๐ค
2๋ฒ๋ง ์ํํ๋ฉด 3๋ฒ ๊ณผ์ ์ด ์๋์ผ๋ก ์ํ๋ ์ ์์๊น?
README๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ ์๋์ ๊ฐ๋ค
README ์์ฑํ๊ธฐ
๋ฌด์์ ํ์ด ํ์ผ์ ์ฌ๋ฆฌ๊ฒ ๋๋ฉด ๋ฌธ์ ๊ฐ์๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ๋์ค์ ๋ค์ ์ฐพ์๋ณด๊ธฐ๊ฐ ์ด๋ ต๋ค.
README์ ํ ์ด๋ธ๋ก ์ ๋ฆฌํด๋์ผ๋ฉด ์ด๋ ๋ฌธ์ ์ธ์ง + ์ด๋ป๊ฒ ํ์ดํ๋์ง๋ฅผ ์ฝ๊ฒ ํ์ธํ ์ ์๋ค.
- ๋ฒํธ
- ๋ฌธ์ ๊ฐ์๋ฅผ ํ์ ํ๊ธฐ ์ํด 0๋ฒ๋ถํฐ index๋ฅผ ์ค์ ํด์ฃผ์๋ค.
- ๋ฌธ์
- ๋งํฌ๋ฅผ ๋๋ฅด๋ฉด ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ํ์ด์ง๋ก ์ด๋ํ๋ค.
- ํ์ด
- ๋งํฌ๋ฅผ ๋๋ฅด๋ฉด๊นํ๋ธ์ ์ฌ๋ผ์จ ํ์ด ํ์ผ๋ก ์ด๋ํ๋ค. 3๋ฒ์ด ๋ฐ๋ก ์ด ๋งํฌ๋ฅผ ์ถ๊ฐํด์ฃผ๋ ๊ณผ์ ์ด๋ค.
๋งํฌ๋ค์ด์ผ๋ก ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
// README.md
| index | [๋ฌธ์ ๋ช
](ํ๋ก๊ทธ๋๋จธ์ค์์ ํด๋น ๋ฌธ์ ๋งํฌ) | [๋ฌธ์ ๋ช
.js](๊นํ๋ธ์ ์
๋ก๋ํ ํ์ด ๋งํฌ) |
// ์์
// | 2 | [๊ณผ์ผ ์ฅ์](https://school.programmers.co.kr/learn/courses/30/lessons/135808) | [๊ณผ์ผ-์ฅ์.js](https://github.com/minkyung00/programmers-coding-test/blob/main/level-1/๊ณผ์ผ-์ฅ์.js) |
๋ฌธ์ ํญ : axios๋ก ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ๊ฐ์ ธ์ค๊ธฐ
๋ฌธ์ ํญ์๋ ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ์ ๋ณด(๋ฌธ์ ์ด๋ฆ + ๋ฌธ์ ๋งํฌ)
๊ฐ ์์ฑ๋์ด์ผํ๋ค.
ํ์ง๋ง ํ๋ก๊ทธ๋๋จธ์ค์๋ ๋ฌธ์ ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ url์ ์ผ์ผ์ด ๋ณต์ฌ + ๋ถ์ฌ๋ฃ๊ธฐ ํด์ ์์ฑํ ์ ์๋ค.
axios ํต์ ์ ์ด์ฉํด์ ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค์.
// ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ๋ฅผ ๊ฐ์ ธ์์ title, url ์ ๋ณด๋ง ์ฌ์ฉํ๋ค.
const getProblems = async PAGE => {
try {
const {
data: { result },
} = await axios.get(`${API_URL}/?perPage=20&levels[]=${LEVEL}&order=${ORDER_BY}&page=${PAGE}`);
return result.map(({ id, title }) => ({
title,
url: getProblemURL(id),
}));
} catch (error) {
console.log(error);
}
};
1. ํ๋ก๊ทธ๋๋จธ์ค API์ ๋ฌธ์ ์ ๋ณด๋ฅผ ์์ฒญํ๋ค.
- ๊ฐ๋ฐ์ ๋๊ตฌ > ๋คํธ์ํฌ ํญ์ ๋ค์ด๊ฐ๋ณด๋ฉด ์์ฒญ ์ฃผ์๋ฅผ ๋ฐ๋ก ์ ์ ์๋ค.
2. ๋ฌธ์ ๋ ๋ฒจ / ์ ๋ ฌ ๋ฐฉ์ / ํ์ด์ง๋ ๋ณํ ์ ์๊ธฐ ๋๋ฌธ์ ์์๋ก ๊ด๋ฆฌํด์ฃผ์๋ค.
3. README์๋ ๋ฌธ์ ์ด๋ฆ / ๋ฌธ์ url๋ง ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํด๋น ์ ๋ณด๋ง ๋ฐํํด์ค๋ค.
ํ ์ด๋ธ ํ์์ผ๋ก ๋งํฌ๋ค์ด ์์ฑํ๊ธฐ
์๋ต ๋ฐ์ ๋ฐ์ดํฐ ์ค title, url์ ๋งํฌ๋ค์ด ํ ์ด๋ธ ํ์์ผ๋ก ๋ณํํด์ค๋ค.
/* ํ
์ด๋ธ ํ์
** | index | [๋ฌธ์ ์ด๋ฆ](ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ๋งํฌ) | [๋ฌธ์ ์ด๋ฆ.js](๊นํ๋ธ์ ์ฌ๋ผ์จ ๋ฌธ์ ํ์ด)|
*/
const createTable = problems => problems.map(({ title, url }, index) => `| ${index} | [${title}](${url}) |`).join('\n');
ํ์ด ํญ: ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ
์ด์ README์์ ํ ์ด๋ธ์ ๋ฌธ์ ํญ์ ์ฑ์์ก๋ค.
ํ์ด ํญ์ ์ฑ์ฐ๊ธฐ ์ํด์๋ ํ์ผ์ด ์กด์ฌํ๋ฉด ์ ๋ณด๋ฅผ ์ถ๊ฐํด์ฃผ๊ณ ์์ผ๋ฉด ๋น์นธ์ผ๋ก ์์ฑํด์ผํ๋ค.
ํ์ด ํ์ผ ์ฝ์ด์ค๊ธฐ
const getSolvedProblemList = problems =>
fs
.readdirSync(`level-${LEVEL}`)
.map(fileName => ({
title: formatFileName(fileName),
fileName,
url: `${GITHUB_URL}/level-${LEVEL}/${fileName}`,
}))
.map(({ title, url, fileName }) => {
const { title: problemTitle, url: problemUrl } = problems.find(
({ title: problemTitle }) => problemTitle === title
);
return {
title: problemTitle,
url: problemUrl,
fileName,
fileUrl: url,
};
});
1. level ํด๋์ ํ์ผ์ ์ฝ์ด์จ๋ค.
- level-๋ ๋ฒจ/๋ฌธ์ ์ด๋ฆ.js
๊ตฌ์กฐ๋ก ์ ์ฅ๋๋ค.
2. ์ด ๋, ํ์ด ํ์ผ์ ์ด๋ฆ์ ๋ฌธ์ ์ด๋ฆ์ ๊ณต๋ฐฑ์ด ์์ผ๋ฉด -(ํ์ดํ)
์ผ๋ก ๋์ด์๋ค. formatFileName
์ผ๋ก ์๋ ๋ฌธ์ ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝํด์ค๋ค.
3. ํ์ผ์ด ์กด์ฌํ๋ ๋ฌธ์ ์ ๋ฌธ์ ์ด๋ฆ / ๋ฌธ์ ์ฃผ์ / ํ์ผ ์ด๋ฆ / ํ์ผ ์ฃผ์๋ฅผ ๋ฐํํ๋ค.
README ์์ฑํ๊ธฐ
์ด์ ํ์ํ ์ ๋ณด์ธ ๋ฌธ์ ์ด๋ฆ / ๋ฌธ์ ์ฃผ์ / ํ์ผ ์ด๋ฆ / ํ์ผ ์ฃผ์ ๋ฅผ ๋ชจ๋ ๊ฐ๊ณ ์๋ค.
์ด๋ฅผ ๋งํฌ๋ค์ด ๋ฌธ๋ฒ์ผ๋ก๋ง ๋ณํํด์ฃผ๋ฉด ๋๋ค.
/* problem ๊ฐ์ฒด ์ ๋ณด
** {
** title: ๋ฌธ์ ์ด๋ฆ,
** url: ๋ฌธ์ ์ฃผ์,
** fileName: ํ์ผ ์ด๋ฆ,
** fileUrl: ํ์ผ ์ฃผ์,
** }
*/
const createTable = problems =>
problems
.map(
({ title, url, ...fileInfo }, index) =>
`| ${index} | [${title}](${url}) | [${fileInfo?.fileName ?? ''}](${fileInfo?.fileUrl ?? ''}) |`
)
.join('\n');
ํ์ผ ์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๋น ๋ด์ฉ์ผ๋ก ๋๊ณ ํ์ผ ์ ๋ณด๊ฐ ์์ ๋๋ง ์์ฑํ๋ค.
์ต์ข README๋ฅผ ์์ฑํ๋ฉด ์๋์ ๊ฐ๋ค
const createReadme = async () => {
const problems = await getAllProblems();
const solved = getSolveProblemList(problems);
const content = problems.map(problem => solved.find(({ title }) => title === problem.title) ?? problem);
const readme = `
## ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉ ํ
์คํธ ๋ฌธ์ ํ์ด (2022.11.29 ~)
## ๋ฌธ์
๋ฌธ์ ๋ ํญ์ **์ต์ ์**์ผ๋ก ์
๋ฐ์ดํธ๋ฉ๋๋ค.
### Level 1
| ๋ฒํธ | ๋ฌธ์ | ํ์ด |
| --- | --- | --- |
${createTable(content)}
`.trim();
return readme;
};
1. problems
: ๋ฌธ์ ํญ์ ํ์ํ ์ ๋ณด
2. solved
: ํ์ด ํญ์ ํ์ํ ์ ๋ณด
3. 1๋ฒ๊ณผ 2๋ฒ์ ํฉ์น ์ต์ข ์ ๋ณด
3๋ฒ ์ ๋ณด๋ฅผ ์ด์ฉํด์ ๋งํฌ๋ค์ด ํ
์ด๋ธ์ ๋ง๋ค๊ณ readme
์ ์ฝ์
ํด์ค๋ค.
const build = async () => {
const readme = await createReadme();
fs.writeFileSync('README.md', readme, 'utf8');
};
build();
๊ทธ ํ ํ์ผ ์ฐ๊ธฐ๋ฅผ ํตํด README.md์ ์ต์ข
readme
๋ฌธ์์ด์ ์์ฑํด์ค๋ค.
์๋์ผ๋ก REAMDE ์ ๋ฐ์ดํธํ๊ธฐ
์๋์ ๊ฐ์ด ์๋ํ๋ฅผ ์ํํ ์ ์๋ค
1. ๋ฌธ์ ์ด๋ฆ.js
๊ฐ push๋๋ค.
2. ์์์ ๋ง๋ README๋ฅผ ์์ฑํ๋ ํ์ผ์ ์คํํ๋ค.
yml ํ์ผ
github actions๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ค์ ํ์ผ์ ์์ฑํด์ฃผ์ด์ผํ๋ค.
๋ ํฌ์งํ ๋ฆฌ์ Actions > Choose a workflow > Node.js ๋ฅผ ์ฐธ๊ณ ํ๋ฉด yml ํ์ผ์ ์ฝ๊ฒ ์์ฑํ ์ ์๋ค.
configure ๋ฒํผ์ ๋๋ฅด๋ฉด ์์ yml ํ์ผ์ด ๋์ค๋๋ฐ
ํด๋น ํ์ผ์ ์ฐธ๊ณ ํ์ฌ yml ํ์ผ์ ์์ฑํ์๋ค.
name: update-readme
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Node.js 16.16.0
uses: actions/setup-node@v3
with:
node-version: 16.16.0
- name: Install dependencies
run: npm install
- name: Run Update README.md
run: node utils/updateReadme.js
- name: Create README.md
run: |
git add README.md
git config user.name github-actions
git config user.email github-actions@github.com
git commit -m "docs: README.md ์๋ํ ์
๋ฐ์ดํธ"
git push
์ฑ๊ณต์ ์ธ ๊ฒฐ๊ณผ๐บ
๋ฌธ์ ํ์ด ํ push ํ๋ ๋ฐ๋ก ์๋์ผ๋ก yml ํ์ผ์ด ์คํ๋๋ค.
yml์ ์์ฑํ ๋ชจ๋ ํ๋ก์ธ์ค๊ฐ ์ ์์ ์ผ๋ก ํต๊ณผ๋๋ฉด README๊ฐ ์ ๋ฐ์ดํธ๋๋ค. ๊บ !
์ถ๊ฐ ๊ฐ์ ์ฌํญ
README ์ค๋ณต ์์ฑ
ํ์ฌ push๋ฅผ ํ๋ฉด README๋ฅผ ์์ ์๋ก ์์ฑํ๋ค.์ด๋ ๋ชจ๋ push๊ฐ ๋ฌธ์ ํ์ด๋ฅผ ์ ๋ก๋ํ๋ ๊ฒ์ ๊ฐ์ ํ๊ณ ์๋ค.
๋ง์ฝ ๋ฌธ์ ํ์ด๊ฐ ์๋๋ผ ์ ํธ ํจ์ ๋ฆฌํฉํ ๋ง์ ํ ๊ฒฝ์ฐ, README ๋ด์ฉ์ด ๋ณ๊ฒฝ๋์ง ์๋๋ค.
๋ฐ๋ผ์, ์ด์ README๊ณผ ํ์ฌ README๊ฐ ๋์ผํ๋ค๋ฉด ํ์ผ ์์ฑ์ ํ์ง ์๋ ๊ฒ์ผ๋ก ์ฝ๋๋ฅผ ์์ ํ ์ ์์ ๊ฒ ๊ฐ๋ค.
'๐ฉโ๐ค ํ๋ก ํธ์๋ > javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Javascript] var, let, const (0) | 2022.06.22 |
---|---|
[Javascript] ํ์ด์ง๋ค์ด์ ๊ตฌํํ๊ธฐ (1) | 2022.06.07 |
[Javascript] input์์ ์ปค์ ๋งจ ๋ค๋ก ์์น ์ํค๊ธฐ (0) | 2022.06.03 |