์ผ๋ฐ˜

MSBuild XDT ๋ณ€ํ™˜

MSBuild์— ๋‚ด์žฅ๋œ XDT ๋ณ€ํ™˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ XML์„ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค

  • #xml
  • #msbuild
  • #vs

XML์€ Visual Studio์— ๋‚ด์žฅ๋œ XDT ๋ณ€ํ™˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ƒˆ ๋ฒ„์ „์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€์ธ ์„ฑ๋ช…

ํ•œ๊ตญ์–ด ์‹ค๋ ฅ์ด ๋ถ€์ ํ•˜์—ฌ ์ด ๊ธ€์ด ๊ตฌ๊ธ€ ๋ฒˆ์—ญ๊ธฐ๋ฅผ ์ฃผ๋กœ ํ™œ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€์ •ํ™•ํ•œ ๋ฌธ๋ฒ•๊ณผ ์–ดํœ˜๊ฐ€ ์žˆ์„์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์  ์–‘ํ•ด ๋ถ€ํƒ๋“œ๋ฆฌ๋ฉฐ, ์ถ”ํ›„์— ๋‹ค์‹œ ๊ฒ€ํ† ํ•˜์—ฌ ์ˆ˜์ •ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ณธ

๋‹ค์Œ๊ณผ ๊ฐ™์€ XML ์„ค์ • ํŒŒ์ผ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

dev.config.xml
<website>
  <title>๋‚ด ์‚ฌ์ดํŠธ</title>
  <environment>๊ฐœ๋ฐœ</environment>
  <url>http://localhost:8080</url>
</website>

์ด ์„ค์ •์€ ๋กœ์ปฌ/๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์„ค์ •์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ณ  ๊ด€๋ จ ์†์„ฑ๋งŒ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

prod.config.xml
<website>
  <title>๋‚ด ์‚ฌ์ดํŠธ</title>
  <environment>์ƒ์‚ฐ</environment>
  <url>https://www.mysite.com</url>
</website>

๊ฐ„๋‹จํ•œ ์„ค์ •์ด๋ผ๋ฉด ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์„ค์ •์ด 1,000์ค„์ด๋‚˜ ๋œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ ๋ฐฉ์‹์€ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ๋ถ€ ์†์„ฑ์€ ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์—์„œ ์žฌ์‚ฌ์šฉ๋˜๊ณ  ๊ณต์œ ๋˜๋ฏ€๋กœ ๋ชจ๋“  ์†์„ฑ์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์–ด ์ค‘๋ณต์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ ๋Œ€์‹  XDT ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ XML ํŒŒ์ผ์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ ์†Œ๊ฐœ

XDT ๋ณ€ํ™˜์€ ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ XML ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

prod.config.xml
<?xml version="1.0" encoding="utf-8" ?>
<website xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <environment
    xdt:Locator="XPath(//website/environment)"
    xdt:Transform="Replace">์ƒ์‚ฐ</environment>
  <url
    xdt:Locator="XPath(//website/url)"
    xdt:Transform="Replace">https://www.mysite.com</url>
</website>

์—ฌ๊ธฐ์„œ title์€ ๋ชจ๋“  ํ™˜๊ฒฝ ์ถœ๋ ฅ์—์„œ โ€‹โ€‹๋™์ผํ•˜๋ฏ€๋กœ ๋ฌด์‹œํ•˜๊ณ  environment์™€ url๋งŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. xdt:Locator๋Š” "์›๋ณธ ์š”์†Œ์˜ ์œ„์น˜"๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  xdt:Transform์€ "์–ด๋–ป๊ฒŒ ์กฐ์ž‘ํ•  ๊ฒƒ์ธ๊ฐ€"๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์ด XDT ๋ณ€ํ™˜์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” prod.config.xml ํŒŒ์ผ์ด dev.config.xml ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ XDT ๋ณ€ํ™˜์„ ๊ฑฐ์ณ ๋งˆ์น˜ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ์ฒ˜๋Ÿผ ์™„์ „ํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ๊ฒฐ๊ณผ๋ฌผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” ๋ณ€ํ™˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์„ค์ •

๋จผ์ € Visual Studio์—์„œ MyXmlTransforms๋ผ๋Š” ์ด๋ฆ„์˜ ๋นˆ ์ฝ˜์†” ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

MyXmlTransforms/
โ”œโ”€โ”€ MyXmlTransforms.csproj
โ””โ”€โ”€ Program.cs

๊ทธ ํ›„ Program.cs ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๊ณ  Base๋ผ๋Š” ํด๋”๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ๊ทธ ์•ˆ์— dev.config.xml ํŒŒ์ผ์„ ๋„ฃ์œผ์„ธ์š”. ๋˜ํ•œ Prod๋ผ๋Š” ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ์•ˆ์— prod.config.xml ํŒŒ์ผ์„ ๋„ฃ์œผ์„ธ์š”. ๋งˆ์ง€๋ง‰์œผ๋กœ MyXmlTransforms.csproj ํŒŒ์ผ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—…๋ฐ์ดํŠธํ•˜์„ธ์š”.

MyXmlTransforms.csproj
<Project Sdk="Microsoft.NET.Sdk" DefaultTargets="Transform">
    <PropertyGroup>
        <OutputType>Library</OutputType>
        <TargetFramework>net10.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
    </PropertyGroup>

    <PropertyGroup>
        <XdtDll>$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll</XdtDll>
        <OutputDir>$(MSBuildThisFileDirectory)bin\Output\</OutputDir>
    </PropertyGroup>

    <UsingTask TaskName="TransformXml" AssemblyFile="$(XdtDll)" />

    <ItemGroup>
        <!-- ์—ฌ๊ธฐ์— ํ•ญ๋ชฉ์„ ๋” ์ถ”๊ฐ€ํ•˜์„ธ์š” -->
        <XmlTransform Include="Config">
            <Source>Base\dev.config.xml</Source>
            <Transform>Prod\prod.config.xml</Transform>
            <Destination>$(OutputDir)prod.config.xml</Destination>
        </XmlTransform>
    </ItemGroup>

    <Target Name="Transform" BeforeTargets="Build">
        <MakeDir Directories="$(OutputDir)" />
        <TransformXml Source="%(XmlTransform.Source)" Transform="%(XmlTransform.Transform)" Destination="%(XmlTransform.Destination)" StackTrace="true" />
        <Message Text="Transformed โ†’ %(XmlTransform.Destination)" Importance="high" />
    </Target>
</Project>

%(...) ๋ฐฐ์น˜ ๊ตฌ๋ฌธ์€ MSBuild๊ฐ€ ํ•ญ๋ชฉ๋‹น ํ•œ ๋ฒˆ์”ฉ TransformXml์„ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ˜๋ณต๋ฌธ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž‘์—…์— StackTrace="true" ์˜ต์…˜์„ ์„ค์ •ํ•˜๋ฉด ๋ณ€ํ™˜์ด ์‹คํŒจํ•  ๊ฒฝ์šฐ ์ž์„ธํ•œ ์˜ค๋ฅ˜ ์ถœ๋ ฅ์ด ์ œ๊ณต๋˜๋ฏ€๋กœ ์ž‘์„ฑ ์ค‘์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์— ํ•ต์‹ฌ ์š”์•ฝ์ž…๋‹ˆ๋‹ค.

  • Visual Studio์— ๋‚ด์žฅ๋œ Microsoft.Web.Publishing.Tasks.dll์„ ์ด์šฉํ•œ XDT ๋ณ€ํ™˜
  • dev ๋ฐ prod ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋ณ‘ํ•ฉํ•˜๊ณ  bin/Output ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ถœ๋ ฅํ•˜๋Š” ๋ณ€ํ™˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณ€ํ™˜ํ•  ํŒŒ์ผ ์Œ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ, XmlTransform ์š”์†Œ๋ฅผ ๋ณต์ œํ•˜๊ณ  ํŒŒ์ผ์— ๋”ฐ๋ผ ์†์„ฑ์„ ์ฑ„์šฐํ•ด์„ธ์š”.

๋‹ค์Œ์œผ๋กœ, ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€ํ™˜์„ ์‹คํ–‰ํ•˜์„ธ์š”.

msbuild WithXdt.csproj /t:Transform

๋˜๋Š” ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ

dotnet build

ํŒŒ์ผ ํŠธ๋ฆฌ๋Š” ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

MyXmlTransforms/
โ”œโ”€โ”€ MyXmlTransforms.csproj
โ”œโ”€โ”€ Base/
โ”‚   โ””โ”€โ”€ dev.config.xml
โ”œโ”€โ”€ Prod/
โ”‚   โ””โ”€โ”€ prod.config.xml
โ””โ”€โ”€ bin/
    โ””โ”€โ”€ Output/              <-- ๋นŒ๋“œ ์‹œ์ ์— ์ƒ์„ฑ๋จ

์ผ๋ฐ˜์ ์ธ XDT ๋ณ€ํ™˜ ์†์„ฑ

์—ฌ๊ธฐ๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ณ€ํ™˜ ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ณธxdt:Transformxdt:Locator
์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋‹คSetAttributes(attrName)Match(keyAttr)
์ „์ฒด ์š”์†Œ๋ฅผ ๊ต์ฒดํ•˜๋‹คReplaceMatch(...) or XPath(...)
์ƒˆ ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๋‹คInsert(ํ•„์š” ์—†์Œ)
์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋‹คRemoveMatch(...) or XPath(...)
์†์„ฑ์„ ์‚ญ์ œํ•˜๋‹คRemoveAttributes(attrName)Match(...)

์š”์•ฝ

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” XDT ๋ณ€ํ™˜ ์‹œ๋‚˜๋ฆฌ์˜ค, ๊ฐ„๋‹จํ•œ ๊ตฌ๋ฌธ ๋ฐ ํ”„๋กœ์ ํŠธ ์„ค์ •์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ  ์ž๋ฃŒ๋กœ GitHub์˜ ์œ ์‚ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ํด๋” ๊ธฐ๋ฐ˜ ๋ณ€ํ™˜์— ๋Œ€ํ•ด์„œ๋Š” ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ฐธ๊ณ 

Microsoft. Web.config Transformation Syntax for Web Project Deployment Using Visual Studio. Retrieved 2026, May 3 from https://sparkbyexamples.com/spark/apache-spark-installation-on-windows/
Web Config Transform.ย Logicmade Wiki. Retrieved 2026, May 3 from https://logicwiki.co.uk/Web_Config_Transform
Suwat, C. Xdt transform samples.https://github.com/projectkudu/kudu/wiki/Xdt-transform-samples
XPath Syntax. Retrieved 2026, May 3 from https://www.w3schools.com/xml/xpath_syntax.asp