<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>jjongjjong-e 님의 블로그</title>
    <link>https://jjongjjong-e.tistory.com/</link>
    <description>jjongjjong-e 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Fri, 7 Aug 2026 19:51:07 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>jjongjjong-e</managingEditor>
    <item>
      <title>[Dynamics365] 개발자 초급 코스 - 5. TempDB vs InMemory 임시 테이블 조회 기능 구현</title>
      <link>https://jjongjjong-e.tistory.com/7</link>
      <description>&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;D365 F&amp;amp;O(X++) 환경에서 대량의 데이터를 화면에 유연하게 보여주거나, 복잡한 비즈니스 로직으로 가공된 데이터를 보고서로 출력해야 할 때 가장 먼저 머릿속에 떠오르는 기술이 무엇인가요?&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;바로 임시 테이블(Temporary Table)일 것입니다.&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임시 테이블은 복잡한 데이터 바인딩을 단순화하고, 복잡한 Join 연산을 데이터베이스 외부에서 처리할 수 있게 돕는 강력한 도구입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 D365 F&amp;amp;O에는 크게 &lt;b&gt;TempDB&lt;/b&gt;와 &lt;b&gt;InMemory&lt;/b&gt;라는 두 가지 강력한 임시 테이블 유형이 존재하며, 각각의 작동 메커니즘과 최적의 사용 시나리오가 다릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 이 두 임시 테이블의 핵심 차이점을 비교해 보고, 실무에서 바로 활용할 수 있는 SalesTable 기반의 조회 화면 구현 예제를 소스 코드와 함께 자세히 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. TempDB vs InMemory: 핵심 아키텍처 비교&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 기술은 데이터를 임시로 저장한다는 목적은 같지만, &quot;데이터가 물리적으로 어디에 저장되고 어떻게 통신하는가&quot;에서 결정적인 차이가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 TempDB 테이블 (TempDB Table) InMemory 테이블 (InMemory Table)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;TempDB&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;InMemory&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;물리적 저장 위치&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SQL Server의 tempdb 시스템 데이터베이스&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;AOS(Application Object Server) 서버의 메모리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;데이터 임계치 초과 시&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;항상 SQL Server 디스크/메모리에서 처리됨&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;메모리가 부족할 경우 AOS 서버 디스크 캐시 파일로 페이징&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;주요 용도&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;- 대량의 데이터 처리&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 다른 일반 테이블과의 복잡한 Join 연산&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;- insert_recordset 등 DB단 일괄 처리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;- 소량 데이터 가공&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;- 빈번한 단일 레코드 읽기/쓰기&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;- 빠른 인메모리 연산이 필요할 때&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;데이터 바인딩 API&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;linkPhysicalTableInstance()&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;setTmpData()&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;성능적 특징&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SQL Server 내에서 쿼리가 직접 수행되므로 복잡한 필터 및 조인 성능 우수&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;AOS 메모리 내 직접 접근으로 단일 Record 단위 I/O 속도가 극도로 빠름&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 이유로 대량데이터에서 InMemory 사용은 지양합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;티어(Tier) 간 데이터 이동 오버헤드 (AOS &amp;harr; DB)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적인 운영 데이터(예: 매출 주문, 고객 정보)는 SQL 데이터베이스 서버에 있습니다.&lt;/li&gt;
&lt;li&gt;AOS 메모리에 있는 InMemory 테이블과 DB에 있는 일반 테이블을 JOIN하려면, SQL 서버가 AOS의 데이터를 알지 못하므로 AOS 메모리의 데이터를 DB로 통째로 전송하거나, AOS가 DB에서 데이터를 건건이 가져와 루프를 돌며 매칭해야 합니다. 이 과정에서 엄청난 네트워크 I/O와 CPU 부하가 발생합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;쿼리 옵티마이저의 부재&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;InMemory 테이블끼리 JOIN을 하더라도, 이는 SQL 서버가 아닌 X++ 커널의 로컬 쿼리 프로세서가 연산을 담당합니다.&lt;/li&gt;
&lt;li&gt;SQL 서버처럼 대용량 처리에 최적화된 고급 조인 알고리즘(Hash Join, Merge Join)이나 통계 정보를 활용하지 못하고, 대부분 단순한 &lt;b data-index-in-node=&quot;95&quot; data-path-to-node=&quot;5,1,1,1,0&quot;&gt;중첩 루프 조인(Nested Loop Join)&lt;/b&gt; 방식으로 처리됩니다. 데이터가 만 건, 십만 건으로 늘어나면 연산 횟수가 기하급수적으로 증가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 실습을 위한 AOT 오브젝트 구성&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;619&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F7sdv/dJMcac4LzGf/Tksh6GLNeJDqvFYqplvKzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F7sdv/dJMcac4LzGf/Tksh6GLNeJDqvFYqplvKzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F7sdv/dJMcac4LzGf/Tksh6GLNeJDqvFYqplvKzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF7sdv%2FdJMcac4LzGf%2FTksh6GLNeJDqvFYqplvKzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1025&quot; height=&quot;619&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;619&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 예제는 HDG_TempDB라는 모델 내에 구현되었습니다. 실습 화면을 구성하기 위해 AOT에 다음과 같은 네 가지 오브젝트를 생성했습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;TempDB 테이블 (HDG_SalesInquiryTmpDB)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;핵심 설정&lt;/b&gt;: 테이블 속성 중 TableType을 TempDB로 지정합니다. 이 설정으로 인해 이 테이블은 SQL Server의 tempdb 영역에 생명 주기를 갖게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;InMemory 테이블 (HDG_SalesInquiryInMemory)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;핵심 설정&lt;/b&gt;: 테이블 속성 중 TableType을 InMemory로 지정합니다. 이 테이블은 AOS 서버 메모리 영역을 활용하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;조회 화면 Form (HDG_SalesInquiry)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 화면 내에 두 종류의 임시 테이블 동작 방식을 직관적으로 비교할 수 있도록 두 개의 탭(Tab)을 생성하고, 각각의 그리드(Grid)에 데이터소스를 바인딩합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Display 메뉴 아이템 (HDG_SalesInquiry)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 메뉴나 대시보드에서 이 조회 화면을 호출할 수 있도록 연결하는 엔트리 포인트입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;실제 구현 GITHUB :&lt;a title=&quot;GITHUB - HDG-Dynamics365-FnO-Samples&quot; href=&quot;https://github.com/ans1148/HDG-Dynamics365-FnO-Samples/tree/main/HDG_TempDB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; HDG-Dynamics365-FnO-Samples/HDG_TempDB at main &amp;middot; ans1148/HDG-Dynamics365-FnO-Samples&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 핵심 구현 코드 및 동작 원리 파헤치기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임시 테이블을 다룰 때 가장 까다롭고 자주 실수하는 부분이 바로 &quot;데이터소스 바인딩&quot;입니다. 코드 단에서 데이터를 아무리 열심히 밀어 넣어봤자 화면(Form Data Source)과 올바르게 연결해주지 않으면 화면에는 빈 그리드만 출력됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 Form의 초기화 시점(init 메소드)에서 두 임시 테이블의 데이터를 생성하고 바인딩하는 전체 X++ 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;[Form]
public class HDG_SalesInquiry extends FormRun
{
    /// &amp;lt;summary&amp;gt;
    /// Form 초기화 시점에 각 임시 테이블의 데이터를 채우고 화면 데이터소스에 바인딩합니다.
    /// &amp;lt;/summary&amp;gt;
    public void init()
    {
        super();

        // 1. TempDB 데이터 로드 및 화면 바인딩 실행
        this.fillTempDB();

        // 2. InMemory 데이터 로드 및 화면 바인딩 실행
        this.fillInMemory();
    }

    /// &amp;lt;summary&amp;gt;
    /// TempDB에 데이터를 삽입하고 Form 데이터소스에 물리적 인스턴스를 바인딩합니다.
    /// &amp;lt;/summary&amp;gt;
    private void fillTempDB()
    {
        HDG_SalesInquiryTmpDB tmpDB;
        SalesTable salesTable;

        // SalesTable에서 최근 생성된 10개의 주문 데이터를 조회하여 임시 테이블 버퍼에 삽입합니다.
        while select firstonly 10 SalesId, CustAccount from salesTable
            order by salesTable.CreatedDateTime desc
        {
            tmpDB.clear();
            tmpDB.SalesId = salesTable.SalesId;
            tmpDB.CustAccount = salesTable.CustAccount;
            
            // 실무 팁: Display Method 호출 최소화를 위해 마스터 데이터는 데이터 로드 시점에 미리 가공하여 채워둡니다.
            tmpDB.CustName = CustTable::find(salesTable.CustAccount).name();
            tmpDB.insert();
        }

        // [★중요★] TempDB 바인딩 핵심 메커니즘
        // TempDB는 물리적인 테이블 인스턴스가 SQL Server 단에 실제로 매번 새로 생성됩니다.
        // 그렇기 때문에 데이터를 채워 넣은 '물리적 인스턴스 버퍼(tmpDB)'를 
        // linkPhysicalTableInstance() 메소드를 사용해 Form의 데이터소스(Cursor)와 반드시 맵핑해주어야 합니다.
        HDG_SalesInquiryTmpDB.linkPhysicalTableInstance(tmpDB);
        HDG_SalesInquiryTmpDB_ds.executeQuery();
    }

    /// &amp;lt;summary&amp;gt;
    /// InMemory에 데이터를 삽입하고 Form 데이터소스에 포인터를 바인딩합니다.
    /// &amp;lt;/summary&amp;gt;
    private void fillInMemory()
    {
        HDG_SalesInquiryInMemory tmpInMemory;
        SalesTable salesTable;

        // InMemory 임시 테이블용 로컬 버퍼에 데이터를 삽입합니다.
        while select firstonly 10 SalesId, CustAccount from salesTable
            order by salesTable.CreatedDateTime desc
        {
            tmpInMemory.clear();
            tmpInMemory.SalesId = salesTable.SalesId;
            tmpInMemory.CustAccount = salesTable.CustAccount;
            tmpInMemory.CustName = CustTable::find(salesTable.CustAccount).name();
            tmpInMemory.insert();
        }

        // [★중요★] InMemory 바인딩 핵심 메커니즘
        // InMemory 임시 테이블은 메모리 상에 존재하는 데이터의 포인터 주소를 
        // setTmpData() 메소드를 통해 Form 데이터소스에 그대로 전달하여 화면과 연결합니다.
        HDG_SalesInquiryInMemory.setTmpData(tmpInMemory);
        HDG_SalesInquiryInMemory_ds.executeQuery();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 실무자를 위한 딥다이브 &amp;amp; 성능 최적화 팁 (Deep Dive)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그를 찾아주신 개발자분들을 위해, 실무 설계 단계에서 놓치기 쉬운 성능 최적화 포인트 2가지를 공유합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  팁 1. while select 루프 대신 insert_recordset 사용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예제 코드에서는 가독성을 위해 while select 안에서 하나씩 insert() 하는 방식을 사용했습니다. 하지만 &lt;b&gt;실제 운영 환경(Production)에서 수백, 수천 건 이상의 데이터를 핸들링해야 한다면 이 방식은 심각한 성능 저하&lt;/b&gt;를 일으킵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 &lt;b&gt;TempDB&lt;/b&gt;의 경우 물리적으로 데이터베이스 레벨에서 처리되므로, 아래와 같이 한 번의 SQL 호출로 데이터를 밀어 넣는 insert_recordset 구문을 사용하는 것이 압도적으로 유리합니다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;// 예시: insert_recordset을 활용한 대용량 처리 기법 (AOS-DB 간 통신 횟수를 획기적으로 줄여줍니다)
insert_recordset tmpDB (SalesId, CustAccount)
    select SalesId, CustAccount from salesTable
    where salesTable.CreatedDateTime &amp;gt;= datetimeValue;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  팁 2. 언제 무엇을 선택해야 할까요? (결정 가이드)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;TempDB를 선택해야 하는 경우&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;화면에서 사용자가 임시 테이블을 기준으로 다른 마스터 테이블(예: CustTable, InventTable)과 복잡한 Join 및 필터링 검색을 수행해야 할 때.&lt;/li&gt;
&lt;li&gt;처리해야 하는 대상 데이터가 예측하기 어려울 정도로 많거나 대용량일 때.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;InMemory를 선택해야 하는 경우&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;화면에 단순히 뿌려주기만 하면 되는 독립적인 휘발성 가공 데이터일 때.&lt;/li&gt;
&lt;li&gt;데이터의 총량이 수십~수백 건 미만으로 매우 적고 단순 루프 연산이 주를 이룰 때.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;마치며&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 D365 F&amp;amp;O 개발 시 필수적으로 이해해야 하는 두 가지 형태의 임시 테이블, &lt;b&gt;TempDB&lt;/b&gt;와 &lt;b&gt;InMemory&lt;/b&gt;에 대해 알아보고 구현 코드까지 살펴보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 TempDB는 linkPhysicalTableInstance(), InMemory는 setTmpData()를 사용한다는 점, 그리고 데이터 용량과 쿼리의 복잡도에 따라 인프라 환경을 고려해 알맞은 테이블 타입을 선택해야 한다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은 아키텍처의 차이를 이해하는 것이 곧 성능 최적화된 고품질 ERP 개발의 시작입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 준비한 내용이 여러분의 개발 업무에 큰 도움이 되길 바랍니다! 질문이나 다른 좋은 의견이 있다면 언제든 댓글로 남겨주세요.&lt;/p&gt;</description>
      <category>Dynamics365 ERP/개발 초급자 코스 강의</category>
      <author>jjongjjong-e</author>
      <guid isPermaLink="true">https://jjongjjong-e.tistory.com/7</guid>
      <comments>https://jjongjjong-e.tistory.com/7#entry7comment</comments>
      <pubDate>Sun, 5 Jul 2026 23:00:21 +0900</pubDate>
    </item>
    <item>
      <title>[Dynamics365] 개발 초급자 코스 - 4. 운영환경의 데이터베이스 로컬 환경에 적용하기</title>
      <link>https://jjongjjong-e.tistory.com/6</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2816&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcQzTj/dJMcab5drP7/x54Oek5aRYXvPxOQmNZ1iK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcQzTj/dJMcab5drP7/x54Oek5aRYXvPxOQmNZ1iK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcQzTj/dJMcab5drP7/x54Oek5aRYXvPxOQmNZ1iK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcQzTj%2FdJMcab5drP7%2Fx54Oek5aRYXvPxOQmNZ1iK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2816&quot; height=&quot;1536&quot; data-origin-width=&quot;2816&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;D365 F&amp;amp;O 개발을 하다 보면 운영 환경이나 Sandbox(UAT)의 실데이터를 로컬 개발 환경에서 테스트하거나 디버깅해야 할 일이 자주 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 SqlPackage.exe를 활용하여 데이터베이스를 Export하고, 로컬 DB(AxDB)에 적용하는 전체 과정을 정리해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 준비 작업: SqlPackage 설치 및 경로 확인&lt;/b&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;가장 먼저 필요한 Tool은 &lt;b data-index-in-node=&quot;13&quot; data-path-to-node=&quot;5&quot;&gt;SqlPackage&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;다운로드:&lt;/b&gt; &lt;a href=&quot;https://learn.microsoft.com/en-us/sql/tools/sqlpackage/sqlpackage-download?view=sql-server-ver15&quot;&gt;Download and Install SqlPackage - SQL Server | Microsoft Learn&lt;/a&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,1,0,0&quot;&gt;Tip:&lt;/i&gt; 설치 관리자보다는 &lt;b data-index-in-node=&quot;15&quot; data-path-to-node=&quot;6,0,1,0,0&quot;&gt;.ZIP 파일&lt;/b&gt; 형태로 다운로드하여 원하는 경로에 압축을 푸는 것을 추천한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;실행 경로 예시:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C:\Program Files\Microsoft SQL Server\170\DAC\bin (SQL Server 버전 및 설치 방식에 따라 다를 수 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 운영/Sandbox DB 내보내기&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size20&quot;&gt;1) 먼저 SandBox 에 Production database 를 Refresh(덮어쓰기) 한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS4NUj/dJMcac36vHF/U1CAMo0SEzszWpKUkjS4k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS4NUj/dJMcac36vHF/U1CAMo0SEzszWpKUkjS4k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS4NUj/dJMcac36vHF/U1CAMo0SEzszWpKUkjS4k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS4NUj%2FdJMcac36vHF%2FU1CAMo0SEzszWpKUkjS4k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;975&quot; height=&quot;834&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;834&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTltKL/dJMcagMfTJt/Xql8qXZnW01RuIkr0PcEe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTltKL/dJMcagMfTJt/Xql8qXZnW01RuIkr0PcEe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTltKL/dJMcagMfTJt/Xql8qXZnW01RuIkr0PcEe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTltKL%2FdJMcagMfTJt%2FXql8qXZnW01RuIkr0PcEe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;352&quot; height=&quot;617&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size20&quot;&gt;2) Sandbox 에 있는 데이터 베이스를 Export 한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vqD8O/dJMcaf7A3fQ/qFH10OZkW58iMWqk2JDDC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vqD8O/dJMcaf7A3fQ/qFH10OZkW58iMWqk2JDDC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vqD8O/dJMcaf7A3fQ/qFH10OZkW58iMWqk2JDDC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvqD8O%2FdJMcaf7A3fQ%2FqFH10OZkW58iMWqk2JDDC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;763&quot; height=&quot;892&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size20&quot;&gt;3) Export 가 완료되면 Asset library &amp;gt; Database backup 에서 Database 를 다운로드 한다.&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSm6Fq/dJMcaiceIPs/2XoKtOn2KE9zPKafHtA5VK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSm6Fq/dJMcaiceIPs/2XoKtOn2KE9zPKafHtA5VK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSm6Fq/dJMcaiceIPs/2XoKtOn2KE9zPKafHtA5VK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSm6Fq%2FdJMcaiceIPs%2F2XoKtOn2KE9zPKafHtA5VK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;382&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;9&quot; data-ke-style=&quot;style3&quot;&gt;Managed 환경이 아닌 환경에서 Export 할 경우 다음과 같은 Script를 실행한다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;# SqlPackage 경로로 이동 cd &quot;C:\Program Files\Microsoft SQL Server\170\DAC\bin\&quot; # Export 실행 ./SqlPackage.exe /a:export /ssn:localhost /sdn:AxDB /tf:J:\MSSQL_BACKUP\AxDB_20251027.bacpac /p:CommandTimeout=1200 /p:VerifyFullTextDocumentTypesSupported=false /SourceTrustServerCertificate:True&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;/ssn&lt;/b&gt;: 원본 서버 주소 (보통 로컬이면 localhost)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;/sdn&lt;/b&gt;: 원본 DB 명 (일반적으로 AxDB)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0&quot;&gt;/tf&lt;/b&gt;: 생성될 파일 경로 및 이름&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,3,0&quot;&gt;/SourceTrustServerCertificate:True&lt;/b&gt;: 연결 인증서 관련 에러 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 로컬 환경에 데이터 가져오기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;명령 프롬프트(CMD)를 관리자 권한으로 실행한 뒤 다운로드한 .bacpac 파일을 새 이름으로 Import를 진행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1778427437805&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Import 실행
./SqlPackage.exe /a:import /sf:I:\MSSQL_BACKUP\hcc-uatbackup.bacpac /tsn:localhost /tdn:AxDB_20251110 /p:CommandTimeout=1200 /TargetTrustServerCertificate:True&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,0,0&quot;&gt;/sf&lt;/b&gt;: 가져올 파일 경로&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&gt;/tdn&lt;/b&gt;: 로컬에 생성할 &lt;b data-index-in-node=&quot;14&quot; data-path-to-node=&quot;16,1,0&quot;&gt;새로운 DB 이름&lt;/b&gt; (기존 AxDB와 충돌을 피하기 위해 날짜 등을 붙임)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,2,0&quot;&gt;/TargetTrustServerCertificate:True&lt;/b&gt;: 로컬 방화벽 정책이나 인증서 에러 발생 시 /ttsc:true 옵션과 동일한 역할을 수행합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 가져온 Database 에 다음과 같은 쿼리 실행&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1778427540269&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;CREATE USER axdeployuser FROM LOGIN axdeployuser
EXEC sp_addrolemember 'db_owner', 'axdeployuser'

CREATE USER axdbadmin FROM LOGIN axdbadmin
EXEC sp_addrolemember 'db_owner', 'axdbadmin'

CREATE USER axmrruntimeuser FROM LOGIN axmrruntimeuser
EXEC sp_addrolemember 'db_datareader', 'axmrruntimeuser'
EXEC sp_addrolemember 'db_datawriter', 'axmrruntimeuser'

CREATE USER axretaildatasyncuser FROM LOGIN axretaildatasyncuser

CREATE USER axretailruntimeuser FROM LOGIN axretailruntimeuser

CREATE USER axdeployextuser FROM LOGIN axdeployextuser

CREATE USER [NT AUTHORITY\NETWORK SERVICE] FROM LOGIN [NT AUTHORITY\NETWORK SERVICE]
EXEC sp_addrolemember 'db_owner', 'NT AUTHORITY\NETWORK SERVICE'

UPDATE T1
SET T1.storageproviderid = 0
    , T1.accessinformation = ''
    , T1.modifiedby = 'Admin'
    , T1.modifieddatetime = getdate()
FROM docuvalue T1
WHERE T1.storageproviderid = 1 --Azure storage

DROP PROCEDURE IF EXISTS SP_ConfigureTablesForChangeTracking
DROP PROCEDURE IF EXISTS SP_ConfigureTablesForChangeTracking_V2
GO
-- Begin Refresh Retail FullText Catalogs
DECLARE @RFTXNAME NVARCHAR(MAX);
DECLARE @RFTXSQL NVARCHAR(MAX);
DECLARE retail_ftx CURSOR FOR
SELECT OBJECT_SCHEMA_NAME(object_id) + '.' + OBJECT_NAME(object_id) fullname FROM SYS.FULLTEXT_INDEXES
    WHERE FULLTEXT_CATALOG_ID = (SELECT TOP 1 FULLTEXT_CATALOG_ID FROM SYS.FULLTEXT_CATALOGS WHERE NAME = 'COMMERCEFULLTEXTCATALOG');
OPEN retail_ftx;
FETCH NEXT FROM retail_ftx INTO @RFTXNAME;

BEGIN TRY
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
        PRINT 'Refreshing Full Text Index ' + @RFTXNAME;
        EXEC SP_FULLTEXT_TABLE @RFTXNAME, 'activate';
        SET @RFTXSQL = 'ALTER FULLTEXT INDEX ON ' + @RFTXNAME + ' START FULL POPULATION';
        EXEC SP_EXECUTESQL @RFTXSQL;
        FETCH NEXT FROM retail_ftx INTO @RFTXNAME;
    END
END TRY
BEGIN CATCH
    PRINT error_message()
END CATCH

CLOSE retail_ftx; 
DEALLOCATE retail_ftx; 
-- End Refresh Retail FullText Catalogs

--Begin create retail channel database record--
declare @ExpectedDatabaseName nvarchar(64) = 'Default';
declare @DefaultDataGroupRecId BIGINT;
declare @ExpectedDatabaseRecId BIGINT; 
IF NOT EXISTS (select 1 from RETAILCONNDATABASEPROFILE where NAME = @ExpectedDatabaseName)
BEGIN 
 select @DefaultDataGroupRecId = RECID from RETAILCDXDATAGROUP where NAME = 'Default'; 
 insert into RETAILCONNDATABASEPROFILE (DATAGROUP, NAME, CONNECTIONSTRING, DATASTORETYPE)
 values (@DefaultDataGroupRecId, @ExpectedDatabaseName, NULL, 0); 
 select @ExpectedDatabaseRecId = RECID from RETAILCONNDATABASEPROFILE where NAME = @ExpectedDatabaseName; 
 insert into RETAILCDXDATASTORECHANNEL (CHANNEL, DATABASEPROFILE)
 select RCT.RECID, @ExpectedDatabaseRecId from RETAILCHANNELTABLE RCT
 inner join RETAILCHANNELTABLEEXT RCTEX on RCTEX.CHANNEL = RCT.RECID
        update RETAILCHANNELTABLEEXT set LIVECHANNELDATABASE = @ExpectedDatabaseRecId where LIVECHANNELDATABASE = 0
END; 
--End create retail channel database record&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 쿼리 실행중 오류가 나는 쿼리는 무시하고 진행해도 상관없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. Local 환경 중지&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Service 에서 아래 3가지 항목을 중지한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #161616; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: initial;&quot;&gt;World Wide Web Publishing Service&lt;/li&gt;
&lt;li style=&quot;list-style-type: initial;&quot;&gt;Microsoft Dynamics 365 Unified Operations: Batch Management Service&lt;/li&gt;
&lt;li style=&quot;list-style-type: initial;&quot;&gt;Management Reporter 2012 Process Service&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. Database 이름 변경&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 사용중이던 AxDB 는 이름을 다른 것으로 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음 새로 업로드한 Database 를 AxDB 로 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경하는 쿼리는 아래를 참고한다.&lt;/p&gt;
&lt;pre id=&quot;code_1778427679982&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 1. 기존 DB를 싱글 유저 모드로 전환하여 연결 끊기 및 이름 변경
ALTER DATABASE AxDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE AxDB MODIFY NAME = AxDB_Old;

-- 2. 새로 가져온 DB의 이름을 AxDB로 변경
ALTER DATABASE AxDB_20251110 MODIFY NAME = AxDB;

-- 3. 멀티 유저 모드로 복구 (정상 사용 설정)
ALTER DATABASE AxDB SET MULTI_USER WITH ROLLBACK IMMEDIATE;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. &quot;5. Local 환경 중지&quot; 에서 실행했던 서비스를 다시 실행시키고, Full Database synchronize, Admin provision 을 진행한다.&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-path-to-node=&quot;31&quot; data-ke-size=&quot;size16&quot;&gt;이 과정은 D365 F&amp;amp;O 개발 환경 구축 및 유지보수의 핵심이다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;31&quot; data-ke-size=&quot;size16&quot;&gt;특히 SqlPackage 경로와 파라미터 옵션(/ttsc 등)만 잘 숙지해도 시행착오를 크게 줄일 수 있습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;31&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;더 자세한 시나리오는 &lt;a href=&quot;https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/database/dbmovement-scenario-exportuat#import-the-database&quot;&gt;MS Learn - DB Movement Scenario&lt;/a&gt; 문서를 참고하시기 바랍니다.&lt;/p&gt;</description>
      <category>Dynamics365 ERP/개발 초급자 코스 강의</category>
      <author>jjongjjong-e</author>
      <guid isPermaLink="true">https://jjongjjong-e.tistory.com/6</guid>
      <comments>https://jjongjjong-e.tistory.com/6#entry6comment</comments>
      <pubDate>Mon, 11 May 2026 01:03:46 +0900</pubDate>
    </item>
    <item>
      <title>[Dynamics365] 개발 초급자 코스 - 3. 간단한 데이터 조회 및 관리 화면 만들기</title>
      <link>https://jjongjjong-e.tistory.com/5</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 앞서 작성한 Model 위에서 간단한 테이블 생성 부터 입력, 조회 화면까지 만들어본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dp45Ub/dJMcabKIPcs/8x0tH5cfx3TxmGp7iTTkqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dp45Ub/dJMcabKIPcs/8x0tH5cfx3TxmGp7iTTkqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dp45Ub/dJMcabKIPcs/8x0tH5cfx3TxmGp7iTTkqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdp45Ub%2FdJMcabKIPcs%2F8x0tH5cfx3TxmGp7iTTkqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;990&quot; height=&quot;479&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;시나리오:&lt;/b&gt; 회사의 사무용 비품(노트북, 모니터, 키보드 등)을 등록하고 조회하는 간단한 화면 생성.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;테이블 :&lt;/b&gt; HDG_AssetTable&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;주요 필드 구성:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,1,0,0&quot;&gt;비품 코드 (AssetId):&lt;/b&gt; 고유 식별자 (String)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,1,1,0&quot;&gt;비품 명칭 (AssetName):&lt;/b&gt; 명칭 (String)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,1,2,0&quot;&gt;비품 분류 (AssetCategory):&lt;/b&gt; 가구, 전자제품, 소모품 등 (Base Enum)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;0&quot;&gt;1. 다중언어의 기본 - Label 생성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 단계에서는 다중언어의 기본인 Label 을 생성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;651&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUKLZe/dJMcadIshIc/oHHhvndxec86xTMAQ8YDF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUKLZe/dJMcadIshIc/oHHhvndxec86xTMAQ8YDF1/img.png&quot; data-alt=&quot;Add &amp;amp;gt; New item... &amp;amp;gt; Label File &amp;amp;gt; 이름을 지정 후 Add&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUKLZe/dJMcadIshIc/oHHhvndxec86xTMAQ8YDF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUKLZe%2FdJMcadIshIc%2FoHHhvndxec86xTMAQ8YDF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;935&quot; height=&quot;651&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;651&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Add &amp;gt; New item... &amp;gt; Label File &amp;gt; 이름을 지정 후 Add&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;581&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXIugd/dJMcabjD6hH/c4m6LkPOfJtV1Sk4bqosi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXIugd/dJMcabjD6hH/c4m6LkPOfJtV1Sk4bqosi1/img.png&quot; data-alt=&quot;Next&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXIugd/dJMcabjD6hH/c4m6LkPOfJtV1Sk4bqosi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXIugd%2FdJMcabjD6hH%2Fc4m6LkPOfJtV1Sk4bqosi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;780&quot; height=&quot;581&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;581&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Next&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BDlvh/dJMcaaE2fo9/GLCnc71aaOLX8pDdwkWK00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BDlvh/dJMcaaE2fo9/GLCnc71aaOLX8pDdwkWK00/img.png&quot; data-alt=&quot;다중언어를 입력한 언어를 선택 후 Next&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BDlvh/dJMcaaE2fo9/GLCnc71aaOLX8pDdwkWK00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBDlvh%2FdJMcaaE2fo9%2FGLCnc71aaOLX8pDdwkWK00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;771&quot; height=&quot;582&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;582&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다중언어를 입력한 언어를 선택 후 Next&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Pcqt/dJMcacv45M3/mKhqZ5vQzUSkDbMYY5OPs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Pcqt/dJMcacv45M3/mKhqZ5vQzUSkDbMYY5OPs0/img.png&quot; data-alt=&quot;각각 언어에 맞게 ID와 다중언어 라벨을 지정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Pcqt/dJMcacv45M3/mKhqZ5vQzUSkDbMYY5OPs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Pcqt%2FdJMcacv45M3%2FmKhqZ5vQzUSkDbMYY5OPs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1466&quot; height=&quot;830&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;830&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;각각 언어에 맞게 ID와 다중언어 라벨을 지정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;사용방법 : @{{Label 파일}}:{{Label ID}} ( 예시 : &lt;/b&gt;&lt;b&gt;@HDG:AssetId )&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;0&quot;&gt;2: 데이터의 기본 - Table 및 EDT 생성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;두 번째 단계에서는 데이터를 저장할 '테이블'을 생성한다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size20&quot;&gt;1) EDT(Extended Data Type) 생성&lt;/h4&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;D365에서 EDT는 데이터의 '설계도'와 같다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;한 번 정의하면 여러 테이블에서 재사용할 수 있으며, 레이블(Label)이나 정렬 방식을 일괄 관리할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;생성 항목:&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;5,0,1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;HDG_AssetId (String): 비품을 식별하는 고유 코드&lt;/li&gt;
&lt;li&gt;HDG_AssetName (String): 비품의 명칭&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;EDT를 사용하는 이유:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,1,0,0&quot;&gt;재사용성:&lt;/b&gt; 여러 테이블에서 '비품 코드'를 사용할 때, 동일한 길이와 속성을 유지할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,1,1,0&quot;&gt;유지보수성:&lt;/b&gt; AssetId의 길이를 10자에서 20자로 늘려야 할 때, EDT만 수정하면 이를 사용하는 모든 테이블에 즉시 반영된다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,1,2,0&quot;&gt;Label 관리:&lt;/b&gt; 사용자에게 보여질 이름(예: &quot;비품 번호&quot;)을 한 곳에서 관리하여 UI의 일관성을 제공한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Table Relation 정의:&lt;/b&gt; EDT 를 통해 어떠한 테이블을 위해 정의되었는지 확인이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oEgLx/dJMcacJCqdt/cLmj2BY3UAPIhTzLfZTmVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oEgLx/dJMcacJCqdt/cLmj2BY3UAPIhTzLfZTmVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oEgLx/dJMcacJCqdt/cLmj2BY3UAPIhTzLfZTmVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoEgLx%2FdJMcacJCqdt%2FcLmj2BY3UAPIhTzLfZTmVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1658&quot; height=&quot;490&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;838&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfe33v/dJMcafzy75B/XQUZFcvsANukOrNVidlbO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfe33v/dJMcafzy75B/XQUZFcvsANukOrNVidlbO1/img.png&quot; data-alt=&quot;EDT String 생성 &amp;amp;gt; Label 지정 &amp;amp;gt; String Size 지정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfe33v/dJMcafzy75B/XQUZFcvsANukOrNVidlbO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfe33v%2FdJMcafzy75B%2FXQUZFcvsANukOrNVidlbO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1654&quot; height=&quot;838&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;838&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;EDT String 생성 &amp;gt; Label 지정 &amp;gt; String Size 지정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;7&quot; data-ke-style=&quot;style2&quot;&gt;위 예시에서는 EDT는 Model 을 관리목적상 분리하였다. 실습에서는 같은 Model 에서 진행하도록 한다.&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;2) Base Enum 생성&lt;/h4&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;비품의 종류(전자제품, 가구, 소모품 등)처럼 정해진 선택지 중 하나를 고르는 데이터는 &lt;b data-index-in-node=&quot;49&quot; data-path-to-node=&quot;8&quot;&gt;Base Enum&lt;/b&gt;으로 관리한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;생성 항목:&lt;/b&gt; HDG_AssetCategory&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;Elements 구성:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;None (0)&lt;/li&gt;
&lt;li&gt;Electronic (1) - 전자제품&lt;/li&gt;
&lt;li&gt;Furniture (2) - 가구&lt;/li&gt;
&lt;li&gt;Supplies (3) - 소모품&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt;장점:&lt;/b&gt; 데이터베이스에는 숫자로 저장되어 가볍고, 코드에서는 이름으로 호출할 수 있어 가독성이 높다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1484&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/89sqA/dJMcahREtbg/h1mVAmCsG9PwmXkgkvyzok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/89sqA/dJMcahREtbg/h1mVAmCsG9PwmXkgkvyzok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/89sqA/dJMcahREtbg/h1mVAmCsG9PwmXkgkvyzok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F89sqA%2FdJMcahREtbg%2Fh1mVAmCsG9PwmXkgkvyzok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1484&quot; height=&quot;394&quot; data-origin-width=&quot;1484&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;각 Enum 값 별로 Label 은 따로 지정하도록 한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;3) Table 생성 및 필드 구성&lt;/h4&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;이제 앞서 만든 EDT와 Enum을 조합하여 실제 데이터를 담을 HDG_AssetTable을 생성합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;필드 추가:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AssetId (EDT: HDG_AssetId 연결)&lt;/li&gt;
&lt;li&gt;AssetName (EDT: HDG_AssetName 연결)&lt;/li&gt;
&lt;li&gt;AssetCategory (Base Enum: HDG_AssetCategory 연결)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1475&quot; data-origin-height=&quot;773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxnZw/dJMcabqpbaL/kldh7JU4muIJGWuf6gNEKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxnZw/dJMcabqpbaL/kldh7JU4muIJGWuf6gNEKK/img.png&quot; data-alt=&quot;AssetId 필드에 EDT 를 지정하면 String Size 가 상속되는 것을 확인할 수 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxnZw/dJMcabqpbaL/kldh7JU4muIJGWuf6gNEKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkxnZw%2FdJMcabqpbaL%2Fkldh7JU4muIJGWuf6gNEKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1475&quot; height=&quot;773&quot; data-origin-width=&quot;1475&quot; data-origin-height=&quot;773&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AssetId 필드에 EDT 를 지정하면 String Size 가 상속되는 것을 확인할 수 있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;Table 주요 속성 설정:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Label: &quot;사무용 비품&quot; (사용자 화면에 표시될 테이블 이름)&lt;/li&gt;
&lt;li&gt;Title Field 1: AssetId&lt;/li&gt;
&lt;li&gt;Title Field 2: AssetName (레코드 식별 시 주로 보일 필드 지정)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1489&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mdzgK/dJMcabYd8a8/SCBIHxeKgolleA7FHCjl6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mdzgK/dJMcabYd8a8/SCBIHxeKgolleA7FHCjl6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mdzgK/dJMcabYd8a8/SCBIHxeKgolleA7FHCjl6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmdzgK%2FdJMcabYd8a8%2FSCBIHxeKgolleA7FHCjl6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1489&quot; height=&quot;408&quot; data-origin-width=&quot;1489&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h4 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size20&quot;&gt;4) Primary Index 설정&lt;/h4&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;중복된 비품 코드가 들어오지 않도록 인덱스를 설정해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;Index 생성:&lt;/b&gt; AssetIdx라는 이름의 인덱스를 만들고 AssetId 필드를 추가한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;필드 속성 설정:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Allow Duplicates: &lt;b data-index-in-node=&quot;18&quot; data-path-to-node=&quot;17,1,1,0,0&quot;&gt;No&lt;/b&gt; (중복 방지)&lt;/li&gt;
&lt;li&gt;Alternate Key: &lt;b data-index-in-node=&quot;15&quot; data-path-to-node=&quot;17,1,1,1,0&quot;&gt;Yes&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,2,0&quot;&gt;Table 수준 설정:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블의 Primary Index 속성에서 방금 만든 AssetIdx를 선택한다.&lt;/li&gt;
&lt;li&gt;이렇게 설정하면 시스템은 AssetId가 고유함을 보장하며, 조회 성능 또한 최적화된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1493&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kCPE7/dJMcajhBCGX/KcH1hbIcGRRnTHm8VQT5r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kCPE7/dJMcajhBCGX/KcH1hbIcGRRnTHm8VQT5r0/img.png&quot; data-alt=&quot;Index 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kCPE7/dJMcajhBCGX/KcH1hbIcGRRnTHm8VQT5r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkCPE7%2FdJMcajhBCGX%2FKcH1hbIcGRRnTHm8VQT5r0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1493&quot; height=&quot;439&quot; data-origin-width=&quot;1493&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Index 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1475&quot; data-origin-height=&quot;487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PevmB/dJMcagZvpXd/mIeYfT19jM1VFn3LfiIKBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PevmB/dJMcagZvpXd/mIeYfT19jM1VFn3LfiIKBK/img.png&quot; data-alt=&quot;필드 속성 지정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PevmB/dJMcagZvpXd/mIeYfT19jM1VFn3LfiIKBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPevmB%2FdJMcagZvpXd%2FmIeYfT19jM1VFn3LfiIKBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1475&quot; height=&quot;487&quot; data-origin-width=&quot;1475&quot; data-origin-height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;필드 속성 지정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1475&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AifUH/dJMcadPcVpQ/mRRs41SerF25HhF6aezkfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AifUH/dJMcadPcVpQ/mRRs41SerF25HhF6aezkfK/img.png&quot; data-alt=&quot;Primary Index 지정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AifUH/dJMcadPcVpQ/mRRs41SerF25HhF6aezkfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAifUH%2FdJMcadPcVpQ%2FmRRs41SerF25HhF6aezkfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1475&quot; height=&quot;512&quot; data-origin-width=&quot;1475&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Primary Index 지정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Form Design - 'Simple List' 패턴 적용 &lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size20&quot;&gt;1) Form 생성 및 Data Source 연결&lt;/h4&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;화면 개발의 시작은 데이터를 어디서 가져올지 정의하는 것에서 시작된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;Form 생성:&lt;/b&gt; 프로젝트에서 Add &amp;gt; New Item &amp;gt; Form을 선택하여 생성한다. (HDG_AssetTable)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;Data Source 지정:&lt;/b&gt; 생성된 Form의 Data Sources 노드에 이전 세션에서 만든 AssetTable을 드래그 앤 드롭으로 추가한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Caption 지정: 화면의 제목을 지정한다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;2) Simple List 패턴 적용&lt;/h4&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;D365는 디바이스 환경에 최적화된 UI를 제공하기 위해 패턴 검사기를 운영한다. 'Simple List'는 마스터 데이터를 한눈에 조회하고 편집하기에 가장 적합한 패턴이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;패턴 지정:&lt;/b&gt; Design 노드에서 우클릭 후 Apply pattern &amp;gt; Simple List를 선택한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;패턴의 역할:&lt;/b&gt; 패턴을 적용하면 화면 구성에 필요한 필수 컨트롤 목록이 나타난다. 개발자는 이 가이드를 따라 컨트롤을 배치하기만 하면 표준 디자인이 완성된다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt;시각적 일관성:&lt;/b&gt; 패턴을 사용하면 해상도 변화에 따라 UI가 유동적으로 대응하며, 사용자에게 시스템 전반에 걸친 일관된 경험을 제공한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;3) 디자인 구조 잡기: Action Pane, Filter, Grid&lt;/h4&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;Simple List 패턴은 크게 세 가지 영역으로 구성된다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size23&quot;&gt;① Action Pane (기능 영역)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;화면 최상단에 위치하며, 새 레코드 생성, 삭제, 저장 등의 버튼이 배치되는 곳이다.&lt;/li&gt;
&lt;li&gt;Design 노드 아래에 Action Pane 컨트롤을 추가한다. 별도의 커스텀 버튼이 없어도 시스템 표준 버튼이 자동으로 생성된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size23&quot;&gt;② Custom Filter Group (조회 영역)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 특정 데이터를 빠르게 찾을 수 있도록 필터 기능을 제공한다.&lt;/li&gt;
&lt;li&gt;Group 컨트롤을 추가하고 속성에서 Custom and Quick Filters 패턴을 적용한다.&lt;/li&gt;
&lt;li&gt;이를 통해 사용자는 비품 코드나 명칭으로 실시간 검색을 수행할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;③ Grid (데이터 영역)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;18&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 데이터가 리스트 형태로 출력되는 핵심 컨트롤이다.&lt;/li&gt;
&lt;li&gt;Grid 컨트롤을 추가하고 Data Source 속성을 HDG_AssetTable로 연결한다.&lt;/li&gt;
&lt;li&gt;Data Sources 노드에 있는 필드들(AssetId, AssetName, AssetCategory 등)을 Grid 내부로 드래그하여 배치한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;929&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nHbLx/dJMcaf7mV6i/wW4qgCb6C8DC2eqxue79IK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nHbLx/dJMcaf7mV6i/wW4qgCb6C8DC2eqxue79IK/img.png&quot; data-alt=&quot;최종적으로 완성된 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nHbLx/dJMcaf7mV6i/wW4qgCb6C8DC2eqxue79IK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnHbLx%2FdJMcaf7mV6i%2FwW4qgCb6C8DC2eqxue79IK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1476&quot; height=&quot;929&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;929&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최종적으로 완성된 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size26&quot;&gt;  Pro-Tip: 디자인 가이드라인 준수의 이유&lt;/h2&gt;
&lt;blockquote data-path-to-node=&quot;21&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;21,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,0&quot;&gt;&quot;구조화된 UI가 유지보수 비용을 결정한다.&quot;&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;21,1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,1,0,0&quot;&gt;Metadata-Driven UI:&lt;/b&gt; D365의 UI는 코드가 아닌 메타데이터 기반으로 작동한다. 패턴을 준수해야만 향후 플랫폼 업데이트 시 UI 깨짐 현상을 방지할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,1,1,0&quot;&gt;사용자 편의성:&lt;/b&gt; 전 세계 모든 D365 모듈은 동일한 패턴을 공유한다. 사용자가 별도의 교육 없이도 새로운 화면의 사용법을 직관적으로 이해할 수 있게 한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,1,2,0&quot;&gt;필수 속성 점검:&lt;/b&gt; 패턴 적용 후 Pattern 담긴 컨트롤에 누락된 요소가 있다면 Visual Studio가 오류 메시지로 안내하므로, 실수 없는 완벽한 화면 구성이 가능하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 사용자 접근 권한: Menu Item 생성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;Dynamics 365 F&amp;amp;O에서 Form은 단독으로 실행될 수 없으며, 반드시 &lt;b data-index-in-node=&quot;45&quot; data-path-to-node=&quot;4&quot;&gt;Menu Item&lt;/b&gt;을 통해 호출된다. 이는 UI와 내비게이션을 분리하여 보안 및 관리 효율성을 높이기 위함이다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;1) Display Menu Item 생성 및 Form 연결&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;Menu Item 생성:&lt;/b&gt; 프로젝트에서 Add &amp;gt; New Item &amp;gt; Display Menu Item을 생성한다. (HDG_AssetTable)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;Object 연결:&lt;/b&gt; 속성 창의 Object Type을 &lt;b data-index-in-node=&quot;30&quot; data-path-to-node=&quot;6,1,0&quot;&gt;Form&lt;/b&gt;으로 설정하고, Object 속성에서 이전에 만든 Form( HDG_AssetTable)을 선택한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,0&quot;&gt;Label 설정:&lt;/b&gt; 사용자에게 보여질 메뉴 명칭(예: &quot;비품 관리&quot;)을 작성한다. 이는 사용자 편의성과 직결되는 필수 작업이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1485&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b61L60/dJMcafTRzwM/RGiBUIrhK9kJfhJ5D7vXqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b61L60/dJMcafTRzwM/RGiBUIrhK9kJfhJ5D7vXqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b61L60/dJMcafTRzwM/RGiBUIrhK9kJfhJ5D7vXqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb61L60%2FdJMcafTRzwM%2FRGiBUIrhK9kJfhJ5D7vXqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1485&quot; height=&quot;860&quot; data-origin-width=&quot;1485&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;2) 메뉴 확장(Menu Extension)을 통한 배치&lt;/h4&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;Menu Item만 생성해서는 사용자가 화면에서 찾을 수 없다. 기존 시스템 메뉴에 이를 등록해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;Menu Extension 생성:&lt;/b&gt; Application Explorer에서 Menus &amp;gt; MainMenu 혹은 특정 모듈 메뉴(예: FleetManagement)를 찾아 우클릭 후 Create extension을 선택한다. 만약 Create Extension 이 비활성화 되어 있다면 Model Reference 를 추가한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;항목 추가:&lt;/b&gt; 확장된 메뉴 구조에서 원하는 위치(예: Rentals )에 방금 만든 Display Menu Item을 드래그하여 배치한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bahIrb/dJMcaf0AQtQ/iZigDTUuGJjjsp7t6iD8D0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bahIrb/dJMcaf0AQtQ/iZigDTUuGJjjsp7t6iD8D0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bahIrb/dJMcaf0AQtQ/iZigDTUuGJjjsp7t6iD8D0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbahIrb%2FdJMcaf0AQtQ%2FiZigDTUuGJjjsp7t6iD8D0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;805&quot; height=&quot;207&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size23&quot;&gt;5. 실습 및 검증: 빌드와 실행&lt;/h3&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;모든 객체 생성이 완료되었다면, 메타데이터를 컴파일하고 데이터베이스에 물리적인 변화를 반영할 차례다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size20&quot;&gt;1) 솔루션 빌드 및 DB 동기화(DB Sync)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0,0&quot;&gt;Build 수행:&lt;/b&gt; 전체 솔루션을 빌드한다. 이 과정에서 구문 오류나 패턴 위반 여부를 최종 확인한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0&quot;&gt;Database Synchronize:&lt;/b&gt; 새로운 테이블이나 필드가 추가되었으므로, SQL Server에 실제 테이블 구조를 생성하기 위해 DB Sync를 수행한다. 이 과정을 거쳐야만 런타임에서 데이터 오류가 발생하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size20&quot;&gt;2) 웹 브라우저 실행 및 테스트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,0,0&quot;&gt;화면 접속:&lt;/b&gt; 빌드가 완료되면 웹 브라우저를 통해 시스템에 접속한다. 메뉴를 통해 들어가거나, URL 끝에 &amp;amp;mi=MenuItemName을 붙여 직접 호출한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&gt;데이터 입력 테스트:&lt;/b&gt; New 버튼을 눌러 비품 정보를 입력하고 저장이 정상적으로 이루어지는지 확인한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,2,0&quot;&gt;조회 및 필터 기능 검증:&lt;/b&gt; 앞서 설정한 QuickFilter를 통해 특정 비품이 올바르게 검색되는지, 그리드의 정렬 기능이 작동하는지 테스트한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EBFmL/dJMcahqB8m3/MDmcCQfKk2whFblTPkxo5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EBFmL/dJMcahqB8m3/MDmcCQfKk2whFblTPkxo5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EBFmL/dJMcahqB8m3/MDmcCQfKk2whFblTPkxo5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEBFmL%2FdJMcahqB8m3%2FMDmcCQfKk2whFblTPkxo5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1246&quot; height=&quot;379&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;379&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Dynamics365 ERP/개발 초급자 코스 강의</category>
      <author>jjongjjong-e</author>
      <guid isPermaLink="true">https://jjongjjong-e.tistory.com/5</guid>
      <comments>https://jjongjjong-e.tistory.com/5#entry5comment</comments>
      <pubDate>Mon, 20 Apr 2026 22:57:41 +0900</pubDate>
    </item>
    <item>
      <title>[Dynamics365] 개발 초급자 코스 - 2. 아키텍쳐 (Model, Layer, Project)</title>
      <link>https://jjongjjong-e.tistory.com/4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Dynamics 365의 언어인 X++을 잘 작성하는 것도 중요하지만, 그 이전에 아키텍쳐를 이해해야 정확한 코드 관리가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 개발 아키텍쳐의 핵심요소인 Model과 Layer, Project에 대해서 알아본다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Layer&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Layer는 코드의 우선순위를 결정하는 수직적 계층이다. AX 시절부터 이어져온 구조로 8개의 기본 레이어와 8개의 패치 레이어(xxP)로 구성되어 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vFcPQ/dJMcabJRqqM/wCFhkh7HFXv1Lz3KuBYU60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vFcPQ/dJMcabJRqqM/wCFhkh7HFXv1Lz3KuBYU60/img.png&quot; data-alt=&quot;Layer 계층&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vFcPQ/dJMcabJRqqM/wCFhkh7HFXv1Lz3KuBYU60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvFcPQ%2FdJMcabJRqqM%2FwCFhkh7HFXv1Lz3KuBYU60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;463&quot; height=&quot;436&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Layer 계층&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* 주요 레이어 계층 구조 (하위 -&amp;gt; 상위 순)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;SYS (System):&lt;/b&gt; Microsoft가 작성한 핵심 표준 코드.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ISV (Independent Software Vendor):&lt;/b&gt; 외부 독립 소프트웨어 개발사(ISV)가 개발한 솔루션.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;VAR (Value Added Reseller):&lt;/b&gt; 지역 파트너사가 여러 고객사를 위해 개발한 솔루션. (EX: 모든 고객사에 들어가는 부가세 패키지)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CUS (Customer):&lt;/b&gt; 특정 고객사의 요구에 맞춘 커스터마이징 코드.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;USR (User):&lt;/b&gt; 개별 설치 환경에서의 최종 수정 사항.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;AX 때까지만 해도 상위 Layer 가 하위 Layer 를 덮어버리는 Overshadow 라는 개념을 충분히 이해해야했지만, Dynamics365 로 개발환경이 넘어오면서 부터는 크게 중요하지 않다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Model&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dynamics365 개발에서는 Layer는 이제 Model이 속할 수 있는 '영역'을 제공할 뿐, 실제 모든 개발 요소는 Model 내에서 관리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Model은 Layer 에 종속되지만, 개발자가 실제 제어하고 관리해야할 실체는 Model이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* 모델관리의 핵심 포인트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-pm-slice=&quot;3 3 []&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;배타적 소속성:&lt;/b&gt; 하나의 개체는 특정 레이어 안의 &lt;b&gt;단 하나의 모델&lt;/b&gt;에만 존재할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;논리적&amp;middot;물리적 단위:&lt;/b&gt; 모델은 XML 파일들의 집합이며, 개발자가 프로젝트를 생성할 때 지정하는 가장 중요한 기준이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;종속성 관리 (Dependency):&lt;/b&gt; 모델은 다른 모델을 참조(Reference)해야만 해당 기능을 확장할 수 있다. 레이어가 수직적인 서열이라면, 모델은 그 안에서 &lt;b&gt;그물망 같은 참조 관계&lt;/b&gt;를 형성한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Project&lt;/h2&gt;
&lt;p data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size16&quot;&gt;Visual Studio에서의 프로젝트는 소스 코드를 물리적으로 담는 것이 아니라, 특정 모델 내의 요소들을 편집하기 위한 &lt;b&gt;논리적 참조 목록 &lt;/b&gt;이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;모델 귀속:&lt;/b&gt; 모든 프로젝트는 생성 시 반드시 하나의 'Model'에 연결된다다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;필터링된 뷰:&lt;/b&gt; 프로젝트는 수만 개의 표준 개체 중 현재 내가 수정하거나 생성해야 할 개체들만 모아놓은 역할을 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 왜 Layer보다 Model 이 중요해 졌는가?&lt;/h2&gt;
&lt;p data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size16&quot;&gt;AX 2012까지는 레이어의 우선순위를 이용해 코드를 덮어쓰는 오버레이어링(Overlayering)이 가능했다.&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size16&quot;&gt;하지만 Dynamics365는 이를 금지하고 &lt;b&gt;확장(Extension)&lt;/b&gt; 방식을 강제하면서 패러다임이 크게 바뀌었다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 72px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 12.6356%; height: 17px;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.4729%; height: 17px;&quot;&gt;&lt;b&gt;과거 (AX)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.8914%; height: 17px;&quot;&gt;&lt;b&gt;현재 (Dynamics365)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 12.6356%; height: 21px;&quot;&gt;&lt;b&gt;핵심 기제&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.4729%; height: 21px;&quot;&gt;오버레이어링 (하위 코드 무시)&lt;/td&gt;
&lt;td style=&quot;width: 45.8914%; height: 21px;&quot;&gt;&lt;b&gt;확장 (표준 코드 유지 및 기능 추가)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 12.6356%; height: 17px;&quot;&gt;&lt;b&gt;관리 대상&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.4729%; height: 17px;&quot;&gt;레이어 우선순위 (Overshadowing)&lt;/td&gt;
&lt;td style=&quot;width: 45.8914%; height: 17px;&quot;&gt;&lt;b&gt;모델 간 참조 및 종속성 (Dependency)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 12.6356%; height: 17px;&quot;&gt;&lt;b&gt;업데이트&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.4729%; height: 17px;&quot;&gt;코드 병합(Merge)의 고통 발생&lt;/td&gt;
&lt;td style=&quot;width: 45.8914%; height: 17px;&quot;&gt;표준 모델 업데이트 시 영향 최소화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;* 모델 중심 관리의 이점&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;모듈화:&lt;/b&gt; 기능을 기능별로 모델 단위로 쪼개어 배포할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;배포 효율:&lt;/b&gt; 패키지(Package)는 모델들의 집합이며, 수정된 모델이 포함된 패키지만 빌드하여 배포 효율을 높인다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유지보수성:&lt;/b&gt; Microsoft 가 배포하는 코드와 고객만을 위한 코드의 병합이 발생할 가능성이 사라진다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;* 모델 중심 관리의 제약&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;표준 비즈니스 프로세스의 강제:&lt;/b&gt;&lt;span&gt; &lt;/span&gt;과거 AX 시절에는 표준 로직이 고객사의 비즈니스 프로세스와 맞지 않을 경우, 해당 코드를 주석 처리하거나 삭제하고 새로운 로직을 채워 넣을 수 있었다. 그러나 Dynamics365 에서는 표준 로직을 무시할수 없기 때문에, 다소 복잡한 우회 로직을 설계해야한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;확장 지점(CoC)의 의존성: &lt;/b&gt;표준 기능을 수정하려면 Microsoft가 열어둔 &lt;b&gt;Delegate&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;나 Wrapper(CoC)를 사용해야 한다.&lt;br /&gt;* &lt;/span&gt;&lt;b&gt;문제:&lt;/b&gt; 만약 특정 메서드가 private이거나 확장 가능한 구조로 설계되지 않았다면, 개발자는 해당 기능을 수정할 방법이 없다. 이 경우 비효율적인 우회 구현을 해야만 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;설계의 복잡도 증가: &lt;/b&gt;단순히 코드를 고치는 것이 아니라, 기존 로직의 실행 전과 후를 고려하여 기능을 덧붙여야 하므로 설계 난이도가 높다.&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 실습&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Model 과 Project 생성을 실습해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1) Model 생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AU4wT/dJMcabXmDxH/ukomJYkk0cr0vFJMW1yTr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AU4wT/dJMcabXmDxH/ukomJYkk0cr0vFJMW1yTr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AU4wT/dJMcabXmDxH/ukomJYkk0cr0vFJMW1yTr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAU4wT%2FdJMcabXmDxH%2FukomJYkk0cr0vFJMW1yTr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;918&quot; height=&quot;391&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Extensions &amp;gt; Dynamics365 &amp;gt; Model Management &amp;gt; Create Model..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJzmr2/dJMcajgKomi/IwJiD9my0oRipOfBHqhilK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJzmr2/dJMcajgKomi/IwJiD9my0oRipOfBHqhilK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJzmr2/dJMcajgKomi/IwJiD9my0oRipOfBHqhilK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJzmr2%2FdJMcajgKomi%2FIwJiD9my0oRipOfBHqhilK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;605&quot; height=&quot;466&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Model Name 을 지정하고, Layer 는 cus나 var 로 지정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u6Ucu/dJMcafMfS2K/aGkJsBKipsp5KGfS8E2IS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u6Ucu/dJMcafMfS2K/aGkJsBKipsp5KGfS8E2IS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u6Ucu/dJMcafMfS2K/aGkJsBKipsp5KGfS8E2IS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu6Ucu%2FdJMcafMfS2K%2FaGkJsBKipsp5KGfS8E2IS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;599&quot; height=&quot;461&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Create new package 를 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/otVQC/dJMcadnjned/B2TaSnYL8Yf3yskCZxY75k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/otVQC/dJMcadnjned/B2TaSnYL8Yf3yskCZxY75k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/otVQC/dJMcadnjned/B2TaSnYL8Yf3yskCZxY75k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FotVQC%2FdJMcadnjned%2FB2TaSnYL8Yf3yskCZxY75k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;604&quot; height=&quot;469&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;469&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떠한 Model 를 Reference 할지 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 ApplicationSuite, ApplicationCommon, ApplicationPlatform, ApplicationFoundation 등은 많이 참조하게 되므로 기본적으로 선택하는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY8z23/dJMcaaKVrLN/NEekbn2WomwwCALs2Vz121/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY8z23/dJMcaaKVrLN/NEekbn2WomwwCALs2Vz121/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY8z23/dJMcaaKVrLN/NEekbn2WomwwCALs2Vz121/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY8z23%2FdJMcaaKVrLN%2FNEekbn2WomwwCALs2Vz121%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;599&quot; height=&quot;460&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 확인 후 Next를 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;577&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRvXyM/dJMcahQOQqO/kSqHWzS1wenLDSK8clh011/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRvXyM/dJMcahQOQqO/kSqHWzS1wenLDSK8clh011/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRvXyM/dJMcahQOQqO/kSqHWzS1wenLDSK8clh011/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRvXyM%2FdJMcahQOQqO%2FkSqHWzS1wenLDSK8clh011%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;830&quot; height=&quot;577&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;577&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PackagesLocalDirectory 내부에 Model 명 폴더가 생겼다면 Model 생성 성공이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2) Project 생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsvhPF/dJMcabpybGK/S3Fphka8g93mKPhahz6KS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsvhPF/dJMcabpybGK/S3Fphka8g93mKPhahz6KS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsvhPF/dJMcabpybGK/S3Fphka8g93mKPhahz6KS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsvhPF%2FdJMcabpybGK%2FS3Fphka8g93mKPhahz6KS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;681&quot; height=&quot;355&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;File &amp;gt; New &amp;gt; Project...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;669&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DEa4e/dJMcabC4U0s/S59ZlKkDriaWizDuFsfNu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DEa4e/dJMcabC4U0s/S59ZlKkDriaWizDuFsfNu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DEa4e/dJMcabC4U0s/S59ZlKkDriaWizDuFsfNu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDEa4e%2FdJMcabC4U0s%2FS59ZlKkDriaWizDuFsfNu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1017&quot; height=&quot;669&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;669&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Finance Operations 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;671&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSstuz/dJMcaaKVrOb/eJN2KZR4S51pyyBi5SHNbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSstuz/dJMcaaKVrOb/eJN2KZR4S51pyyBi5SHNbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSstuz/dJMcaaKVrOb/eJN2KZR4S51pyyBi5SHNbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSstuz%2FdJMcaaKVrOb%2FeJN2KZR4S51pyyBi5SHNbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1001&quot; height=&quot;671&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;671&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적절한 Project name 입력 후 Create&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;723&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx3TKv/dJMcacBYRdX/aFdXx6mCFRAN5PdQTUBwn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx3TKv/dJMcacBYRdX/aFdXx6mCFRAN5PdQTUBwn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx3TKv/dJMcacBYRdX/aFdXx6mCFRAN5PdQTUBwn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx3TKv%2FdJMcacBYRdX%2FaFdXx6mCFRAN5PdQTUBwn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;568&quot; height=&quot;723&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;723&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무런 설정을 하지않으면 Fleet Management로 Project의 Model 속성이 지정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽 버튼을 클릭하여 속성으로 진입한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PJe0y/dJMcabQAPgG/kfxJRGGEACRk6aKyyW85KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PJe0y/dJMcabQAPgG/kfxJRGGEACRk6aKyyW85KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PJe0y/dJMcabQAPgG/kfxJRGGEACRk6aKyyW85KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPJe0y%2FdJMcabQAPgG%2FkfxJRGGEACRk6aKyyW85KK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;563&quot; height=&quot;655&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNaFYx/dJMcacIK1kN/2AKbMZZnZsoEgVUdKAVtv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNaFYx/dJMcacIK1kN/2AKbMZZnZsoEgVUdKAVtv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNaFYx/dJMcacIK1kN/2AKbMZZnZsoEgVUdKAVtv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNaFYx%2FdJMcacIK1kN%2F2AKbMZZnZsoEgVUdKAVtv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;796&quot; height=&quot;503&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;503&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Model 을 지정하고 OK를 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llnWA/dJMcab37I5w/DWGrIzWMZWSkQlMtw73Zxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llnWA/dJMcab37I5w/DWGrIzWMZWSkQlMtw73Zxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llnWA/dJMcab37I5w/DWGrIzWMZWSkQlMtw73Zxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllnWA%2FdJMcab37I5w%2FDWGrIzWMZWSkQlMtw73Zxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;314&quot; height=&quot;155&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Project 뒤에 Model 이 잘 변경되었는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 Project에서 생성한 Object는 모두 HDG 이라는 Model 에 종속되게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마치며..&lt;/h2&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;실습을 통해 Model이 Layer 에 종속되고, Project는 Model 에 종속된다는 것을 확인하였다.&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;또한 이제 Dynamics365 개발을 하기 위해서는 표준을 수정하는 것이 아니라 표준과 '공존' 하는 법을 배워야한다는 것을 명심해야한다.&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;단순한 Coder 가 아닌 ERP 프로세스를 이해하는 개발자가 되는 날을 위해 화이팅..!&lt;/p&gt;</description>
      <category>Dynamics365 ERP/개발 초급자 코스 강의</category>
      <author>jjongjjong-e</author>
      <guid isPermaLink="true">https://jjongjjong-e.tistory.com/4</guid>
      <comments>https://jjongjjong-e.tistory.com/4#entry4comment</comments>
      <pubDate>Tue, 3 Feb 2026 21:01:07 +0900</pubDate>
    </item>
    <item>
      <title>[Dynamics365] 개발 초급자 코스 - 1. 환경(Local VM) 세팅</title>
      <link>https://jjongjjong-e.tistory.com/3</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Dynamics365의 개발 환경은 크게 Cloud Hosted Environment(CHE)와 Local VM(VHD) 이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 중 Local VM 환경 최초 셋업과 그 구성에 대해 간단히 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MS 가이드 : &lt;a href=&quot;https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/dev-tools/access-instances&quot;&gt;Deploy and access development environments - Finance &amp;amp; Operations | Dynamics 365 | Microsoft Learn&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size26&quot;&gt;0. 시작하기 전 준비사항 (Prerequisites)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-pm-slice=&quot;3 3 []&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;하드웨어:&lt;/b&gt; 최소 16GB RAM (32GB 권장), i5 이상의 프로세서.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;저장공간:&lt;/b&gt; SSD 필수, 최소 &lt;b&gt;250GB~300GB&lt;/b&gt;의 여유 공간.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. LCS에서 VHD 파일 다운로드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 먼저 LCS에서 VHD 파일을 다운로드 받아야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1) LCS (lcs.dynamics.com) 이동&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2) Shared asset library 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3) Downloadable VHD 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4) 가장 최신의 VM 파일 모두 다운로드&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1714&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EOFKE/dJMcah34DLx/hmOhJCmAWVZ2y9FWaZn4KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EOFKE/dJMcah34DLx/hmOhJCmAWVZ2y9FWaZn4KK/img.png&quot; data-alt=&quot;10.0.43 버전을 설치하려면 해당 버전의 모든 파트 파일을 한 폴더에 받아야한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EOFKE/dJMcah34DLx/hmOhJCmAWVZ2y9FWaZn4KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEOFKE%2FdJMcah34DLx%2FhmOhJCmAWVZ2y9FWaZn4KK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1714&quot; height=&quot;747&quot; data-origin-width=&quot;1714&quot; data-origin-height=&quot;747&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;10.0.43 버전을 설치하려면 해당 버전의 모든 파트 파일을 한 폴더에 받아야한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5) 1번 파일을 열어서 압축을 해제&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;231&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P7TrD/dJMcadgfWP5/MxcWwvi4dledceQ9c5RQj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P7TrD/dJMcadgfWP5/MxcWwvi4dledceQ9c5RQj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P7TrD/dJMcadgfWP5/MxcWwvi4dledceQ9c5RQj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP7TrD%2FdJMcadgfWP5%2FMxcWwvi4dledceQ9c5RQj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;121&quot; data-origin-width=&quot;231&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d6BGSN/dJMcahCZX91/ECRsQxNxwztFx9pUmDGjk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d6BGSN/dJMcahCZX91/ECRsQxNxwztFx9pUmDGjk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d6BGSN/dJMcahCZX91/ECRsQxNxwztFx9pUmDGjk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6BGSN%2FdJMcahCZX91%2FECRsQxNxwztFx9pUmDGjk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;514&quot; height=&quot;388&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;6) VHD 파일 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf8CuI/dJMcahXkeXe/LWK83qa4P72jVzRursYPu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf8CuI/dJMcahXkeXe/LWK83qa4P72jVzRursYPu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf8CuI/dJMcahXkeXe/LWK83qa4P72jVzRursYPu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf8CuI%2FdJMcahXkeXe%2FLWK83qa4P72jVzRursYPu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;620&quot; height=&quot;157&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Hyper-V 설정 및 VM 생성&lt;/h2&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;Dynamics 365 VHD는 Windows의 가상화 기술인 Hyper-V를 기반으로 작동한다.&lt;/p&gt;
&lt;blockquote data-pm-slice=&quot;1 1 []&quot; data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;윈도우 Home 사용자 주의사항&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Windows Home 을 쓰면은 따로 Hyper-V 활성화가 필요한데 활성화 방법은 아래 블로그대로 따라하면 금방 설정이 가능하다.&lt;br /&gt;&lt;a href=&quot;https://geekorea.com/how-to-enable-hyper-v-windows11-home/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;윈도우11 Home에서 Hyper-V 설치 및 활성화 방법 - GeeKorea&lt;/a&gt;&lt;/blockquote&gt;
&lt;figure id=&quot;og_1766409748295&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;윈도우11 Home에서 Hyper-V 설치 및 활성화 방법 - GeeKorea&quot; data-og-description=&quot;다양한 버전의 운영 체제를 사용하는 사용자라면 가상 머신 플랫폼은 없어서는 안될 중요한 기능이지만 Home 버전에서는 Hyper-V를 지원하지 않습니다. 이 가이드는 Windows 11 Home에서 Hyper-V 설치 및 &quot; data-og-host=&quot;geekorea.com&quot; data-og-source-url=&quot;https://geekorea.com/how-to-enable-hyper-v-windows11-home/&quot; data-og-url=&quot;https://geekorea.com/how-to-enable-hyper-v-windows11-home/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iU5MT/hyZPZmreJk/ELgbzrD43yzPYDGTndNhS1/img.png?width=440&amp;amp;height=440&amp;amp;face=0_0_440_440,https://scrap.kakaocdn.net/dn/bDjcRN/hyZPWwupdL/9DZMuJNRm2x3vI3TJvaD6K/img.png?width=900&amp;amp;height=506&amp;amp;face=0_0_900_506,https://scrap.kakaocdn.net/dn/bnJjcw/hyZP8DF0gE/rWT0qh1QmKTurCR35kskuK/img.png?width=900&amp;amp;height=485&amp;amp;face=0_0_900_485&quot;&gt;&lt;a href=&quot;https://geekorea.com/how-to-enable-hyper-v-windows11-home/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geekorea.com/how-to-enable-hyper-v-windows11-home/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iU5MT/hyZPZmreJk/ELgbzrD43yzPYDGTndNhS1/img.png?width=440&amp;amp;height=440&amp;amp;face=0_0_440_440,https://scrap.kakaocdn.net/dn/bDjcRN/hyZPWwupdL/9DZMuJNRm2x3vI3TJvaD6K/img.png?width=900&amp;amp;height=506&amp;amp;face=0_0_900_506,https://scrap.kakaocdn.net/dn/bnJjcw/hyZP8DF0gE/rWT0qh1QmKTurCR35kskuK/img.png?width=900&amp;amp;height=485&amp;amp;face=0_0_900_485');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;윈도우11 Home에서 Hyper-V 설치 및 활성화 방법 - GeeKorea&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;다양한 버전의 운영 체제를 사용하는 사용자라면 가상 머신 플랫폼은 없어서는 안될 중요한 기능이지만 Home 버전에서는 Hyper-V를 지원하지 않습니다. 이 가이드는 Windows 11 Home에서 Hyper-V 설치 및&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;geekorea.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1) 가상컴퓨터 새로 만들기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ns54B/dJMcagjM6AJ/ZXtO7CaOQklt8abxzYAQqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ns54B/dJMcagjM6AJ/ZXtO7CaOQklt8abxzYAQqK/img.png&quot; data-alt=&quot;새로만들기 &amp;amp;gt; 가상컴퓨터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ns54B/dJMcagjM6AJ/ZXtO7CaOQklt8abxzYAQqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNs54B%2FdJMcagjM6AJ%2FZXtO7CaOQklt8abxzYAQqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1262&quot; height=&quot;720&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;새로만들기 &amp;gt; 가상컴퓨터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GfVAv/dJMb99SvYNd/Hgg1MJ3wmTnAaNC9M9e3zK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GfVAv/dJMb99SvYNd/Hgg1MJ3wmTnAaNC9M9e3zK/img.png&quot; data-alt=&quot;컴퓨터 이름 지정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GfVAv/dJMb99SvYNd/Hgg1MJ3wmTnAaNC9M9e3zK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGfVAv%2FdJMb99SvYNd%2FHgg1MJ3wmTnAaNC9M9e3zK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;780&quot; height=&quot;528&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;컴퓨터 이름 지정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br2BID/dJMcadm02tJ/3IFsq4BQQSKh06qlVC8dfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br2BID/dJMcadm02tJ/3IFsq4BQQSKh06qlVC8dfk/img.png&quot; data-alt=&quot;1세대 지정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br2BID/dJMcadm02tJ/3IFsq4BQQSKh06qlVC8dfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr2BID%2FdJMcadm02tJ%2F3IFsq4BQQSKh06qlVC8dfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;779&quot; height=&quot;526&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1세대 지정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIk8We/dJMcahweMYI/O0pL5VtjHOBqnYVscW9zak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIk8We/dJMcahweMYI/O0pL5VtjHOBqnYVscW9zak/img.png&quot; data-alt=&quot;메모리는 원활한 개발을 위해서는 최소 16GB할당&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIk8We/dJMcahweMYI/O0pL5VtjHOBqnYVscW9zak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIk8We%2FdJMcahweMYI%2FO0pL5VtjHOBqnYVscW9zak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;779&quot; height=&quot;526&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메모리는 원활한 개발을 위해서는 최소 16GB할당&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biaOBm/dJMcaiBRRoe/nR31ad9EXOep0fWXgaYLJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biaOBm/dJMcaiBRRoe/nR31ad9EXOep0fWXgaYLJ1/img.png&quot; data-alt=&quot;네트워크는 각자 PC에 맞게끔 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biaOBm/dJMcaiBRRoe/nR31ad9EXOep0fWXgaYLJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiaOBm%2FdJMcaiBRRoe%2FnR31ad9EXOep0fWXgaYLJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;780&quot; height=&quot;525&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네트워크는 각자 PC에 맞게끔 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PdgYp/dJMcagYoBnJ/97uhLr5WkoRRSpltH5K6R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PdgYp/dJMcagYoBnJ/97uhLr5WkoRRSpltH5K6R1/img.png&quot; data-alt=&quot;위에서 내려받았던 하드디스크 파일 연결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PdgYp/dJMcagYoBnJ/97uhLr5WkoRRSpltH5K6R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPdgYp%2FdJMcagYoBnJ%2F97uhLr5WkoRRSpltH5K6R1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;777&quot; height=&quot;527&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위에서 내려받았던 하드디스크 파일 연결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2) CPU 개수 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;717&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VSlD0/dJMcabW5JL4/rv1F9AU6JTDO58AKmZZY01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VSlD0/dJMcabW5JL4/rv1F9AU6JTDO58AKmZZY01/img.png&quot; data-alt=&quot;만들어진 VM 클릭 &amp;amp;gt; 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VSlD0/dJMcabW5JL4/rv1F9AU6JTDO58AKmZZY01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVSlD0%2FdJMcabW5JL4%2Frv1F9AU6JTDO58AKmZZY01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1059&quot; height=&quot;717&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;717&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;만들어진 VM 클릭 &amp;gt; 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cghIMX/dJMcacoaiuX/UEZk0pKGvy8IYVVma7a4x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cghIMX/dJMcacoaiuX/UEZk0pKGvy8IYVVma7a4x1/img.png&quot; data-alt=&quot;프로세서는 4~8개로 각 PC 설정에 맞게 지정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cghIMX/dJMcacoaiuX/UEZk0pKGvy8IYVVma7a4x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcghIMX%2FdJMcacoaiuX%2FUEZk0pKGvy8IYVVma7a4x1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;838&quot; height=&quot;780&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로세서는 4~8개로 각 PC 설정에 맞게 지정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 초기 부팅 및 Windows License 연장&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1) VM 부팅&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;715&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwDvZI/dJMcafFcjQQ/bmSLrz9IOejLS1Tghz10VK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwDvZI/dJMcafFcjQQ/bmSLrz9IOejLS1Tghz10VK/img.png&quot; data-alt=&quot;VM 클릭 후 시작&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwDvZI/dJMcafFcjQQ/bmSLrz9IOejLS1Tghz10VK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwDvZI%2FdJMcafFcjQQ%2FbmSLrz9IOejLS1Tghz10VK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1060&quot; height=&quot;715&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;715&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VM 클릭 후 시작&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2) &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;최초 패스워드 &lt;b&gt;pass@word1&lt;/b&gt; 입력 후 로그인&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1szc9/dJMcahCZYjV/vdKC4KD7SWWM7jykcYeqJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1szc9/dJMcahCZYjV/vdKC4KD7SWWM7jykcYeqJk/img.png&quot; data-alt=&quot;pass@word1 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1szc9/dJMcahCZYjV/vdKC4KD7SWWM7jykcYeqJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1szc9%2FdJMcahCZYjV%2FvdKC4KD7SWWM7jykcYeqJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1366&quot; height=&quot;868&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pass@word1 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3) Windows License 연장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 VM은 보통 신규 VHD가 출시되면 6개월 정도의 Windows License 유효기간을 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 개발환경별로 정해진 수만큼 (아마 4~5회정도로 기억한다) 6개월 씩 연장할 수 있으니 유효기간이 만료됐다면 꼭 연장하도록하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blLbTc/dJMcafFcjSd/Wxg3yxJFkyBCyta0kcaIF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blLbTc/dJMcafFcjSd/Wxg3yxJFkyBCyta0kcaIF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blLbTc/dJMcafFcjSd/Wxg3yxJFkyBCyta0kcaIF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblLbTc%2FdJMcafFcjSd%2FWxg3yxJFkyBCyta0kcaIF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1366&quot; height=&quot;768&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4) CMD(관리자권한으로 실행) 명령어 실행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1357&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0kgi2/dJMcac2I2iR/HBCZuvSM7LkKgraB0YXDE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0kgi2/dJMcac2I2iR/HBCZuvSM7LkKgraB0YXDE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0kgi2/dJMcac2I2iR/HBCZuvSM7LkKgraB0YXDE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0kgi2%2FdJMcac2I2iR%2FHBCZuvSM7LkKgraB0YXDE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1357&quot; height=&quot;766&quot; data-origin-width=&quot;1357&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5) 재부팅 후 연장 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;260&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uNLrV/dJMcac2I2k8/S2DbenTNIxWK6CahpkR1ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uNLrV/dJMcac2I2k8/S2DbenTNIxWK6CahpkR1ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uNLrV/dJMcac2I2k8/S2DbenTNIxWK6CahpkR1ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuNLrV%2FdJMcac2I2k8%2FS2DbenTNIxWK6CahpkR1ck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;260&quot; height=&quot;68&quot; data-origin-width=&quot;260&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Azure App Registration (인증 설정)&lt;/h3&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;로컬 환경은 클라우드와 달리 로그인을 처리해줄 주체가 없으므로, 직접 Azure(Entra ID)에 앱을 등록하여 연결해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반드시 Dynamics365 개발을 진행할 계정이 속해있는 Azure Tenant에서 아래 절차를 진행하도록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1) Azure App 생성 &lt;a href=&quot;https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/dev-tools/vhd-setup&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;(MS 가이드)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Microsoft Entra ID &amp;gt; 앱 등록 이동&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;1129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDLe39/dJMcabiuU0T/bbNHBj77HBhTN4q30t6kXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDLe39/dJMcabiuU0T/bbNHBj77HBhTN4q30t6kXk/img.png&quot; data-alt=&quot;이름 입력 후 등록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDLe39/dJMcabiuU0T/bbNHBj77HBhTN4q30t6kXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDLe39%2FdJMcabiuU0T%2FbbNHBj77HBhTN4q30t6kXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;825&quot; height=&quot;1129&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;1129&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이름 입력 후 등록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2) Redirection URI 구성&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #161616; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: initial;&quot;&gt;https://usnconeboxax1aos.cloud.onebox.dynamics.com/&lt;/li&gt;
&lt;li style=&quot;list-style-type: initial;&quot;&gt;https://usnconeboxax1aos.cloud.onebox.dynamics.com/oauth/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;691&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsY8S3/dJMcaaRp9MZ/O7TXEX93ks37WDyDcow0e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsY8S3/dJMcaaRp9MZ/O7TXEX93ks37WDyDcow0e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsY8S3/dJMcaaRp9MZ/O7TXEX93ks37WDyDcow0e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsY8S3%2FdJMcaaRp9MZ%2FO7TXEX93ks37WDyDcow0e1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1099&quot; height=&quot;691&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;691&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3) App ID 복사&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bucofI/dJMcai9HS7r/axBs1mBBfNNp9Txo50X0i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bucofI/dJMcai9HS7r/axBs1mBBfNNp9Txo50X0i0/img.png&quot; data-alt=&quot;등록된 App ID를 복사&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bucofI/dJMcai9HS7r/axBs1mBBfNNp9Txo50X0i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbucofI%2FdJMcai9HS7r%2FaxBs1mBBfNNp9Txo50X0i0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1048&quot; height=&quot;636&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;등록된 App ID를 복사&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4) 바탕화면의 &quot;Generate Self-Signed Certificates&quot; 권리자 권한으로 실행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqeCWk/dJMcacaCXWN/T0Qytm9c1RzvG1Va3pkwQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqeCWk/dJMcacaCXWN/T0Qytm9c1RzvG1Va3pkwQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqeCWk/dJMcacaCXWN/T0Qytm9c1RzvG1Va3pkwQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqeCWk%2FdJMcacaCXWN%2FT0Qytm9c1RzvG1Va3pkwQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;327&quot; height=&quot;381&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5) 3)에서 복사했던 App ID 붙여넣고 입력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yzFdH/dJMcaaqlIfH/JmPbKXvLKnvpuoSKJQ5MHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yzFdH/dJMcaaqlIfH/JmPbKXvLKnvpuoSKJQ5MHK/img.png&quot; data-alt=&quot;App ID 입력 / N 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yzFdH/dJMcaaqlIfH/JmPbKXvLKnvpuoSKJQ5MHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyzFdH%2FdJMcaaqlIfH%2FJmPbKXvLKnvpuoSKJQ5MHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;972&quot; height=&quot;212&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;App ID 입력 / N 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;6) 정상적으로 App이 등록되었는지 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDHM0f/dJMcaiaQz3J/dDT45kHpX8zt1CwJtieXb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDHM0f/dJMcaiaQz3J/dDT45kHpX8zt1CwJtieXb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDHM0f/dJMcaiaQz3J/dDT45kHpX8zt1CwJtieXb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDHM0f%2FdJMcaiaQz3J%2FdDT45kHpX8zt1CwJtieXb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;976&quot; height=&quot;510&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Admin provisioning 등록 (관리자 권한 부여)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발환경의 관리자 권한을 부여할 계정을 입력하는 단계이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최초 개발환경 세팅뿐만 아니라 Database를 복사한 후에도 진행하는 단계이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1) C:\AOSService\PackagesLocalDirectory\bin 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2) AdminUserProvisioning 관리자 권한으로 실행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u0I8H/dJMcagKRSmt/j7tn0UKJuYFZvhmBJgM7e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u0I8H/dJMcagKRSmt/j7tn0UKJuYFZvhmBJgM7e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u0I8H/dJMcagKRSmt/j7tn0UKJuYFZvhmBJgM7e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu0I8H%2FdJMcagKRSmt%2Fj7tn0UKJuYFZvhmBJgM7e1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;877&quot; height=&quot;310&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3) 계정 입력 후 Submit&lt;/p&gt;
&lt;blockquote data-pm-slice=&quot;1 1 [&amp;quot;ordered_list&amp;quot;,{&amp;quot;order&amp;quot;:1},&amp;quot;list_item&amp;quot;,{}]&quot; data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;실패 시: 인터넷 연결 상태와 DNS 설정을 확인하고 VM을 재부팅한 뒤 다시 시도해본다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biC6az/dJMcagc2zH3/W1sNzZxccB6oI8KyTcKVK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biC6az/dJMcagc2zH3/W1sNzZxccB6oI8KyTcKVK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biC6az/dJMcagc2zH3/W1sNzZxccB6oI8KyTcKVK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiC6az%2FdJMcagc2zH3%2FW1sNzZxccB6oI8KyTcKVK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;492&quot; height=&quot;182&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 컴퓨터 이름 변경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나중에 팀원과의 개발 협업을 하기 위해서는 Azure Devops 연결을 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그중에서도 TFVC(Team foundation version control)은 각 사용자의 컴퓨터명이 관리키가 되기 때문에 꼭 변경해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 이제는 TFVC 보다는 Git 을 사용하게끔 권장하지만 아직 각 회사나 고객사 성격에 따라 TFVC을 사용하는 경우도 있기 때문에 꼭 변경해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1) Server manager &amp;gt; Local Server &amp;gt; Computer name &amp;gt; Change &amp;gt; 이름 입력 후 OK &amp;gt; 재부팅&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1359&quot; data-origin-height=&quot;611&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zjirB/dJMcaiPpoLP/Oixk7BrKYKNssuqeOrk3U0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zjirB/dJMcaiPpoLP/Oixk7BrKYKNssuqeOrk3U0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zjirB/dJMcaiPpoLP/Oixk7BrKYKNssuqeOrk3U0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzjirB%2FdJMcaiPpoLP%2FOixk7BrKYKNssuqeOrk3U0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1359&quot; height=&quot;611&quot; data-origin-width=&quot;1359&quot; data-origin-height=&quot;611&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. (Optional) Visual studio, SSMS 관리자 권한 실행 아이콘 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dynamics365 개발을 하기위해서는 Visual studio와 SSMS 를 항상 관리자 권한으로 실행이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1) Visual studio 를 Taskbar에 고정 후 오른쪽 버튼 &amp;gt; 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/67s6f/dJMcachorXn/VKxSkBAUptuw9JovOqyQe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/67s6f/dJMcachorXn/VKxSkBAUptuw9JovOqyQe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/67s6f/dJMcachorXn/VKxSkBAUptuw9JovOqyQe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F67s6f%2FdJMcachorXn%2FVKxSkBAUptuw9JovOqyQe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;287&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2) Advanced &amp;gt; Run as administrator 체크&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMNP37/dJMcabQj70b/BeQAtAudHkAbMxWcrey7AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMNP37/dJMcabQj70b/BeQAtAudHkAbMxWcrey7AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMNP37/dJMcabQj70b/BeQAtAudHkAbMxWcrey7AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMNP37%2FdJMcabQj70b%2FBeQAtAudHkAbMxWcrey7AK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;747&quot; height=&quot;515&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3) SSMS 도 1), 2) 과정 반복&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;8. 환경 접근 테스트 ( 최초 URL :&amp;nbsp;usnconeboxax1aos.cloud.onebox.dynamics.com )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSKeG7/dJMcaa4WWBW/JoIEcmNAGKoa15llU9P8x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSKeG7/dJMcaa4WWBW/JoIEcmNAGKoa15llU9P8x0/img.png&quot; data-alt=&quot;Dynamics365 홈페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSKeG7/dJMcaa4WWBW/JoIEcmNAGKoa15llU9P8x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSKeG7%2FdJMcaa4WWBW%2FJoIEcmNAGKoa15llU9P8x0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1032&quot; height=&quot;654&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Dynamics365 홈페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;마치며..&lt;/h2&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;이제 Dynamics 365 F&amp;amp;O Local VM 구축이 완료되었다.&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;다음 포스팅에서는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;간단한 X++ 모델을 알아본다음,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; Visual Studio에서 프로젝트를 생성하고 첫 개발을 시작해볼 예정이다.&lt;/p&gt;</description>
      <category>Dynamics365 ERP/개발 초급자 코스 강의</category>
      <author>jjongjjong-e</author>
      <guid isPermaLink="true">https://jjongjjong-e.tistory.com/3</guid>
      <comments>https://jjongjjong-e.tistory.com/3#entry3comment</comments>
      <pubDate>Mon, 22 Dec 2025 22:34:20 +0900</pubDate>
    </item>
    <item>
      <title>[Dynamics365] Azure Synapse Link</title>
      <link>https://jjongjjong-e.tistory.com/2</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dynamics365 F&amp;amp;O의 Database 를 외부로 복사하는 방법 중 하나인 Azure Synapse Link에 대해서 알아보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Azure Synapse Link란 무엇인가?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Azure Synapse Link는 기존에 Export to data lake 를 대체해서 나온 기능이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BYOD의 단점을 보완하고 Dataverse의 Synapse Link 기능의 장점을 잘 섞어서 만들어진 기능인데 꽤나 강력한 기능이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Microsoft 문서에 나온 특징은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;- You can choose both standard and custom finance and operations entities and tables.&lt;br /&gt;=&amp;gt; Entity 뿐만 아니라 일반적인 Table 도 Export가 가능하다.(BYOD는 Entity만 가능했지만 Table도 Export가 가능해졌다)&lt;br /&gt;&lt;br /&gt;- Continuous replication of entity and table data is supported. Create, update, and delete (CUD) transactions are also supported.&lt;br /&gt;=&amp;gt;&amp;nbsp;&amp;nbsp;CUD 트랜잭션 포함해서 지속적인 Entity와 Table 복사가 이루어진다.&lt;br /&gt;&lt;br /&gt;- You can link or unlink the environment to Azure Synapse Analytics and/or Data Lake Storage Gen2 in your Azure subscription. You don't have to go to the Azure portal or Microsoft Dynamics Lifecycle Services for system configuration.&lt;br /&gt;=&amp;gt; 설정을 위해 굳이 Azure portal이나 LCS에서 할 필요없이 Azure Synapse Link나 Data lake storage Gen2에서 설정하면된다.&lt;br /&gt;&lt;br /&gt;- You can choose data and explore by using Azure Synapse. You don't have to run external tools to configure Synapse Analytics workspaces.&lt;br /&gt;=&amp;gt; Azure Synapse를 통해 데이터를 조회하고 탐구할수 있다. Synapse Analytics workspaces를 구성할 때에 외부 Tool은 필요없다. (이 특징은 Spark를 사용해야만 가능한 기능같다. csv로 증분 업데이트를 하면 지원하지 않는다.)&lt;br /&gt;&lt;br /&gt;- All features of Azure Synapse Link for Dataverse are supported. These features include availability in all regions, saving as Parquet Delta files, and restricted storage accounts.&lt;br /&gt;=&amp;gt; 모든&amp;nbsp;Azure Synapse Link for Dataverse&amp;nbsp;에서 제공하는 기능도 사용가능하다.&lt;br /&gt;&lt;br /&gt;- The table limits in the Export to Data Lake service aren't applicable in Azure Synapse Link for Dataverse.&lt;br /&gt;=&amp;gt; 테이블 수 제한이 없다.&lt;br /&gt;&lt;br /&gt;- By default, saving in Parquet Delta Lake format is enabled for finance and operations data, so that query response times are faster.&lt;br /&gt;=&amp;gt; 쿼리 응답시간이 빠른 parquet 파일로 생성이 가능하다. (사실 parquet 파일이 뭔지는 잘모르겠다. 데이터 분석쪽에서는 유명한거 같기도 한데, 사용해보니 Azure Synapse Analytics에서 직접적인 쿼리 사용이 가능했다.)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;장점 밖에 없는것 같지만, 거의 유일한 단점이 하나 있다면 바로 비용적인 측면이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;Spark 기능을 24시간 가동하게 된다면 일단 70만원부터 비용이 들게되고 Azure Data Factory 까지 쓴다면 추가적으로 비용이 발생할 수 있기 때문에 데이터 동기화 주기를 적절히 설정하는 것이 매우 중요하다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Dynamics365 for Azure Synapse Link 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Synapse Link 를 구현하는데에는 크게 2가지 방법이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 블로그에 이 2가지 기능에 대해 아주 명확하게 설명한 그림이 있어서 그림과 함께 살펴보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) CSV 형태로 증분 파일을 생성 (MS문서 : &lt;a href=&quot;https://learn.microsoft.com/en-us/power-apps/maker/data-platform/azure-synapse-link-select-fno-data#access-incremental-data-changes-from-finance-and-operations&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Access incremental data changes from finance and operations&lt;/a&gt;)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1023&quot; data-origin-height=&quot;424&quot;&gt;&lt;a href=&quot;https://azureintegrations.com/2023/10/21/export-data-from-d365-fo-using-synapse-link/&quot; target=&quot;_blank&quot; title=&quot;출처&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vz4uG/dJMcajUQXNQ/sAi8UKSy5bRCC0d7kFYdx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvz4uG%2FdJMcajUQXNQ%2FsAi8UKSy5bRCC0d7kFYdx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1023&quot; height=&quot;424&quot; data-origin-width=&quot;1023&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 방법은 Data Lake 에서 직접적으로 데이터분석을 할 필요가 없을 경우에 사용하면 좋은 방법이다.&lt;/li&gt;
&lt;li&gt;생성, 변경, 삭제된 데이터만 증분으로 csv 파일을 생성한다.&lt;/li&gt;
&lt;li&gt;Spark 가 필요없기 때문에 Azure Data Factory 와 Data Lake에 대한 비용만 부담하면된다.&lt;/li&gt;
&lt;li&gt;그러나 증분된 파일에 대한 삭제관리와 트리거 같은 설정이 복잡하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) Parquet 형식으로 생성 (MS문서 : &lt;a href=&quot;https://learn.microsoft.com/en-us/power-apps/maker/data-platform/azure-synapse-link-select-fno-data#add-finance-and-operations-tables-in-azure-synapse-link&quot;&gt;Choose finance and operations data in Azure Synapse Link for Dataverse - Power Apps | Microsoft Learn&lt;/a&gt;)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AVM9p/dJMcain6IV3/NEvtsgsJzhL7fTWM7wF951/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AVM9p/dJMcain6IV3/NEvtsgsJzhL7fTWM7wF951/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AVM9p/dJMcain6IV3/NEvtsgsJzhL7fTWM7wF951/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAVM9p%2FdJMcain6IV3%2FNEvtsgsJzhL7fTWM7wF951%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;833&quot; height=&quot;423&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;423&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 방법은 Data Lake 에서 직접적으로 쿼리를 분석할 때에 좋은 방법이다.&lt;/li&gt;
&lt;li&gt;위 방법과 달리 증분이 아닌 전체 데이터에 대해서 하나의 데이터셋에 데이터변경점을 입력한다.&lt;/li&gt;
&lt;li&gt;Spark를 사용해야 하기 때문에 비용이 최소 월 70만원 부터 시작한다. (24시간 가동시)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 설정하기&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;각 방법에 대한 설정방법은 MS 문서의 가이드를 따라가면 되는데, MS문서의 내용 앞 뒤로 내용을 추가해서 설명하겠다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8cb3be;&quot;&gt;(작성자 생각 : 왜 MS 문서는 꼭 하나의 가이드에 적지않고 다른 문서를 찾아야하는 번거로움을 만드는 걸까)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) Parquet 형식으로 생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 Azure에서 Dynamics365 와 같은 Region으로 Azure Synapse Analytics를 생성하면 Blob storage 가 같이 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Analytics 생성 후 Workspace 에서 Apache spark pool까지 생성해주면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2982&quot; data-origin-height=&quot;1487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mRTzj/dJMcafyaAyj/illPh6H2Yz0dB3OeGZc3k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mRTzj/dJMcafyaAyj/illPh6H2Yz0dB3OeGZc3k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mRTzj/dJMcafyaAyj/illPh6H2Yz0dB3OeGZc3k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmRTzj%2FdJMcafyaAyj%2FillPh6H2Yz0dB3OeGZc3k0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;627&quot; height=&quot;313&quot; data-origin-width=&quot;2982&quot; data-origin-height=&quot;1487&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음은 아래 지침을 잘 따라가면 바로 설정이 가능하다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #161616; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Sign in to Power Apps and select the environment you want.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;On the left navigation pane, select&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Azure Synapse Link&lt;/b&gt;.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;On the command bar of the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Synapse Link&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;page, select&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;+ New link to data lake&lt;/b&gt;.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Select&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Connect to your Azure Synapse Analytics workspace&lt;/b&gt;, and then select the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Subscription&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Resource group&lt;/b&gt;, and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Workspace name&lt;/b&gt;.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Select&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Use Spark pool for processing&lt;/b&gt;, and then select the precreated Spark pool and storage account.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Select&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Next&lt;/b&gt;.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Add the tables you want to export. You can choose finance and operations tables provided the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;background-color: #000000; color: #0065b3;&quot; href=&quot;https://learn.microsoft.com/en-us/power-apps/maker/data-platform/azure-synapse-link-select-fno-data#prerequisites&quot; data-linktype=&quot;self-bookmark&quot;&gt;prerequisites&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;are met.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Select&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Advanced&lt;/b&gt;, select&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Show advanced configuration settings&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and enter the time interval, in minutes, for how often the incremental updates should be captured. The options&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Append only&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Partition&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;available at the table level are ignored for finance and operations tables because the system determines the partitioning strategy.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Select&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Save&lt;/b&gt;. Tables selected are initialized and ready for reporting.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uJobO/dJMcabWP7CI/GOll9KwI4zkxUM6mUk2OHK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uJobO/dJMcabWP7CI/GOll9KwI4zkxUM6mUk2OHK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uJobO/dJMcabWP7CI/GOll9KwI4zkxUM6mUk2OHK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/uJobO/dJMcabWP7CI/GOll9KwI4zkxUM6mUk2OHK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;668&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* 설정할 때에 Tenant 에 최초로 연결할 경우 아래와 같은 에러가 발생할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 다음 앱이 &amp;lt;GUID&amp;gt; 테넌트에 없습니다.&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1944&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7IxFV/dJMcaa4Hozh/wntPIaKk4dVyx3j4CR5821/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7IxFV/dJMcaa4Hozh/wntPIaKk4dVyx3j4CR5821/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7IxFV/dJMcaa4Hozh/wntPIaKk4dVyx3j4CR5821/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7IxFV%2FdJMcaa4Hozh%2FwntPIaKk4dVyx3j4CR5821%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1944&quot; height=&quot;309&quot; data-origin-width=&quot;1944&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;해결책 : PowerShell에서 아래 Script를 실행시키면 된다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1762866016019&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;nbsp;Install-Module -Name Az -AllowClobber -Scope AllUsers
 Connect-AzAccount
 New-AzADServicePrincipal -ApplicationId '&amp;lt;GUID&amp;gt;'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 403 스토리지 계정에 액세스 할수 없습니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JsFMN/dJMcagX9iGV/eGpMntu3PS3tCHYVgLlhGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JsFMN/dJMcagX9iGV/eGpMntu3PS3tCHYVgLlhGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JsFMN/dJMcagX9iGV/eGpMntu3PS3tCHYVgLlhGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJsFMN%2FdJMcagX9iGV%2FeGpMntu3PS3tCHYVgLlhGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1907&quot; height=&quot;155&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;해결책 : Storage 찾아가서 IAM &amp;gt; Storage account contributer &amp;gt; Managed identity &amp;gt; Synapse workspace 선택해서 권한을 할당하면 된다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2952&quot; data-origin-height=&quot;1416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0xLb9/dJMcadmOI3n/TkaqmOb1QPuIRMpWwmNZk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0xLb9/dJMcadmOI3n/TkaqmOb1QPuIRMpWwmNZk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0xLb9/dJMcadmOI3n/TkaqmOb1QPuIRMpWwmNZk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0xLb9%2FdJMcadmOI3n%2FTkaqmOb1QPuIRMpWwmNZk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2952&quot; height=&quot;1416&quot; data-origin-width=&quot;2952&quot; data-origin-height=&quot;1416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) CSV 형태로 증분 파일을 생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법은 굳이 Azure Synapse Analytics 를 생성할 필요가 없기 때문에 (물론 연결해도 상관은 없다) 바로 Blob storage를 생성하면 된다. 생성할 때에 &quot;계층 구조 네임스페이스&quot; 반드시 체크하는 것만 잊지말고 생성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;629&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baH5B0/dJMcajm2fvz/NDzGhtsi6SK9uhyeykCAgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baH5B0/dJMcajm2fvz/NDzGhtsi6SK9uhyeykCAgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baH5B0/dJMcajm2fvz/NDzGhtsi6SK9uhyeykCAgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaH5B0%2FdJMcajm2fvz%2FNDzGhtsi6SK9uhyeykCAgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;659&quot; height=&quot;492&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;629&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시 마찬가지로 다음부터는 MS의 지침을 잘 따라가보도록 하자.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #161616; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Sign in to Power Apps and select the environment you want.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;On the left navigation pane, select&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Azure Synapse Link&lt;/b&gt;.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;On the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Azure Synapse Link for Dataverse&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;page, select&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;+ New link&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;on the command bar.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Select&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Subscription&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Resource group&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Storage account&lt;/b&gt;. You don't need to provide a Synapse workspace or a Spark pool.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Select&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Next&lt;/b&gt;. The option to choose tables appears.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Select&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Advanced&lt;/b&gt;, select&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Show advanced configuration settings&lt;/b&gt;, and then enable the option&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Enable incremental update folder structure&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;In the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Time interval&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;field, choose the desired frequency for reading incremental data. Using this frequency, the system partitions data into time stamped folders such that you can read the data without being impacted by ongoing write operations.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Select the Dataverse tables you want. You can also select finance and operations tables. The options&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Append only&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Partition&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;available at a table level are ignored. Data files are always appended and data is partitioned yearly.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Select&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Save&lt;/b&gt;. Tables selected are initialized and you see incremental data in the storage account.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cG03QJ/dJMcaa4HoOl/SxIMGNHFgOMDSfpYhniGP1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cG03QJ/dJMcaa4HoOl/SxIMGNHFgOMDSfpYhniGP1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cG03QJ/dJMcaa4HoOl/SxIMGNHFgOMDSfpYhniGP1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cG03QJ/dJMcaa4HoOl/SxIMGNHFgOMDSfpYhniGP1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;668&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;* 시간 간격 설정&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;&lt;b&gt;각 설정 모두 시간 간격에 대한 설정을 지정해야한다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;&lt;b&gt;시간 간격은 15분부터 24시간 까지 설정이 가능하다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;&lt;b&gt;동기화는 시간 간격이 설정되어 있어도 그 전에 동기화 작업이 끝나지 않으면 다음 동기화 작업도 시작할 수 없기 때문에 반드시 적절한 시간을 지정하는 것이 좋다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;&lt;b&gt;또한 시간 간격이 짧다는 것은 그만큼 ADF나 Spark의 가동시간이 늘어난다는 뜻이기 때문에 비용적인 측면도 같이 고려해야한다.&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. CSV 형태로 증분파일 생성 시나리오 - Azure SQL로 ADF를 사용하여 복사&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) Container 폴더 살펴보기&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;681&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q6fTJ/dJMcabieGxM/w8PJYSiK41DhEPq0xFQtcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q6fTJ/dJMcabieGxM/w8PJYSiK41DhEPq0xFQtcK/img.png&quot; data-alt=&quot;증분된 데이터를 갖고 있는 Blob storage&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q6fTJ/dJMcabieGxM/w8PJYSiK41DhEPq0xFQtcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq6fTJ%2FdJMcabieGxM%2Fw8PJYSiK41DhEPq0xFQtcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;579&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;681&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;증분된 데이터를 갖고 있는 Blob storage&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;dataverse-environmentName-organizationUniqueName 으로 되어있는 Blob container를 선택하면 위와 같은 폴더 구조를 확인할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;각 파일들의 역할은 다음과 같다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;TimeStamp 폴더&lt;/b&gt; : 증분된 시간(동기화된 시간)의 데이터를 갖고 있는 폴더&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 내부구조는 아래 이미지와 같으며 데이터변경이 일어난 Table에 대해 폴더를 갖는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uFto7/dJMcahQhYTT/FWyJscYcuZYRFc8WBhVOE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uFto7/dJMcahQhYTT/FWyJscYcuZYRFc8WBhVOE1/img.png&quot; data-alt=&quot;TimeStamp 폴더 내 파일들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uFto7/dJMcahQhYTT/FWyJscYcuZYRFc8WBhVOE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuFto7%2FdJMcahQhYTT%2FFWyJscYcuZYRFc8WBhVOE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;684&quot; height=&quot;211&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;TimeStamp 폴더 내 파일들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Changelog&lt;/b&gt; : 안에 changelog.info 파일을 보면 현재 업데이트 중인 TimeStamp 폴더이름을 갖고 있다. 시스템이 불안정해질 수 있으므로 파일을 업데이트 하면 안된다.&lt;br /&gt;- &lt;b&gt;EntitySyncFailure&lt;/b&gt; : Azure Synapse Link에서 동기화 오류가 발생할 경우 해당 폴더내에 에러가 발생한 Table 명이 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;model.json&lt;/b&gt; : 최종 업데이트가 발생한 Table 의 csv 증분 파일을 지정하고, csv의 필드구조 정의를 갖고 있다. 사실상 시나리오에서는 TimeStamp내의 model.json만 사용하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VBxLE/dJMcadf27aa/a4wsKlTHw2fGuCZ6oft0jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VBxLE/dJMcadf27aa/a4wsKlTHw2fGuCZ6oft0jk/img.png&quot; data-alt=&quot;model.json&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VBxLE/dJMcadf27aa/a4wsKlTHw2fGuCZ6oft0jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVBxLE%2FdJMcadf27aa%2Fa4wsKlTHw2fGuCZ6oft0jk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;984&quot; height=&quot;323&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;323&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;model.json&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 파일의 생성 흐름 파악하기 (15분 간격일 경우)&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;증분이 발생하면 TimeStamp 폴더가 생성된다. 그리고 changelog.info 파일에 현재 생성된 TimeStamp가 기록된다.&lt;/li&gt;
&lt;li&gt;15분동안 변경이 발생한 데이터에 대해 TimeStamp 폴더 안에 테이블의 변경사항이 기록된 csv 파일이 생성, 변경된다.&lt;/li&gt;
&lt;li&gt;15분이 지나면 TimeStamp 폴더 내에 변경이 발생된 csv폴더를 지정하는 model.json 파일이 생성되며, root 에 있는 model.json 폴더에 덮어쓴다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 증분된 csv 파일 ADF 로 Trigger 후 Azure SQL로 복사&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 생성 흐름을 파악해보면 증분이 끝나는 시점에 데이터를 Azure SQL로 복사하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, TimeStamp 내의 model.json 파일이 생성되는 시점으로 Trigger를 발생시키면 된다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 그럼 Trigger에 대한 시점도 알겠는데 저 복잡한 폴더구조에서 어떻게 데이터를 찾아서 Azure SQL 에 복사해야할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그것에 대한 답은 이미 Microsoft가 Template으로 제공하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상세한 설정과 내용은 아래 MS 가이드에 상세하게 설명되어 있으니 문서를 참고하여 설정해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/power-apps/maker/data-platform/azure-synapse-incremental-updates&quot;&gt;Dataverse용 Azure Synapse 링크를 사용하여 증분 업데이트 쿼리 및 분석 - Power Apps | Microsoft Learn&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1762869675840&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Dataverse용 Azure Synapse 링크를 사용하여 증분 업데이트 쿼리 및 분석 - Power Apps&quot; data-og-description=&quot;Power Apps 및 Azure Synapse Analytics를 사용하여 사용자가 지정한 시간 간격 동안 Microsoft Dataverse 데이터에 대한 증분 업데이트를 쿼리하고 분석하는 방법을 알아봅니다.&quot; data-og-host=&quot;learn.microsoft.com&quot; data-og-source-url=&quot;https://learn.microsoft.com/ko-kr/power-apps/maker/data-platform/azure-synapse-incremental-updates&quot; data-og-url=&quot;https://learn.microsoft.com/ko-kr/power-apps/maker/data-platform/azure-synapse-incremental-updates&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/K15em/hyZMwehFMz/qeDn4DGvNqtytPd9xoXRQ0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/kK6PJ/hyZNwKuuP1/Pz7BcRSvKtI0I97kggc2KK/img.png?width=847&amp;amp;height=681&amp;amp;face=0_0_847_681,https://scrap.kakaocdn.net/dn/5pORI/hyZNHZxUMG/kXJFIiPJoWGOWkJgSueAq1/img.png?width=828&amp;amp;height=391&amp;amp;face=0_0_828_391&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/power-apps/maker/data-platform/azure-synapse-incremental-updates&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learn.microsoft.com/ko-kr/power-apps/maker/data-platform/azure-synapse-incremental-updates&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/K15em/hyZMwehFMz/qeDn4DGvNqtytPd9xoXRQ0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/kK6PJ/hyZNwKuuP1/Pz7BcRSvKtI0I97kggc2KK/img.png?width=847&amp;amp;height=681&amp;amp;face=0_0_847_681,https://scrap.kakaocdn.net/dn/5pORI/hyZNHZxUMG/kXJFIiPJoWGOWkJgSueAq1/img.png?width=828&amp;amp;height=391&amp;amp;face=0_0_828_391');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Dataverse용 Azure Synapse 링크를 사용하여 증분 업데이트 쿼리 및 분석 - Power Apps&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Power Apps 및 Azure Synapse Analytics를 사용하여 사용자가 지정한 시간 간격 동안 Microsoft Dataverse 데이터에 대한 증분 업데이트를 쿼리하고 분석하는 방법을 알아봅니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learn.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Template을 사용해도 데이터 복사가 끝난 폴더에 대한 삭제 관리에 대한 부분은 아직 해결되지 못했다.&lt;br /&gt;이 부분을 어떻게 해결할 수 있을지에 대한 고민과 방법은 좀 더 찾아봐야할 듯 하다.&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>Dynamics365 ERP/Data Integration</category>
      <category>Azure Data Factory</category>
      <category>Azure Synapse Link</category>
      <category>dynamics365</category>
      <author>jjongjjong-e</author>
      <guid isPermaLink="true">https://jjongjjong-e.tistory.com/2</guid>
      <comments>https://jjongjjong-e.tistory.com/2#entry2comment</comments>
      <pubDate>Tue, 11 Nov 2025 23:07:34 +0900</pubDate>
    </item>
    <item>
      <title>[Dynamics365] BYOD(Bring your own database) 설정하기</title>
      <link>https://jjongjjong-e.tistory.com/1</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJ9G1C/dJMcaeTwZi2/fzG0zePTv78DECGz2QCbSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJ9G1C/dJMcaeTwZi2/fzG0zePTv78DECGz2QCbSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJ9G1C/dJMcaeTwZi2/fzG0zePTv78DECGz2QCbSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJ9G1C%2FdJMcaeTwZi2%2FfzG0zePTv78DECGz2QCbSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dynamics365 ERP를 다루다보면 Power BI나 타 시스템과의 인터페이스를 위해 BYOD 를 사용해야할 때가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 BYOD가 어떤 것인지, 언제 써야하는지, 어떻게 설정하는지에 대해 알아본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. BYOD란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MS 공식 문서 : &lt;a href=&quot;https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/analytics/export-entities-to-your-own-database&quot;&gt;Bring your own database (BYOD) - Finance &amp;amp; Operations | Dynamics 365 | Microsoft Learn&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1762261532441&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Bring your own database (BYOD) - Finance &amp;amp; Operations | Dynamics 365&quot; data-og-description=&quot;Learn how to export entities to your own Azure SQL database, including information about creating an SQL database and configuring the entity export option.&quot; data-og-host=&quot;learn.microsoft.com&quot; data-og-source-url=&quot;https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/analytics/export-entities-to-your-own-database&quot; data-og-url=&quot;https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/analytics/export-entities-to-your-own-database&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dpt5Km/hyZMwLcz1o/U4KS48D7sMZdUJDLkE4uT0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b8Uuem/hyZM0SE9nP/qDGIt6buGPumlVfLDWhG00/img.png?width=1024&amp;amp;height=437&amp;amp;face=0_0_1024_437,https://scrap.kakaocdn.net/dn/cuHk6M/hyZMZ7hzqk/JOHyYSMjH5KePEXJQFoqkK/img.png?width=646&amp;amp;height=499&amp;amp;face=0_0_646_499&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/analytics/export-entities-to-your-own-database&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/analytics/export-entities-to-your-own-database&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dpt5Km/hyZMwLcz1o/U4KS48D7sMZdUJDLkE4uT0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b8Uuem/hyZM0SE9nP/qDGIt6buGPumlVfLDWhG00/img.png?width=1024&amp;amp;height=437&amp;amp;face=0_0_1024_437,https://scrap.kakaocdn.net/dn/cuHk6M/hyZMZ7hzqk/JOHyYSMjH5KePEXJQFoqkK/img.png?width=646&amp;amp;height=499&amp;amp;face=0_0_646_499');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bring your own database (BYOD) - Finance &amp;amp; Operations | Dynamics 365&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn how to export entities to your own Azure SQL database, including information about creating an SQL database and configuring the entity export option.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learn.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MS 공식문서에 나와있듯이 BYOD는 Data entity를 Azure SQL Database 에 Export 하는 기술이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LG9TC/dJMcai2Hl9l/DhtA6ta5rK25SHUnmSl1wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LG9TC/dJMcai2Hl9l/DhtA6ta5rK25SHUnmSl1wk/img.png&quot; data-alt=&quot;MS 문서&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LG9TC/dJMcai2Hl9l/DhtA6ta5rK25SHUnmSl1wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLG9TC%2FdJMcai2Hl9l%2FDhtA6ta5rK25SHUnmSl1wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;611&quot; height=&quot;407&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MS 문서&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1-1. BYOD Push option&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BYOD를 설정할 때에 옵션 중에 &lt;b&gt;Full push&lt;/b&gt; 를 할 것이냐 &lt;b&gt;Incremental push&lt;/b&gt;를 할 것이냐가 굉장히 중요하다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 42px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 26.2791%; height: 21px;&quot;&gt;Full push (전체 푸시)&lt;/td&gt;
&lt;td style=&quot;width: 73.7209%; height: 21px;&quot;&gt;모든 데이터를 삭제 후 입력하는 방법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 26.2791%; height: 21px;&quot;&gt;Incremental push (증분 푸시)&lt;/td&gt;
&lt;td style=&quot;width: 73.7209%; height: 21px;&quot;&gt;변경이 일어난 데이터에 대해서만 변경 및 삭제하는 방법&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각 방법에 대해 장단점이 있으니 적절한 정책을 갖고 운영하여야 한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 139px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot; colspan=&quot;2&quot;&gt;&lt;b&gt; Full push &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot; colspan=&quot;2&quot;&gt;&lt;b&gt;Incremental push&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 21px; text-align: center;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 21px; text-align: center;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 21px; text-align: center;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 21px; text-align: center;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 101px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 101px;&quot;&gt;Export할 때마다 전체 데이터를 복사하기 때문에 복사된 데이터에 대한 정확도가 높다.&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 101px;&quot;&gt;모든 데이터에 대해 입력하기 때문에 시간이 매우 길게 소요될 수 있다. (특히 InventTrans나, GeneralJournalAccountEntry 같은 테이블이 있다면 더더욱)&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 101px;&quot;&gt;변경된 데이터에 대해서만 Export 를 하기 때문에 시간적으로 효율적이다.&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 101px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; &lt;span style=&quot;text-align: start;&quot;&gt;데이터의 정확성을 보장할 수 없다.&lt;/span&gt; &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1-2. BYOD 증분 푸쉬의 치명적인 단점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 표를 보면 굉장히 치명적인 말이 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&quot;데이터의 정확도를 보장할 수 없다.&quot;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니 증분 푸쉬를 한다고 해서 왜 데이터의 정확도를 보장할 수 없는 것인가!?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;증분 푸쉬는 기본적으로 Change tracking 이 Enabled 된 Entity만 설정할 수 있다는 것을 알아야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Change tracking key값을 기준으로 입력, 삭제, 변경에 대한 작업을 수행하게 되는데, 만약 Export 중 배포와 같이 시스템이 다운되는 일이 발생했다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dynamics365 가 기본적으로 이러한 경우에 대비해 시스템이 정상적으로 돌아오면 다시 종료됐던 시점부터 작업을 시작하게끔 하는 기능이 있지만.. Change tracking key를 놓치는 경우가 아주 가끔 발생하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 되면 데이터가 통채로 사라지는 등 데이터의 정확도를 보장할 수 없는 경우가 발생하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BYOD를 통해 BI와 같은 데이터를 제공했다면 그래도 다행이겠지만, 만약 인터페이스 용으로 사용하고 있었다면 그것은 굉장히 치명적인 오류가 될 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;따라서 증분 push 를 사용하더라도 주기적으로 Full push 를 통해 데이터의 정확도를 보장하거나 지속적인 모니터링이 필요할 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. BYOD 사용목적&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 왜 굳이 Dynamics365 ERP에 직접 Database를 접근하지 않고 BYOD를 통해 Data를 Export를 할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1) 운영상의 이유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dynamcis365 ERP가 Production(운영) 환경 부터는 직접적인 Database 접근을 허용하지 않기 때문에 외부에 data를 복사하여 접근하여야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2) 성능상의 이유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 Power BI가 Dynamics365 ERP의 데이터를 바라보는 방법 중에 Data Entity를 직접 OData로 접근하는 방법이 있다. 이 방법을 채택할 경우 Dynamics365 성능뿐만 아니라 Power BI의 성능에도 좋지 않을 수 있기 때문에 Database 를 따로 생성하여 데이터를 복사하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3) 인터페이스 구현의 이유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Power BI 뿐만 아니라 DB to DB 인터페이스 구현을 위해 BYOD를 사용하는 경우다 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. BYOD 에 대한 개인적인 견해&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 BYOD는 위에서 서술했던 데이터 정확도의 이슈와 Export를 하는 동안 ERP의 리소스를 사용하기 때문에 ERP의 성능상에도 문제가 발생하기 때문에 잘 권장하지는 않는다. (이를 대체하기 위해 Azure Synapse Link 라는 기술을 사용하면 되지만, 잘못하면 비용이 굉장히 많이 발생하는 경우가 생긴다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼에도 불구하고 BYOD는 설정이 아주 쉽고 다른 Azure 솔루션을 사용할 필요가 없으며 비용적으로 아주 우수하다는 장점이 있기 때문에, 데이터양이 크지 않거나 중요도가 낮은 데이터를 복사할 때에는 고려해볼만한 매력적인 솔루션임에는 틀림없다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. BYOD 설정 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BYOD는 크게 다음과 같은 설정방법으로 이루어진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;597&quot;&gt;&lt;a href=&quot;https://community.dynamics.com/blogs/post/?postid=f42c1857-1599-48f4-ac53-4fbb5e2add4f&quot; target=&quot;_blank&quot; title=&quot;출처&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qcbJ5/dJMcacBpzQp/FHkgaaqaKmNkr0qv3h0uV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqcbJ5%2FdJMcacBpzQp%2FFHkgaaqaKmNkr0qv3h0uV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;597&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;597&quot;/&gt;&lt;/a&gt;&lt;figcaption&gt;다른 블로그에서 잘 정리된 설정 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4-1. Azure SQL Database 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Azure SQL Database 를 생성하면 된다. Azure VM와 연동되는 Azure SQL 이던, PaaS형태의 Azure SQL 이던, Elastic Pool 을 사용하던 상관은 없으나 성능은 꼭 고려하여 생성하여야한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MS 문서에서는 최소 성능을 아래표로 구현하라고 하지만 실제로 가이드 대로 구현하면 비용적으로 몹시 부담이 클 수 있기 때문에, 최소 사양으로 생성 후 모니터링하며 성능을 서서히 올려보는 것을 권장한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccqZXF/dJMcacBpzQn/vV3l2DiPKvdzNbKR5TkSB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccqZXF/dJMcacBpzQn/vV3l2DiPKvdzNbKR5TkSB0/img.png&quot; data-alt=&quot;MS 추천 SQL 성능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccqZXF/dJMcacBpzQn/vV3l2DiPKvdzNbKR5TkSB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccqZXF%2FdJMcacBpzQn%2FvV3l2DiPKvdzNbKR5TkSB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;591&quot; height=&quot;236&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MS 추천 SQL 성능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4-2. Entity export option 구성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data management &amp;gt; Configure entity export to database 에 접근한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1100z/dJMcafkBjEp/7WBQTGm5jlMZAUTS69HU40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1100z/dJMcafkBjEp/7WBQTGm5jlMZAUTS69HU40/img.png&quot; data-alt=&quot;Data management&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1100z/dJMcafkBjEp/7WBQTGm5jlMZAUTS69HU40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1100z%2FdJMcafkBjEp%2F7WBQTGm5jlMZAUTS69HU40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1186&quot; height=&quot;351&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Data management&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Record를 새로 생성 후 적절한 Source name과 설명을 적어준 뒤 Connection string 을 정확히 작성해야한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JMnm0/dJMcafkBjEq/4PezX5K8hyzFTgLGwQs0kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JMnm0/dJMcafkBjEq/4PezX5K8hyzFTgLGwQs0kk/img.png&quot; data-alt=&quot;Entity store&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JMnm0/dJMcafkBjEq/4PezX5K8hyzFTgLGwQs0kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJMnm0%2FdJMcafkBjEq%2F4PezX5K8hyzFTgLGwQs0kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1201&quot; height=&quot;374&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Entity store&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Connection string 에 뭘 적어야할지 모르겠다면, Azure SQL 리소스의 설정 &amp;gt; 연결 문자열에 가면 인증방법에 따른 문자열 예시가 있으니 복사해서 사용하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2OWUi/dJMcafkBjEr/pba1IXMoUa5DC75QlgRxk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2OWUi/dJMcafkBjEr/pba1IXMoUa5DC75QlgRxk1/img.png&quot; data-alt=&quot;Azure 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2OWUi/dJMcafkBjEr/pba1IXMoUa5DC75QlgRxk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2OWUi%2FdJMcafkBjEr%2Fpba1IXMoUa5DC75QlgRxk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1248&quot; height=&quot;842&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Azure 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Connection string을 정상적으로 작성했다면 Validate 버튼을 클릭했을 때 다음과 같은 문구가 나오면 성공이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XsbMk/dJMcae639Mz/F29JZ41OW4Tr6X5vSSkPsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XsbMk/dJMcae639Mz/F29JZ41OW4Tr6X5vSSkPsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XsbMk/dJMcae639Mz/F29JZ41OW4Tr6X5vSSkPsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXsbMk%2FdJMcae639Mz%2FF29JZ41OW4Tr6X5vSSkPsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;458&quot; height=&quot;77&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;77&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4-3. Publish&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 구성된 Entity store 에 Entity를 게시하여야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단에 Publish 버튼을 클릭하면 Entity Grid 가 나오는데, Export 하고자 하는 Entity를 찾아서 Publish 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b681zc/dJMcacBpzQo/GmMiGYpDs43BtHOK444QnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b681zc/dJMcacBpzQo/GmMiGYpDs43BtHOK444QnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b681zc/dJMcacBpzQo/GmMiGYpDs43BtHOK444QnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb681zc%2FdJMcacBpzQo%2FGmMiGYpDs43BtHOK444QnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1201&quot; height=&quot;437&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;437&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4-4. Data management 작성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Export 를 하기 위한 모든 사전작업은 완료되었고, Data management 에서 Export Entity를 작성하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfoQLC/dJMcae639MA/MfUIvaDNEXzyGSGpKSn1Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfoQLC/dJMcae639MA/MfUIvaDNEXzyGSGpKSn1Ok/img.png&quot; data-alt=&quot;Export project&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfoQLC/dJMcae639MA/MfUIvaDNEXzyGSGpKSn1Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfoQLC%2FdJMcae639MA%2FMfUIvaDNEXzyGSGpKSn1Ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1210&quot; height=&quot;602&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Export project&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Entity name : 4-3에서 게시했던 Entity 중 하나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Target data format : 4-2에서 생성했던 Entity store 명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Default refresh type : 증분 혹은 전체 푸쉬 선&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적으로 Project catrgory는 다른 프로젝트와의 구분 때문에 Integration으로 하는 것을 권장하나 필수는 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 모든 설정이 끝났으면 Export 작업을 실행해서 정상적으로 Database 에 Export 되는지 확인하면 된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 설명한 방법 말고도 Change tracking 활성화나 Time out 과 같은 설정방법에 대해서도 MS 문서에서 설명하고 있으니 문서를 잘 참고했으면 좋겠다.&lt;/p&gt;</description>
      <category>Dynamics365 ERP/Data Integration</category>
      <author>jjongjjong-e</author>
      <guid isPermaLink="true">https://jjongjjong-e.tistory.com/1</guid>
      <comments>https://jjongjjong-e.tistory.com/1#entry1comment</comments>
      <pubDate>Tue, 4 Nov 2025 23:14:58 +0900</pubDate>
    </item>
  </channel>
</rss>