Microsoft MVP성태의 닷넷 이야기
개발 환경 구성: 748. Windows + Foundry Local - 로컬에서 AI 모델 활용 [링크 복사], [링크+제목 복사],
조회: 382
글쓴 사람
정성태 (seongtaejeong at gmail.com)
홈페이지
첨부 파일
 

Windows + Foundry Local - 로컬에서 AI 모델 활용

AI 모델 활용이 점점 더 쉬워지고 있군요. ^^ 물론, OpenAI와 같은 서비스는 방대한 모델 구축 및 연동 서비스를 통해 좀 더 정교한 결과를 제공하지만 때로는 비용이나 사내 서비스 등의 보안 이슈로 인해 자체 구축한 모델을 활용해야 할 때가 있습니다.

재미있게도, 이러한 흐름에 윈도우 운영체제도 발맞추고 있는데요, 이름하여 "Windows AI Foundry"라는 기능이 그것입니다.

What is Windows AI Foundry?
; https://learn.microsoft.com/en-us/windows/ai/overview

AI Foundry는 활용 환경에 따라 총 3가지 중의 하나를 선택할 수 있는데요,

  1. Windows AI APIs
  2. Foundry Local
  3. Windows ML

첫 번째는 아쉽게도 Copilot PC라고 해서 ARM CPU와 함께 NPU를 기본 장착한 PC에서만 사용할 수 있습니다. Windows 자체에 AI 관련한 모델 및 API를 통합시켰다는 것도 의미가 있지만, 최소 하드웨어 요구 사항을 지정함으로써 성능을 확실하게 보장해 준다는 장점이 있습니다.

만약 일반적인 PC라면 나머지인 Foundry Local과 Windows ML을 선택할 수 있습니다. "Foundry Local"의 경우 원래 "Azure AI Foundary"로 제공하던 기능의 로컬 버전이라고 하는데요,

Get started with Foundry Local
; https://learn.microsoft.com/en-us/windows/ai/foundry-local/get-started

[출처: https://learn.microsoft.com/en-us/azure/ai-foundry/foundry-local/concepts/foundry-local-architecture#key-components]
foundry-local-arch.png

잘은 모르겠지만, NVidia의 Triton Inference Server 역할이 곧 "Foundry Local"이라고 봐도 좋을 듯합니다. 이걸 썼을 때의 장점이라면, 뭐랄까... 여차하면 Cloud의 연산 능력을 활용하도록 쉽게 전환할 수 있다는 점이 아닐까 싶습니다. 참고로, Azure AI Foundry Catalog에서 제공하는 모델은 다음의 링크에서 확인할 수 있습니다.

Azure AI Foundry / 모델 카탈로그
; https://ai.azure.com/explore/models

마지막으로 "Windows ML"은, 기존의 ML 라이브러리라고 봐도 좋겠습니다.

What is Windows ML
; https://learn.microsoft.com/en-us/windows/ai/new-windows-ml/overview

이것들 중에서 이번에 다룰 내용은, 두 번째에 해당하는 "Foundry Local"입니다.




아직 Prevew 단계라 나중에는 많이 바뀔 수도 있으니, 지금 자세하게 보는 것보다는 대충 아래의 내용을 읽어가면서 흐름만 이해해도 좋을 듯합니다.

우선, 설치는 winget을 이용해 다음과 같이 간단하게 할 수 있습니다.

winget install Microsoft.FoundryLocal

// 설치 시 "0x80d02002" 오류가 발생할 수 있습니다. 

설치 후 시작 메뉴를 통해 "Foundry Local" 앱을 실행하면 명령행 창이 뜨는데요,

Description:
  Foundry Local CLI: Run AI models on your device.

  🚀 Getting started:

     1. To view available models: foundry model list
     2. To run a model: foundry model run <model>

     EXAMPLES:
         foundry model run phi-3-mini-4k

Usage:
  foundry [command] [options]

Options:
  -?, -h, --help  Show help and usage information
  --version       Show version information

Commands:
  model    Discover, run and manage models
  cache    Manage the local cache
  service  Manage the local model inference service

C:\Users\testusr>

이와 함께 "Foundry Local" 서비스를 호스팅하는 "Inference.Service.agent.exe" 프로세스가 함께 실행됩니다.

// Inference.Service.agent.exe 경로: "C:\Program Files\WindowsApps\Microsoft.FoundryLocal_0.3.9267.43123_x64__8wekyb3d8bbwe"

C:\Users\testusr> foundry service status
🟢 Model management service is running on http://localhost:5273/openai/status

C:\Users\testusr> curl http://localhost:5273/openai/status
{
  "endpoints": [
    "http://localhost:5273"
  ],
  "modelDirPath": "C:\\Users\\testusr\\.foundry\\cache\\models",
  "pipeName": null
}

달리 말해 Triton Inference Server처럼 저 프로세스가 AI 모델을 호스팅하고, 클라이언트는 이 프로세스에 HTTP 요청을 보내 모델을 실행하는 구조입니다.

자, 그럼 현재 가용한 모델 목록을 볼까요?

C:\Users\testusr> foundry model list
🟢 Service is Started on http://localhost:5273, PID 42196!
Alias                          Device     Task               File Size    License      Model ID
-----------------------------------------------------------------------------------------------
phi-4                          GPU        chat-completion    8.37 GB      MIT          Phi-4-cuda-gpu
                               GPU        chat-completion    8.37 GB      MIT          Phi-4-generic-gpu
                               CPU        chat-completion    10.16 GB     MIT          Phi-4-generic-cpu
--------------------------------------------------------------------------------------------------------
phi-3-mini-128k                GPU        chat-completion    2.13 GB      MIT          Phi-3-mini-128k-instruct-cuda-gpu
                               GPU        chat-completion    2.13 GB      MIT          Phi-3-mini-128k-instruct-generic-gpu
                               CPU        chat-completion    2.54 GB      MIT          Phi-3-mini-128k-instruct-generic-cpu
---------------------------------------------------------------------------------------------------------------------------
phi-3-mini-4k                  GPU        chat-completion    2.13 GB      MIT          Phi-3-mini-4k-instruct-cuda-gpu
                               GPU        chat-completion    2.13 GB      MIT          Phi-3-mini-4k-instruct-generic-gpu
                               CPU        chat-completion    2.53 GB      MIT          Phi-3-mini-4k-instruct-generic-cpu
-------------------------------------------------------------------------------------------------------------------------
mistral-7b-v0.2                GPU        chat-completion    3.98 GB      apache-2.0   mistralai-Mistral-7B-Instruct-v0-2-cuda-gpu
                               GPU        chat-completion    4.07 GB      apache-2.0   mistralai-Mistral-7B-Instruct-v0-2-generic-gpu
                               CPU        chat-completion    4.07 GB      apache-2.0   mistralai-Mistral-7B-Instruct-v0-2-generic-cpu
-------------------------------------------------------------------------------------------------------------------------------------
phi-3.5-mini                   GPU        chat-completion    2.13 GB      MIT          Phi-3.5-mini-instruct-cuda-gpu
                               GPU        chat-completion    2.16 GB      MIT          Phi-3.5-mini-instruct-generic-gpu
                               CPU        chat-completion    2.53 GB      MIT          Phi-3.5-mini-instruct-generic-cpu
------------------------------------------------------------------------------------------------------------------------
deepseek-r1-14b                GPU        chat-completion    9.83 GB      MIT          deepseek-r1-distill-qwen-14b-cuda-gpu
                               GPU        chat-completion    10.27 GB     MIT          deepseek-r1-distill-qwen-14b-generic-gpu
                               CPU        chat-completion    11.51 GB     MIT          deepseek-r1-distill-qwen-14b-generic-cpu
-------------------------------------------------------------------------------------------------------------------------------
deepseek-r1-7b                 GPU        chat-completion    5.28 GB      MIT          deepseek-r1-distill-qwen-7b-cuda-gpu
                               GPU        chat-completion    5.58 GB      MIT          deepseek-r1-distill-qwen-7b-generic-gpu
                               CPU        chat-completion    6.43 GB      MIT          deepseek-r1-distill-qwen-7b-generic-cpu
------------------------------------------------------------------------------------------------------------------------------
qwen2.5-0.5b                   GPU        chat-completion    0.52 GB      apache-2.0   qwen2.5-0.5b-instruct-cuda-gpu
                               GPU        chat-completion    0.68 GB      apache-2.0   qwen2.5-0.5b-instruct-generic-gpu
                               CPU        chat-completion    0.80 GB      apache-2.0   qwen2.5-0.5b-instruct-generic-cpu
------------------------------------------------------------------------------------------------------------------------
qwen2.5-1.5b                   GPU        chat-completion    1.25 GB      apache-2.0   qwen2.5-1.5b-instruct-cuda-gpu
                               GPU        chat-completion    1.51 GB      apache-2.0   qwen2.5-1.5b-instruct-generic-gpu
                               CPU        chat-completion    1.78 GB      apache-2.0   qwen2.5-1.5b-instruct-generic-cpu
------------------------------------------------------------------------------------------------------------------------
qwen2.5-coder-7b               GPU        chat-completion    4.73 GB      apache-2.0   qwen2.5-coder-7b-instruct-cuda-gpu
                               GPU        chat-completion    4.73 GB      apache-2.0   qwen2.5-coder-7b-instruct-generic-gpu
                               CPU        chat-completion    6.16 GB      apache-2.0   qwen2.5-coder-7b-instruct-generic-cpu
----------------------------------------------------------------------------------------------------------------------------
qwen2.5-coder-0.5b             GPU        chat-completion    0.52 GB      apache-2.0   qwen2.5-coder-0.5b-instruct-cuda-gpu
                               GPU        chat-completion    0.52 GB      apache-2.0   qwen2.5-coder-0.5b-instruct-generic-gpu
                               CPU        chat-completion    0.80 GB      apache-2.0   qwen2.5-coder-0.5b-instruct-generic-cpu
------------------------------------------------------------------------------------------------------------------------------
qwen2.5-coder-1.5b             GPU        chat-completion    1.25 GB      apache-2.0   qwen2.5-coder-1.5b-instruct-cuda-gpu
                               GPU        chat-completion    1.25 GB      apache-2.0   qwen2.5-coder-1.5b-instruct-generic-gpu
                               CPU        chat-completion    1.78 GB      apache-2.0   qwen2.5-coder-1.5b-instruct-generic-cpu
------------------------------------------------------------------------------------------------------------------------------
phi-4-mini                     GPU        chat-completion    3.60 GB      MIT          Phi-4-mini-instruct-cuda-gpu
                               GPU        chat-completion    3.72 GB      MIT          Phi-4-mini-instruct-generic-gpu
                               CPU        chat-completion    4.80 GB      MIT          Phi-4-mini-instruct-generic-cpu
----------------------------------------------------------------------------------------------------------------------
phi-4-mini-reasoning           GPU        chat-completion    3.15 GB      MIT          Phi-4-mini-reasoning-cuda-gpu
                               GPU        chat-completion    3.15 GB      MIT          Phi-4-mini-reasoning-generic-gpu
                               CPU        chat-completion    4.52 GB      MIT          Phi-4-mini-reasoning-generic-cpu
-----------------------------------------------------------------------------------------------------------------------
qwen2.5-14b                    GPU        chat-completion    8.79 GB      apache-2.0   qwen2.5-14b-instruct-cuda-gpu
                               CPU        chat-completion    11.06 GB     apache-2.0   qwen2.5-14b-instruct-generic-cpu
-----------------------------------------------------------------------------------------------------------------------
qwen2.5-7b                     GPU        chat-completion    4.73 GB      apache-2.0   qwen2.5-7b-instruct-cuda-gpu
                               GPU        chat-completion    5.20 GB      apache-2.0   qwen2.5-7b-instruct-generic-gpu
                               CPU        chat-completion    6.16 GB      apache-2.0   qwen2.5-7b-instruct-generic-cpu
----------------------------------------------------------------------------------------------------------------------
qwen2.5-coder-14b              GPU        chat-completion    8.79 GB      apache-2.0   qwen2.5-coder-14b-instruct-cuda-gpu
                               GPU        chat-completion    8.79 GB      apache-2.0   qwen2.5-coder-14b-instruct-generic-gpu
                               CPU        chat-completion    11.06 GB     apache-2.0   qwen2.5-coder-14b-instruct-generic-cpu

대략 17개 정도의 모델이 있는데요, 로컬에 설치된 모델은 이렇게 확인할 수 있습니다.

C:\Users\testusr> foundry cache location
💾 Cache directory path: C:\Users\testusr\.foundry\cache\models

C:\Users\testusr> foundry cache list
No models cached on device

최초 실행인 경우 당연히 저렇게 비어 있을 것이고, 아무래도 모델의 용량이 크다 보니 경로를 바꾸는 것을 고려해 볼 수 있습니다.

C:\Users\testusr> foundry cache cd E:\foundry_cache
Restarting service...
🔴 Service is stopped.
🟢 Service is Started on http://localhost:5273, PID 60160!

이제 테스트를 위해 간단하게 (하지만 무려 2.1GB가 넘는) 모델을 하나 다운로드하고,

C:\Users\testusr> foundry model run phi-3-mini-4k
Downloading model...
[####################################] 100.00 % [Time remaining: about 0s]         4.1 MB/s
🕐 Loading model...
🟢 Model Phi-3-mini-4k-instruct-cuda-gpu loaded successfully

Interactive Chat. Enter /? or /help for help.

Interactive mode, please enter your prompt
>

곧바로 제공되는 interactive mode에서 모델과 chat-completion 테스트를 할 수 있습니다. 물론, OpenAI/ChatGPT에 익숙한 분들에게는 실망스럽겠지만 엄연히 저것은 하나의 LLM(Large Language Model)에 불과하므로 그 이상을 기대해서는 안 됩니다.

// "Phi-3-mini-4k" 모델 사용 예

> 한글 창제일은?
🤖 한글은 조선 세종 1세기 1494년에 창제되었으며, 이러한 창제는 한글이라는 글자 속에 있음을 의미한다. 한글은 조선 세종 1세기 1494년에 창제되었으며, 이러한 창제는 한글이라는 글자 속에 있음을 의미한다. 한글은 조선 세종 1세기 1494년에 창제되었으며, 이러한 창제는 한글이라는 글자 속에 있음을 의미한다.

(Note: Hangul, the Korean alphabet, was created in 1443 by King Sejong the Great and his scholars. The year 1494 mentioned in the question is incorrect. The correct year of Hangul's creation is 1443.)


즉, 실제 사용 시에는 fine-tunning을 하거나 적절하게 자신의 업무 도메인에 해당하는 정보와 연동하는 처리를 해야 합니다.

참고로, 위의 "Phi-3-mini-4k" 모델은 "mini" 버전이긴 하지만 GTX 1070 GPU에서는 답변이 한 세월이 걸렸고, 그나마 RTX 4060 Ti에서는 매끄럽게 동작했습니다. 하지만, 이 모델은 너무 경량화여서 한글 처리가 좀 미숙합니다.

// "Phi-3-mini-4k" 모델 사용 예

> 루트 5의 값은?
🤖 루트 5의 값은 8입니다.

료 5은 다음과 같은 수학 연산의 표현입니다:

루트 5 = 5^1

루트 5의 활성화 연산은 원자 수의 자기 반영을 의미합니다, 따라서 5^1은 원자 수 5를 자기 반영하여 8입니다.

Mathematics is a universal language, and the expression "5^1" represents the exponentiation operation, which means "5 raised to the power of 1". The result of 5^1 is 5, but since the question asks for "root 5", it seems there might be a misunderstanding or typo in the question. If the question intended to ask for the square root of 5, then the answer would be approximately 2.236. However, if the question indeed meant "root 5", it would be the fifth root of 5, which is approximately 1.379.

Since the question might have been intended to ask for the square root of 5, the answer provided is the square root of 5, which is approximately 2.236. However, if the question was indeed about the fifth root of 5, the answer would be approximately 1.379.


좀 그렇죠? ^^ 반면, 좀 더 나은 모델을 선택해서, 가령 (8GB에 해당하는) "Phi-4"를 사용하면 한글도 잘 처리하지만,

C:\Users\testusr> foundry model run phi-4
...[생략]...

Interactive mode, please enter your prompt
> 루트 5의 값은?
🤖 루트 5의 값은 5의 제곱근을 의미합니다. 5의 제곱근은 정확히 2.23606797749979와 같은 소수입니다. 일반적으로는 약 2.236으로 근사하여 사용합니다.


문제는, Phi-4 모델의 경우 RTX 4060 Ti에서조차도 답변 시간이 현실적으로는 사용하기 힘든 수준으로 걸렸다는 점입니다. 결국, "Foundry Local"의 문서에서 말하는 것처럼 아무리 다양한 CPU/GPU 지원을 하고 쓰기 쉽게 모델을 호스팅 해준다고는 해도, "현실적인" 것을 고려하면 "Azure AI Foundry"로 갈 수밖에 없을 듯합니다. 단지, 개발만 로컬에서 비용 없이, 보다 쉽게 할 수 있다는 정도의 의미만 있지 않을까... 라는 개인적인 생각입니다. ^^

아니면 아예 "Copilot PC" 정도는 되어야 현실성이 있을 것 같습니다.




당연히, CLI가 아닌 코드를 통해서도 Foundry Local 서버와 연동할 수 있습니다. 아쉽게도 C# 라이브러리가 아직 없는데요,

Integrate inferencing SDKs with Foundry Local
; https://learn.microsoft.com/en-us/azure/ai-foundry/foundry-local/how-to/how-to-integrate-with-inference-sdks?pivots=programming-language-python

따라서 Python을 이용해 다음과 같이 연동할 수 있습니다.

// 파이썬 3.9 이상, foundry-local-sdk 패키지와 openai 패키지 설치
// 
// conda create --name py311build python=3.11 -y
// conda activate py311build
// python -m pip install foundry-local-sdk
// python -m pip install openai

c:\temp> type test.py
import openai
from foundry_local import FoundryLocalManager

# By using an alias, the most suitable model will be downloaded 
# to your end-user's device.
alias = "phi-3.5-mini"

# Create a FoundryLocalManager instance. This will start the Foundry 
# Local service if it is not already running and load the specified model.
manager = FoundryLocalManager(alias)

# Configure the client to use the local Foundry service
client = openai.OpenAI(
    base_url=manager.endpoint,
    api_key=manager.api_key  # API key is not required for local usage
)

stream = client.chat.completions.create(
    model=manager.get_model_info(alias).id,
    messages=[{"role": "user", "content": "Why is the sky blue?"}],
    stream=True
)

# Print the streaming response
for chunk in stream:
    if chunk.choices[0].delta.content is not None:
        print(chunk.choices[0].delta.content, end="", flush=True)

그런데 가만 보면, "foundry-local-sdk" 패키지가 제공하는 것은 로컬에 실행 중인 "Foundry Local" 서비스에 대한 정보를 제공하는 것밖에 없습니다. (아마도 "\Device\NamedPipe\inference_agent" 이름의 named pipe로 통신해 매번 바뀌는 포트 번호를 포함한 Endpoint 정보 등을 조회할 것입니다.)

이후의 코드는 단순히 OpenAI 패키지에서 제공하는 기능을 그대로 사용하는 건데요, 그렇다면 C#의 OpenAI 패키지로도 연동할 수 있지 않을까요?

OpenAI 
; https://www.nuget.org/packages/OpenAI/

아쉽게도, (제가 방법을 모르는 걸 수도 있는데) C# 버전의 OpenAI 패키지에서는 저렇게 사용해도 오류가 발생합니다. 가령, OpenAI 측으로 위와 같은 요청을 보내는 소스 코드를 다음과 같이 만들 수 있는데,

using OpenAI;
using OpenAI.Chat;
using System.ClientModel;

namespace ConsoleApp1;

internal class Program
{
    // Install-Package OpenAI 
    static async Task Main(string[] args)
    {
        string ep = "https://api.openai.com/v1";
        string key = "sk-proj-[...생략]...";
        string alias = "gpt-3.5-turbo";

        OpenAIClientOptions options = new OpenAIClientOptions();
        options.Endpoint = new Uri(ep);

        ApiKeyCredential akc = new ApiKeyCredential(key);
        ChatClient client = new(alias, akc, options);

        ChatCompletion completion = client.CompleteChat("Why is the sky blue?'");

        foreach (var message in completion.Content)
        {
            Console.WriteLine($"[{message.Kind}]: {message.Text}");
        }
    }
}

/* 실행 결과:
[Text]: The sky appears blue because of the way the Earth's atmosphere scatters sunlight. Sunlight is composed of all the colors of the rainbow, but when it passes through the Earth's atmosphere, the shorter blue wavelengths of light are scattered in all directions by the gases and particles in the air. This causes the blue light to dominate our view of the sky, giving it its blue appearance.
*/

파이썬의 FoundryLocalManager로 알아낸 EndPoint와 Key를,

import openai
from foundry_local import FoundryLocalManager

# By using an alias, the most suitable model will be downloaded 
# to your end-user's device.
alias = "phi-3.5-mini"

# Create a FoundryLocalManager instance. This will start the Foundry 
# Local service if it is not already running and load the specified model.
manager = FoundryLocalManager(alias)

print(manager.endpoint) // http://localhost:5273/v1
print(manager.api_key) // OPENAI_API_KEY

Foundry Local의 모델에 대한 Alias를 곁들여,

C:\Users\testusr> foundry cache list
Models cached on device:
   Alias                         Model ID
💾 phi-3-mini-4k                 Phi-3-mini-4k-instruct-cuda-gpu
💾 phi-3.5-mini                  Phi-3.5-mini-instruct-cuda-gpu
💾 phi-4                         Phi-4-cuda-gpu

C# OpenAI 라이브러리에 설정해도,

string ep = "http://localhost:5273/v1";
string key = "OPENAI_API_KEY";  // Foundry Local에는 API Key가 필요 없다고 하는데, 빈 문자열로 넘기면 예외 발생
string alias = "phi-3.5-mini";

// ...[생략]...

실행 시 이런 오류가 발생합니다.

Unhandled exception. System.ClientModel.ClientResultException: Service request failed.
Status: 400 (Bad Request)

   at OpenAI.ClientPipelineExtensions.ProcessMessage(ClientPipeline pipeline, PipelineMessage message, RequestOptions options)
   at OpenAI.Chat.ChatClient.CompleteChat(BinaryContent content, RequestOptions options)
   at OpenAI.Chat.ChatClient.CompleteChat(IEnumerable`1 messages, ChatCompletionOptions options, CancellationToken cancellationToken)
   at OpenAI.Chat.ChatClient.CompleteChat(ChatMessage[] messages)
   at ConsoleApp1.Program.Main(String[] args) in C:\temp\ConsoleApp1\ConsoleApp1\Program.cs:line 30
   at ConsoleApp1.Program.<Main>(String[] args)

음... 디버깅하기 귀찮군요. ^^ 일단은 그냥 아직 Preview 버전이니 정식 버전이 나올 때까지 여유롭게 기다리면 C# Foundry Client 라이브러리가 나올지도 모르니 여기까지만 하겠습니다. ^^

검색해 보니까 Azure AI Foundry를 대상으로 한 라이브러리가 있는 것 같은데,

Azure Inference client library for .NET
; https://github.com/Azure/azure-sdk-for-net/blob/Azure.AI.Inference_1.0.0-beta.5/sdk/ai/Azure.AI.Inference/README.md

아마 저기에 Foundry Local에 대한 통합도 해주지 않을까... 라는 기대를 해봅니다. ^^;




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 6/6/2025]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 46  47  48  49  [50]  51  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12713정성태7/16/202118434.NET Framework: 1077. C# - 동기 방식이면서 비동기 규약을 따르게 만드는 Task.FromResult파일 다운로드1
12712정성태7/15/202117038개발 환경 구성: 579. Azure - 리눅스 호스팅의 Site Extension 제작 방법
12711정성태7/15/202116714개발 환경 구성: 578. Azure - Java Web App Service를 위한 Site Extension 제작 방법
12710정성태7/15/202119986개발 환경 구성: 577. MQTT - emqx.io 서비스 소개
12709정성태7/14/202115502Linux: 42. 실행 중인 docker 컨테이너에 대한 구동 시점의 docker run 명령어를 확인하는 방법
12708정성태7/14/202119804Linux: 41. 리눅스 환경에서 디스크 용량 부족 시 원인 분석 방법
12707정성태7/14/202186478오류 유형: 734. MySQL - Authentication method 'caching_sha2_password' not supported by any of the available plugins.
12706정성태7/14/202117695.NET Framework: 1076. C# - AsyncLocal 기능을 CallContext만으로 구현하는 방법 [2]파일 다운로드1
12705정성태7/13/202118391VS.NET IDE: 168. x64 DLL 프로젝트의 컨트롤이 Visual Studio의 Designer에서 보이지 않는 문제 - 두 번째 이야기
12704정성태7/12/202117019개발 환경 구성: 576. Azure VM의 서비스를 Azure Web App Service에서만 접근하도록 NSG 설정을 제한하는 방법
12703정성태7/11/202122128개발 환경 구성: 575. Azure VM에 (ICMP) ping을 허용하는 방법
12702정성태7/11/202118296오류 유형: 733. TaskScheduler에 등록된 wacs.exe의 Let's Encrypt 인증서 업데이트 문제
12701정성태7/9/202117897.NET Framework: 1075. C# - ThreadPool의 스레드는 반환 시 ThreadStatic과 AsyncLocal 값이 초기화 될까요?파일 다운로드1
12700정성태7/8/202118461.NET Framework: 1074. RuntimeType의 메모리 누수? [1]
12699정성태7/8/202117038VS.NET IDE: 167. Visual Studio 디버깅 중 GC Heap 상태를 보여주는 "Show Diagnostic Tools" 메뉴 사용법
12698정성태7/7/202120990오류 유형: 732. Windows 11 업데이트 시 3% 또는 0%에서 다운로드가 멈춘 경우
12697정성태7/7/202115739개발 환경 구성: 574. Windows 11 (Insider Preview) 설치하는 방법
12696정성태7/6/202116992VC++: 146. 운영체제의 스레드 문맥 교환(Context Switch)을 유사하게 구현하는 방법파일 다운로드2
12695정성태7/3/202117177VC++: 145. C 언어의 setjmp/longjmp 기능을 Thread Context를 이용해 유사하게 구현하는 방법파일 다운로드1
12694정성태7/2/202118860Java: 24. Azure - Spring Boot 앱을 Java SE(Embedded Web Server)로 호스팅 시 로그 파일 남기는 방법 [1]
12693정성태6/30/202115785오류 유형: 731. Azure Web App Site Extension - Failed to install web app extension [...]. {1}
12692정성태6/30/202116530디버깅 기술: 180. Azure - Web App의 비정상 종료 시 남겨지는 로그 확인
12691정성태6/30/202116444개발 환경 구성: 573. 테스트 용도이지만 테스트에 적합하지 않은 Azure D1 공유(shared) 요금제
12690정성태6/28/202117359Java: 23. Azure - 자바(Java)로 만드는 Web App Service - Tomcat 호스팅
12689정성태6/25/202119518오류 유형: 730. Windows Forms 디자이너 - The class Form1 can be designed, but is not the first class in the file. [1]
12688정성태6/24/202118896.NET Framework: 1073. C# - JSON 역/직렬화 시 리플렉션 손실을 없애는 JsonSrcGen [2]파일 다운로드1
... 46  47  48  49  [50]  51  52  53  54  55  56  57  58  59  60  ...