๐ช Programming
[Algorithm] ๋ณต์กํ DOM ์์ ๋ก ๋ณด๋ DFS ํ์ ์๊ณ ๋ฆฌ์ฆ
[Algorithm] ๋ณต์กํ DOM ์์ ๋ก ๋ณด๋ DFS ํ์ ์๊ณ ๋ฆฌ์ฆ
2024.05.22๋ชฉํ์๋ DOM ๊ตฌ์กฐ์์ ๊ฐ์ฅ ์์ชฝ ์์๋ถํฐ ์์ํด ๋ถ๋ชจ ์์๋ก ๊ฐ ์๋ก ์ค์ฒฉ ๋ ๋ฒจ์ด 1์ฉ ๋์ด๋๊ณ , class์ ๋์ํ๋ dataset์ ์ค์ฒฉ ๋ ๋ฒจ ๊ฐ์ ํ ๋นํด์ผ ํ๋ค. ์๋ฅผ๋ค์ด class๊ฐ "clause" ์ด๊ณ , ํด๋น ์์์ ์ค์ฒฉ ๋ ๋ฒจ์ด 2๋ผ๋ฉด data-clause-lv="2" ์์ฑ์ ํ ๋นํ๋ค. Hello ; ๋ง์ฝ ์์ ์์๊ฐ 2๊ฐ ์ด์์ผ ๋ ์์ ์์๋ค์ค ์ค์ฒฉ ๋ ๋ฒจ์ด ๊ฐ์ฅ ๋์ ๊ฐ + 1์ด ๋ถ๋ชจ ์์์ ์ค์ฒฉ ๋ ๋ฒจ์ด ๋๋ค. ์๋ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก 1๋ฒ์งธ ์์์ ์ค์ฒฉ ๋ ๋ฒจ(data-word-lv="1") ๋ณด๋ค, 2๋ฒ์งธ ์์์ ์ค์ฒฉ ๋ ๋ฒจ(data-phrase-lv="2")์ด ๋ ๋์ผ๋ฏ๋ก, ๋ถ๋ชจ ์์์ ์ค์ฒฉ๋ ๋ฒจ์ 3์ด ๋๋ค(data-clause-lv="3"). ..
[Algorithm] ๋ฐ์ดํฐ ์ถ๊ฐ, ์ญ์ , ์ ๋ ฌ๋ก ๋ณด๋ BFS / DFS ํ์ ์๊ณ ๋ฆฌ์ฆ
[Algorithm] ๋ฐ์ดํฐ ์ถ๊ฐ, ์ญ์ , ์ ๋ ฌ๋ก ๋ณด๋ BFS / DFS ํ์ ์๊ณ ๋ฆฌ์ฆ
2024.05.21์์ ๋ฐ์ดํฐ๋จ์ด ํน์ ๋ฌธ์ฅ๋ถํธ(' ์ํฌ์คํธ๋กํผ ์ ์ธ)๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌํ ํ ํฐ ์ธ๋ฑ์ค ์ ๋ณด๊ฐ ๋ด๊ธฐ๋ Part ๊ฐ์ฒด๊ฐ ์๋ค. ์ด Part ๊ฐ์ฒด๋ child ๋ฐฐ์ด์ ๊ฐ์ง๋ฉฐ, child ๋ฐฐ์ด์ ๊ฐ ์์์ธ Part๋ ๋ถ๋ชจ Part์ ํ ํฐ ์ธ๋ฑ์ค ๋ฒ์ ๋ด์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง๋ค. ์๋ฅผ๋ค์ด ๋ถ๋ชจ Part์ ํ ํฐ ์ธ๋ฑ์ค ๋ฒ์๊ฐ 2~13์ด๋ผ๋ฉด ์์ Part์ ํ ํฐ ์ธ๋ฑ์ค๋ 3~13(3~13, 4~13, ...) ํน์ 2~12(2~12, 2~11, ...) ๋ฒ์๋ฅผ ๊ฐ์ง๋ค.[ // parts ๋ฐฐ์ด { id: 0, // part begin: 2, end: 13, kc: [{ id: 'kc-1', /* ... */ }], child: [ // parts ๋ฐฐ์ด { id: 1, // ..
[React/JS] ๋๋๊ทธํ ๋ฌธ์์ด ๋ถ๋ฆฌ(๋ฉํ)ํ๊ธฐ / Selection API
[React/JS] ๋๋๊ทธํ ๋ฌธ์์ด ๋ถ๋ฆฌ(๋ฉํ)ํ๊ธฐ / Selection API
2024.05.21์๋์ ๊ฐ์ ๋ฌธ์์ด์ด ์์ ๋ ๋ง์ฐ์ค๋ก ๋๋๊ทธํด์ ํ
์คํธ๋ฅผ ์ ํํ ๋๋ง๋ค ํ๊ทธ๋ก ๊ฐ์ธ๋๋ก ๊ตฌํํ๋ ๊ฒ ๋ชฉํ. Pharetra convallis hendrerit integer nec eleifend tellus luctus lorem dignissimPharetra convallis hendrerit integer nec eleifend tellus luctus lorem dignissimPharetra convallis hendrerit integer nec eleifend tellus luctus lorem dignissim ๋๋๊ทธํ ๋ฌธ์์ด ๋ฉํโถ ๋ง์ฐ์ค ํด๋ฆญ/ํ
์คํธ ๋๋๊ทธ/ํด๋ฆญ ํด์ → onMouseUp ์ด๋ฒคํธ ํธ์ถ โท ์ ํํ ์์ญ์ ๋ํ Selection ๊ฐ์ฒด ํ๋const selection =..
[React] ๋ฆฌ์กํธ ๋์์ฑ ๋ ๋๋ง(Concurrent) ํบ์๋ณด๊ธฐ
[React] ๋ฆฌ์กํธ ๋์์ฑ ๋ ๋๋ง(Concurrent) ํบ์๋ณด๊ธฐ
2024.05.20์ฌ์ฉ์๊ฐ ์ฌ์ฉํ๋ UI๋ ์ฌ๋ฌ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ํผ ์
๋ ฅ ํ๋๋ ์ํธ ์์ฉ์ ์ฆ๊ฐ์ ์ผ๋ก ์๋ตํ์ง๋ง, ๋ง์ ์์ ํํฐ๋ง ๋ชฉ๋ก ๊ฐ์ ๋ถ๋ถ์ ์๋ตํ๋๋ฐ ์ค๋ ์๊ฐ์ด ์์๋ ์ ์๋ค. React๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๊ธฐ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ ๋๋งํ๋๋ฐ, UI์ ๋๋ฆฐ ์์
(ํํฐ๋ง ๋ชฉ๋ก ๋ฑ)์ด ๋ค๋ฅธ ๋น ๋ฅธ ์์
(์
๋ ฅ ํผ ๋ฑ)์ ์ฐจ๋จํ์ฌ ์๋ต์ด ๋๋ ค์ง๋ ํ์์ด ๋ฐ์ํ๋ค. ๐ก Render-blocking: Concurrent ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์์ ๋ React๋ ์ปดํฌ๋ํธ๋ฅผ ๋๊ธฐ์ ์ผ๋ก ๋ ๋๋ง ํ๋ฉฐ, ๋ ๋๋ง์ ์์ํ๋ฉด ์์ธ๊ฐ ์๋ ์ด์ ๋ ๋๋ง์ ์ค๋จํ ์ ์๋ค. ์ฆ, ๋ ๋๋ง์ด ๋๋์ผ๋ง ๋ค๋ฅธ ์์
์ ์ํํ ์ ์๋ค. React 18 ๋ฒ์ ์ ๊ณต๊ฐํ Concurrent ๊ธฐ๋ฅ์ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ๋ฐ๋๋ค. Concu..
[Express] req.query vs req.params
[Express] req.query vs req.params
2024.05.19Path Parameter : /books/888 (888 ๋ถ๋ถ์ด ํ๋ผ๋ฏธํฐ)Query Parameter : /search?sort=price (sort=price ๋ถ๋ถ์ด ์ฟผ๋ฆฌ) ์ฟผ๋ฆฌ ์คํธ๋ง(Query String)์ /search?sort=price ์ฃผ์์์ ? ๋ฌผ์ํ ์ดํ์ ๋์ค๋ ์ ์ฒด ๋ฌธ์์ด์ ์๋ฏธํ๊ณ , ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ(Query Parameter)๋ ์ฟผ๋ฆฌ ์คํธ๋ง ๋ด์ key=value ์์ ์๋ฏธํ๋ค. req.params// ์์ฒญ URL : /books/888router.get('/books/:id', (req, res, next) => { console.log(req.params); // { id: '888' }}); req.query// URL-encoded ๋ฐ์ดํฐ ํ์ฑ์ ์ฃผ๋ก ํผ ๋ฐ์ดํฐ๋ฅผ ์ ์ถํ ..
[JS] ํจ์ํ / ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ฎ์ ๊ผด
[JS] ํจ์ํ / ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ฎ์ ๊ผด
2024.05.19์ปค๋งํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ์์ฃผ ์ฌ์ฉํ๋ ์ปค๋ง ํจ์๋ n๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋ ๋์ n๊ฐ์ ํจ์๋ฅผ ๋ง๋ค์ด์ ํ๋์ ์ธ์๋ง ๋ฐ๋๋ก ๋ง๋๋ ํจํด์ด๋ค. ์ปค๋ง์ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ํจ์๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค๊ณ , ์ฌ์ฌ์ฉํ ์ ์๋ ํจ์๋ก ๋ถ๋ฆฌํ ์ ์๋ค. ๋ํ, ์ง์ฐ ํ๊ฐ(ํ์ํ ๋๊น์ง ๊ณ์ฐ/ํ๊ฐ๋ฅผ ๋ฏธ๋ฃจ๋ ์ ๋ต)๋ฅผ ํตํด ์ ์ฐํ ์์
์ ์ํํ ์ ์๋ค.// ์ผ๋ฐ ํจ์const adder = (x, y) => x + y;adder(100, 50); // 150// ์ปค๋ง ํจ์const adder = (x) => (y) => x + y;const add100 = adder(100);add100(50); // 150 ๊ฐ์ฒด ์งํฅ / ์ผ๋ฐ ํจ์ / ํจ์ํ ๋น๊ต๐ก ๊ฐ์ฒด ์งํฅ / ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์์์ ์ธ ์ปจํ
์คํธ ๊ฐ๋๋ค...
[TS] TypeScript ํ์
์คํฌ๋ฆฝํธ Infer ํค์๋ ํ์ฉํ๊ธฐ
[TS] TypeScript ํ์ ์คํฌ๋ฆฝํธ Infer ํค์๋ ํ์ฉํ๊ธฐ
2024.05.19ํ์
์คํฌ๋ฆฝํธ infer๋ ํ์
์ ์ถ๋ก ํ๋๋ฐ ์ฌ์ฉํ๋ ํค์๋๋ค. ๋ฐฐ์ด ์์ ํ์
, ํจ์ ํ๋ผ๋ฏธํฐ ํ์
, ํจ์ ๋ฐํ ํ์
๋ฑ ํน์ ๋ฌธ๋งฅ์ ํ์
์ถ์ถ์ด ํ์ํ ๋ infer๋ฅผ ํ์ฉํ ์ ์๋ค.๊ธฐ๋ณธ ๋ฌธ๋ฒ : T extends infer U ? U : T — U๊ฐ ์ถ๋ก ๊ฐ๋ฅํ ํ์
์ด๋ฉด U ๋ฆฌํด, ์๋๋ฉด T ๋ฆฌํด infer๋ ํ์
๊ตฌํ ์์ญ(ํ ๋น ์ฐ์ฐ์ ์ฐ์ธก)์ ์กฐ๊ฑด๋ถ ํ์
(extends ์ )์์๋ง ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, TS ์์ง์ด ํ์
์ ์ถ๋ก ํ๊ณ ๋ณ์(์ ๋ค๋ฆญ ํ์
)์ ํ ๋นํ๋ค. ํ ๋น๋ ๋ณ์๋ ์กฐ๊ฑด๋ถ ํ์
์ true ๋ถ๊ธฐ์์๋ง ์ฌ์ฉํ ์ ์๋ค.// Error! 'infer' declarations are only permitted in the 'extends' clause of a conditional type.(t..
[JS] JavaScript ์๋ฐ์คํฌ๋ฆฝํธ Map ๋ ์ ์ฌ์ฉํ๊ธฐ
[JS] JavaScript ์๋ฐ์คํฌ๋ฆฝํธ Map ๋ ์ ์ฌ์ฉํ๊ธฐ
2024.05.19Map์ key, value๋ก ์ด๋ฃจ์ด์ง ์์๊ฐ ์๋ ์ปฌ๋ ์
์ด๋ค. ์ฝ์
์์๋ฅผ ๊ธฐ์ตํ๋ฉฐ key/value ์ถ๊ฐ/์ ๊ฑฐ๊ฐ ๋น๋ฒํ ๋ ๊ฐ์ฒด๋ณด๋ค ๋ ์ข์ ์ฑ๋ฅ์ ๊ฐ์ง๋ค MDN - Map ํ์ด์ง๋ฅผ ๋ณด๋ฉด ์๋์ ๊ฐ์ด ์ ํ์๋ค.Map: ํค-๊ฐ ์์ ๋น๋ฒํ ์ถ๊ฐ ๋ฐ ์ ๊ฑฐ์ ๊ด๋ จ๋ ์ํฉ์์๋ ์ฑ๋ฅ์ด ์ข ๋ ์ข์ต๋๋ค.Object: ํค-๊ฐ ์์ ๋น๋ฒํ ์ถ๊ฐ ๋ฐ ์ ๊ฑฐ์ ์ต์ ํ๋์ง ์์์ต๋๋ค. ์ค์ ๋ก ๋๋ค ์ซ์ 10,000๊ฐ๋ก ๊ตฌ์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐ/์ญ์ ํ ๋ Map์ 901 ops/s, ๊ฐ์ฒด๋ 183 ops/s๋ก ์ธก์ ๋๋ค. ์ฆ, 1์ด ๋์ Map์ 901๋ฒ์ ์์
์ ์ฒ๋ฆฌํ๊ณ , ๊ฐ์ฒด๋ 183๋ฒ์ ์์
์ ์ฒ๋ฆฌํ๋ค. Map์ด ์ผ๋ฐ ๊ฐ์ฒด๋ณด๋ค ๊ฑฐ์ 4~5๋ฐฐ ๊ฐ๋ ๋น ๋ฅด๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋ฌผ๋ก ์ด ๋ฒค์น๋งํฌ๋ฅผ 100% ์ ๋ขฐํ ์ ์์ง๋ง key..
[CS] ๋๊ธฐ / ๋น๋๊ธฐ, ๋ธ๋กํน / ๋
ผ๋ธ๋กํน
[CS] ๋๊ธฐ / ๋น๋๊ธฐ, ๋ธ๋กํน / ๋ ผ๋ธ๋กํน
2024.05.18A ํจ์(ํธ์ถ์)๊ฐ B ํจ์(ํผํธ์ถ์)๋ฅผ ํธ์ถํ๋ ์ํฉ์ด๋ผ๊ณ ๊ฐ์ โถ ๋๊ธฐ/๋น๋๊ธฐ: ํธ์ถ์(A)๊ฐ ํผํธ์ถ์(B)์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋์ง ์ฌ๋ถ๋๊ธฐ: ํผํธ์ถ์์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ ๋ค์ ์์
์ํ → ํธ์ถ์/ํผํธ์ถ์ ์์ฐจ์ ์ํA๋ B ์์
์ด ๋๋ ๋๊น์ง ๋ค๋ฅธ ์์
์ ์ํํ์ง ์๊ณ B์ ๋ฐํ๊ฐ์ ๊ธฐ๋ค๋ฆผ ๋น๋๊ธฐ: ํผํธ์ถ์์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์์
์ํ → ํธ์ถ์/ํผํธ์ถ์ ๋์ ์ํB๊ฐ ์์
์ ์๋ฃํ๋ฉด ์ฝ๋ฐฑ ํจ์ ํธ์ถ (ํน์ ํ๋ก๋ฏธ์ค ํ์ฉ) โท ๋ธ๋กํน/๋
ผ๋ธ๋กํน: ํธ์ถ์(A)๊ฐ ํผํธ์ถ์(B)์๊ฒ ์ ์ด๊ถ ์ ๋ฌ ์ฌ๋ถ๋ธ๋กํน: ํผํธ์ถ์์๊ฒ ์ ์ด๊ถ ์ ๋ฌ → ํผํธ์ถ์๊ฐ ์์
์ ์๋ฃํ ๋๊น์ง ๋๊ธฐA๊ฐ B๋ฅผ ํธ์ถํ์ฌ ์ ์ด๊ถ ์ ๋ฌ ํ, B์ ์์
์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆผ ๋
ผ๋ธ๋กํน: ํผํธ์ถ์์๊ฒ ์ ์ด๊ถ ์ ๋ฌ ์ํจ → ํธ์ถ์๋ ..
[JS] ์ ๊ท์์ ๊ทธ๋ฃนํ(Grouping) / ์บก์ฒํ(Capturing) ํ์ฉํ๊ธฐ
[JS] ์ ๊ท์์ ๊ทธ๋ฃนํ(Grouping) / ์บก์ฒํ(Capturing) ํ์ฉํ๊ธฐ
2024.05.18๊ทธ๋ฃนํ / ์บก์ฒํ๊ทธ๋ฃนํ Grouping์ ๊ท์์์ ๊ทธ๋ฃนํ๋ ํน์ ๋ฌธ์๋ค์ ๋จ์ผ ํํ์(Single Entity)์ผ๋ก ๊ตฌ๋ถํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ๊ทธ๋ฃนํ๋ ๋ณดํต ์บก์ฒ๋ง๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฏ๋ก ์ด ๋์ ํจ๊ป ์์๋๋ ๊ฒ์ด ์ข๋ค. ์๋ ์์์์ ์ฌ์ฉํ + ์๋์๋ 1๋ฒ ์ด์ ๋ฐ๋ณตํ๋ ๋ฌธ์์ด์ ์ฐพ๋๋ค. ๋ฐ๋ผ์ ab(b 1๋ฒ ์ผ์น), abb(b 2๋ฒ ์ผ์น) ๋ฑ์ ๋ชจ๋ ์ผ์นํ๋ค๊ณ ํ๋จํ๋ค.const str = 'aabbbababaabb';str.match(/ab+/g); // ['abbb', 'ab', 'ab', 'abb'] ํน์ ๋ฌธ์ ๊ทธ๋ฃน์ ๋ฐ๋ณต ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ค๋ฉด ์๊ดํธ()๋ฅผ ์ฌ์ฉํด ๊ทธ๋ฃนํํ๋ฉด ๋๋ค. ๊ทธ๋ฃนํํ๋ฉด ๊ดํธ ์ ๋ฌธ์๋ฅผ ํ๋์ ๋จ์ผ ํํ์์ผ๋ก ์ ์ํ๋ค. ์๋ ์์์์ (ab)๋ก ๋ฌถ์์ผ๋ฏ๋ก ab๊ฐ 1๋ฒ ์ด์ ๋ฐ๋ณต๋๋ ..
[React] ๋์์ ํจ๊ณผ Algebraic Effect
[React] ๋์์ ํจ๊ณผ Algebraic Effect
2024.05.18TL;DR์ ์๋ถ์ ํจ๊ณผ๋ฅผ ์ถ์ํํ๋ ๋ฐฉ์ ์ค ํ๋๋ถ์ ํจ๊ณผ๋ฅผ ๋ฐ์์ํค๋ ์ฐ์ฐ(Effect)๊ณผ ๊ทธ ์ฐ์ฐ์ ์ฒ๋ฆฌํ๋ ํธ๋ค๋ฌ(Effect Handler)๋ก ๊ตฌ์ฑ์ฝ๋ ๊ด๋ฆฌ ๋ฐฉ์์ฝ๋ ์กฐ๊ฐ์ ๊ฐ์ธ๋ ๋งฅ๋ฝ(context)์ผ๋ก ์ฑ
์ ๋ถ๋ฆฌํน์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์๊ฒ ์ญํ ์์React์์ ๋์์ ํจ๊ณผ — Suspense, ErrorBoundary๋ก๋ฉ UI, ์๋ฌ ํ์ ์ญํ ์ ํน์ ์ปดํฌ๋ํธ๋ก ๊ฐ์ธ๋ ํํ๋ก ๋ถ๋ฆฌ์์ ์ปดํฌ๋ํธ์์ ๋ฐ์ํ ๋ถ์ ํจ๊ณผ๋ฅผ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์บ์นํ๊ณ ์ฒ๋ฆฌ๋์์ ํจ๊ณผ์ ์ฅ์ ์์ํ์ง ์์ ๋์์ ๋ํ ์ฑ
์ ๋ถ๋ฆฌ์ ์ธ์ (declarative) ์ฝ๋ ์์ฑ ๊ฐ๋ฅWhat๊ณผ How๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ฝ๋ ๊ฐ๋
์ฑ๊ณผ ์ ์ง๋ณด์์ฑ ํฅ์ ๋์์ ํจ๊ณผ๋?๋์์ ํจ๊ณผ๋ ๋ถ์ ํจ๊ณผ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ์ ์ค ํ๋๋ก, ๋ถ์ ํจ๊ณผ๋ฅผ ..
[Git] 1Password์ ์ ์ฅํ SSH ํค๋ก Git ์ปค๋ฐ ์๋ช
ํ๊ธฐ
[Git] 1Password์ ์ ์ฅํ SSH ํค๋ก Git ์ปค๋ฐ ์๋ช ํ๊ธฐ
2024.05.18Git 2.34 ์ดํ ๋ฒ์ ๋ถํฐ SSH ํค๋ฅผ ์ด์ฉํ ์ปค๋ฐ / ํ๊ทธ ์๋ช
์ ์ง์ํ๋ค. 1Password SSH ํตํฉ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด GPG ํค ์์ด 1Password ์ฑ์์ Git ์ปค๋ฐ ์๋ช
์ ์๋์ผ๋ก ๊ตฌ์ฑํ ์๋ ์๋ค. ์ปค๋ฐ์ ์๋ช
ํ๋ฉด GitHub ๊ณ์ ์ ์ฐ๊ฒฐ๋ SSH ๊ณต๊ฐํค๋ก ์ค์ ์ฌ์ฉ์๊ฐ ๋ณ๊ฒฝํ ๋ด์ฉ์ธ์ง ๊ฒ์ฆ ํ ์ ์๋ค. ๊ทธ๋ผ ๋ค๋ฅธ ์ฌ๋์ ์๋ช
ํ์ง ์์ ์ปค๋ฐ์ ๋ฐฉ์งํ ์ ์๋ค.GPG(Gnu Privacy Guard)๋ GNU ํ๋ก์ ํธ์์ ๊ฐ๋ฐํ ์คํ์์ค ์ํธํ ์ํํธ์จ์ด๋ค. ๊ณต๊ฐํค ์ํธํ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉฐ, ์ํธํ, ์๋ช
, ์ธ์ฆ ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์๊ตฌ ์ฌํญ1Password ๋ฒ์ 8์ด์์ ๋ฐ์คํฌํฑ ์ฑGit 2.34 ํน์ ์ดํ ๋ฒ์ 1Password SSH Agent ํ์ฑ (์ฐธ๊ณ ํฌ์คํ
)1Pas..