3์›” ํ–‰์‚ฌ๋ฅผ ์œ„ํ•ด ์ค€๋น„์ค‘์ด๋‹ค. 2025-03-12๊นŒ์ง€ ๋ฐ๋ชจ๋ฅผ ์™„์„ฑํ•ด์•ผํ•œ๋‹ค.

์ง€๋‚œ ์ฃผ ๋ถ€ํ„ฐ ๋งž๋‹คAI๊ฐ€์˜ ์›น ํŽ˜์ด์ง€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰์ค‘์ด๋‹ค. ๊ธฐ์กด์˜ ํ”„๋กœ์ ํŠธ์— Linktree ๊ฐ™์€ ๋งํฌ ๋ชจ์Œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋Š” ์ž‘์„ฑํ•œ markdown์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™์œผ๋กœ ์ •์  ์›น ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค. ์—ฌ๊ธฐ์— YAML ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค. ์ •ํ•ด์ง„ ํ˜•์‹์˜ YAMLํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ด๋ฅผ markdown ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋‚ด๊ฐ€ ๋งก์€ ๊ธฐ๋Šฅ์ด๋‹ค. ์ด๋ฅผ ์‹œ์˜๋‹˜๊ณผ ๊ฐ™์ด ์ง„ํ–‰ํ•œ๋‹ค. ์‹œ์˜๋‹˜์€ link ํŽ˜์ด์ง€๋ฅผ ์œ„ํ•œ css๋ฅผ ์œ„์ฃผ๋กœ ๋‹ด๋‹น, ๋‚˜๋Š” YAML ํŒŒ์ผ์„ Markdown ์•ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” .NET ์ฝ˜์†” ์•ฑ ๊ฐœ๋ฐœ์„ ๋‹ด๋‹นํ•œ๋‹ค.

.NET ๊ฐœ๋ฐœ์€ ๊ฒฝํ—˜ํ•œ ์  ์—†๋‹ค. C#๋„ ์ œ๋Œ€๋กœ ๋ฐฐ์šด ์  ์—†๋‹ค;; Justin๋‹˜์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ์–ด๊นจ๋„ˆ๋จธ๋กœ ๋ฐฐ์šด ๊ฒƒ์ด ์ „๋ถ€์ด์ง€๋งŒ.. ๋ง‰์ƒ ํ•ด๋ณด๋‹ˆ ๋ณ„ ๊ฒƒ ์•„๋‹ˆ์—ˆ๋‹ค. ์ด๋”ฐ๊ธˆ ์ฒ˜์Œ ๋ณด๋Š” ๋ฌธ๋ฒ•์ด ๋‚˜์˜ค์ง€๋งŒ GPT์—๊ฒŒ ๋ฌผ์–ด๋ณด๋ฉด ๊ทธ๋งŒ์ด๋‹ค.

YAML ํŒŒ์ผ์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๋Š” JSON ๋ฌธ์„œ ์ž‘์„ฑ ๋ถ€ํ„ฐ ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ์—ฅ JSON? ๊ทธ๋ƒฅ ์ž‘์„ฑํ•˜๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹˜? ใ…‡ใ…‡ ์•„๋‹˜.. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ๋งŽ์•˜๋‹ค. ๊ผญ ๊ตฌ์กฐ๊ฐ€ ์ด๋ž˜์•ผ๋งŒ ํ•˜๋Š”์ง€, ๋” ํšจ์œจ์ ์ธ ๊ตฌ์กฐ๋Š” ์—†์„์ง€, ๊ตณ์ด ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋  ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต์œผ๋กœ ๋“ค์–ด๊ฐ€์ง€๋Š” ์•Š์•˜๋Š”์ง€.. JSON์œผ๋กœ YAML์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ฒ˜์Œ์ด๋‹ค ๋ณด๋‹ˆ ์„ค์ • ๋ฐฉ๋ฒ•๋„ ์ƒ์†Œํ–ˆ๊ธฐ์— ๋” ์–ด๋ ค์›€์„ ๋А๊ผˆ๋‹ค. ๋ฌดํ•œ PR๊ณผ ๋ฌดํ•œ review ๋์— ๊ฐ„์‹ ํžˆ merge ๋˜์—ˆ๋‹ค.

๊ทธ ๋‹ค์Œ์€ IConverterService.cs๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘์œผ๋กœ ์ œ๋Œ€๋กœ ๊ณต๋ถ€ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์ง€ํ–ฅ์ด ์ต์ˆ™ํ•˜์ง€ ์•Š์•˜๋‹ค. ๊ฐ„๋‹จํ•œ ์•ฑ์ธ๋ฐ ๊ตณ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•˜๋‚˜? ์‹ถ์–ด ์งˆ๋ฌธ์„ ํ–ˆ๋‹ค. ๋ฏธ๋ฆฌ ๋ฐ‘๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์€ ๋ฌผ๋ก ์ด๊ณ  ํ…Œ์ŠคํŠธ์— ์šฉ์ดํ•˜๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŠน๋ณ„ํ•œ ์ฃผ์„(?)๋„ ๋ฐฐ์› ๋‹ค.

/// <summary>
 
/// Loads data from a specified file and deserializes it into an object.
 
/// </summary>
 
/// <param name="filepath">the path of data source</param>
 
/// <returns>Returnss <see cref="LinkCollection"/> instance.></returns>
 
Task<LinkCollection> LoadAsync(string filepath);

์ด๋Ÿฐ์‹์œผ๋กœ HTML๋งˆ๋ƒฅ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ์„์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ์—๋„ @param ์ฒ˜๋Ÿผ ์ฃผ์„์„ ๋‹ฌ๊ณ ๋Š” ํ–ˆ์—ˆ๋‹ค. ๋‹น์—ฐํžˆ C#์„ ๋น„๋กฏํ•œ ๋‹ค๋ฅธ ์–ธ์–ด์—๋„ ์žˆ์„ ๋งŒ ํ•˜์ง€๋งŒ.. ์™œ ์ƒ๊ฐ์„ ๋ชปํ–ˆ์„๊นŒ?

Justin๋‹˜์˜ ๋ฆฌ๋ทฐ๋ฅผ ๋ณด๋ฉฐ ์˜๋ฌธ ์ฃผ์„ ์ž‘์„ฑ ์Šคํƒ€์ผ๋„ ์กฐ๊ธˆ ๋ฐฐ์šด ๊ฒƒ ๊ฐ™๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚ด๊ฐ€ returns LinkCollection that represents... ๋ผ๊ณ  ์žฅํ™ฉํ•˜๊ฒŒ ์„ค๋ช…ํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์œ„์˜ ์ฝ”๋“œ ์ฒ˜๋Ÿผ Returns LinkCollection instance ๋ผ๊ณ  ๊ฐ„๊ฒฐํ•˜๊ณ  ์ •ํ™•ํ•œ ์˜๋ฏธ ์ „๋‹ฌ์ด ๋  ์ˆ˜ ์žˆ๊ฒŒ ๊ณ ์ณ์ฃผ์…จ๋‹ค.

์ˆ˜ ๋ฒˆ์˜ PR๊ณผ review ๋์— merge๋˜๊ณ , ํ˜„์žฌ ConverterService ๊ตฌํ˜„์ค‘์ด๋‹ค. ์‚ฌ์‹ค Service ์ž์ฒด๋Š” YamlDotNet ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ์ด๋ฏธ ๊ตฌํ˜„ํ–ˆ๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ์ค‘์ด๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์ž์ฒด๊ฐ€ ์ฒ˜์Œ์ด๋‹ˆ ๋ญ˜ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ๊ฐ๋„ ์•ˆ์™”๋‹ค. ์ด๊ฑธ ๋ญ ๋กœ๊ทธ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”์ง€.. ๊ทธ๋Ÿผ ๊ธฐ์กด Service ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š”๊ฑด์ง€.. ๊ทธ๋Ÿผ test ํ”„๋กœ์ ํŠธ๋Š” ๋ญ˜ ํ•˜๋Š”๊ฑด์ง€..

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