๐ ๏ธ .NET Core Global Tools ๊ฐ๋ฐ๊ณผ ๋ฐฐํฌ: ๊ฐ๋ฐ์์ ํ์ ๋๊ตฌ ํคํธ ๐

์๋ ํ์ธ์, ์ด์ ๋์น๋ ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! ์ค๋์ ์ ๋ง ํฅ๋ฏธ์ง์งํ ์ฃผ์ ๋ก ์ฌ๋ฌ๋ถ๊ณผ ํจ๊ป ์๊ฐ์ ๋ณด๋ด๋ ค๊ณ ํฉ๋๋ค. ๋ฐ๋ก .NET Core Global Tools์ ๋ํด ๊น์ด ์๊ฒ ํํค์ณ๋ณผ ๊ฑฐ์์. ์ด ๊ฐ๋ ฅํ ๋๊ตฌ๊ฐ ์ฌ๋ฌ๋ถ์ ๊ฐ๋ฐ ์ํ์ ์ด๋ป๊ฒ ํ์ ์ ์ผ๋ก ๋ฐ๊ฟ ์ ์๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์ง์ ๋ง๋ค๊ณ ๋ฐฐํฌํ ์ ์๋์ง ํจ๊ป ์์๋ณด๊ฒ ์ต๋๋ค! ๐
์ฌ๋ฌ๋ถ, ํน์ ์ฌ๋ฅ๋ท(https://www.jaenung.net)์ด๋ผ๋ ๋ฉ์ง ํ๋ซํผ์ ๋ค์ด๋ณด์ จ๋์? ์ด๊ณณ์ ๋ค์ํ ์ฌ๋ฅ์ ๊ฐ์ง ์ฌ๋๋ค์ด ๋ชจ์ฌ ์ง์๊ณผ ๊ธฐ์ ์ ๊ณต์ ํ๋ ๊ณณ์ธ๋ฐ์. ์ค๋ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ธ .NET Core Global Tools ๊ฐ๋ฐ ๊ธฐ์ ๋ ์ด๋ฐ ํ๋ซํผ์์ ๊ณต์ ํ๋ฉด ์ ๋ง ์ข์ ๊ฒ ๊ฐ์์. ์ฌ๋ฌ๋ถ์ ์ฌ๋ฅ์ ํผ์น ์ ์๋ ์ข์ ๊ธฐํ๊ฐ ๋ ๊ฑฐ์์! ๐
๐ก ์๊ณ ๊ณ์ จ๋์? .NET Core Global Tools๋ ๋ช ๋ น ์ค์์ ์คํํ ์ ์๋ ํน๋ณํ NuGet ํจํค์ง์ ๋๋ค. ์ด ๋๊ตฌ๋ค์ ์ฌ๋ฌ๋ถ์ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ํ๊ธฐ์ ์ผ๋ก ๊ฐ์ ํ ์ ์๋ ๊ฐ๋ ฅํ ํ์ ๊ฐ์ง๊ณ ์์ฃ !
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก .NET Core Global Tools์ ์ธ๊ณ๋ก ๋ฐ์ด๋ค์ด๋ณผ๊น์? ์ฐ๋ฆฌ์ ์ฌ์ ์ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ์์ํด์ ๊ณ ๊ธ ๊ธฐ์ ๊น์ง ๋ค๋ฃฐ ์์ ์ด์์. ์ค๋น๋์ จ๋์? ๊ทธ๋ผ ์ถ๋ฐ~! ๐
๐ .NET Core Global Tools: ๊ธฐ๋ณธ ๊ฐ๋ ์ดํดํ๊ธฐ
.NET Core Global Tools๋ .NET Core SDK์ ์ผ๋ถ๋ก, ๊ฐ๋ฐ์๋ค์ด ๋ช ๋ น ์ค์์ ์ฝ๊ฒ ์ค์นํ๊ณ ์คํํ ์ ์๋ ํน๋ณํ NuGet ํจํค์ง์ ๋๋ค. ์ด ๋๊ตฌ๋ค์ ์ฌ๋ฌ๋ถ์ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋์ฑ ํ๋ถํ๊ณ ํจ์จ์ ์ผ๋ก ๋ง๋ค์ด์ค ๊ฑฐ์์. ๐
๐ Global Tools์ ํน์ง
- ๊ฐํธํ ์ค์น: dotnet CLI๋ฅผ ํตํด ์ฝ๊ฒ ์ค์นํ ์ ์์ด์.
- ์ ์ญ ์ ๊ทผ์ฑ: ์ค์น ํ ์์คํ ์ด๋์๋ ์ฌ์ฉ ๊ฐ๋ฅํด์.
- ๋ฒ์ ๊ด๋ฆฌ: ์ฌ๋ฌ ๋ฒ์ ์ ๋์์ ๊ด๋ฆฌํ ์ ์์ด์.
- ํฌ๋ก์ค ํ๋ซํผ: Windows, macOS, Linux์์ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅํด์.
์ด๋ฐ ํน์ง๋ค ๋๋ถ์ Global Tools๋ ๊ฐ๋ฐ์๋ค ์ฌ์ด์์ ์ธ๊ธฐ๊ฐ ๋ ๋ก ๋์์ง๊ณ ์์ด์. ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์๋ ์ด๋ฐ ๋๊ตฌ๋ฅผ ๋ง๋ค๊ณ ๊ณต์ ํ๋ ๊ฐ๋ฐ์๋ค์ ์ข ์ข ๋ณผ ์ ์์ฃ . ์ฌ๋ฌ๋ถ๋ ๊ณง ๊ทธ ์ฃผ์ธ๊ณต์ด ๋ ์ ์์ ๊ฑฐ์์! ๐จโ๐ป๐ฉโ๐ป
๐ ํ: Global Tools๋ฅผ ์ ํ์ฉํ๋ฉด, ๋ฐ๋ณต์ ์ธ ์์ ์ ์๋ํํ๊ฑฐ๋ ๋ณต์กํ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํ ์ ์์ด์. ์ด๋ ๊ฐ๋ฐ ์์ฐ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ ๋ฐฉ๋ฒ์ด์ฃ !
๐ ๏ธ Global Tools vs Local Tools
Global Tools์ ๋น์ทํ์ง๋ง ์กฐ๊ธ ๋ค๋ฅธ ๊ฐ๋ ์ผ๋ก Local Tools๊ฐ ์์ด์. ์ด ๋์ ์ฐจ์ด์ ์ ์์๋ณผ๊น์?
ํน์ฑ | Global Tools | Local Tools |
---|---|---|
์ค์น ๋ฒ์ | ์์คํ ์ ์ฒด | ํน์ ํ๋ก์ ํธ |
์ ๊ทผ์ฑ | ์ด๋์๋ ์ ๊ทผ ๊ฐ๋ฅ | ํ๋ก์ ํธ ๋ด์์๋ง ์ ๊ทผ ๊ฐ๋ฅ |
๋ฒ์ ๊ด๋ฆฌ | ์๋์ผ๋ก ๊ด๋ฆฌ | ํ๋ก์ ํธ์ ํจ๊ป ์๋ ๊ด๋ฆฌ |
๋ ๊ฐ์ง ๋ฐฉ์ ๋ชจ๋ ์ฅ๋จ์ ์ด ์์ด์. Global Tools๋ ํธ๋ฆฌํ์ง๋ง ๋ฒ์ ์ถฉ๋์ ์ํ์ด ์๊ณ , Local Tools๋ ํ๋ก์ ํธ๋ณ๋ก ์์ ํ๊ฒ ๊ด๋ฆฌํ ์ ์์ง๋ง ์ค์ ์ด ์กฐ๊ธ ๋ ๋ณต์กํ ์ ์์ฃ . ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ ๋ฐฉ์์ ์ ํํ๋ ๊ฒ์ด ์ค์ํด์. ๐
๐ Global Tools์ ํ์ฉ ์ฌ๋ก
Global Tools๋ ์ ๋ง ๋ค์ํ ๋ฐฉ๋ฉด์์ ํ์ฉ๋ ์ ์์ด์. ๋ช ๊ฐ์ง ์๋ฅผ ๋ค์ด๋ณผ๊น์?
- ์ฝ๋ ์์ฑ๊ธฐ: ๋ฐ๋ณต์ ์ธ ์ฝ๋ ํจํด์ ์๋์ผ๋ก ์์ฑ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์ ๋๊ตฌ: DB ์คํค๋ง ๋ณ๊ฒฝ์ ๊ด๋ฆฌ
- ์ฑ๋ฅ ๋ถ์ ๋๊ตฌ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ธก์ ํ๊ณ ๋ถ์
- API ๋ฌธ์ ์์ฑ๊ธฐ: API ๋ช ์ธ๋ฅผ ์๋์ผ๋ก ๋ฌธ์ํ
- ์ฝ๋ ํฌ๋งทํฐ: ์ผ๊ด๋ ์ฝ๋ ์คํ์ผ์ ์ ์ง
์ด๋ฐ ๋๊ตฌ๋ค์ ์ง์ ๋ง๋ค์ด ์ฌ์ฉํ๋ฉด, ์ฌ๋ฌ๋ถ์ ๊ฐ๋ฐ ํ๋ก์ธ์ค๊ฐ ์ผ๋ง๋ ํจ์จ์ ์ผ๋ก ๋ณํ ์ง ์์์ด ๋์๋์? ๊ฒ๋ค๊ฐ ์ด๋ ๊ฒ ๋ง๋ ๋๊ตฌ๋ฅผ ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์ ๊ณต์ ํ๋ฉด, ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์๊ฒ๋ ํฐ ๋์์ด ๋ ์ ์์ด์. ๋ฉ์ง์ง ์๋์? ๐
๐ก ์์ด๋์ด: ์ฌ๋ฌ๋ถ๋ง์ ๋ ํนํ Global Tool์ ๊ฐ๋ฐํด๋ณด๋ ๊ฑด ์ด๋จ๊น์? ์๋ฅผ ๋ค์ด, ํ๋ก์ ํธ ์ด๊ธฐ ์ค์ ์ ์๋ํํ๋ ๋๊ตฌ๋, ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋๋ ๋๊ตฌ ๋ฑ์ ๋ง๋ค์ด๋ณผ ์ ์์ด์. ์ด๋ฐ ๊ฒฝํ์ ์ฌ๋ฌ๋ถ์ ํฌํธํด๋ฆฌ์ค๋ฅผ ๋น๋๊ฒ ๋ง๋ค์ด์ค ๊ฑฐ์์!
์, ์ด์ .NET Core Global Tools์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋ํด ์์๋ดค์ด์. ์ดํด๊ฐ ์ ๋์ จ๋์? ๐ ๋ค์ ์น์ ์์๋ ์ค์ ๋ก Global Tool์ ๊ฐ๋ฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ค๋น๋์ จ๋์? Let's go! ๐
๐ ๏ธ .NET Core Global Tool ๊ฐ๋ฐํ๊ธฐ: ๋จ๊ณ๋ณ ๊ฐ์ด๋
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก .NET Core Global Tool์ ๊ฐ๋ฐํด๋ณผ ์ฐจ๋ก์์! ์ฌ๋ฌ๋ถ์ ์ฒซ ๋ฒ์งธ Global Tool์ ๋ง๋๋ ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ค๋น๋์ จ๋์? ๊ทธ๋ผ ์์ํด๋ณผ๊น์? ๐
1๏ธโฃ ํ๋ก์ ํธ ์์ฑํ๊ธฐ
๋จผ์ , ์๋ก์ด ์ฝ์ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก์ ํธ๋ฅผ ์์ฑํด์ผ ํด์. ๋ช ๋ น ํ๋กฌํํธ๋ ํฐ๋ฏธ๋์ ์ด๊ณ ๋ค์ ๋ช ๋ น์ ์คํํด์ฃผ์ธ์:
dotnet new console -n MyFirstGlobalTool
์ด ๋ช ๋ น์ 'MyFirstGlobalTool'์ด๋ผ๋ ์ด๋ฆ์ ์ ์ฝ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค. ๋ฉ์ง ์ด๋ฆ์ด์ฃ ? ๐
2๏ธโฃ ํ๋ก์ ํธ ํ์ผ ์์ ํ๊ธฐ
์์ฑ๋ ํ๋ก์ ํธ ํด๋๋ก ์ด๋ํ ํ, .csproj ํ์ผ์ ์ด์ด ๋ค์๊ณผ ๊ฐ์ด ์์ ํด์ฃผ์ธ์:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<PackAsTool>true</PackAsTool>
<ToolCommandName>myfirsttool</ToolCommandName>
<PackageOutputPath>./nupkg</PackageOutputPath>
</PropertyGroup>
</Project>
์ฌ๊ธฐ์ PackAsTool์ ์ด ํ๋ก์ ํธ๋ฅผ ๋๊ตฌ๋ก ํจํค์งํ๋ค๋ ์๋ฏธ์ด๊ณ , ToolCommandName์ ์ด ๋๊ตฌ๋ฅผ ์คํํ ๋ ์ฌ์ฉํ ๋ช ๋ น์ด ์ด๋ฆ์ด์์. PackageOutputPath๋ ํจํค์ง๊ฐ ์์ฑ๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค.
๐ ํ: ToolCommandName์ ์ฌ์ฉ์๊ฐ ์ฝ๊ฒ ๊ธฐ์ตํ๊ณ ์ ๋ ฅํ ์ ์๋ ๊ฐ๋จํ ์ด๋ฆ์ผ๋ก ์ ํ๋ ๊ฒ์ด ์ข์์. ์๋ฅผ ๋ค์ด, 'generate-code'๋ 'db-migrate' ๊ฐ์ ์ด๋ฆ์ด ์ข๊ฒ ์ฃ ?
3๏ธโฃ ์ฝ๋ ์์ฑํ๊ธฐ
์ด์ ์ค์ ๋ก ๋๊ตฌ๊ฐ ์ํํ ์์ ์ ์ฝ๋ฉํ ์ฐจ๋ก์์. Program.cs ํ์ผ์ ์ด๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ ํด๋ณผ๊น์?
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("์๋
ํ์ธ์! ์ ์ฒซ ๋ฒ์งธ .NET Core Global Tool์
๋๋ค!");
Console.WriteLine("์ค๋ ๋ ์ง: " + DateTime.Now.ToShortDateString());
}
}
์ด ๊ฐ๋จํ ์ฝ๋๋ ์ธ์ฌ๋ง๊ณผ ํจ๊ป ํ์ฌ ๋ ์ง๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ๋ฌผ๋ก ์ด๊ฑด ์์์ผ ๋ฟ์ด์์. ์ฌ๋ฌ๋ถ์ ์์๋ ฅ์ ๋ฐํํด ๋ ๋ณต์กํ๊ณ ์ ์ฉํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ต๋๋ค! ๐
4๏ธโฃ ๋๊ตฌ ๋น๋ํ๊ธฐ
์ฝ๋ ์์ฑ์ด ๋๋ฌ๋ค๋ฉด, ์ด์ ๋๊ตฌ๋ฅผ ๋น๋ํ ์ฐจ๋ก์์. ๋ค์ ๋ช ๋ น์ ์คํํด์ฃผ์ธ์:
dotnet pack
์ด ๋ช ๋ น์ ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๊ณ NuGet ํจํค์ง๋ฅผ ์์ฑํฉ๋๋ค. ์์ฑ๋ ํจํค์ง๋ ์ด์ ์ ์ง์ ํ ./nupkg ํด๋์์ ์ฐพ์ ์ ์์ด์.
5๏ธโฃ ๋๊ตฌ ์ค์นํ๊ธฐ
๋น๋๋ ๋๊ตฌ๋ฅผ ์ค์นํด๋ณผ๊น์? ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ธ์:
dotnet tool install --global --add-source ./nupkg MyFirstGlobalTool
์ด ๋ช ๋ น์ ๋ฐฉ๊ธ ๋ง๋ ๋๊ตฌ๋ฅผ ์ ์ญ์ ์ผ๋ก ์ค์นํฉ๋๋ค. ์ด์ ์์คํ ์ด๋์๋ ์ด ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์์ด์!
6๏ธโฃ ๋๊ตฌ ์คํํ๊ธฐ
๋๋์ด ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋๊ตฌ๋ฅผ ์คํํด๋ณผ ์๊ฐ์ด์์! ๋ช ๋ น ํ๋กฌํํธ๋ ํฐ๋ฏธ๋์์ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฅํด๋ณด์ธ์:
myfirsttool
์ง์! ๐ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ฉ์์ง์ ํจ๊ป ์ค๋ ๋ ์ง๊ฐ ์ถ๋ ฅ๋์๋์? ์ถํ๋๋ ค์, ์ฌ๋ฌ๋ถ์ ๋ฐฉ๊ธ ์์ ๋ง์ .NET Core Global Tool์ ๋ง๋ค๊ณ ์คํํ์ด์!
๐ก ์๊ฐํด๋ณด๊ธฐ: ์ด ๋๊ตฌ๋ฅผ ์ด๋ป๊ฒ ๋ฐ์ ์ํฌ ์ ์์๊น์? ์๋ฅผ ๋ค์ด, ๋ ์ง ํ์์ ์ฌ์ฉ์๊ฐ ์ง์ ํ ์ ์๊ฒ ํ๊ฑฐ๋, ๋ค์ํ ์๊ฐ๋์ ์๊ฐ์ ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ฉด ์ด๋จ๊น์? ์ฌ๋ฌ๋ถ์ ์ฐฝ์๋ ฅ์ ๋ง์๊ป ๋ฐํํด๋ณด์ธ์!
์, ์ด๋ ๊ฒ ํด์ ์ฐ๋ฆฌ๋ ๊ฐ๋จํ์ง๋ง ์์ ํ .NET Core Global Tool์ ๋ง๋ค์ด๋ดค์ด์. ์ด๋ ์ จ๋์? ์๊ฐ๋ณด๋ค ์ด๋ ต์ง ์์ฃ ? ๐
์ด์ ์ฌ๋ฌ๋ถ์ ์ด ๊ธฐ๋ณธ์ ์ธ ํ์ ๋ฐํ์ผ๋ก ๋ ๋ณต์กํ๊ณ ์ ์ฉํ ๋๊ตฌ๋ค์ ๋ง๋ค ์ ์์ด์. ์๋ฅผ ๋ค์ด, ํ์ผ ๋ณํ๊ธฐ, ์ฝ๋ ์์ฑ๊ธฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์ ๋๊ตฌ ๋ฑ ๋ค์ํ ๋๊ตฌ๋ฅผ ๋ง๋ค ์ ์์ฃ . ์ฌ๋ฌ๋ถ์ ์์๋ ฅ์ด ๊ณง ํ๊ณ์์!
๋ค์ ์น์ ์์๋ ์ข ๋ ์ค์ฉ์ ์ด๊ณ ๋ณต์กํ Global Tool์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ๊ธฐ๋๋์ง ์๋์? ๊ณ์ํด์ ํจ๊ป ๋ฐฐ์๋๊ฐ์! ๐
๐ ๊ณ ๊ธ .NET Core Global Tool ๊ฐ๋ฐ: ์ค์ฉ์ ์ธ ์์
์, ์ด์ ์ฐ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ธ .NET Core Global Tool์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๊ฒ ๋์์ด์. ํ์ง๋ง ์ค์ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๋ ๋ณต์กํ๊ณ ์ ์ฉํ ๋๊ตฌ๊ฐ ํ์ํ๊ฒ ์ฃ ? ๊ทธ๋์ ์ด๋ฒ์๋ ์กฐ๊ธ ๋ ์ค์ฉ์ ์ธ Global Tool์ ๋ง๋ค์ด๋ณด๋ ค๊ณ ํด์. ์ค๋น๋์ จ๋์? ๐
๐จ ํ๋ก์ ํธ: ์ฝ๋ ์คํ์ผ ๊ฒ์ฌ๊ธฐ
์ด๋ฒ์ ๋ง๋ค ๋๊ตฌ๋ C# ์ฝ๋์ ์คํ์ผ์ ๊ฒ์ฌํ๋ ๋๊ตฌ์์. ์ด ๋๊ตฌ๋ ์ฃผ์ด์ง C# ํ์ผ์ ๋ถ์ํ๊ณ , ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ์ค์ํ์ง ์์ ๋ถ๋ถ์ ์ฐพ์๋ด ๋ฆฌํฌํธ๋ฅผ ์์ฑํ ๊ฑฐ์์. ๋ฉ์ง์ง ์๋์? ๐ต๏ธโโ๏ธ
1. ํ๋ก์ ํธ ์ค์
๋จผ์ , ์๋ก์ด ์ฝ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด๋ณผ๊น์?
dotnet new console -n CodeStyleChecker
๊ทธ๋ฆฌ๊ณ ํ๋ก์ ํธ ํ์ผ(CodeStyleChecker.csproj)์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํด์ฃผ์ธ์:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<PackAsTool>true</PackAsTool>
<ToolCommandName>codestyle</ToolCommandName>
<PackageOutputPath>./nupkg</PackageOutputPath>
<Version>1.0.0</Version>
<Authors>Your Name</Authors>
<Description>A tool to check C# code style</Description>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.9.0" />
</ItemGroup>
</Project>
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ Microsoft.CodeAnalysis.CSharp ํจํค์ง๋ฅผ ์ถ๊ฐํ์ด์. ์ด ํจํค์ง๋ C# ์ฝ๋๋ฅผ ๋ถ์ํ๋ ๋ฐ ๋์์ ์ค ๊ฑฐ์์.
2. ์ฝ๋ ์์ฑ
์ด์ ์ค์ ์ฝ๋๋ฅผ ์์ฑํด๋ณผ๊น์? Program.cs ํ์ผ์ ์ด๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด์ฃผ์ธ์:
using System;
using System.IO;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
class Program
{
static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("์ฌ์ฉ๋ฒ: codestyle <ํ์ผ๊ฒฝ๋ก>");
return;
}
string filePath = args[0];
if (!File.Exists(filePath))
{
Console.WriteLine($"ํ์ผ์ ์ฐพ์ ์ ์์ต๋๋ค: {filePath}");
return;
}
string code = File.ReadAllText(filePath);
SyntaxTree tree = CSharpSyntaxTree.ParseText(code);
CompilationUnitSyntax root = tree.GetCompilationUnitRoot();
int issues = 0;
foreach (var method in root.DescendantNodes().OfType<MethodDeclarationSyntax>())
{
if (method.Identifier.ToString().Length > 20)
{
Console.WriteLine($"๊ฒฝ๊ณ : ๋ฉ์๋ ์ด๋ฆ์ด ๋๋ฌด ๊น๋๋ค ({method.Identifier})");
issues++;
}
if (method.ParameterList.Parameters.Count > 5)
{
Console.WriteLine($"๊ฒฝ๊ณ : ๋ฉ์๋ {method.Identifier}์ ๋งค๊ฐ๋ณ์๊ฐ ๋๋ฌด ๋ง์ต๋๋ค ({method.ParameterList.Parameters.Count})");
issues++;
}
}
foreach (var property in root.DescendantNodes().OfType<PropertyDeclarationSyntax>())
{
if (!property.Identifier.ToString().StartsWith(char.ToUpper(property.Identifier.ToString()[0])))
{
Console.WriteLine($"๊ฒฝ๊ณ : ํ๋กํผํฐ ์ด๋ฆ์ ๋๋ฌธ์๋ก ์์ํด์ผ ํฉ๋๋ค ({property.Identifier})");
issues++;
}
}
Console.WriteLine($"๊ฒ์ฌ ์๋ฃ. ๋ฐ๊ฒฌ๋ ๋ฌธ์ : {issues}๊ฐ");
}
}
์ฐ์, ์ฝ๋๊ฐ ์กฐ๊ธ ๊ธธ์ด์ก๋ค์! ๐ ํ์ง๋ง ๊ฑฑ์ ํ์ง ๋ง์ธ์. ํ๋์ฉ ์ดํด๋ณด๋ฉด ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์์.
๐ ์ฝ๋ ์ค๋ช :
- ์ด ๋๊ตฌ๋ ๋ช ๋ น์ค ์ธ์๋ก ๋ฐ์ ํ์ผ ๊ฒฝ๋ก์ C# ์ฝ๋๋ฅผ ๋ถ์ํด์.
- Microsoft.CodeAnalysis๋ฅผ ์ฌ์ฉํด ์ฝ๋๋ฅผ ํ์ฑํ๊ณ ๊ตฌ๋ฌธ ํธ๋ฆฌ๋ฅผ ์์ฑํด์.
- ๋ฉ์๋ ์ด๋ฆ์ด 20์๋ฅผ ์ด๊ณผํ๋์ง, ๋งค๊ฐ๋ณ์๊ฐ 5๊ฐ๋ฅผ ์ด๊ณผํ๋์ง ๊ฒ์ฌํด์.
- ํ๋กํผํฐ ์ด๋ฆ์ด ๋๋ฌธ์๋ก ์์ํ๋์ง ํ์ธํด์.
- ๋ฐ๊ฒฌ๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ์ฝ์์ ์ถ๋ ฅํ๊ณ , ์ต์ข ์ ์ผ๋ก ๋ฌธ์ ์ ๊ฐ์๋ฅผ ๋ณด๊ณ ํด์.
3. ๋น๋ ๋ฐ ์ค์น
์ด์ ์ฐ๋ฆฌ์ ๋ฉ์ง ๋๊ตฌ๋ฅผ ๋น๋ํ๊ณ ์ค์นํด๋ณผ๊น์?
dotnet pack
dotnet tool install --global --add-source ./nupkg CodeStyleChecker
4. ์ฌ์ฉํด๋ณด๊ธฐ
์, ์ด์ ์ฐ๋ฆฌ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด๋ณผ ์๊ฐ์ด์์! ํ ์คํธ๋ฅผ ์ํด ๊ฐ๋จํ C# ํ์ผ์ ๋ง๋ค์ด๋ณผ๊น์?
// TestCode.cs
using System;
class Program
{
public static void ThisIsAReallyLongMethodNameThatShouldTriggerAWarning(int param1, int param2, int param3, int param4, int param5, int param6)
{
Console.WriteLine("Hello, World!");
}
public string propertyWithLowercaseName { get; set; }
}
์ด์ ์ฐ๋ฆฌ์ ๋๊ตฌ๋ก ์ด ํ์ผ์ ๊ฒ์ฌํด๋ด์:
codestyle TestCode.cs
๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๊ฑฐ์์:
๊ฒฝ๊ณ : ๋ฉ์๋ ์ด๋ฆ์ด ๋๋ฌด ๊น๋๋ค (ThisIsAReallyLongMethodNameThatShouldTriggerAWarning)
๊ฒฝ๊ณ : ๋ฉ์๋ ThisIsAReallyLongMethodNameThatShouldTriggerAWarning์ ๋งค๊ฐ๋ณ์๊ฐ ๋๋ฌด ๋ง์ต๋๋ค (6)
๊ฒฝ๊ณ : ํ๋กํผํฐ ์ด๋ฆ์ ๋๋ฌธ์๋ก ์์ํด์ผ ํฉ๋๋ค (propertyWithLowercaseName)
๊ฒ์ฌ ์๋ฃ. ๋ฐ๊ฒฌ๋ ๋ฌธ์ : 3๊ฐ
์ง์! ๐ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋๊ตฌ๊ฐ ์ฝ๋์ ์คํ์ผ ๋ฌธ์ ๋ฅผ ์ ํํ ์ฐพ์๋์ด์!
๐ก ๊ฐ์ ์์ด๋์ด: ์ด ๋๊ตฌ๋ฅผ ๋ ๋ฐ์ ์ํฌ ์ ์๋ ๋ฐฉ๋ฒ๋ค์ด ๋ง์์. ์๋ฅผ ๋ค๋ฉด:
- ๋ ๋ง์ ์ฝ๋ฉ ๊ท์น ์ถ๊ฐํ๊ธฐ (์: ๋ค์ฌ์ฐ๊ธฐ, ์ฃผ์ ์คํ์ผ ๋ฑ)
- ์ค์ ํ์ผ์ ํตํด ๊ท์น์ ์ปค์คํฐ๋ง์ด์ฆํ ์ ์๊ฒ ๋ง๋ค๊ธฐ
- ๋ฌธ์ ๊ฐ ๋ฐ๊ฒฌ๋ ์ ํํ ์ค ๋ฒํธ ํ์ํ๊ธฐ
- ์๋์ผ๋ก ์ผ๋ถ ๋ฌธ์ ๋ฅผ ์์ ํ๋ ๊ธฐ๋ฅ ์ถ๊ฐํ๊ธฐ
์ฌ๋ฌ๋ถ์ ์ฐฝ์๋ ฅ์ ๋ฐํํด ์ด ๋๊ตฌ๋ฅผ ๋์ฑ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ค์ด๋ณด์ธ์!
์ด๋ ๊ฒ ํด์ ์ฐ๋ฆฌ๋ ์ค์ฉ์ ์ธ .NET Core Global Tool์ ๋ง๋ค์ด๋ดค์ด์ . ์ด๋ ์ จ๋์? ์ด์ ์ฌ๋ฌ๋ถ์ ๋จ์ํ ๋๊ตฌ๋ถํฐ ์ค์ฉ์ ์ธ ๊ฐ๋ฐ ๋๊ตฌ๊น์ง ๋ง๋ค ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ถ๊ฒ ๋์์ด์! ๐
์ด๋ฐ ์ข ๋ฅ์ ๋๊ตฌ๋ ๊ฐ๋ฐ ํ์ ์์ฐ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ด์. ์๋ฅผ ๋ค์ด, ์ด ์ฝ๋ ์คํ์ผ ๊ฒ์ฌ๊ธฐ๋ฅผ CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉํ๋ฉด, ๋ชจ๋ ์ฝ๋ ๋ณ๊ฒฝ์ฌํญ์ ๋ํด ์๋์ผ๋ก ์คํ์ผ ๊ฒ์ฌ๋ฅผ ์ํํ ์ ์์ฃ . ์ด๋ ์ฝ๋ ํ์ง์ ์ผ๊ด๋๊ฒ ์ ์งํ๋ ๋ฐ ํฐ ๋์์ด ๋ ๊ฑฐ์์. ๐
๐ .NET Core Global Tools ๋ฐฐํฌํ๊ธฐ
์, ์ด์ ์ฐ๋ฆฌ๋ ๋ฉ์ง Global Tool์ ๋ง๋ค์์ด์. ํ์ง๋ง ์ด๊ฑธ ์ฐ๋ฆฌ๋ง ์ฌ์ฉํ๊ธฐ์ ๋๋ฌด ์๊น์ง ์๋์? ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค๊ณผ ๊ณต์ ํด๋ณผ๊น์? Global Tool์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ด ์๋ค! ๐
1๏ธโฃ NuGet ํจํค์ง ์ค๋นํ๊ธฐ
Global Tool์ ๋ฐฐํฌํ๋ ค๋ฉด ๋จผ์ NuGet ํจํค์ง๋ฅผ ๋ง๋ค์ด์ผ ํด์. ๋คํํ ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ด ๊ณผ์ ์ ๊ฑฐ์ณค์ฃ ! dotnet pack
๋ช
๋ น์ ์คํํ๋ฉด ./nupkg ํด๋์ .nupkg ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
2๏ธโฃ NuGet ๊ณ์ ๋ง๋ค๊ธฐ
์์ง NuGet ๊ณ์ ์ด ์๋ค๋ฉด, NuGet ์น์ฌ์ดํธ์์ ๊ณ์ ์ ๋ง๋ค์ด์ฃผ์ธ์. ์ด ๊ณ์ ์ ํตํด ํจํค์ง๋ฅผ ์ ๋ก๋ํ๊ณ ๊ด๋ฆฌํ ์ ์์ด์.
3๏ธโฃ API ํค ์์ฑํ๊ธฐ
NuGet์ ๋ก๊ทธ์ธํ ํ, 'API Keys' ์น์ ์์ ์๋ก์ด API ํค๋ฅผ ์์ฑํด์ฃผ์ธ์. ์ด ํค๋ ํจํค์ง๋ฅผ ์ ๋ก๋ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. API ํค๋ ์์ ํ๊ฒ ๋ณด๊ดํด์ผ ํด์!
โ ๏ธ ์ฃผ์: API ํค๋ ์ ๋๋ก ๊ณต๊ฐ๋์ด์๋ ์ ๋ฉ๋๋ค. ๊นํ๋ธ ๊ฐ์ ๊ณต๊ฐ ์ ์ฅ์์ ์ฌ๋ฆฌ์ง ์๋๋ก ์ฃผ์ํ์ธ์!
4๏ธโฃ ํจํค์ง ์ ๋ก๋ํ๊ธฐ
์ด์ ์ค๋นํ ํจํค์ง๋ฅผ NuGet์ ์ ๋ก๋ํ ์ฐจ๋ก์์. ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํด ํจํค์ง๋ฅผ ์ ๋ก๋ํ ์ ์์ต๋๋ค:
dotnet nuget push ./nupkg/CodeStyleChecker.1.0.0.nupkg --api-key YOUR_API_KEY --source https://api.nuget.org/v3/index.json
์ด ๋ช
๋ น์์ YOUR_API_KEY
๋ถ๋ถ์ ์ฌ๋ฌ๋ถ์ ์ค์ API ํค๋ก ๊ต์ฒดํด์ฃผ์ธ์.
5๏ธโฃ ํจํค์ง ํ์ธํ๊ธฐ
์ ๋ก๋๊ฐ ์๋ฃ๋๋ฉด, NuGet ์น์ฌ์ดํธ์์ ์ฌ๋ฌ๋ถ์ ํจํค์ง๋ฅผ ํ์ธํ ์ ์์ด์. ํจํค์ง ํ์ด์ง์์๋ ์ค์น ๋ฐฉ๋ฒ, ๋ฒ์ ์ ๋ณด, ๋ค์ด๋ก๋ ํต๊ณ ๋ฑ์ ๋ณผ ์ ์์ต๋๋ค.
6๏ธโฃ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์๊ฒ ์๋ฆฌ๊ธฐ
์ด์ ์ฌ๋ฌ๋ถ์ Global Tool์ด ์ธ์์ ๊ณต๊ฐ๋์์ด์! ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์ด ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์๋ ค์ฃผ์ธ์. ๋ธ๋ก๊ทธ ํฌ์คํธ๋ฅผ ์์ฑํ๊ฑฐ๋, ์์ ๋ฏธ๋์ด์ ๊ณต์ ํ๊ฑฐ๋, ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์ ์๊ฐํด๋ณด๋ ๊ฑด ์ด๋จ๊น์?
๐ก ํ: README ํ์ผ์ ์ ์์ฑํ๋ ๊ฒ์ด ์ค์ํด์. ๋๊ตฌ์ ๊ธฐ๋ฅ, ์ค์น ๋ฐฉ๋ฒ, ์ฌ์ฉ ์์ ๋ฑ์ ๋ช ํํ๊ฒ ์ค๋ช ํด์ฃผ์ธ์. ์ข์ ๋ฌธ์๋ ๋ ๋ง์ ์ฌ์ฉ์๋ฅผ ๋์ด๋ค์ผ ์ ์์ด์!
7๏ธโฃ ์ง์์ ์ธ ๊ด๋ฆฌ์ ์ ๋ฐ์ดํธ
ํจํค์ง๋ฅผ ๋ฐฐํฌํ ํ์๋ ํ ์ผ์ด ๋จ์์์ด์. ์ฌ์ฉ์๋ค์ ํผ๋๋ฐฑ์ ์์งํ๊ณ , ๋ฒ๊ทธ๋ฅผ ์์ ํ๊ณ , ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๋ฑ ์ง์์ ์ธ ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. ์ ๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ณตํ๋ฉด ์ฌ์ฉ์๋ค์ ์ ๋ขฐ๋ฅผ ์ป์ ์ ์์ด์.
๋ฒ์ ์ ์ ๋ฐ์ดํธํ ๋๋ ์๋งจํฑ ๋ฒ์ ๋์ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ข์์. ์ด๋ ๋ฒ์ ๋ฒํธ๋ฅผ ํตํด ๋ณ๊ฒฝ์ฌํญ์ ์ค์๋๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ด์์.
๐ ์ถํํฉ๋๋ค!
์ฌ๋ฌ๋ถ์ ์ด์ ์์ ๋ง์ .NET Core Global Tool์ ๊ฐ๋ฐํ๊ณ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ ๋ฐฐ์ ์ด์! ์ด๋ ์ ๋ง ๋๋จํ ์ฑ๊ณผ์ ๋๋ค. ์ฌ๋ฌ๋ถ์ ๋๊ตฌ๊ฐ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์๊ฒ ๋์์ด ๋๊ณ , ๊ฐ๋ฐ ์ปค๋ฎค๋ํฐ์ ๊ธฐ์ฌํ๊ฒ ๋ ๊ฑฐ์์. ๐๐๐
์ด์ ์ฌ๋ฌ๋ถ์ ์ฐฝ์๋ ฅ์ ๋ง์๊ป ๋ฐํํด๋ณด์ธ์. ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋๊ตฌ๋ฅผ ๋ง๋ค๊ณ ์ถ๋์? ์์ด๋์ด๊ฐ ๋ ์ค๋ฅด๋ฉด ์ฃผ์ ํ์ง ๋ง๊ณ ๋์ ํด๋ณด์ธ์. ๊ทธ๋ฆฌ๊ณ ๊ผญ ์ฌ๋ฅ๋ท(https://www.jaenung.net)์์ ์ฌ๋ฌ๋ถ์ ๊ฒฝํ์ ๊ณต์ ํด์ฃผ์ธ์. ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์๊ฒ ํฐ ์๊ฐ์ ์ค ์ ์์ ๊ฑฐ์์! ๐
๐ค ๋ง๋ฌด๋ฆฌ: ์๊ฐํด๋ณผ ์ ๊ณผ ๋ค์ ๋จ๊ณ
์ฐ๋ฆฌ๋ ์ง๊ธ๊น์ง .NET Core Global Tools์ ๊ฐ๋ฐ๋ถํฐ ๋ฐฐํฌ๊น์ง ์ ๊ณผ์ ์ ์ดํด๋ดค์ด์. ์ ๋ง ๊ธด ์ฌ์ ์ด์์ฃ ? ํ์ง๋ง ์ด๊ฒ ๋์ด ์๋์์. ๊ฐ๋ฐ์๋ก์ ์ฐ๋ฆฌ๋ ํญ์ ๋ฐฐ์ฐ๊ณ ์ฑ์ฅํด์ผ ํฉ๋๋ค. ๊ทธ๋์ ๋ง์ง๋ง์ผ๋ก ๋ช ๊ฐ์ง ์๊ฐํด๋ณผ ์ ๊ณผ ๋ค์ ๋จ๊ณ๋ฅผ ์ ์ํ๊ณ ์ถ์ด์. ๐ฑ
๐ง ์๊ฐํด๋ณผ ์
- ํ์ฅ์ฑ: ์ฌ๋ฌ๋ถ์ด ๋ง๋ ๋๊ตฌ๋ ๋ค์ํ ์ํฉ์์ ์ฌ์ฉ๋ ์ ์๋์? ๋ ๋ง์ ์ฌ์ฉ์์๊ฒ ๋์์ด ๋๋๋ก ์ด๋ป๊ฒ ํ์ฅํ ์ ์์๊น์?
- ์ฑ๋ฅ: ๋๊ท๋ชจ ํ๋ก์ ํธ์์๋ ๋น ๋ฅด๊ฒ ๋์ํ๋์? ์ฑ๋ฅ์ ๊ฐ์ ํ ๋ฐฉ๋ฒ์ ์์๊น์?
- ์ฌ์ฉ์ ๊ฒฝํ: ๋๊ตฌ์ ์ฌ์ฉ๋ฒ์ด ์ง๊ด์ ์ธ๊ฐ์? ์ฌ์ฉ์ ํผ๋๋ฐฑ์ ์ด๋ป๊ฒ ์์งํ๊ณ ๋ฐ์ํ ์ ์์๊น์?
- ๋ณด์: ๋๊ตฌ๊ฐ ์ฒ๋ฆฌํ๋ ๋ฐ์ดํฐ๋ ์์ ํ๊ฐ์? ๋ณด์ ์ทจ์ฝ์ ์ ์๋์ง ์ด๋ป๊ฒ ํ์ธํ ์ ์์๊น์?
๐ ๋ค์ ๋จ๊ณ
- ํ ์คํธ ๊ฐํํ๊ธฐ: ๋จ์ ํ ์คํธ, ํตํฉ ํ ์คํธ๋ฅผ ์ถ๊ฐํด ๋๊ตฌ์ ์์ ์ฑ์ ๋์ฌ๋ณด์ธ์.
- ๋ฌธ์ํ ๊ฐ์ ํ๊ธฐ: ์์ธํ ์ฌ์ฉ ์ค๋ช ์, API ๋ฌธ์ ๋ฑ์ ์์ฑํด ์ฌ์ฉ์๋ค์ ์ดํด๋ฅผ ๋์ต๋๋ค.
- ์ปค๋ฎค๋ํฐ ๋ง๋ค๊ธฐ: GitHub ๋ฑ์์ ํ๋ก์ ํธ๋ฅผ ์คํ์์ค๋ก ๊ณต๊ฐํ๊ณ , ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ๊ธฐ์ฌ๋ฅผ ๋ฐ์๋ณด์ธ์.
- CI/CD ํ์ดํ๋ผ์ธ ๊ตฌ์ถํ๊ธฐ: ์๋ํ๋ ๋น๋, ํ ์คํธ, ๋ฐฐํฌ ๊ณผ์ ์ ๋ง๋ค์ด ๊ฐ๋ฐ ํจ์จ์ ๋์ ๋๋ค.
- ๋ค๋ฅธ ํ๋ซํผ ์ง์ํ๊ธฐ: .NET Core์ ํฌ๋ก์ค ํ๋ซํผ ํน์ฑ์ ํ์ฉํด Windows, macOS, Linux ๋ชจ๋์์ ๋์ํ๋ ๋๊ตฌ๋ก ๋ง๋ค์ด๋ณด์ธ์.
๐ก ์์ด๋์ด: ์ฌ๋ฌ๋ถ์ Global Tool์ ๋ค๋ฅธ ๊ฐ๋ฐ ๋๊ตฌ๋ ์๋น์ค์ ์ฐ๋ํด๋ณด๋ ๊ฑด ์ด๋จ๊น์? ์๋ฅผ ๋ค์ด, Slack ๋ด๊ณผ ์ฐ๋ํด ์ฝ๋ ์คํ์ผ ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์๋์ผ๋ก ์ฑ๋์ ๋ณด๊ณ ํ๊ฒ ๋ง๋ค ์ ์์ด์. ์ด๋ฐ ์์ ํ์ฅ์ ๋๊ตฌ์ ๊ฐ์น๋ฅผ ํฌ๊ฒ ๋์ผ ์ ์๋ต๋๋ค!
๐ ๋ง์ง๋ง์ผ๋ก...
์ฌ๋ฌ๋ถ์ด ๋ง๋ ๋๊ตฌ๊ฐ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ์ผ์์ ์กฐ๊ธ์ด๋ผ๋ ํธํ๊ฒ ๋ง๋ค ์ ์๋ค๋ฉด, ๊ทธ๊ฒ์ด์ผ๋ง๋ก ๊ฐ๋ฐ์๋ก์ ๋๋ ์ ์๋ ๊ฐ์ฅ ํฐ ๋ณด๋์ด ์๋๊น์? ์ฌ๋ฌ๋ถ์ ๋ ธ๋ ฅ๊ณผ ์ฐฝ์์ฑ์ด ๊ฐ๋ฐ ์ปค๋ฎค๋ํฐ ์ ์ฒด์ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์๋ค๋ ์ ์ ํญ์ ๊ธฐ์ตํ์ธ์.
๊ทธ๋ฆฌ๊ณ ์์ง ๋ง์ธ์. ๊ฐ๋ฐ์ ํผ์ ํ๋ ๊ฒ์ด ์๋์์. ์ฌ๋ฅ๋ท(https://www.jaenung.net)๊ฐ์ ํ๋ซํผ์ ํตํด ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค๊ณผ ๊ฒฝํ์ ๋๋๊ณ , ์๋ก ๋ฐฐ์ฐ๊ณ ์ฑ์ฅํ๋ ๊ธฐํ๋ฅผ ๊ฐ์ ธ๋ณด์ธ์. ์ฌ๋ฌ๋ถ์ ์ง์๊ณผ ๊ฒฝํ์ด ๋๊ตฐ๊ฐ์๊ฒ ํฐ ๋์์ด ๋ ์ ์๋ต๋๋ค. ๐
์, ์ด์ ์ฌ๋ฌ๋ถ๋ง์ ๋ฉ์ง .NET Core Global Tool์ ๋ง๋ค ์ค๋น๊ฐ ๋์ จ๋์? ์ธ์์ ๋ณํ์ํฌ ์ฌ๋ฌ๋ถ์ ์์ด๋์ด๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ด์. ํ์ดํ ! ๐๐
๊ด๋ จ ํค์๋
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ