PowerShell DSC(ํ์ํ ์ํ ๊ตฌ์ฑ)๋ ์๋ฐฑ ๊ฐ์ ์๋ฒ๊ฐ ์๋ ๊ฒฝ์ฐ ์ด์ ์ฒด์ , ์๋ฒ ์ญํ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ๊ณ ๊ตฌ์ฑํ๋ ์์
์ ํฌ๊ฒ ๋จ์ํํฉ๋๋ค.
๊ทธ๋ฌ๋ ์จํ๋ ๋ฏธ์ค์์ DSC๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ฆ MS Azure์๋ ๋ช ๊ฐ์ง ๋์์ค๊ฐ ์์ต๋๋ค. ์กฐ์ง ๊ท๋ชจ๊ฐ ํฌ๊ณ (์ํฌ์คํ ์ด์ ๊ณผ ์๋ฒ๊ฐ 300๊ฐ ์ด์) ์์ง ์ปจํ ์ด๋์ ์ธ๊ณ๋ฅผ ๊ฒฝํํ์ง ๋ชปํ ๊ฒฝ์ฐ ํนํ ๋๋๋ฌ์ง๋๋ค.
- ์์คํ ์ํ์ ๋ํ ์ ์ฒด ๋ณด๊ณ ์๋ ์์ต๋๋ค. ์ผ๋ถ ์๋ฒ์ ํ์ํ ๊ตฌ์ฑ์ด ์ ์ฉ๋์ง ์์ ๊ฒฝ์ฐ ์ด๋ฌํ ๋ณด๊ณ ์ ์์ด๋ ์ด์ ๋ํด ์ ์ ์์ต๋๋ค. ๋ด์ฅ๋ ๋ณด๊ณ ์๋ฒ์์ ์ ๋ณด๋ฅผ ์ป๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ค์ฐ๋ฉฐ, ํธ์คํธ ์๊ฐ ๋ง์ ๊ฒฝ์ฐ ์๊ฐ๋ ์ค๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
- ํ์ฅ์ฑ๊ณผ ๋ด๊ฒฐํจ์ฑ์ด ๋ถ์กฑํฉ๋๋ค. ๋จ์ผ ๋ด๊ฒฐํจ์ฑ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์ฑ, ๋ชจ๋ ๋ฐ ๋ฑ๋ก ํค์ ๋ํ ๊ณตํต mof ํ์ผ ์ ์ฅ์๋ฅผ ๊ฐ์ถ DSC ํ ์น ์๋ฒ ํ์ ๊ตฌ์ถํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ค๋์ ์ฒซ ๋ฒ์งธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋ณด๊ณ ์ฉ ๋ฐ์ดํฐ๋ฅผ ์ป๋ ๋ฐฉ๋ฒ์ ์๋ ค ๋๋ฆฌ๊ฒ ์ต๋๋ค. SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ฌ์ฉํ ์ ์๋ค๋ฉด ๋ชจ๋ ๊ฒ์ด ๋ ๊ฐ๋จํด์ง ๊ฒ์
๋๋ค. MS
์ด ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค. Windows Server 2012 ๋ฐ 2016์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
์ฐธ๊ณ : Windows Server 2016์ ๊ฒฝ์ฐ ๋ค์์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
DSC ํ ์๋ฒ ๋ฐฐํฌ ํ๋ก์ธ์ค์ ๋ํด์๋ ์์ธํ ์ค๋ช
ํ์ง ์๊ฒ ์ต๋๋ค. ๋งค์ฐ ์ ์ค๋ช
๋์ด ์์ต๋๋ค.
-
UseSecurityBestPractices = $false
๊ทธ๋ ์ง ์์ผ๋ฉด TLS 1.0์ด ๋นํ์ฑํ๋๊ณ SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. Kaspersky Security Center๋ ์๋ํ์ง ์์ต๋๋ค(์ด ๋ฌธ์ ๋ Kaspersky Security Center v11์์ ํด๊ฒฐ๋์ด์ผ ํจ).
-
Enable32BitAppOnWin64 = $true
์ด๋ ๊ฒ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด WSUS๊ฐ ํฌํจ๋ IIS์์ AppPool DSC ์๋ฒ๋ฅผ ์คํํ ์ ์์ต๋๋ค.
- WSUS๋ฅผ ์ฌ์ฉํ์ฌ DSC ์๋ฒ๋ฅผ ์ค์นํ ๋ DSC ์ฌ์ดํธ์ ๋ํ ์ ์ ๋ฐ ๋์ ์บ์ฑ์ ๋นํ์ฑํํฉ๋๋ค.
SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋๋ก DSC ์๋ฒ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง๋ค๊ธฐ
- DSC๋ผ๋ ๋น SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
- ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๊ธฐ ์ํ ๊ณ์ ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ SQL Server๊ฐ Windows ๊ณ์ ๊ณผ SQL ๊ณ์ ๋ชจ๋์ ์ธ์ฆ์ ํ์ฉํ๋์ง ํ์ธํ์ธ์.
- ์ฌ์ฉ์ ๋งคํ ์น์ ์ผ๋ก ์ด๋ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค(์ด ๊ฒฝ์ฐ DSC)๋ฅผ ์ ํํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์์ ๊ถ๋ฆฌ๋ฅผ ๋ถ์ฌํฉ๋๋ค.
- ์๋ฃ.
DSC ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์คํค๋ง ๋ง๋ค๊ธฐ
DSC ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์คํค๋ง๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- TSQL ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ๋
๋ฆฝ์ ์ผ๋ก
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Devices]( [TargetName] [nvarchar](255) NOT NULL, [ConfigurationID] [nvarchar](255) NOT NULL, [ServerCheckSum] [nvarchar](255) NOT NULL, [TargetCheckSum] [nvarchar](255) NOT NULL, [NodeCompliant] [bit] NOT NULL, [LastComplianceTime] [datetime] NULL, [LastHeartbeatTime] [datetime] NULL, [Dirty] [bit] NOT NULL, [StatusCode] [int] NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[RegistrationData]( [AgentId] [nvarchar](255) NOT NULL, [LCMVersion] [nvarchar](255) NULL, [NodeName] [nvarchar](255) NULL, [IPAddress] [nvarchar](255) NULL, [ConfigurationNames] [nvarchar](max) NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO CREATE TABLE [dbo].[StatusReport]( [JobId] [nvarchar](50) NOT NULL, [Id] [nvarchar](50) NOT NULL, [OperationType] [nvarchar](255) NULL, [RefreshMode] [nvarchar](255) NULL, [Status] [nvarchar](255) NULL, [LCMVersion] [nvarchar](50) NULL, [ReportFormatVersion] [nvarchar](255) NULL, [ConfigurationVersion] [nvarchar](255) NULL, [NodeName] [nvarchar](255) NULL, [IPAddress] [nvarchar](255) NULL, [StartTime] [datetime] NULL, [EndTime] [datetime] NULL, [Errors] [nvarchar](max) NULL, [StatusData] [nvarchar](max) NULL, [RebootRequested] [nvarchar](255) NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO
- SQL ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ง๋ฒ์ฌ๋ฅผ ํตํด PS ๋ชจ๋ PSDesiredStateConfiguration์ ์ผ๋ถ๋ก ๋น devices.mdb์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์์ ํ Devices.mdb๋ โโC:WindowsSysWOW64WindowsPowerShellv1.0ModulesPSDesiredStateConfigurationPullServer์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด SQL Server ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๋ด๋ณด๋ด๊ธฐ ๋ง๋ฒ์ฌ๋ฅผ ์คํํ์ธ์.
- ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์์น๋ฅผ ์ ํํฉ๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ Microsoft Access ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ค. ๋ค์์ ํด๋ฆญํ์ธ์.
- ๋ค์ด์ด๊ทธ๋จ์ ๊ฐ์ ธ์ฌ ํ์ผ์ ์ ํํฉ๋๋ค.
- ๊ฐ์ ธ์ฌ ์์น๋ฅผ ํ์ํฉ๋๋ค. ์ฐ๋ฆฌ์๊ฒ๋ SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ค.
- SQL ์๋ฒ(์๋ฒ ์ด๋ฆ)์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค(DataBase)๋ฅผ ์ ํํฉ๋๋ค.
- ํ๋ ์ด์์ ํ ์ด๋ธ ๋๋ ๋ทฐ์์ ๋ฐ์ดํฐ ๋ณต์ฌ(ํ ์ด๋ธ ๋๋ ๋ทฐ์์ ๋ฐ์ดํฐ ๋ณต์ฌ) ์ต์ ์ ์ ํํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ๊ฐ์ ธ์ฌ ํ ์ด๋ธ์ ์ ํํฉ๋๋ค.
- ์ฆ์ ์คํ ํ์ธ๋์ ์ ํํ๊ณ ๋ง์นจ์ ํด๋ฆญํฉ๋๋ค.
- ์๋ฃ.
- ๊ฒฐ๊ณผ์ ์ผ๋ก ํ ์ด๋ธ์ด DSC ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ๋์ผ ํฉ๋๋ค.
.mdb "ํ๋ก์" ํ์ผ ์ค์
SQL ์๋ฒ์ ๋ํ ODBC ์ฐ๊ฒฐ์ ์์ฑํฉ๋๋ค. DSC๋ฅผ ์คํํ๋ ์๋ฒ์๋ MS Access๊ฐ ์ค์น๋์ด ์์ง ์๋ค๊ณ ๊ฐ์ ํ๋ฏ๋ก MS Access๊ฐ ์ค์น๋ ์ค๊ฐ ํธ์คํธ์์ MS Access ์ค์ ์ด ์ํ๋ฉ๋๋ค.
SQL Server์ ๋ํ ์์คํ
ODBC ์ฐ๊ฒฐ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ฐ๊ฒฐ ๋นํธ๋ MS Access ๋นํธ(64 ๋๋ 32)์ ์ผ์นํด์ผ ํฉ๋๋ค. ๋ค์์ ์ฌ์ฉํ์ฌ ๋ง๋ค ์ ์์ต๋๋ค.
- Powershell cmdlet:
Add-OdbcDsn โName DSC โDriverName 'SQL Server' โPlatform '<64-bit or 32-bit>' โDsnType System โSetPropertyValue @('Description=DSC Pull Server',"Server=<Name of your SQL Server>",'Trusted_Connection=yes','Database=DSC') โPassThru
โ ๋๋ ์ฐ๊ฒฐ ๋ง๋ฒ์ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก:
- ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ์ฝ๋๋ค. ์ค์น๋ MS Access ๋ฒ์ ์ ๋ฐ๋ผ ODBC ๋ฐ์ดํฐ ์์ค๋ฅผ ์ ํํฉ๋๋ค. ์์คํ DSN ํญ์ผ๋ก ์ด๋ํ์ฌ ์์คํ ์ฐ๊ฒฐ์ ์์ฑํฉ๋๋ค(์ถ๊ฐ).
- ์ฐ๋ฆฌ๋ SQL ์๋ฒ์ ์ฐ๊ฒฐํ ๊ฒ์์ ๋ํ๋ ๋๋ค. ๋ง์นจ์ ํด๋ฆญํฉ๋๋ค.
- ์ฐ๊ฒฐํ ์ด๋ฆ๊ณผ ์๋ฒ๋ฅผ ์ง์ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋์ผํ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ DSC ์๋ฒ์ ์ฐ๊ฒฐ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
- SQL Server์ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ด์ ์ ์์ฑ๋ DSC๋ผ๋ ์ด๋ฆ์ ๋ก๊ทธ์ธ์ ์ฌ์ฉํจ์ ๋ํ๋ ๋๋ค.
- DSC ์ฐ๊ฒฐ ์ค์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ง์ ํฉ๋๋ค.
- ๋ง์นจ์ ํด๋ฆญํฉ๋๋ค.
- ์ค์ ์ ์๋ฃํ๊ธฐ ์ ์ ์ฐ๊ฒฐ์ด ์๋ํ๋์ง ํ์ธํฉ๋๋ค(ํ ์คํธ ๋ฐ์ดํฐ ์์ค).
- ์๋ฃ.
MS Access์์ devices.mdb ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํฉ๋๋ค. MS Access๋ฅผ ์์ํ๊ณ devices.mdb๋ผ๋ ๋น ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ง๋ญ๋๋ค.
- ์ธ๋ถ ๋ฐ์ดํฐ ํญ์ผ๋ก ์ด๋ํ์ฌ ODBC ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํด๋ฆญํฉ๋๋ค. ํ์๋๋ ์ฐฝ์์ ์ฐ๊ฒฐ ํ ์ด๋ธ ๋ง๋ค๊ธฐ๋ฅผ ์ ํํ์ฌ ๋ฐ์ดํฐ ์๋ณธ์ ์ฐ๊ฒฐํฉ๋๋ค.
- ์ ์ฐฝ์์ ๋จธ์ ๋ฐ์ดํฐ ์๋ณธ ํญ์ ์ ํํ๊ณ ํ์ธ์ ํด๋ฆญํฉ๋๋ค. ์ ์ฐฝ์์ SQL Server์ ์ฐ๊ฒฐํ๊ธฐ ์ํ ์๊ฒฉ ์ฆ๋ช ์ ์ ๋ ฅํฉ๋๋ค.
- ์ฐ๊ฒฐํด์ผ ํ๋ ํ ์ด๋ธ์ ์ ํํฉ๋๋ค. ๋น๋ฐ๋ฒํธ ์ ์ฅ ์์๋ฅผ ์ฒดํฌํ๊ณ ํ์ธ์ ํด๋ฆญํ์ธ์. ์ธ ํ ์ด๋ธ ๋ชจ๋์ ๋ํด ๋งค๋ฒ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ์ฅํ์ญ์์ค.
- ์ธ๋ฑ์ค์์ ๋ค์์ ์ ํํด์ผ ํฉ๋๋ค.
โ dbo_Devices ํ ์ด๋ธ์ TargetName์ ๋๋ค.
โ dbo_RegistrationData์ ๊ฒฝ์ฐ NodeName ๋๋ IPAddress์ ๋๋ค.
โ dbo_StatusReport์ NodeName ๋๋ IPAddress์ ๋๋ค. - MS Access์์ ํ ์ด๋ธ ์ด๋ฆ์ ๋ฐ๊พธ๊ฒ ์ต๋๋ค. ์ฆ, DSC๊ฐ ์ฌ์ฉํ ์ ์๋๋ก dbo_ ์ ๋์ฌ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- ์๋ฃ.
- ํ์ผ์ ์ ์ฅํ๊ณ MS Access๋ฅผ ๋ซ์ต๋๋ค. ์ด์ ๊ฒฐ๊ณผ devices.mdb๋ฅผ DSC ์๋ฒ(๊ธฐ๋ณธ์ ์ผ๋ก C: Program FilesWindowsPowershellDSCService)์ ๋ณต์ฌํ๊ณ ๊ธฐ์กด ์๋ฒ๋ฅผ ํด๋น ์๋ฒ(์๋ ๊ฒฝ์ฐ)๋ก ๋ฐ๊ฟ๋๋ค.
SQL์ ์ฌ์ฉํ๋๋ก DSC ์๋ฒ ๊ตฌ์ฑ
- DSC ์๋ฒ๋ก ๋์๊ฐ๋๋ค. ํ๋ก์ ํ์ผ์ ์ฌ์ฉํ์ฌ SQL ์๋ฒ์ ์ฐ๊ฒฐํ๋ ค๋ฉด DSC ์๋ฒ์์ ์ ODBC ์ฐ๊ฒฐ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฆ, ๋นํธ ์ฌ๋, ์ฐ๊ฒฐ ์ค์ ์ MDB ํ์ผ ์์ฑ ์์ ๋์ผํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์์ ์ด๋ฏธ ๊ตฌ์ฑ๋ ๋น devices.mdb๋ฅผ ๋ณต์ฌํ ์ ์์ต๋๋ค.
- devices.mdb๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด DSC ํ ์๋ฒ์ web.config๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค(๊ธฐ๋ณธ๊ฐ์ C:inetpubPSDSCPullServerweb.config).
- ์๋์ฐ ์๋ฒ 2012์ ๊ฒฝ์ฐ
<add key="dbprovider" value="System.Data.OleDb">
<add key="dbconnectionstr" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:Program FilesWindowsPowerShellDscServiceDevices.mdb;">
- ์๋์ฐ ์๋ฒ 2016์ ๊ฒฝ์ฐ
<add key="dbprovider" value="System.Data.OleDb">
<add key="dbconnectionstr" value="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:Program FilesWindowsPowerShellDscServiceDevices.mdb;">
์ด๊ฒ์ผ๋ก DSC ์๋ฒ ์ค์ ์ด ์๋ฃ๋ฉ๋๋ค.
DSC ์๋ฒ์ ๊ธฐ๋ฅ ํ์ธ
- ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด DSC ์๋ฒ์ ์ ๊ทผํ ์ ์๋์ง ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
- ์ด์ DSC ํ ์๋ฒ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด xPSDesiredStateConfiguration ๋ชจ๋์๋ pullserversetuptests.ps1 ์คํฌ๋ฆฝํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ธฐ ์ ์ Pester๋ผ๋ Powershell ๋ชจ๋์ ์ค์นํด์ผ ํฉ๋๋ค. ์ค์น-๋ชจ๋-์ด๋ฆ Pester๋ฅผ ์ค์นํ์ญ์์ค.
- C:Program FilesWindowsPowerShellModulesxPSDesiredStateConfiguration<๋ชจ๋ ๋ฒ์ >DSCPullServerSetupPullServerDeploymentVerificationTest(์์์๋ ๋ฒ์ 8.0.0.0.0)๋ฅผ ์ฝ๋๋ค.
- PullServerSetupTests.ps1์ ์ด๊ณ DSC ์๋ฒ์ web.config ๊ฒฝ๋ก๋ฅผ ํ์ธํฉ๋๋ค. ์คํฌ๋ฆฝํธ๋ฅผ ํ์ธํ web.config ๊ฒฝ๋ก๋ ๋นจ๊ฐ์์ผ๋ก ๊ฐ์กฐ ํ์๋ฉ๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์ด ๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
- pullserversetuptests.ps1 ์คํ
ํธ์ถ-Pester.PullServerSetupTests.ps1
ะัะต ัะฐะฑะพัะฐะตั. - SQL Management Studio์์๋ ๊ด๋ฆฌ ๋์ ํธ์คํธ๊ฐ DSC ๋ณด๊ณ ์๋ฒ์ ๋ณด๊ณ ์๋ฅผ ๋ณด๋ด๊ณ ๋ฐ์ดํฐ๊ฐ SQL ์๋ฒ์ DSC ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๊ฒ ๋ค์ผ. ๋ค์ ๊ธฐ์ฌ์์๋ ์ป์ ๋ฐ์ดํฐ์ ๋ํ ๋ณด๊ณ ์๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํ๊ณ ๋ด๊ฒฐํจ์ฑ ๋ฐ ํ์ฅ์ฑ์ ๊ดํ ๋ฌธ์ ๋ฅผ ๋ค๋ฃฐ ๊ฒ์
๋๋ค.
์ถ์ฒ : habr.com