Ver3.0 ๐ C# ์คํ์์ค ๊ธฐ์ฌ์ .NET ์ํ๊ณ ์ฐธ์ฌ๋ก ๊ฐ๋ฐ์ ์ปค๋ฆฌ์ด ์ฑ์ฅ์ํค๊ธฐ

๐ C# ์คํ์์ค ๊ธฐ์ฌ์ .NET ์ํ๊ณ ์ฐธ์ฌ๋ก ๊ฐ๋ฐ์ ์ปค๋ฆฌ์ด ์ฑ์ฅ์ํค๊ธฐ
์ค์ ๊ฒฝํ์ผ๋ก ๋ฐฐ์ฐ๋ ์คํ์์ค ๊ธฐ์ฌ ์๋ฒฝ ๊ฐ์ด๋
๐ก ํน์ ์ด๋ฐ ๊ณ ๋ฏผ ํด๋ณธ ์ ์์ด? "๋๋ ์คํ์์ค์ ๊ธฐ์ฌํ๊ณ ์ถ์๋ฐ ์ด๋์๋ถํฐ ์์ํด์ผ ํ ์ง ๋ชจ๋ฅด๊ฒ ์ด..." ๋๋ "๋ด ์ค๋ ฅ์ผ๋ก ์คํ์์ค์ ๊ธฐ์ฌํ ์ ์์๊น?" ๊ฑฑ์ ๋ง! ์ค๋์ C# ๊ฐ๋ฐ์๋ผ๋ฉด ๋๊ตฌ๋ ์ฐธ์ฌํ ์ ์๋ ์คํ์์ค ๊ธฐ์ฌ ๋ฐฉ๋ฒ๊ณผ .NET ์ํ๊ณ์์ ์ฑ์ฅํ๋ ์ค์ ๋
ธํ์ฐ๋ฅผ ์น๊ตฌ์ฒ๋ผ ํธํ๊ฒ ์๋ ค์ค๊ฒ. ๐
์คํ์์ค ๊ธฐ์ฌ๋ ๋จ์ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ ์ด์์ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ด. ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค๊ณผ ํ์
ํ๋ฉฐ ์ค๋ ฅ์ ํค์ฐ๊ณ , ํฌํธํด๋ฆฌ์ค๋ฅผ ๊ฐํํ๋ฉฐ, ๋๋ก๋ ์ทจ์
์ด๋ ์ด์ง์ ๊ฒฐ์ ์ ์ธ ๊ธฐํ๊ฐ ๋๊ธฐ๋ ํ์ง. ์ค์ ๋ก ๋ง์ ๊ธฐ์
๋ค์ด ์คํ์์ค ๊ธฐ์ฌ ๊ฒฝํ์ ๋์ด ํ๊ฐํ๊ณ ์๊ฑฐ๋ !
๐ ์ ์คํ์์ค ๊ธฐ์ฌ๊ฐ ์ค์ํ ๊น?
์คํ์์ค ๊ธฐ์ฌ๋ ๊ฐ๋ฐ์๋ก์ ์ฑ์ฅํ๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ ์ค ํ๋์ผ. ๋จ์ํ "์ข์ ์ผ"์ ํ๋ ๊ฒ ์๋๋ผ, ์ค์ง์ ์ธ ์ปค๋ฆฌ์ด ์ฑ์ฅ๊ณผ ์ง๊ฒฐ๋๋ ํ๋์ด๊ฑฐ๋ . ๐ฏ
๐ ์คํ์์ค ๊ธฐ์ฌ๊ฐ ๊ฐ์ ธ๋ค์ฃผ๋ ์ค์ง์ ์ด์
1. ์ค์ ์ฝ๋ ๋ฆฌ๋ทฐ ๊ฒฝํ ๐ผ
ํ์ฌ์์๋ ๊ฒฝํํ๊ธฐ ์ด๋ ค์ด ์์ค ๋์ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ ์ ์์ด. Microsoft์ .NET ํ ๊ฐ์ ์ธ๊ณ ์ต๊ณ ์์ค์ ๊ฐ๋ฐ์๋ค์ด ์ง์ ๋ด ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํด์ฃผ๋ ๊ฒฝํ์ ์ ๋ง ๊ฐ์ง ๋ฐฐ์์ด์ผ. ๊ทธ๋ค์ ํผ๋๋ฐฑ์ ํตํด ์ฝ๋ฉ ์คํ์ผ, ์ฑ๋ฅ ์ต์ ํ, ์ํคํ
์ฒ ์ค๊ณ ๋ฑ์ ๋ฐฐ์ธ ์ ์์ง.
2. ๊ธ๋ก๋ฒ ๋คํธ์ํน ๐
์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค๊ณผ ํ์
ํ๋ฉด์ ์์ฐ์ค๋ฝ๊ฒ ๋คํธ์ํฌ๊ฐ ํ์ฑ๋ผ. ์ด๋ฐ ์ธ๋งฅ์ ๋์ค์ ์ทจ์
์ด๋ ํ๋ก์ ํธ ํ์
๊ธฐํ๋ก ์ด์ด์ง ์ ์์ด. ์ค์ ๋ก ์คํ์์ค ์ปค๋ฎค๋ํฐ์์ ๋ง๋ ์ธ์ฐ์ผ๋ก ํด์ธ ์ทจ์
์ ์ฑ๊ณตํ ์ฌ๋ก๋ ๋ง์!
3. ํฌํธํด๋ฆฌ์ค ๊ฐํ ๐
GitHub ํ๋กํ์ ์ ๋ช
์คํ์์ค ํ๋ก์ ํธ ๊ธฐ์ฌ ์ด๋ ฅ์ด ์์ด๋ฉด, ์ด๋ ฅ์๋ณด๋ค ๊ฐ๋ ฅํ ์ฆ๋ช
์ด ๋ผ. ํนํ .NET Foundation ํ๋ก์ ํธ๋ ASP.NET Core ๊ฐ์ ๋ฉ์ด์ ํ๋ก์ ํธ ๊ธฐ์ฌ ๊ฒฝํ์ ๋ฉด์ ์์ ํฐ ํ๋ฌ์ค ์์ธ์ด์ผ.
4. ์ต์ ๊ธฐ์ ํธ๋ ๋ ์ต๋ ๐ฅ
์คํ์์ค ํ๋ก์ ํธ๋ ํญ์ ์ต์ ๊ธฐ์ ์ ๋จผ์ ๋์
ํด. C# 12์ ์๋ก์ด ๊ธฐ๋ฅ์ด๋ .NET 8์ ์ฑ๋ฅ ๊ฐ์ ์ฌํญ์ ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํ๋ฉด์ ๋ฐฐ์ธ ์ ์์ง. ์ฑ
์ด๋ ๊ฐ์๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ฒ ์ค์ ๊ฒฝํ์ ์์ ์ ์์ด!
๐ฏ ์คํ์์ค ๊ธฐ์ฌ, ์ด๋์๋ถํฐ ์์ํ ๊น?
"์ข์, ์คํ์์ค ๊ธฐ์ฌ๊ฐ ์ค์ํ ๊ฑด ์๊ฒ ๋๋ฐ... ๋๋์ฒด ์ด๋์๋ถํฐ ์์ํด์ผ ํด?" ์ด๋ฐ ๊ณ ๋ฏผ, ์ ๋ง ๋ง์ด ํ์ง? ๊ฑฑ์ ๋ง! ๋จ๊ณ๋ณ๋ก ์ฐจ๊ทผ์ฐจ๊ทผ ์๋ ค์ค๊ฒ. ๐
1๋จ๊ณ: ์์ ์ ์์ค ํ์ ํ๊ธฐ ๐
๋จผ์ ์์งํ๊ฒ ์์ ์ ์ค๋ ฅ์ ํ๊ฐํด๋ณด์. ์ด๊ฑด ๋ถ๋๋ฌ์ด ๊ฒ ์๋๋ผ ํจ์จ์ ์ธ ์์์ ์ํ ํ์ ๊ณผ์ ์ด์ผ!
์ด๊ธ ๊ฐ๋ฐ์ (C# ๊ธฐ์ด ๋ฌธ๋ฒ ์ดํด)
- ๋ฌธ์ ๋ฒ์ญ์ด๋ ์คํ ์์ ๋ถํฐ ์์
- ๊ฐ๋จํ ๋ฒ๊ทธ ๋ฆฌํฌํธ ์์ฑ
- ์ฝ๋ ์ฃผ์ ๊ฐ์
- README ํ์ผ ๊ฐ์
์ค๊ธ ๊ฐ๋ฐ์ (์ค๋ฌด ๊ฒฝํ 1-3๋
)
- 'good first issue' ํ๊ทธ๊ฐ ๋ฌ๋ฆฐ ์ด์ ํด๊ฒฐ
- ๋จ์ ํ
์คํธ ์ถ๊ฐ
- ์์ ๋ฒ๊ทธ ์์
- ๊ธฐ์กด ๊ธฐ๋ฅ ๋ฆฌํฉํ ๋ง
๊ณ ๊ธ ๊ฐ๋ฐ์ (์ค๋ฌด ๊ฒฝํ 3๋
์ด์)
- ์๋ก์ด ๊ธฐ๋ฅ ๊ตฌํ
- ์ฑ๋ฅ ์ต์ ํ
- ์ํคํ
์ฒ ๊ฐ์ ์ ์
- ๋ณต์กํ ๋ฒ๊ทธ ํด๊ฒฐ
2๋จ๊ณ: ํ๋ก์ ํธ ์ ํํ๊ธฐ ๐
C#๊ณผ .NET ์ํ๊ณ์๋ ์ ๋ง ๋ค์ํ ์คํ์์ค ํ๋ก์ ํธ๊ฐ ์์ด. ์์ ์ ๊ด์ฌ์ฌ์ ์์ค์ ๋ง๋ ํ๋ก์ ํธ๋ฅผ ์ ํํ๋ ๊ฒ ์ค์ํด!
์ถ์ฒ ํ๋ก์ ํธ ๋ฆฌ์คํธ:
๐ .NET Core / ASP.NET Core
GitHub: dotnet/runtime, dotnet/aspnetcore
๋์ด๋: ์ค์๊ธ
Microsoft๊ฐ ์ง์ ๊ด๋ฆฌํ๋ ํ๋ก์ ํธ๋ก, ์ฝ๋ ํ์ง์ด ๋งค์ฐ ๋์. ์ฒ์์ ๋ฌธ์ ๊ฐ์ ์ด๋ ์ํ ์ฝ๋ ์ถ๊ฐ๋ก ์์ํ๋ ๊ฑธ ์ถ์ฒํด.
๐จ Avalonia UI
GitHub: AvaloniaUI/Avalonia
๋์ด๋: ์ค๊ธ
ํฌ๋ก์ค ํ๋ซํผ UI ํ๋ ์์ํฌ์ผ. WPF ๊ฒฝํ์ด ์๋ค๋ฉด ์ฝ๊ฒ ์ ๊ทผํ ์ ์์ด. UI ๊ด๋ จ ๋ฒ๊ทธ๋ ์ปจํธ๋กค ๊ฐ์ ์ ๊ธฐ์ฌํ ์ ์์ง.
๐ง Dapper
GitHub: DapperLib/Dapper
๋์ด๋: ์ค๊ธ
๊ฐ๋ฒผ์ด ORM ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ฝ๋๋ฒ ์ด์ค๊ฐ ์๋์ ์ผ๋ก ์์์ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ํ์
ํ๊ธฐ ์ข์. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ๊ธฐ๋ฅ ๊ฐ์ ์ ์ฐธ์ฌํ ์ ์์ด.
๐ BenchmarkDotNet
GitHub: dotnet/BenchmarkDotNet
๋์ด๋: ์ค์๊ธ
.NET ์ฑ๋ฅ ๋ฒค์น๋งํน ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ผ. ์ฑ๋ฅ ์ธก์ ๊ณผ ์ต์ ํ์ ๊ด์ฌ ์๋ค๋ฉด ์ ๋ง ์ข์ ํ๋ก์ ํธ์ง.
๐งช xUnit / NUnit
GitHub: xunit/xunit, nunit/nunit
๋์ด๋: ์ค๊ธ
ํ
์คํ
ํ๋ ์์ํฌ๋ก, ํ
์คํธ ์ฝ๋ ์์ฑ ๊ฒฝํ์ ์๊ธฐ ์ข์. ์๋ก์ด assertion ๋ฉ์๋ ์ถ๊ฐ๋ ๋ฒ๊ทธ ์์ ์ผ๋ก ์์ํ ์ ์์ด.
3๋จ๊ณ: ํ๋ก์ ํธ ์ดํดํ๊ธฐ ๐
ํ๋ก์ ํธ๋ฅผ ์ ํํ๋ค๋ฉด, ๋ฐ๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ๋ณด๋ค๋ ๋จผ์ ํ๋ก์ ํธ๋ฅผ ์ถฉ๋ถํ ์ดํดํ๋ ์๊ฐ์ ๊ฐ์ ธ์ผ ํด.
ํ๋ก์ ํธ ๋ถ์ ์ฒดํฌ๋ฆฌ์คํธ:
โ
README.md ์ ๋
ํ๊ธฐ
- ํ๋ก์ ํธ์ ๋ชฉ์ ๊ณผ ์ฃผ์ ๊ธฐ๋ฅ ํ์
- ์ค์น ๋ฐ ์คํ ๋ฐฉ๋ฒ ํ์ธ
- ๊ธฐ์ฌ ๊ฐ์ด๋๋ผ์ธ ์์ง
โ
CONTRIBUTING.md ํ์ธํ๊ธฐ
- ์ฝ๋ ์คํ์ผ ๊ฐ์ด๋
- PR ์ ์ถ ํ๋ก์ธ์ค
- ์ปค๋ฐ ๋ฉ์์ง ๊ท์น
- ํ
์คํธ ์๊ตฌ์ฌํญ
โ
์ด์ ํธ๋์ปค ๋๋ฌ๋ณด๊ธฐ
- 'good first issue', 'help wanted' ํ๊ทธ ์ฐพ๊ธฐ
- ๋ค๋ฅธ ๊ธฐ์ฌ์๋ค์ PR ์ดํด๋ณด๊ธฐ
- ์ฝ๋ ๋ฆฌ๋ทฐ ํจํด ํ์
ํ๊ธฐ
โ
๋ก์ปฌ ํ๊ฒฝ์์ ๋น๋ํ๊ธฐ
- ํ๋ก์ ํธ ํด๋ก ๋ฐ ๋น๋
- ํ
์คํธ ์คํํด๋ณด๊ธฐ
- ๋๋ฒ๊น
ํ๊ฒฝ ์ค์
๐ป ์ค์ ! ์ฒซ ๋ฒ์งธ PR ๋ง๋ค๊ธฐ
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ฒซ ๋ฒ์งธ Pull Request๋ฅผ ๋ง๋ค์ด๋ณผ ์๊ฐ์ด์ผ! ์ค์ ์์๋ฅผ ๋ค์ด์ ๋จ๊ณ๋ณ๋ก ์ค๋ช ํด์ค๊ฒ. ๐
Step 1: ์ด์ ์ ํ ๋ฐ ํ ๋น๋ฐ๊ธฐ
๋จผ์ GitHub์์ 'good first issue' ํ๊ทธ๊ฐ ๋ฌ๋ฆฐ ์ด์๋ฅผ ์ฐพ์๋ณด์. ์๋ฅผ ๋ค์ด, Dapper ํ๋ก์ ํธ์์ "Add XML documentation for SqlMapper class" ๊ฐ์ ์ด์๋ฅผ ๋ฐ๊ฒฌํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ด์ ์ ํ ํ:
โ
์ด์ ์ค๋ช
์ด ๋ช
ํํ๊ฐ?
โ
์ต๊ทผ์ ์์ฑ๋ ์ด์์ธ๊ฐ? (6๊ฐ์ ์ด๋ด)
โ
์ด๋ฏธ ๋ค๋ฅธ ์ฌ๋์ด ์์
์ค์ด์ง ์์๊ฐ?
โ
๋ด ์ค๋ ฅ์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅํ๊ฐ?
์ด์๋ฅผ ์ ํํ๋ค๋ฉด, ๋๊ธ๋ก "I'd like to work on this issue. Could you assign it to me?"๋ผ๊ณ ์์ฑํด์ ํ ๋น์ ์์ฒญํด. ๋๋ถ๋ถ์ ํ๋ก์ ํธ๋ ์น์ ํ๊ฒ ํ ๋นํด์ค ๊ฑฐ์ผ!
Step 2: ์ ์ฅ์ Fork ๋ฐ Clone
# GitHub์์ Fork ๋ฒํผ ํด๋ฆญ ํ
# ๋ด ๊ณ์ ์ Fork๋ ์ ์ฅ์๋ฅผ ๋ก์ปฌ๋ก ํด๋ก
git clone https://github.com/your-username/Dapper.git
cd Dapper
# ์๋ณธ ์ ์ฅ์๋ฅผ upstream์ผ๋ก ์ถ๊ฐ
git remote add upstream https://github.com/DapperLib/Dapper.git
# ์ต์ ์ํ ํ์ธ
git fetch upstream
git checkout main
git merge upstream/main
Step 3: ๋ธ๋์น ์์ฑ ๋ฐ ์์
# ์๋ฏธ ์๋ ์ด๋ฆ์ผ๋ก ๋ธ๋์น ์์ฑ
git checkout -b add-xml-docs-sqlmapper
# ์ด์ ์ฝ๋ ์์ฑ!
# Visual Studio๋ VS Code์์ SqlMapper.cs ํ์ผ ์ด๊ธฐ
์ค์ ์ฝ๋ ์์ - XML ๋ฌธ์ ์ฃผ์ ์ถ๊ฐ:
/// <summary>
/// Executes a query and returns the result as a dynamic object.
/// </summary>
/// <param name="cnn">The database connection.</param>
/// <param name="sql">The SQL query to execute.</param>
/// <param name="param">The parameters to use in the query.</param>
/// <param name="transaction">The transaction to use, if any.</param>
/// <param name="commandTimeout">The command timeout in seconds.</param>
/// <param name="commandType">The type of command to execute.</param>
/// <returns>A dynamic object containing the query results.</returns>
/// <example>
/// <code>
/// var result = connection.Query("SELECT * FROM Users WHERE Id = @Id", new { Id = 1 });
/// </code>
/// </example>
public static IEnumerable<dynamic> Query(
this IDbConnection cnn,
string sql,
object param = null,
IDbTransaction transaction = null,
int? commandTimeout = null,
CommandType? commandType = null)
{
// ๊ธฐ์กด ์ฝ๋...
}
Step 4: ํ ์คํธ ์์ฑ ๋ฐ ์คํ
์ฝ๋๋ฅผ ์์ฑํ๋ค๋ฉด ๋ฐ๋์ ํ
์คํธ๋ฅผ ์คํํด์ผ ํด! ๋๋ถ๋ถ์ ํ๋ก์ ํธ๋ ๊ธฐ์ฌ ๊ฐ์ด๋๋ผ์ธ์ ํ
์คํธ ์๊ตฌ์ฌํญ์ ๋ช
์ํ๊ณ ์์ด.
ํ
์คํธ ์ฒดํฌ๋ฆฌ์คํธ:
โ
๊ธฐ์กด ํ
์คํธ๊ฐ ๋ชจ๋ ํต๊ณผํ๋๊ฐ?
โ
์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ ํ
์คํธ๋ฅผ ์ถ๊ฐํ๋๊ฐ?
โ
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ๊ฐ์ํ์ง ์์๋๊ฐ?
โ
๋น๋ ๊ฒฝ๊ณ ๊ฐ ์๋๊ฐ?
# ํ๋ก์ ํธ ๋น๋
dotnet build
# ํ
์คํธ ์คํ
dotnet test
# ํน์ ํ
์คํธ๋ง ์คํ
dotnet test --filter "FullyQualifiedName~SqlMapperTests"
Step 5: ์ปค๋ฐ ๋ฐ ํธ์
์ปค๋ฐ ๋ฉ์์ง๋ ํ๋ก์ ํธ์ ์ปจ๋ฒค์ ์ ๋ฐ๋ผ์ผ ํด. ๋๋ถ๋ถ์ .NET ํ๋ก์ ํธ๋ ๋ค์๊ณผ ๊ฐ์ ํ์์ ์ฌ์ฉํด:
# ๋ณ๊ฒฝ์ฌํญ ์คํ
์ด์ง
git add .
# ์๋ฏธ ์๋ ์ปค๋ฐ ๋ฉ์์ง ์์ฑ
git commit -m "docs: Add XML documentation for SqlMapper.Query method
- Added comprehensive XML documentation
- Included parameter descriptions
- Added usage example
- Fixes #1234"
# ์๊ฒฉ ์ ์ฅ์์ ํธ์
git push origin add-xml-docs-sqlmapper
- ๋ณธ๋ฌธ์ 72์๋ง๋ค ์ค๋ฐ๊ฟ
- ๋ฌด์์(What) ๋ณ๊ฒฝํ๋์ง, ์(Why) ๋ณ๊ฒฝํ๋์ง ๋ช ํํ ์์ฑ
- ๊ด๋ จ ์ด์ ๋ฒํธ ํฌํจ (Fixes #123, Closes #456)
- Conventional Commits ํ์ ์ฌ์ฉ (feat:, fix:, docs:, refactor: ๋ฑ)
Step 6: Pull Request ์์ฑ
GitHub์์ ๋ด Fork๋ ์ ์ฅ์๋ก ๊ฐ๋ฉด "Compare & pull request" ๋ฒํผ์ด ๋ณด์ผ ๊ฑฐ์ผ. ํด๋ฆญํด์ PR์ ์์ฑํ์!
PR ์ค๋ช
์์ฑ ์์:
Description:
This PR adds comprehensive XML documentation for the SqlMapper.Query method to improve IntelliSense support and developer experience.
Changes:
- Added XML documentation comments with parameter descriptions
- Included usage example in the documentation
- Ensured consistency with existing documentation style
Testing:
- All existing tests pass
- Verified XML documentation appears correctly in Visual Studio IntelliSense
- Checked generated API documentation
Related Issue:
Fixes #1234
Checklist:
- [x] Code follows project style guidelines
- [x] All tests pass
- [x] Documentation has been updated
- [x] No breaking changes introduced
- ๋ถํ์ํ ํ์ผ์ด๋ ๋๋ฒ๊ทธ ์ฝ๋ ์ ๊ฑฐ
- ์ปค๋ฐ ํ์คํ ๋ฆฌ ์ ๋ฆฌ (ํ์์ squash)
- PR ํ ํ๋ฆฟ์ ๋ชจ๋ ํญ๋ชฉ ์์ฑ
- ๊ด๋ จ ์ด์์ ์ฐ๊ฒฐ
๐จ ์ฝ๋ ๋ฆฌ๋ทฐ ๋ฐ๊ณ ๋์ํ๊ธฐ
PR์ ์ ์ถํ๋ค๊ณ ๋์ด ์๋์ผ! ์ด์ ๊ฐ์ฅ ์ค์ํ ๋จ๊ณ์ธ ์ฝ๋ ๋ฆฌ๋ทฐ๊ฐ ์์๋ผ. ์ฝ๋ ๋ฆฌ๋ทฐ๋ ๋ฐฐ์์ ๊ธฐํ์ด์, ํ๋ก์ ํธ ๋ฉ์ธํ ์ด๋์ ์ํตํ๋ ๊ณผ์ ์ด์ผ. ๐
์ฝ๋ ๋ฆฌ๋ทฐ ํผ๋๋ฐฑ ์ ํ๊ณผ ๋์ ๋ฐฉ๋ฒ
1. ์ฝ๋ ์คํ์ผ ๊ด๋ จ ํผ๋๋ฐฑ ๐จ
์์ ํผ๋๋ฐฑ:
"Could you please use var instead of explicit type declaration here? It's our project convention."
์ข์ ๋์:
"Thanks for pointing that out! I've updated the code to use var. I'll make sure to follow the style guide more carefully in future contributions."
ํ: ํ๋ก์ ํธ์ .editorconfig ํ์ผ์ ํ์ธํ๊ณ , ์ฝ๋ ํฌ๋งคํฐ๋ฅผ ์ค์ ํ๋ฉด ์ด๋ฐ ํผ๋๋ฐฑ์ ์ฌ์ ์ ๋ฐฉ์งํ ์ ์์ด.
2. ์ฑ๋ฅ ๊ด๋ จ ํผ๋๋ฐฑ โก
์์ ํผ๋๋ฐฑ:
"This LINQ query might cause performance issues with large datasets. Consider using a for loop instead."
์ข์ ๋์:
"Good catch! I've refactored the code to use a for loop. I also ran benchmarks and the new version is 30% faster. Here are the results: [benchmark ๊ฒฐ๊ณผ ๋งํฌ]"
ํ: BenchmarkDotNet์ ์ฌ์ฉํด์ ์ฑ๋ฅ ๊ฐ์ ์ ์์น๋ก ์ฆ๋ช
ํ๋ฉด ๋ ์ค๋๋ ฅ ์์ด!
3. ์ํคํ
์ฒ ๊ด๋ จ ํผ๋๋ฐฑ ๐๏ธ
์์ ํผ๋๋ฐฑ:
"This approach breaks the single responsibility principle. Could you extract this logic into a separate method?"
์ข์ ๋์:
"You're absolutely right. I've refactored the code to separate concerns. The validation logic is now in ValidateInput() and the processing logic is in ProcessData(). Does this look better?"
ํ: ๋์์ธ ํจํด๊ณผ SOLID ์์น์ ๊ณต๋ถํ๋ฉด ์ด๋ฐ ํผ๋๋ฐฑ์ ์ดํดํ๊ณ ๋์ํ๊ธฐ ์ฌ์์ ธ.
ํผ๋๋ฐฑ ๋ฐ์ ๋ฐ ์ฌํธ์
# ํผ๋๋ฐฑ์ ๋ฐ์ํ ์ฝ๋ ์์ ํ
# ๋ณ๊ฒฝ์ฌํญ ์ปค๋ฐ
git add .
git commit -m "refactor: Apply code review feedback
- Changed explicit types to var
- Extracted validation logic to separate method
- Improved performance by using for loop instead of LINQ"
# ๊ฐ์ ๋ธ๋์น์ ํธ์ (PR์ด ์๋์ผ๋ก ์
๋ฐ์ดํธ๋จ)
git push origin add-xml-docs-sqlmapper
- ํผ๋๋ฐฑ์ ๋ฐ์ผ๋ฉด 24-48์๊ฐ ๋ด์ ์๋ต
- ๋ฐ๋ก ์์ ์ด ์ด๋ ค์ฐ๋ฉด ์ธ์ ๊น์ง ๋ฐ์ํ ์ง ์๋ ค์ฃผ๊ธฐ
2. ๊ฐ์ฌ ํํํ๊ธฐ
- ๋ชจ๋ ํผ๋๋ฐฑ์ ๊ฐ์ฌ ์ธ์ฌํ๊ธฐ
- ๋ฐฐ์ด ์ ์ ์ธ๊ธํ๋ฉด ๋ ์ข์
3. ์ง๋ฌธํ๊ธฐ๋ฅผ ๋๋ ค์ํ์ง ์๊ธฐ
- ์ดํด๊ฐ ์ ๋๋ฉด ์ ์คํ๊ฒ ์ง๋ฌธํ๊ธฐ
- "Could you elaborate on...?" ๊ฐ์ ํํ ์ฌ์ฉ
4. ๋ฐฉ์ด์ ์ด์ง ์๊ธฐ
- ํผ๋๋ฐฑ์ ๊ฐ์ธ์ ์ธ ๊ณต๊ฒฉ์ผ๋ก ๋ฐ์๋ค์ด์ง ์๊ธฐ
- ๋ ๋์ ์ฝ๋๋ฅผ ์ํ ํ์ ๊ณผ์ ์ผ๋ก ์ดํดํ๊ธฐ
5. ์ถ๊ฐ ๊ฐ์ ์ ์ํ๊ธฐ
- ๊ด๋ จ๋ ๋ค๋ฅธ ๊ฐ์ ์ฌํญ์ ๋ฐ๊ฒฌํ๋ฉด ์ ์ํ๊ธฐ
- ๋จ, ํ์ฌ PR์ ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์๋๋ก ์ฃผ์
PR์ด ๋จธ์ง๋๋ฉด?
์ถํํด! ๐ ๋๋์ด ๋ด ์ฝ๋๊ฐ ์คํ์์ค ํ๋ก์ ํธ์ ๋จธ์ง๋์ด! ์ด์ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ๋ด๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ ๊ฑฐ์ผ. ์ ๋ง ๋ฟ๋ฏํ ์๊ฐ์ด์ง?
๋จธ์ง ํ ํ ์ผ:
โ
๋ก์ปฌ ์ ์ฅ์ ์ ๋ฆฌ
์์
ํ ๋ธ๋์น๋ฅผ ์ญ์ ํ๊ณ main ๋ธ๋์น๋ฅผ ์ต์ ์ํ๋ก ์
๋ฐ์ดํธํด.
โ
ํฌํธํด๋ฆฌ์ค์ ์ถ๊ฐ
GitHub ํ๋กํ, ์ด๋ ฅ์, LinkedIn์ ๊ธฐ์ฌ ๋ด์ญ์ ์ถ๊ฐํด. ํนํ ์ ๋ช
ํ๋ก์ ํธ๋ผ๋ฉด ๋์ฑ ๊ฐ์กฐํ์!
โ
๋ค์ ์ด์ ์ฐพ๊ธฐ
์ฒซ ๋ฒ์งธ ๊ธฐ์ฌ๊ฐ ์ฑ๊ณตํ๋ค๋ฉด, ์ด์ ๋ ๋์ ์ ์ธ ์ด์๋ฅผ ์ฐพ์๋ณด์. ์ ์ง์ ์ผ๋ก ๋์ด๋๋ฅผ ๋์ฌ๊ฐ๋ ๊ฒ ์ข์.
โ
์ปค๋ฎค๋ํฐ ์ฐธ์ฌ
ํ๋ก์ ํธ์ Discord๋ Slack ์ฑ๋์ ์ฐธ์ฌํด์ ๋ค๋ฅธ ๊ธฐ์ฌ์๋ค๊ณผ ์ํตํด๋ณด์.
# ๋ก์ปฌ ์ ์ฅ์ ์ ๋ฆฌ
git checkout main
git pull upstream main
git branch -d add-xml-docs-sqlmapper
# ์๊ฒฉ ๋ธ๋์น๋ ์ญ์
git push origin --delete add-xml-docs-sqlmapper
๐ .NET ์ํ๊ณ ๊น์ด ํ๊ณ ๋ค๊ธฐ
์คํ์์ค ๊ธฐ์ฌ๋ฅผ ๋์ด์, .NET ์ํ๊ณ์ ๋ ๊น์ด ์ฐธ์ฌํ๋ ๋ฐฉ๋ฒ๋ค์ ์์๋ณด์. ๋จ์ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ ์ด์์ ํ๋๋ค์ด ์์ด! ๐
1. .NET Foundation ์ฐธ์ฌํ๊ธฐ
.NET Foundation์ .NET ์คํ์์ค ์ํ๊ณ๋ฅผ ์ง์ํ๋ ๋
๋ฆฝ์ ์ธ ๋น์๋ฆฌ ์กฐ์ง์ด์ผ. ์ฌ๊ธฐ์ ์ฐธ์ฌํ๋ฉด ๋ ํฐ ์ํฅ๋ ฅ์ ๋ฐํํ ์ ์์ด!
์ฐธ์ฌ ๋ฐฉ๋ฒ:
๐ ๋ฉค๋ฒ์ญ ์ ์ฒญ
- .NET ์คํ์์ค์ ๊ธฐ์ฌํ ์ด๋ ฅ์ด ์๋ค๋ฉด ๋๊ตฌ๋ ์ ์ฒญ ๊ฐ๋ฅ
- ์ฐ๊ฐ ํ๋น๋ ๋ฌด๋ฃ (๊ฐ์ธ ๋ฉค๋ฒ์ญ)
- ํฌํ๊ถ์ ๊ฐ์ง๊ณ ์ฌ๋จ ์ด์์ ์ฐธ์ฌํ ์ ์์ด
๐ฏ ํ๋ก์ ํธ ์ ์
- ์์ ์ ์คํ์์ค ํ๋ก์ ํธ๋ฅผ .NET Foundation ํ๋ก์ ํธ๋ก ์ ์
- ์น์ธ๋๋ฉด ์ฌ๋จ์ ๋ฒ์ , ์ฌ์ ์ ์ง์์ ๋ฐ์ ์ ์์ด
- ํ๋ก์ ํธ ์ธ์ง๋์ ์ ๋ขฐ๋๊ฐ ํฌ๊ฒ ํฅ์๋ผ
๐ค ์ํน ๊ทธ๋ฃน ์ฐธ์ฌ
- Outreach Working Group: ์ปค๋ฎค๋ํฐ ํ๋ ์ง์
- Marketing Working Group: .NET ํ๋ณด ํ๋
- Membership Working Group: ๋ฉค๋ฒ์ญ ๊ด๋ฆฌ
์ค์ ํํ:
- Microsoft MVP ์ ์ ์ ์ ๋ฆฌ
- ๊ธ๋ก๋ฒ .NET ์ปค๋ฎค๋ํฐ์ ๋คํธ์ํน
- ์ปจํผ๋ฐ์ค ๋ฐํ ๊ธฐํ
- ์คํ์์ค ํ๋ก์ ํธ ์ด์ ๋
ธํ์ฐ ์ต๋
2. ๊ธฐ์ ๋ธ๋ก๊ทธ ๋ฐ ์ปจํ ์ธ ์ ์
์ฝ๋ ๊ธฐ์ฌ๋ง์ด ์คํ์์ค ์ฐธ์ฌ ๋ฐฉ๋ฒ์ ์๋์ผ! ์ง์์ ๊ณต์ ํ๋ ๊ฒ๋ ์์ฒญ๋๊ฒ ๊ฐ์น ์๋ ๊ธฐ์ฌ์ผ. ์ค์ ๋ก ๋ง์ ๊ฐ๋ฐ์๋ค์ด ๋ธ๋ก๊ทธ ๊ธ์ด๋ ํํ ๋ฆฌ์ผ์ ํตํด ์ปค๋ฎค๋ํฐ์ ๊ธฐ์ฌํ๊ณ ์์ด.
์ปจํ
์ธ ์ ์ ์์ด๋์ด:
๐ ํํ ๋ฆฌ์ผ ์์ฑ
- "ASP.NET Core๋ก RESTful API ๋ง๋ค๊ธฐ"
- "Entity Framework Core ์ฑ๋ฅ ์ต์ ํ ๊ฐ์ด๋"
- "Blazor๋ก ์ค์๊ฐ ์ฑํ
์ฑ ๋ง๋ค๊ธฐ"
๐ฅ ๋์์ ๊ฐ์
- YouTube์ C# ๊ธฐ์ด ๊ฐ์ ์๋ฆฌ์ฆ
- Twitch์์ ๋ผ์ด๋ธ ์ฝ๋ฉ ์คํธ๋ฆฌ๋ฐ
- ์คํ์์ค ํ๋ก์ ํธ ์ฝ๋ ๋ฆฌ๋ทฐ ์์
๐ ์คํ์์ค ๋ฌธ์ ๋ฒ์ญ
- Microsoft Docs ํ๊ตญ์ด ๋ฒ์ญ
- ์ ๋ช
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฌธ์ ํ๊ธํ
- ํํ ๋ฆฌ์ผ ํ์งํ
๐ก ์ํ ํ๋ก์ ํธ ์ ์
- ์ค์ ์์ ์ฝ๋ ์์ฑ
- ๋ฒ ์คํธ ํ๋ํฐ์ค ์์ฐ
- ์ํฐํจํด ์ค๋ช
๋ฐ ๊ฐ์ ๋ฐฉ๋ฒ
3. ์ปจํผ๋ฐ์ค ๋ฐ ๋ฐ์ ์ฐธ์ฌ
์คํ๋ผ์ธ(๋๋ ์จ๋ผ์ธ) ์ปค๋ฎค๋ํฐ ํ๋๋ .NET ์ํ๊ณ ์ฐธ์ฌ์ ์ค์ํ ๋ถ๋ถ์ด์ผ!
์ฃผ์ .NET ์ปจํผ๋ฐ์ค:
๐ ๊ธ๋ก๋ฒ ์ด๋ฒคํธ
- .NET Conf: Microsoft๊ฐ ์ฃผ์ตํ๋ ์ฐ๋ก ์จ๋ผ์ธ ์ปจํผ๋ฐ์ค (๋ฌด๋ฃ!)
- NDC (Nexon Developers Conference): ํ๊ตญ ์ต๋ ๊ฒ์ ๊ฐ๋ฐ ์ปจํผ๋ฐ์ค
- Microsoft Build: Microsoft์ ๋ํ ๊ฐ๋ฐ์ ์ปจํผ๋ฐ์ค
๐ฐ๐ท ๊ตญ๋ด ์ปค๋ฎค๋ํฐ
- ํ๊ตญ ๋ท๋ท ๊ฐ๋ฐ์ ๊ทธ๋ฃน: ์ ๊ธฐ ๋ฐ์
๋ฐ ์คํฐ๋
- Seoul.NET Meetup: ์๊ฐ ๊ธฐ์ ์ธ๋ฏธ๋
- C# Korea: ์จ๋ผ์ธ ์ปค๋ฎค๋ํฐ ๋ฐ Q&A
์ฐธ์ฌ ๋ฐฉ๋ฒ:
โ
์ฒญ์ค์ผ๋ก ์ฐธ์ฌํด์ ๋คํธ์ํน
โ
๋ผ์ดํธ๋ ํ ํฌ ๋ฐํ (5-10๋ถ ์งง์ ๋ฐํ)
โ
์ ๊ท ์ธ์
๋ฐํ ์ ์
โ
์์๋ด์ฌ์๋ก ์ฐธ์ฌ
โ
์คํฐ์ ๋ถ์ค ๋ฐฉ๋ฌธ ๋ฐ ์ฑ์ฉ ์ ๋ณด ์์ง
4. Microsoft MVP ๋๊ธฐ
Microsoft MVP(Most Valuable Professional)๋ Microsoft ๊ธฐ์ ์ปค๋ฎค๋ํฐ์ ํ์ํ ๊ธฐ์ฌ๋ฅผ ํ ๊ฐ๋ฐ์์๊ฒ ์์ฌ๋๋ ์์๋ก์ด ํ์ดํ์ด์ผ. ์ ์ธ๊ณ์ ์ผ๋ก ์ฝ 3,000๋ช
์ ๋๋ง ์ ์ ๋๋ ๋งค์ฐ ๊ถ์ ์๋ ํ๋ก๊ทธ๋จ์ด์ง.
MVP๊ฐ ๋๋ฉด ์ป๋ ํํ:
๐ ์ค์ง์ ํํ
- Visual Studio Enterprise ๋ผ์ด์ ์ค (์ฐ $5,999 ์๋น)
- Azure ํฌ๋ ๋ง ์ $150
- Microsoft 365 ๊ตฌ๋
- LinkedIn Learning ๋ฌด๋ฃ ์ด์ฉ
- Pluralsight ๊ตฌ๋
๐ ๋ช
์์ ๊ธฐํ
- Microsoft ๋ณธ์ฌ MVP Summit ์ด๋
- ์ ํํ๊ณผ ์ง์ ์ํต ๊ธฐํ
- ๋ฒ ํ ์ ํ ์กฐ๊ธฐ ์ ๊ทผ
- ์ปจํผ๋ฐ์ค ๋ฐํ ์ฐ์ ๊ถ
- ๊ธ๋ก๋ฒ ๋คํธ์ํน
MVP ์ ์ ๊ธฐ์ค:
โ
์ง์์ ์ธ ์ปค๋ฎค๋ํฐ ๊ธฐ์ฌ (์ต์ 1๋
)
โ
๊ธฐ์ ๋ธ๋ก๊ทธ ์ด์ ๋๋ ์ปจํ
์ธ ์ ์
โ
์คํ์์ค ํ๋ก์ ํธ ๊ธฐ์ฌ
โ
์ปจํผ๋ฐ์ค ๋ฐํ ๋๋ ๋ฐ์
์ด์
โ
์จ๋ผ์ธ ์ปค๋ฎค๋ํฐ ํ๋ (Stack Overflow, GitHub ๋ฑ)
โ
๊ธฐ์ ์์ ์งํ ๋๋ ๋ฒ์ญ
์ ์ฒญ ๋ฐฉ๋ฒ:
1. MVP ํ๋ก๊ทธ๋จ ์น์ฌ์ดํธ์์ ์ ์ฒญ
2. ์ง๋ 12๊ฐ์๊ฐ์ ๊ธฐ์ฌ ํ๋ ์ ๋ฆฌ
3. ์ถ์ฒ์ธ 2๋ช
ํ๋ณด (๊ธฐ์กด MVP ๋๋ Microsoft ์ง์)
4. ์ฌ์ฌ ํ ์ ์ (๋ณดํต 3-6๊ฐ์ ์์)
๐ ์ค์ ํ๋ก์ ํธ: ๋๋ง์ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ง๋ค๊ธฐ
๊ธฐ์กด ํ๋ก์ ํธ์ ๊ธฐ์ฌํ๋ ๊ฒ๋ ์ข์ง๋ง, ์ง์ ์คํ์์ค ํ๋ก์ ํธ๋ฅผ ์์ํ๋ ๊ฒ๋ ์์ฒญ๋ ๋ฐฐ์์ ๊ธฐํ์ผ! ์ค์ ๋ก ๋ง์ ์ ๋ช ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ๊ฐ์ธ ํ๋ก์ ํธ๋ก ์์ํ์ด. ๐
ํ๋ก์ ํธ ์์ด๋์ด ์ฐพ๊ธฐ
์ข์ ์คํ์์ค ํ๋ก์ ํธ์ ์กฐ๊ฑด:
โ
์ค์ ๋ฌธ์ ํด๊ฒฐ
- ๋ด๊ฐ ์ค๋ฌด์์ ๊ฒช์ ๋ถํธํจ ํด๊ฒฐ
- ๋ฐ๋ณต์ ์ผ๋ก ์์ฑํ๋ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋ ์๋ํ
- ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ถ์กฑํ ๊ธฐ๋ฅ ๋ณด์
โ
๋ช
ํํ ๋ฒ์
- ๋๋ฌด ํฌ์ง ์๊ณ ๊ด๋ฆฌ ๊ฐ๋ฅํ ํฌ๊ธฐ
- ๋จ์ผ ์ฑ
์ ์์น ์ค์
- ๋ช
ํํ API ์ค๊ณ
โ
์ฐจ๋ณํ ์์
- ๊ธฐ์กด ์๋ฃจ์
๋ณด๋ค ๋ ๋์ ์ ์ด ์์ด์ผ ํจ
- ์ฑ๋ฅ, ์ฌ์ฉ์ฑ, ๊ธฐ๋ฅ ์ค ํ๋ ์ด์์์ ์ฐ์
ํ๋ก์ ํธ ์์ด๋์ด ์์:
1. FluentValidator.Extensions
- FluentValidation์ ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ ํ์ฅ ๋ฉ์๋ ๋ชจ์
- ํ๊ตญ ํนํ ๊ฒ์ฆ ๊ท์น (์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ, ์ฌ์
์๋ฑ๋ก๋ฒํธ ๋ฑ)
2. MinimalAPI.Swagger.Generator
- Minimal API๋ฅผ ์ํ ์๋ Swagger ๋ฌธ์ ์์ฑ๊ธฐ
- ์ดํธ๋ฆฌ๋ทฐํธ ๊ธฐ๋ฐ ๋ฌธ์ํ
3. EFCore.BulkExtensions.Optimized
- Entity Framework Core ๋๋ ์์
์ต์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ธ ๋ฐฐ์น ์ฒ๋ฆฌ
4. Blazor.LocalStorage.Typed
- Blazor์ฉ ํ์
์์ ํ LocalStorage ๋ํผ
- ์๋ ์ง๋ ฌํ/์ญ์ง๋ ฌํ
ํ๋ก์ ํธ ๊ตฌ์กฐ ์ค์
MyAwesomeLibrary/
โโโ src/
โ โโโ MyAwesomeLibrary/
โ โโโ MyAwesomeLibrary.csproj
โ โโโ Extensions/
โ โโโ Services/
โ โโโ Models/
โโโ tests/
โ โโโ MyAwesomeLibrary.Tests/
โ โโโ MyAwesomeLibrary.Tests.csproj
โ โโโ UnitTests/
โโโ samples/
โ โโโ MyAwesomeLibrary.Sample/
โ โโโ Program.cs
โโโ docs/
โ โโโ getting-started.md
โ โโโ api-reference.md
โโโ .github/
โ โโโ workflows/
โ โ โโโ ci.yml
โ โ โโโ release.yml
โ โโโ ISSUE_TEMPLATE/
โ โโโ PULL_REQUEST_TEMPLATE.md
โโโ .editorconfig
โโโ .gitignore
โโโ LICENSE
โโโ README.md
โโโ CONTRIBUTING.md
โโโ CHANGELOG.md
ํ์ ํ์ผ ์์ฑํ๊ธฐ
1. README.md - ํ๋ก์ ํธ์ ์ผ๊ตด
# MyAwesomeLibrary
[](https://www.nuget.org/packages/MyAwesomeLibrary/)
[](https://github.com/yourusername/MyAwesomeLibrary/actions)
[](LICENSE)
A simple and powerful library for doing awesome things in .NET!
## โจ Features
- ๐ High performance
- ๐ก Easy to use
- ๐ง Highly configurable
- ๐ฆ Zero dependencies
## ๐ฆ Installation
```bash
dotnet add package MyAwesomeLibrary
```
## ๐ Quick Start
```csharp
using MyAwesomeLibrary;
var service = new AwesomeService();
var result = await service.DoSomethingAwesomeAsync();
```
## ๐ Documentation
For detailed documentation, visit [our wiki](https://github.com/yourusername/MyAwesomeLibrary/wiki).
## ๐ค Contributing
Contributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md).
## ๐ License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
2. CONTRIBUTING.md - ๊ธฐ์ฌ ๊ฐ์ด๋
# Contributing to MyAwesomeLibrary
Thank you for your interest in contributing! ๐
## Getting Started
1. Fork the repository
2. Clone your fork: `git clone https://github.com/yourusername/MyAwesomeLibrary.git`
3. Create a branch: `git checkout -b feature/my-feature`
4. Make your changes
5. Run tests: `dotnet test`
6. Commit: `git commit -m "feat: add awesome feature"`
7. Push: `git push origin feature/my-feature`
8. Create a Pull Request
## Code Style
- Follow C# coding conventions
- Use meaningful variable names
- Add XML documentation for public APIs
- Write unit tests for new features
## Commit Message Format
We follow [Conventional Commits](https://www.conventionalcommits.org/):
- `feat:` New feature
- `fix:` Bug fix
- `docs:` Documentation changes
- `refactor:` Code refactoring
- `test:` Test additions or changes
- `chore:` Build process or auxiliary tool changes
## Questions?
Feel free to open an issue or reach out to the maintainers!
NuGet ํจํค์ง ๋ฐฐํฌํ๊ธฐ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์๋ค๋ฉด NuGet์ ๋ฐฐํฌํด์ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํ์!
1. .csproj ํ์ผ ์ค์
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<!-- ํจํค์ง ๋ฉํ๋ฐ์ดํฐ -->
<PackageId>MyAwesomeLibrary</PackageId>
<Version>1.0.0</Version>
<Authors>Your Name</Authors>
<Company>Your Company</Company>
<Description>A simple and powerful library for doing awesome things</Description>
<PackageTags>csharp;dotnet;library;awesome</PackageTags>
<PackageProjectUrl>https://github.com/yourusername/MyAwesomeLibrary</PackageProjectUrl>
<RepositoryUrl>https://github.com/yourusername/MyAwesomeLibrary</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageReadmeFile>README.md</PackageReadmeFile>
<PackageIcon>icon.png</PackageIcon>
</PropertyGroup>
<ItemGroup>
<None Include="..\..\README.md" Pack="true" PackagePath="\" />
<None Include="..\..\icon.png" Pack="true" PackagePath="\" />
</ItemGroup>
</Project>
2. NuGet ํจํค์ง ๋น๋ ๋ฐ ๋ฐฐํฌ
# ํจํค์ง ๋น๋
dotnet pack -c Release
# NuGet.org์ ๋ฐฐํฌ (API ํค ํ์)
dotnet nuget push bin/Release/MyAwesomeLibrary.1.0.0.nupkg \
--api-key YOUR_API_KEY \
--source https://api.nuget.org/v3/index.json
# ๋๋ GitHub Packages์ ๋ฐฐํฌ
dotnet nuget push bin/Release/MyAwesomeLibrary.1.0.0.nupkg \
--api-key YOUR_GITHUB_TOKEN \
--source https://nuget.pkg.github.com/yourusername/index.json
GitHub Actions๋ก CI/CD ์๋ํ
.github/workflows/ci.yml
name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore --configuration Release
- name: Test
run: dotnet test --no-build --configuration Release --verbosity normal
- name: Pack
run: dotnet pack --no-build --configuration Release --output ./artifacts
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: nuget-packages
path: ./artifacts/*.nupkg
.github/workflows/release.yml
name: Release
on:
release:
types: [published]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: 8.0.x
- name: Build and Pack
run: |
dotnet restore
dotnet build --configuration Release
dotnet pack --configuration Release --output ./artifacts
- name: Push to NuGet
run: |
dotnet nuget push ./artifacts/*.nupkg \
--api-key ${{ secrets.NUGET_API_KEY }} \
--source https://api.nuget.org/v3/index.json \
--skip-duplicate
๐ช ์ค๋ ฅ ํฅ์์ ์ํ ์ถ๊ฐ ํ
1. ์ฝ๋ ๋ฆฌ๋ทฐ ์คํฌ ํฅ์์ํค๊ธฐ
์คํ์์ค์ ๊ธฐ์ฌํ๋ค ๋ณด๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํ๊ฒ ๋ผ. ์ข์ ์ฝ๋ ๋ฆฌ๋ทฐ์ด๊ฐ ๋๋ ๊ฒ๋ ์ค์ํ ์คํฌ์ด์ผ!
ํจ๊ณผ์ ์ธ ์ฝ๋ ๋ฆฌ๋ทฐ ๋ฐฉ๋ฒ:
โ
๊ธ์ ์ ์ธ ํผ๋๋ฐฑ๋ถํฐ ์์
"This is a great approach! I especially like how you handled error cases."
โ
๊ตฌ์ฒด์ ์ธ ์ ์ ์ ๊ณต
โ "This code is inefficient."
โ
"Consider using StringBuilder here for better performance when concatenating strings in a loop."
โ
์ง๋ฌธ ํ์์ผ๋ก ์ ์
"Have you considered using async/await here? It might improve responsiveness."
โ
์ฝ๋ ์์ ์ ๊ณต
๋จ์ํ ๋ฌธ์ ๋ฅผ ์ง์ ํ๋ ๊ฒ ์๋๋ผ, ๊ฐ์ ๋ ์ฝ๋ ์์๋ฅผ ๋ณด์ฌ์ฃผ๋ฉด ๋ ๋์์ด ๋ผ.
โ
์ฐ์ ์์ ํ์
- [nit]: ์ฌ์ํ ์คํ์ผ ๋ฌธ์
- [suggestion]: ์ ํ์ ๊ฐ์ ์ฌํญ
- [important]: ๋ฐ๋์ ์์ ํ์
- [blocking]: ๋จธ์ง ์ ํ์ ์์
2. ์ฑ๋ฅ ์ต์ ํ ๋ง์คํฐํ๊ธฐ
.NET ์ํ๊ณ์์ ์ฑ๋ฅ์ ํญ์ ์ค์ํ ์ฃผ์ ์ผ. BenchmarkDotNet์ ํ์ฉํด์ ์ฑ๋ฅ์ ์ธก์ ํ๊ณ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์!
BenchmarkDotNet ์ฌ์ฉ ์์:
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
[MemoryDiagnoser]
[SimpleJob(warmupCount: 3, iterationCount: 5)]
public class StringConcatenationBenchmark
{
private const int Iterations = 1000;
[Benchmark(Baseline = true)]
public string UsingStringConcatenation()
{
string result = "";
for (int i = 0; i < Iterations; i++)
{
result += i.ToString();
}
return result;
}
[Benchmark]
public string UsingStringBuilder()
{
var sb = new StringBuilder();
for (int i = 0; i < Iterations; i++)
{
sb.Append(i);
}
return sb.ToString();
}
[Benchmark]
public string UsingStringCreate()
{
return string.Create(Iterations * 4, Iterations, (span, iterations) =>
{
int pos = 0;
for (int i = 0; i < iterations; i++)
{
i.TryFormat(span.Slice(pos), out int written);
pos += written;
}
});
}
}
class Program
{
static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<StringConcatenationBenchmark>();
}
}
โ LINQ ๋์ for ๋ฃจํ ์ฌ์ฉ (์ฑ๋ฅ์ด ์ค์ํ ๊ฒฝ์ฐ)
โ async/await ์ค๋ฒํค๋ ๊ณ ๋ ค
โ ๋ฌธ์์ด ์ฐ์ฐ ์ต์ ํ (StringBuilder, string.Create)
โ ์ปฌ๋ ์ ์ด๊ธฐ ์ฉ๋ ์ค์
โ ๊ฐ์ฒด ํ๋ง ํ์ฉ
โ ValueTask ์ฌ์ฉ ๊ณ ๋ ค
3. ๋์์ธ ํจํด ์ค์ ์ ์ฉ
์คํ์์ค ํ๋ก์ ํธ์์ ์์ฃผ ์ฌ์ฉ๋๋ ๋์์ธ ํจํด๋ค์ ์ตํ๋๋ฉด ์ฝ๋ ์ดํด์ ๊ธฐ์ฌ๊ฐ ํจ์ฌ ์ฌ์์ ธ!
์์ฃผ ์ฌ์ฉ๋๋ ํจํด:
1. Builder Pattern
๋ณต์กํ ๊ฐ์ฒด ์์ฑ์ ๋จ๊ณ๋ณ๋ก ์ฒ๋ฆฌ
public class HttpClientBuilder
{
private string _baseUrl;
private TimeSpan _timeout = TimeSpan.FromSeconds(30);
private Dictionary<string, string> _headers = new();
public HttpClientBuilder WithBaseUrl(string baseUrl)
{
_baseUrl = baseUrl;
return this;
}
public HttpClientBuilder WithTimeout(TimeSpan timeout)
{
_timeout = timeout;
return this;
}
public HttpClientBuilder AddHeader(string key, string value)
{
_headers[key] = value;
return this;
}
public HttpClient Build()
{
var client = new HttpClient
{
BaseAddress = new Uri(_baseUrl),
Timeout = _timeout
};
foreach (var header in _headers)
{
client.DefaultRequestHeaders.Add(header.Key, header.Value);
}
return client;
}
}
// ์ฌ์ฉ ์์
var client = new HttpClientBuilder()
.WithBaseUrl("https://api.example.com")
.WithTimeout(TimeSpan.FromSeconds(60))
.AddHeader("Authorization", "Bearer token")
.Build();
2. Strategy Pattern
์๊ณ ๋ฆฌ์ฆ์ ์บก์ํํ๊ณ ๊ต์ฒด ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ
public interface ICompressionStrategy
{
byte[] Compress(byte[] data);
byte[] Decompress(byte[] data);
}
public class GzipCompression : ICompressionStrategy
{
public byte[] Compress(byte[] data)
{
using var output = new MemoryStream();
using (var gzip = new GZipStream(output, CompressionMode.Compress))
{
gzip.Write(data, 0, data.Length);
}
return output.ToArray();
}
public byte[] Decompress(byte[] data)
{
using var input = new MemoryStream(data);
using var output = new MemoryStream();
using (var gzip = new GZipStream(input, CompressionMode.Decompress))
{
gzip.CopyTo(output);
}
return output.ToArray();
}
}
public class FileCompressor
{
private readonly ICompressionStrategy _strategy;
public FileCompressor(ICompressionStrategy strategy)
{
_strategy = strategy;
}
public void CompressFile(string inputPath, string outputPath)
{
var data = File.ReadAllBytes(inputPath);
var compressed = _strategy.Compress(data);
File.WriteAllBytes(outputPath, compressed);
}
}
3. Repository Pattern
๋ฐ์ดํฐ ์ก์ธ์ค ๋ก์ง์ ์ถ์ํ
public interface IRepository<T> where T : class
{
Task<T> GetByIdAsync(int id);
Task<IEnumerable<T>> GetAllAsync();
Task<T> AddAsync(T entity);
Task UpdateAsync(T entity);
Task DeleteAsync(int id);
}
public class GenericRepository<T> : IRepository<T> where T : class
{
private readonly DbContext _context;
private readonly DbSet<T> _dbSet;
public GenericRepository(DbContext context)
{
_context = context;
_dbSet = context.Set<T>();
}
public async Task<T> GetByIdAsync(int id)
{
return await _dbSet.FindAsync(id);
}
public async Task<IEnumerable<T>> GetAllAsync()
{
return await _dbSet.ToListAsync();
}
public async Task<T> AddAsync(T entity)
{
await _dbSet.AddAsync(entity);
await _context.SaveChangesAsync();
return entity;
}
public async Task UpdateAsync(T entity)
{
_dbSet.Update(entity);
await _context.SaveChangesAsync();
}
public async Task DeleteAsync(int id)
{
var entity = await GetByIdAsync(id);
if (entity != null)
{
_dbSet.Remove(entity);
await _context.SaveChangesAsync();
}
}
}
4. ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ(TDD) ์ค์ฒํ๊ธฐ
์คํ์์ค ํ๋ก์ ํธ์์๋ ํ
์คํธ๊ฐ ํ์์ผ! TDD๋ฅผ ์ค์ฒํ๋ฉด ์ฝ๋ ํ์ง์ด ํฌ๊ฒ ํฅ์๋ผ.
TDD ์ฌ์ดํด: Red-Green-Refactor
๐ด Red: ์คํจํ๋ ํ
์คํธ ์์ฑ
[Fact]
public void Calculate_WithValidInput_ReturnsCorrectResult()
{
// Arrange
var calculator = new Calculator();
// Act
var result = calculator.Add(2, 3);
// Assert
Assert.Equal(5, result);
}
๐ข Green: ํ ์คํธ๋ฅผ ํต๊ณผํ๋ ์ต์ํ์ ์ฝ๋ ์์ฑ
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}
๐ต Refactor: ์ฝ๋ ๊ฐ์
public class Calculator
{
public int Add(int a, int b)
{
// ์ค๋ฒํ๋ก์ฐ ์ฒดํฌ ์ถ๊ฐ
checked
{
return a + b;
}
}
}
// ์ถ๊ฐ ํ
์คํธ
[Fact]
public void Add_WithOverflow_ThrowsOverflowException()
{
var calculator = new Calculator();
Assert.Throws<OverflowException>(() =>
calculator.Add(int.MaxValue, 1));
}
๐ ํ์ต ๋ฆฌ์์ค ๋ฐ ์ปค๋ฎค๋ํฐ
ํผ์์ ๋ชจ๋ ๊ฑธ ๋ฐฐ์ฐ๊ธฐ๋ ์ด๋ ค์. ์ข์ ๋ฆฌ์์ค์ ์ปค๋ฎค๋ํฐ๋ฅผ ํ์ฉํ๋ฉด ํจ์ฌ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ ์ ์์ด! ๐
์ถ์ฒ ํ์ต ๋ฆฌ์์ค
๐ ๊ณต์ ๋ฌธ์ ๋ฐ ๊ฐ์ด๋
Microsoft Learn
- ๋ฌด๋ฃ ์จ๋ผ์ธ ํ์ต ํ๋ซํผ
- C#, .NET, Azure ๋ฑ ๋ค์ํ ๊ณผ์
- ์ค์ต ํ๊ฒฝ ์ ๊ณต
- ์ธ์ฆ์ ๋ฐ๊ธ
.NET Documentation
- ๊ณต์ API ๋ ํผ๋ฐ์ค
- ํํ ๋ฆฌ์ผ ๋ฐ ์ํ ์ฝ๋
- ๋ฒ ์คํธ ํ๋ํฐ์ค ๊ฐ์ด๋
- ์ต์ ๊ธฐ๋ฅ ์๊ฐ
๐บ ๋์์ ๊ฐ์
YouTube ์ฑ๋
- dotNET: ๊ณต์ .NET ์ฑ๋
- Nick Chapsas: C# ๊ณ ๊ธ ๊ธฐ๋ฒ
- IAmTimCorey: ์ด๋ณด์ ์นํ์ ๊ฐ์
- Raw Coding: ์ค์ ํ๋ก์ ํธ ์ค์ฌ
Pluralsight / Udemy
- ์ฒด๊ณ์ ์ธ ์ปค๋ฆฌํ๋ผ
- ํ๋ก์ ํธ ๊ธฐ๋ฐ ํ์ต
- ์๋ฃ์ฆ ๋ฐ๊ธ
๐ ์ถ์ฒ ๋์
์ด๊ธ
- "C# 12 in a Nutshell" - Joseph Albahari
- "Head First C#" - Andrew Stellman
์ค๊ธ
- "CLR via C#" - Jeffrey Richter
- "Dependency Injection in .NET" - Mark Seemann
๊ณ ๊ธ
- "Pro .NET Memory Management" - Konrad Kokosa
- "Concurrency in C# Cookbook" - Stephen Cleary
์จ๋ผ์ธ ์ปค๋ฎค๋ํฐ
๐ ๊ธ๋ก๋ฒ ์ปค๋ฎค๋ํฐ
Stack Overflow
- C# ํ๊ทธ: ๊ฐ์ฅ ํ๋ฐํ Q&A
- ๋ช
ํํ ์ง๋ฌธ ์์ฑ๋ฒ ์ตํ๊ธฐ
- ๋ค๋ฅธ ์ฌ๋์ ๋ต๋ณ์ผ๋ก ํ์ต
Reddit
- r/csharp: C# ์ ์ฉ ์๋ธ๋ ๋ง
- r/dotnet: .NET ์ํ๊ณ ์ ๋ฐ
- ์ต์ ๋ด์ค ๋ฐ ํ ๋ก
Discord ์๋ฒ
- C# Discord: ์ค์๊ฐ ์ง๋ฌธ ๋ต๋ณ
- .NET Foundation Discord
- ํ๋ก์ ํธ๋ณ ์ ์ฉ ์๋ฒ
๐ฐ๐ท ํ๊ตญ ์ปค๋ฎค๋ํฐ
Facebook ๊ทธ๋ฃน
- "C# Korea"
- ".NET ๊ฐ๋ฐ์ ๊ทธ๋ฃน"
- "ASP.NET Korea"
์นด์นด์คํก ์คํ์ฑํ
- C# ๊ฐ๋ฐ์ ๋ชจ์
- .NET ์คํฐ๋ ๊ทธ๋ฃน
์คํ๋ผ์ธ ๋ชจ์
- Seoul.NET Meetup
- ํ๊ตญ ๋ท๋ท ๊ฐ๋ฐ์ ๊ทธ๋ฃน
- ์ง์ญ๋ณ ๊ฐ๋ฐ์ ๋ชจ์
๐ฏ ๋ก๋๋งต: 6๊ฐ์ ์คํ์์ค ๊ธฐ์ฌ ๊ณํ
๊ตฌ์ฒด์ ์ธ ๊ณํ์ด ์์ผ๋ฉด ์คํํ๊ธฐ ํจ์ฌ ์ฌ์! 6๊ฐ์ ๋์ ๋จ๊ณ์ ์ผ๋ก ์คํ์์ค ๊ธฐ์ฌ์๋ก ์ฑ์ฅํ๋ ๋ก๋๋งต์ ๋ง๋ค์ด๋ดค์ด. ๐
๐๏ธ 1๊ฐ์์ฐจ: ๊ธฐ์ด ๋ค์ง๊ธฐ
Week 1-2: ํ๊ฒฝ ์ค์ ๋ฐ ํ๋ก์ ํธ ํ์
โ
Git/GitHub ๋ง์คํฐํ๊ธฐ
โ
๊ด์ฌ ์๋ ์คํ์์ค ํ๋ก์ ํธ 5๊ฐ ์ ์
โ
๊ฐ ํ๋ก์ ํธ์ README, CONTRIBUTING ๋ฌธ์ ์ฝ๊ธฐ
โ
๋ก์ปฌ ํ๊ฒฝ์์ ๋น๋ ๋ฐ ํ
์คํธ ์คํ
Week 3-4: ์ฒซ ๊ธฐ์ฌ ์ค๋น
โ
'good first issue' ํ๊ทธ ์ด์ 10๊ฐ ์ฐพ๊ธฐ
โ
๊ฐ๋จํ ๋ฌธ์ ์คํ ์์ PR ์ ์ถ
โ
์ฝ๋ ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค ๊ฒฝํํ๊ธฐ
โ
์ฒซ PR ๋จธ์ง ์ฑ๊ณต! ๐
๋ชฉํ: ์ต์ 2๊ฐ์ PR ๋จธ์ง
๐๏ธ 2๊ฐ์์ฐจ: ์ฝ๋ ๊ธฐ์ฌ ์์
Week 5-6: ๋ฒ๊ทธ ์์
โ
๊ฐ๋จํ ๋ฒ๊ทธ ์ด์ ์ ํ
โ
๋๋ฒ๊น
๋ฐ ์์ธ ํ์
โ
์์ ์ฝ๋ ์์ฑ ๋ฐ ํ
์คํธ
โ
์์ธํ PR ์ค๋ช
์์ฑ
Week 7-8: ํ
์คํธ ์ถ๊ฐ
โ
ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ๋ฎ์ ๋ถ๋ถ ์ฐพ๊ธฐ
โ
๋จ์ ํ
์คํธ ์์ฑ
โ
์ฃ์ง ์ผ์ด์ค ํ
์คํธ ์ถ๊ฐ
๋ชฉํ: 3-5๊ฐ์ ์ฝ๋ ๊ธฐ์ฌ PR ๋จธ์ง
๐๏ธ 3๊ฐ์์ฐจ: ๊ธฐ๋ฅ ๊ฐ์
Week 9-10: ์์ ๊ธฐ๋ฅ ์ถ๊ฐ
โ
'enhancement' ํ๊ทธ ์ด์ ์ ํ
โ
๊ธฐ๋ฅ ์ค๊ณ ๋ฐ ๊ตฌํ
โ
ํฌ๊ด์ ์ธ ํ
์คํธ ์์ฑ
โ
๋ฌธ์ ์
๋ฐ์ดํธ
Week 11-12: ๋ฆฌํฉํ ๋ง
โ
์ฝ๋ ์ค๋ฉ ์ฐพ๊ธฐ
โ
๋ฆฌํฉํ ๋ง ์ ์ ๋ฐ ๊ตฌํ
โ
์ฑ๋ฅ ๋ฒค์น๋งํฌ ์์ฑ
๋ชฉํ: 2-3๊ฐ์ ๊ธฐ๋ฅ ๊ฐ์ PR ๋จธ์ง
๐๏ธ 4๊ฐ์์ฐจ: ์ปค๋ฎค๋ํฐ ์ฐธ์ฌ
Week 13-14: ์ด์ ๊ด๋ฆฌ ์ฐธ์ฌ
โ
์๋ก์ด ์ด์์ ๋ต๋ณํ๊ธฐ
โ
๋ฒ๊ทธ ์ฌํ ๋ฐ ํ์ธ
โ
์ด์ ๋ผ๋ฒจ๋ง ๋์์ฃผ๊ธฐ
Week 15-16: ์ฝ๋ ๋ฆฌ๋ทฐ
โ
๋ค๋ฅธ ๊ธฐ์ฌ์์ PR ๋ฆฌ๋ทฐ
โ
๊ฑด์ค์ ์ธ ํผ๋๋ฐฑ ์ ๊ณต
โ
ํ
์คํธ ๋ฐ ๊ฒ์ฆ ๋์์ฃผ๊ธฐ
๋ชฉํ: 10๊ฐ ์ด์์ ์ด์/PR์ ์๋ฏธ ์๋ ๋๊ธ ์์ฑ
๐๏ธ 5๊ฐ์์ฐจ: ๋๋ง์ ํ๋ก์ ํธ
Week 17-18: ํ๋ก์ ํธ ๊ธฐํ
โ
ํด๊ฒฐํ๊ณ ์ถ์ ๋ฌธ์ ์ ์
โ
ํ๋ก์ ํธ ๊ตฌ์กฐ ์ค๊ณ
โ
๊ธฐ์ ์คํ ์ ์
โ
GitHub ์ ์ฅ์ ์์ฑ
Week 19-20: ์ด๊ธฐ ๊ฐ๋ฐ
โ
ํต์ฌ ๊ธฐ๋ฅ ๊ตฌํ
โ
ํ
์คํธ ์์ฑ
โ
README ๋ฐ ๋ฌธ์ ์์ฑ
โ
CI/CD ์ค์
๋ชฉํ: MVP(Minimum Viable Product) ์์ฑ
๐๏ธ 6๊ฐ์์ฐจ: ๋ฐฐํฌ ๋ฐ ํ๋ณด
Week 21-22: ํจํค์ง ๋ฐฐํฌ
โ
NuGet ํจํค์ง ๋ฐฐํฌ
โ
๋ฒ์ ๊ด๋ฆฌ ์ ๋ต ์๋ฆฝ
โ
๋ฆด๋ฆฌ์ค ๋
ธํธ ์์ฑ
Week 23-24: ์ปค๋ฎค๋ํฐ ํ๋ณด
โ
๊ธฐ์ ๋ธ๋ก๊ทธ ํฌ์คํ
โ
Reddit, Twitter ๊ณต์
โ
์ปจํผ๋ฐ์ค ๋ฐํ ์ ์
โ
์ฒซ ์ธ๋ถ ๊ธฐ์ฌ์ ๋ฐ๊ธฐ!
๋ชฉํ: ํ๋ก์ ํธ ๊ณต๊ฐ ๋ฐ ์ฒซ ์คํ 100๊ฐ ๋ฌ์ฑ
๐ผ ์ปค๋ฆฌ์ด ์ฑ์ฅ: ์คํ์์ค ๊ฒฝํ ํ์ฉํ๊ธฐ
์คํ์์ค ๊ธฐ์ฌ๋ ๊ทธ ์์ฒด๋ก๋ ์๋ฏธ ์์ง๋ง, ์ปค๋ฆฌ์ด ์ฑ์ฅ์๋ ์์ฒญ๋ ๋์์ด ๋ผ. ์ค์ ๋ก ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง ์์๋ณด์! ๐ช
์ด๋ ฅ์์ ์คํ์์ค ๊ฒฝํ ์์ฑํ๊ธฐ
โ ๋์ ์์:
"์คํ์์ค ํ๋ก์ ํธ์ ๊ธฐ์ฌํ์ต๋๋ค."
โ
์ข์ ์์:
"ASP.NET Core ํ๋ก์ ํธ์ ์ฑ๋ฅ ๊ฐ์ PR 3๊ฑด ๊ธฐ์ฌ (GitHub Stars 35K+)
- Middleware ํ์ดํ๋ผ์ธ ์ต์ ํ๋ก ์๋ต ์๊ฐ 15% ๊ฐ์
- ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฒ๊ทธ ์์ (Issue #12345)
- ๋จ์ ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง 85%์์ 92%๋ก ํฅ์
- ์ฝ๋ ๋ฆฌ๋ทฐ 20+ ๊ฑด ์ฐธ์ฌ, ์ปค๋ฎค๋ํฐ ํ๋ ํ๋ฐ"
ํต์ฌ ํฌ์ธํธ:
โ
๊ตฌ์ฒด์ ์ธ ํ๋ก์ ํธ๋ช
๊ณผ ๊ท๋ชจ (Stars, Contributors)
โ
์ ๋์ ์ฑ๊ณผ (%, ์ซ์)
โ
๊ธฐ์ ์ ๊น์ด (์ด๋ค ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง)
โ
ํ์
๋ฅ๋ ฅ (์ฝ๋ ๋ฆฌ๋ทฐ, ์ปค๋ฎค๋ํฐ ์ฐธ์ฌ)
GitHub ํ๋กํ ์ต์ ํ
GitHub ํ๋กํ์ ๊ฐ๋ฐ์์ ๋ช
ํจ์ด์ผ! ์ฑ์ฉ ๋ด๋น์๋ค์ด ๊ฐ์ฅ ๋จผ์ ๋ณด๋ ๊ณณ์ด๊ธฐ๋ ํ์ง.
ํ๋กํ ์ต์ ํ ์ฒดํฌ๋ฆฌ์คํธ:
1. README.md ์์ฑ
- ์๊ธฐ์๊ฐ ๋ฐ ๊ด์ฌ ๋ถ์ผ
- ์ฃผ์ ๊ธฐ์ ์คํ
- ์งํ ์ค์ธ ํ๋ก์ ํธ
- ์ฐ๋ฝ์ฒ ๋ฐ ์์
๋งํฌ
2. Pinned Repositories
- ๊ฐ์ฅ ์๋์ค๋ฌ์ด ํ๋ก์ ํธ 6๊ฐ ๊ณ ์
- ๋ค์ํ ๊ธฐ์ ์คํ ๋ณด์ฌ์ฃผ๊ธฐ
- ์์ฑ๋ ๋์ ํ๋ก์ ํธ ์ฐ์
3. Contribution Graph
- ๊พธ์คํ ํ๋ ๋ณด์ฌ์ฃผ๊ธฐ
- ์ฐ์ ์ปค๋ฐ ์คํธ๋ฆญ ์ ์ง
- ์ด๋ก์ ์๋ ์ฌ๊ธฐ ๐ฑ
4. ํ๋กํ ๋ฐฐ์ง
- GitHub Stats
- Most Used Languages
- Streak Stats
- Trophy
๋ฉด์ ์์ ์คํ์์ค ๊ฒฝํ ์ดํํ๊ธฐ
์์ ์ง๋ฌธ๊ณผ ๋ต๋ณ ์์:
Q: "์คํ์์ค ๊ธฐ์ฌ ๊ฒฝํ์ ๋ํด ๋ง์ํด์ฃผ์ธ์."
A: "์ ๋ ์ง๋ 1๋
๊ฐ .NET ์ํ๊ณ์ ์ฌ๋ฌ ์คํ์์ค ํ๋ก์ ํธ์ ๊ธฐ์ฌํด์์ต๋๋ค. ํนํ Dapper ORM ํ๋ก์ ํธ์์ ๋น๋๊ธฐ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ PR์ ์ ์ถํ๋๋ฐ, ์ด ๊ณผ์ ์์ .NET์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ต์ ํ์ ๋ํด ๊น์ด ์๊ฒ ํ์ตํ ์ ์์์ต๋๋ค.
๋ํ ์ฝ๋ ๋ฆฌ๋ทฐ ๊ณผ์ ์์ ์ธ๊ณ์ ์ธ ๊ฐ๋ฐ์๋ค๊ณผ ์ํตํ๋ฉฐ ์ฝ๋ ํ์ง์ ๋ํ ๋์ ๊ธฐ์ค์ ๋ฐฐ์ ๊ณ , ์์ด๋ก ๊ธฐ์ ์ ์ปค๋ฎค๋์ผ์ด์
ํ๋ ๋ฅ๋ ฅ๋ ํฅ์์์ผฐ์ต๋๋ค. ์ด๋ฐ ๊ฒฝํ์ ํ ํ์
๊ณผ ์ฝ๋ ํ์ง ๊ด๋ฆฌ์ ํฐ ๋์์ด ๋ ๊ฒ์ด๋ผ ์๊ฐํฉ๋๋ค."
Q: "์คํ์์ค ๊ธฐ์ฌ ์ค ๊ฐ์ฅ ์ด๋ ค์ ๋ ์ ์?"
A: "์ฒ์์๋ ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ดํดํ๋ ๊ฒ ๊ฐ์ฅ ์ด๋ ค์ ์ต๋๋ค. ASP.NET Core ๊ฐ์ ํ๋ก์ ํธ๋ ์์ญ๋ง ์ค์ ์ฝ๋๋ก ์ด๋ฃจ์ด์ ธ ์์ด์ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ํ์
ํ๊ธฐ๊ฐ ์ฝ์ง ์์์ฃ .
ํ์ง๋ง ์์ ์ด์๋ถํฐ ์์ํด์ ์ ์ง์ ์ผ๋ก ์ฝ๋๋ฒ ์ด์ค์ ์ต์ํด์ง๋ ์ ๋ต์ ์ฌ์ฉํ์ต๋๋ค. ๋ฌธ์๋ฅผ ๊ผผ๊ผผํ ์ฝ๊ณ , ๋๋ฒ๊ฑฐ๋ฅผ ํ์ฉํด ์ฝ๋ ํ๋ฆ์ ์ถ์ ํ๋ฉฐ, ์ดํด๊ฐ ์ ๋๋ ๋ถ๋ถ์ ์ปค๋ฎค๋ํฐ์ ์ง๋ฌธํ์ต๋๋ค. ์ด ๊ณผ์ ์์ ๋๊ท๋ชจ ์์คํ
์ ๋น ๋ฅด๊ฒ ํ์ตํ๋ ๋ฐฉ๋ฒ์ ํฐ๋ํ๊ณ , ์ด๋ ์๋ก์ด ํ์ฌ์ ์
์ฌํ์ ๋๋ ํฐ ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค."
Q: "์์ผ๋ก ์คํ์์ค ํ๋ ๊ณํ์?"
A: "ํ์ฌ ์งํ ์ค์ธ ๊ฐ์ธ ํ๋ก์ ํธ๋ฅผ ์คํ์์ค๋ก ๊ณต๊ฐํ ๊ณํ์
๋๋ค. [ํ๋ก์ ํธ๋ช
]์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ๋ฐ, [๋ฌธ์ ์ค๋ช
]์ ํด๊ฒฐํ๊ธฐ ์ํ ๋๊ตฌ์
๋๋ค. ์ด๋ฏธ NuGet์ ๋ฐฐํฌํ๊ณ , ๋ช๋ช ๊ฐ๋ฐ์๋ค์ด ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ํ .NET Foundation ๋ฉค๋ฒ์ญ์ ์ ์ฒญํ ์์ ์ด๊ณ , ์ฅ๊ธฐ์ ์ผ๋ก๋ Microsoft MVP๋ฅผ ๋ชฉํ๋ก ํ๊ณ ์์ต๋๋ค. ํ์ฌ ์
๋ฌด์ ๋ณํํ๋ฉด์๋ ๊พธ์คํ ์ปค๋ฎค๋ํฐ์ ๊ธฐ์ฌํ๊ณ ์ถ์ต๋๋ค."
๋คํธ์ํน ๋ฐ ๊ธฐํ ์ฐฝ์ถ
์คํ์์ค ํ๋์ ํตํด ๋ง๋ ์ธ์ฐ์ ์์์น ๋ชปํ ๊ธฐํ๋ก ์ด์ด์ง ์ ์์ด!
์ค์ ์ฌ๋ก:
๐ง ํค๋ํํฐ ์ปจํ
"GitHub์์ ๋น์ ์ ์คํ์์ค ๊ธฐ์ฌ๋ฅผ ๋ณด๊ณ ์ฐ๋ฝ๋๋ฆฝ๋๋ค. ์ ํฌ ํ์ฌ์์ .NET ๊ฐ๋ฐ์๋ฅผ ์ฐพ๊ณ ์๋๋ฐ..."
๐ค ํ์
์ ์
"๋น์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํฌ ํ๋ก์ ํธ์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค. ํจ๊ป ํ์
ํ ์ ์์๊น์?"
๐ค ์ปจํผ๋ฐ์ค ์ด์ฒญ
"์คํ์์ค ํ๋ก์ ํธ์ ๋ํด ๋ฐํํด์ฃผ์ค ์ ์๋์?"
๐ผ ํ๋ฆฌ๋์ ์๋ขฐ
"๋น์ ์ ์ ๋ฌธ์ฑ์ด ํ์ํ ํ๋ก์ ํธ๊ฐ ์์ต๋๋ค..."
๋คํธ์ํน ํ:
โ
LinkedIn ํ๋กํ ์
๋ฐ์ดํธ
โ
Twitter์์ ๊ธฐ์ ํธ์ ๊ณต์
โ
์ปจํผ๋ฐ์ค ์ฐธ์ ๋ฐ ๋ช
ํจ ๊ตํ
โ
์จ๋ผ์ธ ์ปค๋ฎค๋ํฐ ํ๋ฐํ ์ฐธ์ฌ
โ
๋ธ๋ก๊ทธ์ ์ฐ๋ฝ์ฒ ๋ช
์
๐ฌ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
"The best way to predict the future is to create it." - Peter Drucker
์คํ์์ค ๊ธฐ์ฌ๋ ๋จ์ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ ์ด์์ ์๋ฏธ๋ฅผ ๊ฐ์ ธ. ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค๊ณผ ํ์
ํ๋ฉฐ ์ฑ์ฅํ๊ณ , ์ค๋ ฅ์ ์ฆ๋ช
ํ๋ฉฐ, ์ปค๋ฎค๋ํฐ์ ๊ธฐ์ฌํ๋ ๋ฉ์ง ์ฌ์ ์ด์ผ. ๐
ํต์ฌ ์์ฝ:
โ
์๊ฒ ์์ํ๊ธฐ
๋ฌธ์ ์์ , ์คํ ์์ ๋ถํฐ ์์ํด๋ ๊ด์ฐฎ์. ์ค์ํ ๊ฑด ์ฒซ ๊ฑธ์์ ๋ผ๋ ๊ฑฐ์ผ!
โ
๊พธ์คํจ์ด ํต์ฌ
ํ๋ฃจ 30๋ถ์ด๋ผ๋ ๋งค์ผ ํ๋ ๊ฒ ์ฃผ๋ง์ ๋ชฐ์์ ํ๋ ๊ฒ๋ณด๋ค ํจ๊ณผ์ ์ด์ผ.
โ
์ปค๋ฎค๋ํฐ์ ์ํต
ํผ์ ํ์ง ๋ง๊ณ ์ปค๋ฎค๋ํฐ์ ์ฐธ์ฌํด. ์ง๋ฌธํ๊ณ , ๋ต๋ณํ๊ณ , ๋คํธ์ํนํ์!
โ
์คํจ๋ฅผ ๋๋ ค์ํ์ง ์๊ธฐ
PR์ด ๊ฑฐ์ ๋๊ฑฐ๋ ์ฝ๋ ๋ฆฌ๋ทฐ์์ ๋ง์ ํผ๋๋ฐฑ์ ๋ฐ์๋ ๊ด์ฐฎ์. ๊ทธ๊ฒ ๋ฐ๋ก ๋ฐฐ์์ ๊ณผ์ ์ด์ผ!
โ
์ฅ๊ธฐ์ ๊ด์ ์ ์ง
์คํ์์ค ๊ธฐ์ฌ๋ ๋ง๋ผํค์ด์ผ. ๋จ๊ธฐ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ ค๊ณ ํ์ง ๋ง๊ณ , ๊พธ์คํ ์ฑ์ฅํ๋ ๋ฐ ์ง์คํ์.
๊ทธ๋ฆฌ๊ณ ํผ์ ํ๊ธฐ ์ด๋ ต๋ค๋ฉด ์ฌ๋ฅ๋ท(https://www.jaenung.net)์์ ๋ฉํ ๋ฅผ ์ฐพ์ ๋์์ ๋ฐ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์ผ. ๊ฒฝํ ๋ง์ ๊ฐ๋ฐ์์ ๊ฐ์ด๋๋ฅผ ๋ฐ์ผ๋ฉด ํจ์ฌ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ ์ ์๊ฑฐ๋ !
์, ์ด์ ๋น์ ์ ์คํ์์ค ์ฌ์ ์ ์์ํ ์๊ฐ์ด์ผ! ํ์ดํ ! ๐๐ช
Happy Coding! ๐
Let's make the .NET ecosystem better together!
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.