<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>도랜니의 놀이터</title>
    <link>https://torenyground.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 15 Apr 2026 03:14:24 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>도랜니</managingEditor>
    <item>
      <title>한 걸음 나아가는 SQL - 인덱스를 생성할 때의 기준</title>
      <link>https://torenyground.tistory.com/103</link>
      <description>&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; 인덱스를&amp;nbsp;생성할&amp;nbsp;때의&amp;nbsp;기준&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; - 사용자에 의해 사용되는 어플리케이션과 SQL과 Query에 인덱스를 생성&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;where절에서&amp;nbsp;빈번하게&amp;nbsp;사용되는&amp;nbsp;컬럼에&amp;nbsp;인덱스를&amp;nbsp;생성&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;자주&amp;nbsp;join&amp;nbsp;되는&amp;nbsp;테이블&amp;nbsp;컬럼에&amp;nbsp;인덱스를&amp;nbsp;생성&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;whwere절에서&amp;nbsp;함수와,&amp;nbsp;연산으로&amp;nbsp;사용되는&amp;nbsp;컬럼에는&amp;nbsp;인덱스를&amp;nbsp;만들지&amp;nbsp;않는다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;외래키와&amp;nbsp;whwere절에서&amp;nbsp;빈번하게&amp;nbsp;사용되는&amp;nbsp;컬럼에는&amp;nbsp;nonunique&amp;nbsp;인덱스를&amp;nbsp;생성&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;테이블의&amp;nbsp;크기가&amp;nbsp;적은&amp;nbsp;것은&amp;nbsp;인덱스를&amp;nbsp;만들지&amp;nbsp;않는다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;인덱스가&amp;nbsp;많은&amp;nbsp;경우&amp;nbsp;오버헤드를&amp;nbsp;발생시킬&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;Select&amp;nbsp;절의&amp;nbsp;컬럼을&amp;nbsp;인덱스&amp;nbsp;컬럼으로&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있다(성능&amp;nbsp;Up)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 칼럼의 분포도가 (10 ~15 %)이하인 경우 적용. 단 분포도가 범위 이상이더라도 부분범위 처리를 목적으로 하는경&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 우 인덱스 적용 (같은 값을 가지는 row가 적은 비율을 가지는 칼럼)&lt;/p&gt;</description>
      <category>데이터베이스</category>
      <author>도랜니</author>
      <guid isPermaLink="true">https://torenyground.tistory.com/103</guid>
      <comments>https://torenyground.tistory.com/103#entry103comment</comments>
      <pubDate>Thu, 8 Oct 2020 10:53:52 +0900</pubDate>
    </item>
    <item>
      <title>오라클(oracle) 실습 (전무가로 가는 지름길) 정리</title>
      <link>https://torenyground.tistory.com/100</link>
      <description>&lt;p&gt;DML을&amp;nbsp;이용하여&amp;nbsp;자료를&amp;nbsp;다룰&amp;nbsp;때는&amp;nbsp;항상&amp;nbsp;NULL을&amp;nbsp;염두에&amp;nbsp;두고&amp;nbsp;다루어야&amp;nbsp;한다. &lt;br /&gt;NUMBER&amp;nbsp;형&amp;nbsp;자료를&amp;nbsp;NULL과&amp;nbsp;연산하면&amp;nbsp;결과는&amp;nbsp;항상&amp;nbsp;NULL이&amp;nbsp;된다. &lt;br /&gt;NULL이&amp;nbsp;포함될&amp;nbsp;유려가&amp;nbsp;있는&amp;nbsp;칼럼을&amp;nbsp;이용할&amp;nbsp;때는&amp;nbsp;항상&amp;nbsp;NVL&amp;nbsp;함수를&amp;nbsp;이용하여&amp;nbsp;값을&amp;nbsp;치환시켜&amp;nbsp;사용하는&amp;nbsp;습관을&amp;nbsp;들여야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;일반&amp;nbsp;적으로&amp;nbsp;같은&amp;nbsp;지&amp;nbsp;비교&amp;nbsp;:&amp;nbsp;WHERE&amp;nbsp;A&amp;nbsp;=&amp;nbsp;'1' &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;다른&amp;nbsp;지&amp;nbsp;비교&amp;nbsp;:&amp;nbsp;WHERE&amp;nbsp;a&amp;nbsp;&amp;lt;&amp;gt;&amp;nbsp;'1' &lt;br /&gt;&lt;br /&gt;NULL&amp;nbsp;비교&amp;nbsp;:&amp;nbsp;WHERE&amp;nbsp;A&amp;nbsp;IS&amp;nbsp;NULL &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WHERE&amp;nbsp;A&amp;nbsp;IS&amp;nbsp;NOT&amp;nbsp;NULL &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELECT&amp;nbsp;EMP&amp;nbsp;NAME&amp;nbsp;FROM&amp;nbsp;TEMP&amp;nbsp;WHERE&amp;nbsp;NVL(HOBBY,&amp;nbsp;&amp;rsquo;&amp;nbsp;등산&amp;rsquo;&amp;nbsp;)&amp;nbsp;=&amp;nbsp;&amp;rsquo;등산&amp;rsquo;&amp;nbsp;; &lt;br /&gt;&lt;br /&gt;ALIAS &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;동일한&amp;nbsp;컬럼&amp;nbsp;이&amp;nbsp;두개&amp;nbsp;테이블&amp;nbsp;이상에&amp;nbsp;존재할&amp;nbsp;때&amp;nbsp;어떤&amp;nbsp;테이블의&amp;nbsp;컬럼&amp;nbsp;인지를&amp;nbsp;명시하지&amp;nbsp;않으&amp;nbsp;에러가&amp;nbsp;나게&amp;nbsp;된다.&amp;nbsp;그래서&amp;nbsp;ALIAS를&amp;nbsp;사용함 &lt;br /&gt;&lt;br /&gt;UNION&amp;nbsp;:&amp;nbsp;합집합을&amp;nbsp;구해준다(중복&amp;nbsp;자료&amp;nbsp;배제) &lt;br /&gt;UNION&amp;nbsp;ALL&amp;nbsp;:&amp;nbsp;합집합을&amp;nbsp;구해준다(중복&amp;nbsp;자료&amp;nbsp;포함) &lt;br /&gt;MINUS&amp;nbsp;:&amp;nbsp;차집합을&amp;nbsp;구해준다. &lt;br /&gt;INTERSECT&amp;nbsp;:&amp;nbsp;교집합을&amp;nbsp;구해준다. &lt;br /&gt;&lt;br /&gt;UNION&amp;nbsp;ALL&amp;nbsp;빼고&amp;nbsp;SORT&amp;nbsp;가&amp;nbsp;일어난다. &lt;br /&gt;(mode에&amp;nbsp;따라&amp;nbsp;다름) &lt;br /&gt;&lt;br /&gt;CORRELATED&amp;nbsp;서브쿼리&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CORRELATED&amp;nbsp;서브쿼리는&amp;nbsp;SUB&amp;nbsp;QUERY&amp;nbsp;가&amp;nbsp;MAIN&amp;nbsp;QUERY&amp;nbsp;의&amp;nbsp;값을&amp;nbsp;이용하고，&amp;nbsp;그&amp;nbsp;렇게&amp;nbsp;구해진&amp;nbsp;SUB&amp;nbsp;QUERY의&amp;nbsp;값을&amp;nbsp;다시&amp;nbsp;MAIN&amp;nbsp;QUERY가&amp;nbsp;다시&amp;nbsp;이용하게&amp;nbsp;된다&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELECT&amp;nbsp;EMP&amp;nbsp;ID,EMP_NAME&amp;nbsp;FROM&amp;nbsp;TEMP&amp;nbsp;A&amp;nbsp;WHERE&amp;nbsp;SALARY&amp;nbsp;&amp;gt;&amp;nbsp;(SELECT&amp;nbsp;AVG(SALARY)&amp;nbsp;FROM&amp;nbsp;TEMP&amp;nbsp;B&amp;nbsp;WHERE&amp;nbsp;B.LEV&amp;nbsp;=&amp;nbsp;A.LEV) &lt;br /&gt;&lt;br /&gt;ROWNUM &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ORDER&amp;nbsp;B&amp;gamma;&amp;nbsp;후에&amp;nbsp;ROWNUM이&amp;nbsp;붙는&amp;nbsp;것이&amp;nbsp;아니고，&amp;nbsp;조건&amp;nbsp;절&amp;nbsp;을&amp;nbsp;만족시킨&amp;nbsp;행들에&amp;nbsp;ROWNUM이&amp;nbsp;붙은&amp;nbsp;후&amp;nbsp;ORDER&amp;nbsp;BY가&amp;nbsp;이루어진다. &lt;br /&gt;&lt;br /&gt;ROWID &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ROWID는&amp;nbsp;DATABASE내의&amp;nbsp;모든&amp;nbsp;ROW가&amp;nbsp;가지는&amp;nbsp;유일한&amp;nbsp;식별자이다. &lt;br /&gt;&lt;br /&gt;NOT&amp;nbsp;IN &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NOTIN&amp;nbsp;연산자에&amp;nbsp;NULL이&amp;nbsp;포함되면&amp;nbsp;어떠한&amp;nbsp;경우&amp;nbsp;일지라도&amp;nbsp;한건도&amp;nbsp;DATA를&amp;nbsp;검색하지&amp;nbsp;못&amp;nbsp;한다.&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WHERE&amp;nbsp;HOBBY&amp;nbsp;&amp;lt;&amp;gt;&amp;nbsp;NULL&amp;nbsp;AND&amp;nbsp;HOBBY&amp;nbsp;&amp;lt;&amp;gt;&amp;nbsp;&amp;rsquo;&amp;nbsp;낚시&amp;nbsp;&amp;rsquo;&amp;nbsp;;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;HIERACHICAL&amp;nbsp;SELECT&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;자료의&amp;nbsp;구조가&amp;nbsp;계층적으로&amp;nbsp;이루어진&amp;nbsp;경우&amp;nbsp;상위자료에서부터&amp;nbsp;하위자료로의&amp;nbsp;자료전개&amp;nbsp;및&amp;nbsp;하위자료에서&amp;nbsp;상위자료로의&amp;nbsp;역&amp;nbsp;전개를&amp;nbsp;위하여&amp;nbsp;사용되는&amp;nbsp;SELECT&amp;nbsp;형식이다 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELECT&amp;nbsp;LEVEL,&amp;nbsp;DEPT&amp;nbsp;CODE,&amp;nbsp;DEPT&amp;nbsp;N.따&amp;lsquo;E&amp;nbsp;FROM&amp;nbsp;TDEPT&amp;nbsp;CONNECT&amp;nbsp;BY&amp;nbsp;PRIOR&amp;nbsp;DEPT&amp;nbsp;CODE&amp;nbsp;=&amp;nbsp;PARENT&amp;nbsp;DEPT&amp;nbsp;START&amp;nbsp;WITH&amp;nbsp;DEPT&amp;nbsp;CODE&amp;nbsp;=&amp;nbsp;&amp;rsquo;&amp;nbsp;000000&amp;nbsp;&amp;rsquo;;&amp;nbsp; &lt;/p&gt;</description>
      <author>도랜니</author>
      <guid isPermaLink="true">https://torenyground.tistory.com/100</guid>
      <comments>https://torenyground.tistory.com/100#entry100comment</comments>
      <pubDate>Thu, 7 May 2020 15:51:42 +0900</pubDate>
    </item>
    <item>
      <title>VS CODE (비쥬얼 스튜디오 코드에서) Spring boot 실행 (RUN)</title>
      <link>https://torenyground.tistory.com/99</link>
      <description>&lt;p&gt;.\mvnw&amp;nbsp;spring-boot:run&amp;nbsp;메이븐&amp;nbsp;프로젝트&amp;nbsp;실행&amp;nbsp;명령어 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;./gradlew bootRun 그래들 프로젝트 실행 명령어&lt;/p&gt;</description>
      <category>Spring</category>
      <author>도랜니</author>
      <guid isPermaLink="true">https://torenyground.tistory.com/99</guid>
      <comments>https://torenyground.tistory.com/99#entry99comment</comments>
      <pubDate>Fri, 3 Apr 2020 17:02:22 +0900</pubDate>
    </item>
    <item>
      <title>도메인 주도 설계(DDD) 책 정리</title>
      <link>https://torenyground.tistory.com/98</link>
      <description>&lt;p&gt;-&amp;nbsp;문서&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;문서는&amp;nbsp;프로젝트&amp;nbsp;활동과&amp;nbsp;관련을&amp;nbsp;맺고&amp;nbsp;있어야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Ubiquitous&amp;nbsp;languzge언어로&amp;nbsp;작성하라 &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;문서를&amp;nbsp;최소한으로&amp;nbsp;유지하고&amp;nbsp;대화를&amp;nbsp;보완하는&amp;nbsp;데&amp;nbsp;집중하라 &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;문서는&amp;nbsp;유요한&amp;nbsp;상태를&amp;nbsp;유지하고&amp;nbsp;최신&amp;nbsp;내용을&amp;nbsp;담고&amp;nbsp;있어야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;하나의&amp;nbsp;모델이&amp;nbsp;구현,&amp;nbsp;설계,&amp;nbsp;의사소통의&amp;nbsp;기초가&amp;nbsp;되야&amp;nbsp;한다 &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;설명을&amp;nbsp;위한&amp;nbsp;모델!! &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;모델과&amp;nbsp;설계를&amp;nbsp;연계한는&amp;nbsp;것이&amp;nbsp;실용적이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;소프트웨어&amp;nbsp;시스템의&amp;nbsp;일부를&amp;nbsp;설계할&amp;nbsp;때는&amp;nbsp;도메인&amp;nbsp;모델을&amp;nbsp;있는&amp;nbsp;그대로&amp;nbsp;반영해서&amp;nbsp;설계와&amp;nbsp;모델의&amp;nbsp;대응을&amp;nbsp;분명하게&amp;nbsp;하라.&amp;nbsp;또한&amp;nbsp;모델을&amp;nbsp;재검토해서&amp;nbsp;더욱&amp;nbsp;자연스럽게&amp;nbsp;소프트웨어로&amp;nbsp;구현될&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;수정하라 &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;유비쿼터스&amp;nbsp;언어를&amp;nbsp;지원하는&amp;nbsp;것과&amp;nbsp;더불어&amp;nbsp;분석과&amp;nbsp;설계의&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;측면을&amp;nbsp;충분히&amp;nbsp;만족하는&amp;nbsp;단&amp;nbsp;하나의&amp;nbsp;모델을&amp;nbsp;만들어내야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;DDD에서는&amp;nbsp;모든&amp;nbsp;단일&amp;nbsp;컨텍스트&amp;nbsp;내에서&amp;nbsp;오로지&amp;nbsp;하나의&amp;nbsp;모델을&amp;nbsp;다룰&amp;nbsp;것을&amp;nbsp;요구한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;코드의&amp;nbsp;변경이&amp;nbsp;곧&amp;nbsp;모델의&amp;nbsp;변경이다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;도메인의&amp;nbsp;격리 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;시스템에서&amp;nbsp;도메인과&amp;nbsp;관련이&amp;nbsp;적은&amp;nbsp;기능으로부터&amp;nbsp;도메인&amp;nbsp;객체를&amp;nbsp;분리할&amp;nbsp;필요가&amp;nbsp;있다.&amp;nbsp;이러한&amp;nbsp;기법을&amp;nbsp;Layered&amp;nbsp;architecture(계층형&amp;nbsp;아키텍처)&amp;nbsp;이라고&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;매우&amp;nbsp;복잡한&amp;nbsp;작업을&amp;nbsp;처리하는&amp;nbsp;소프트웨어를&amp;nbsp;만들&amp;nbsp;경우&amp;nbsp;관심사의&amp;nbsp;분리가&amp;nbsp;필요하며,&amp;nbsp;이로써&amp;nbsp;격리된&amp;nbsp;상태에&amp;nbsp;있는&amp;nbsp;각&amp;nbsp;설계&amp;nbsp;요소에&amp;nbsp;집중할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;동시에&amp;nbsp;시스템&amp;nbsp;내의&amp;nbsp;정교한&amp;nbsp;상호작용은&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;그러한&amp;nbsp;분리와는&amp;nbsp;상관없이&amp;nbsp;유지돼야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;계층화의&amp;nbsp;핵심&amp;nbsp;원칙은&amp;nbsp;한&amp;nbsp;계층의&amp;nbsp;모든&amp;nbsp;요소는&amp;nbsp;오직&amp;nbsp;같은&amp;nbsp;계층에&amp;nbsp;존재하는&amp;nbsp;다른&amp;nbsp;요소나&amp;nbsp;계층상&amp;nbsp;'아래'에&amp;nbsp;위치한&amp;nbsp;요소에만&amp;nbsp;의존한다는것이다&amp;nbsp;위로&amp;nbsp;거슬러&amp;nbsp;올라가는&amp;nbsp;의사소통은&amp;nbsp;반드시&amp;nbsp;간적접인&amp;nbsp;메커니즘을&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;거처야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4가지&amp;nbsp;계층으로&amp;nbsp;이루어짐&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;사용자&amp;nbsp;인터페이스&amp;nbsp;:&amp;nbsp;사용자에게&amp;nbsp;정보를&amp;nbsp;보여주고&amp;nbsp;사용자의&amp;nbsp;명령을&amp;nbsp;해석하는&amp;nbsp;일을&amp;nbsp;책임진다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;응용계층&amp;nbsp;:&amp;nbsp;소프트웨어가&amp;nbsp;수행할&amp;nbsp;작업을&amp;nbsp;저으이하고&amp;nbsp;표현력&amp;nbsp;있는&amp;nbsp;도메인&amp;nbsp;객체가&amp;nbsp;문제를&amp;nbsp;해결하게&amp;nbsp;한다.&amp;nbsp;이&amp;nbsp;계층에서&amp;nbsp;책임지는&amp;nbsp;작업은&amp;nbsp;업무상&amp;nbsp;중요하거나&amp;nbsp;다른&amp;nbsp;시스템의&amp;nbsp;응용&amp;nbsp;계층과&amp;nbsp;상호작용하는데&amp;nbsp;필요한&amp;nbsp;것들이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;도메인&amp;nbsp;계층&amp;nbsp;:&amp;nbsp;업무&amp;nbsp;개념과&amp;nbsp;업무&amp;nbsp;상황에&amp;nbsp;관한&amp;nbsp;정보,&amp;nbsp;업무&amp;nbsp;규칙을&amp;nbsp;표현하는&amp;nbsp;일을&amp;nbsp;책임진다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;인프라스트럭쳐&amp;nbsp;계층&amp;nbsp;상위&amp;nbsp;계층을&amp;nbsp;지원하는&amp;nbsp;일반화된&amp;nbsp;기술적&amp;nbsp;기능을&amp;nbsp;제공한다.&amp;nbsp;메시지&amp;nbsp;전송,&amp;nbsp;도메인&amp;nbsp;영속화,&amp;nbsp;UI위젯을&amp;nbsp;그리는&amp;nbsp;것등&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;복잡한&amp;nbsp;프로그램을&amp;nbsp;여러&amp;nbsp;개의&amp;nbsp;계층으로&amp;nbsp;나누어라 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;상위&amp;nbsp;계층과의&amp;nbsp;결합을&amp;nbsp;느슨하게&amp;nbsp;유지하라. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;도메인&amp;nbsp;객체는&amp;nbsp;도메인&amp;nbsp;모델을&amp;nbsp;표현하는&amp;nbsp;것에만&amp;nbsp;집중&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;계층&amp;nbsp;간&amp;nbsp;관계&amp;nbsp;설정 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;각&amp;nbsp;계층은&amp;nbsp;설계&amp;nbsp;의존성을&amp;nbsp;오직&amp;nbsp;한&amp;nbsp;방향으로만&amp;nbsp;둬서&amp;nbsp;느슨하게&amp;nbsp;결합된다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;하위&amp;nbsp;수준의&amp;nbsp;객체가&amp;nbsp;상위&amp;nbsp;수준의&amp;nbsp;객체와&amp;nbsp;소통해야&amp;nbsp;할&amp;nbsp;경우&amp;nbsp;콜백이나&amp;nbsp;ovserver패턴처럼&amp;nbsp;계층&amp;nbsp;간에&amp;nbsp;관계를&amp;nbsp;맺어주는&amp;nbsp;아키텍처&amp;nbsp;패턴을&amp;nbsp;활욜&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-smart&amp;nbsp;ui&amp;nbsp;안티패턴 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;모든&amp;nbsp;업무&amp;nbsp;로직을&amp;nbsp;사용자&amp;nbsp;인터페이스에&amp;nbsp;넣어라.&amp;nbsp;애플리케이션을&amp;nbsp;작은&amp;nbsp;기능으로&amp;nbsp;잘게&amp;nbsp;나누고,&amp;nbsp;나눈&amp;nbsp;기능을&amp;nbsp;각기&amp;nbsp;분리된&amp;nbsp;사용자&amp;nbsp;인터페이스로&amp;nbsp;구현해서&amp;nbsp;업무&amp;nbsp;규칙을&amp;nbsp;분리된&amp;nbsp;사용자&amp;nbsp;인터페이스에&amp;nbsp;들어가게&amp;nbsp;하라. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;단점&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;데이터&amp;nbsp;베이스를&amp;nbsp;이용하는&amp;nbsp;방식&amp;nbsp;말고는&amp;nbsp;여러&amp;nbsp;애플리케이션을&amp;nbsp;통합하기가&amp;nbsp;수월하지&amp;nbsp;않다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;행위를&amp;nbsp;재사용하지&amp;nbsp;않으며&amp;nbsp;업무&amp;nbsp;문제에&amp;nbsp;대한&amp;nbsp;추상화가&amp;nbsp;이뤄지지&amp;nbsp;않는다.&amp;nbsp;업무&amp;nbsp;규칙이&amp;nbsp;적용&amp;nbsp;되는&amp;nbsp;연만사다&amp;nbsp;업무&amp;nbsp;규칙이&amp;nbsp;중복된다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;신속한&amp;nbsp;프로토타입&amp;nbsp;작성과&amp;nbsp;반복주기가&amp;nbsp;smart&amp;nbsp;ui가&amp;nbsp;지닌&amp;nbsp;태생적인&amp;nbsp;한계에&amp;nbsp;도달하게&amp;nbsp;된다.&amp;nbsp;이는&amp;nbsp;추상화의&amp;nbsp;부재로&amp;nbsp;리팩터링의&amp;nbsp;여지가&amp;nbsp;제한되기&amp;nbsp;때문이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;복잡성에&amp;nbsp;금방&amp;nbsp;압도되어&amp;nbsp;애플리케이션의&amp;nbsp;성장&amp;nbsp;경로가&amp;nbsp;순전히&amp;nbsp;부가적인&amp;nbsp;단순&amp;nbsp;응용으로만&amp;nbsp;향한다&amp;nbsp;우아한&amp;nbsp;방법으로&amp;nbsp;더욱&amp;nbsp;풍부한&amp;nbsp;행위를&amp;nbsp;갖출&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;방법은&amp;nbsp;없다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-연관관계를&amp;nbsp;줄여라(다루는&amp;nbsp;방법) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;탐색&amp;nbsp;방향을&amp;nbsp;부여한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;한정자를&amp;nbsp;추가해서&amp;nbsp;사실상&amp;nbsp;다중성을&amp;nbsp;줄인다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;중요하지&amp;nbsp;않은&amp;nbsp;연관관계를&amp;nbsp;제거한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;ENTITY &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;자신의&amp;nbsp;생명주기&amp;nbsp;동안&amp;nbsp;형태와&amp;nbsp;내용이&amp;nbsp;급격하게&amp;nbsp;바뀔&amp;nbsp;수도&amp;nbsp;있지만&amp;nbsp;연속성은&amp;nbsp;유지해야한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;식별성이&amp;nbsp;저의돼&amp;nbsp;있어야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;사람,도시,자동차,복권티켓,은행거래&amp;nbsp;등 &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ex)&amp;nbsp;경기장의&amp;nbsp;좌석을&amp;nbsp;예약하는&amp;nbsp;애플리케이션에서는&amp;nbsp;좌석과&amp;nbsp;참석자를&amp;nbsp;ENTITY로&amp;nbsp;다룰&amp;nbsp;수&amp;nbsp;있다&amp;nbsp;지정석인&amp;nbsp;경우&amp;nbsp;고유의&amp;nbsp;좌석번호가&amp;nbsp;적혀&amp;nbsp;있을&amp;nbsp;것이므로&amp;nbsp;좌석은&amp;nbsp;유일한&amp;nbsp;식별자를&amp;nbsp;갖는다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;하지만,&amp;nbsp;입장권을&amp;nbsp;가진&amp;nbsp;사람이&amp;nbsp;빈&amp;nbsp;좌석을&amp;nbsp;찾아&amp;nbsp;아무&amp;nbsp;데나&amp;nbsp;앉을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;&quot;일반석&quot;이라면&amp;nbsp;개별좌석을&amp;nbsp;구분하지&amp;nbsp;않아도&amp;nbsp;된다.&amp;nbsp;이&amp;nbsp;경우&amp;nbsp;Entity가&amp;nbsp;아니며&amp;nbsp;식별자는&amp;nbsp;필요하지&amp;nbsp;않다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;가장&amp;nbsp;기본적인&amp;nbsp;책임은&amp;nbsp;객체의&amp;nbsp;행위가&amp;nbsp;명확하고&amp;nbsp;예측&amp;nbsp;가능해질&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;연속성을&amp;nbsp;확립하는&amp;nbsp;것이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;Value&amp;nbsp;Object &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;ENTITY의&amp;nbsp;식별성을&amp;nbsp;관리하는&amp;nbsp;일은&amp;nbsp;매우&amp;nbsp;중요하지만&amp;nbsp;그&amp;nbsp;밖의&amp;nbsp;객체에&amp;nbsp;식별성을&amp;nbsp;추가한다면&amp;nbsp;시스템의&amp;nbsp;성능이&amp;nbsp;저하되고,&amp;nbsp;분석&amp;nbsp;작업이&amp;nbsp;별도로&amp;nbsp;필요하며,&amp;nbsp;모든&amp;nbsp;객체를&amp;nbsp;동일한&amp;nbsp;것으로&amp;nbsp;보이게&amp;nbsp;해서&amp;nbsp;모델이&amp;nbsp;혼란스러워질&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;소프트웨어&amp;nbsp;설계는&amp;nbsp;복잡성과&amp;nbsp;끊임없는&amp;nbsp;전투다.&amp;nbsp;그러므로&amp;nbsp;우리는&amp;nbsp;특별하게&amp;nbsp;다뤄야&amp;nbsp;할&amp;nbsp;부분과&amp;nbsp;그렇지&amp;nbsp;않은&amp;nbsp;부분을&amp;nbsp;구분해야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;식별성이&amp;nbsp;없는&amp;nbsp;것으로만&amp;nbsp;생각한다면,&amp;nbsp;추가할&amp;nbsp;게&amp;nbsp;그리&amp;nbsp;많지&amp;nbsp;않다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;즉,&amp;nbsp;사물을&amp;nbsp;서술하는&amp;nbsp;객체다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;종종&amp;nbsp;한&amp;nbsp;연산에서&amp;nbsp;사용할&amp;nbsp;목적으로&amp;nbsp;만들어진&amp;nbsp;후&amp;nbsp;폐기되는&amp;nbsp;것처럼&amp;nbsp;일시적인&amp;nbsp;용도로&amp;nbsp;사용되기도&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;모델에&amp;nbsp;포함된&amp;nbsp;어떤&amp;nbsp;요소의&amp;nbsp;속성에만&amp;nbsp;관심이&amp;nbsp;있다면&amp;nbsp;그것을&amp;nbsp;VALUE&amp;nbsp;OBJECT로&amp;nbsp;분류하라. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VALUE&amp;nbsp;OBJECT는&amp;nbsp;불변적으로&amp;nbsp;다뤄라! &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ex)&amp;nbsp;한&amp;nbsp;객체가&amp;nbsp;다른&amp;nbsp;여러&amp;nbsp;객체에서&amp;nbsp;참조되고&amp;nbsp;있다면&amp;nbsp;그러한&amp;nbsp;객체&amp;nbsp;가운데&amp;nbsp;일부는&amp;nbsp;가까이에&amp;nbsp;위치하지&amp;nbsp;않을&amp;nbsp;것이므로&amp;nbsp;데이터를&amp;nbsp;가져오는&amp;nbsp;데&amp;nbsp;물리적인&amp;nbsp;연산이&amp;nbsp;추가적으로&amp;nbsp;필요할&amp;nbsp;것이다.&amp;nbsp;(동일한&amp;nbsp;데이터에&amp;nbsp;여러&amp;nbsp;개의&amp;nbsp;사본을&amp;nbsp;저장하는&amp;nbsp;기법 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;을&amp;nbsp;역정규화라고하며&amp;nbsp;접근&amp;nbsp;시간이&amp;nbsp;더&amp;nbsp;중요한&amp;nbsp;경우에&amp;nbsp;사용한다.) &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;MODULE(모듈,&amp;nbsp;패키지라고&amp;nbsp;함) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;보통&amp;nbsp;module을&amp;nbsp;토대로&amp;nbsp;모델을&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;측면에서&amp;nbsp;바라&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있다,&amp;nbsp;즉&amp;nbsp;사람들은&amp;nbsp;전체에&amp;nbsp;압도되지&amp;nbsp;않고도&amp;nbsp;세부사항을&amp;nbsp;보거나,&amp;nbsp;세부&amp;nbsp;사항을&amp;nbsp;배제한&amp;nbsp;상태에서&amp;nbsp;module&amp;nbsp;간의&amp;nbsp;관계를&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;모듈간의&amp;nbsp;결합도는&amp;nbsp;낮아야&amp;nbsp;하고&amp;nbsp;모듈간의&amp;nbsp;응집도는&amp;nbsp;높아야한다.(모듈로&amp;nbsp;쪼개지는&amp;nbsp;것은&amp;nbsp;코드가&amp;nbsp;아닌&amp;nbsp;개념이다) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;모듈은&amp;nbsp;모델과&amp;nbsp;함께&amp;nbsp;발전해야&amp;nbsp;한다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;Aggregate &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;우리가&amp;nbsp;데이터&amp;nbsp;변경의&amp;nbsp;단위로&amp;nbsp;다루는&amp;nbsp;연관&amp;nbsp;객체의&amp;nbsp;묶음을&amp;nbsp;말한다.&amp;nbsp;Aggregate에는&amp;nbsp;루트와&amp;nbsp;경계가&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;경계는&amp;nbsp;Aggregate에&amp;nbsp;무엇이&amp;nbsp;포함되고&amp;nbsp;포함되지&amp;nbsp;않는지를&amp;nbsp;정의한다.&amp;nbsp;루트는&amp;nbsp;단&amp;nbsp;하나만&amp;nbsp;존재하며,&amp;nbsp;Aggregate에&amp;nbsp;포함된&amp;nbsp;특정&amp;nbsp;ENTITY를&amp;nbsp;가리킨다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;경계&amp;nbsp;안의&amp;nbsp;객체는&amp;nbsp;서로&amp;nbsp;참조&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있지만,&amp;nbsp;경계&amp;nbsp;바깥의&amp;nbsp;객체는&amp;nbsp;해당&amp;nbsp;Aggregate의&amp;nbsp;구성요소&amp;nbsp;가운데&amp;nbsp;루트만&amp;nbsp;참조할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;루트&amp;nbsp;이외의&amp;nbsp;ENTITY는&amp;nbsp;지역&amp;nbsp;식별성을&amp;nbsp;지니며,&amp;nbsp;지역&amp;nbsp;식별성은&amp;nbsp;Aggregate&amp;nbsp;내에서만&amp;nbsp;구분되면&amp;nbsp;된다.&amp;nbsp;이는&amp;nbsp;해당&amp;nbsp;Aggregatedml&amp;nbsp;경계&amp;nbsp;밖에&amp;nbsp;위치한&amp;nbsp;객체는&amp;nbsp;루트&amp;nbsp;ENTITY의&amp;nbsp;컨텍스트&amp;nbsp;말고는&amp;nbsp;Aggregate의&amp;nbsp;내부를&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;없기&amp;nbsp;때문이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ENTITY와&amp;nbsp;VALUE&amp;nbsp;OBJECT를&amp;nbsp;Aggregate로&amp;nbsp;모으고&amp;nbsp;각각에&amp;nbsp;대해&amp;nbsp;경계를&amp;nbsp;정의하라. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;한&amp;nbsp;ENTITY를&amp;nbsp;골라&amp;nbsp;Aggregate의&amp;nbsp;루트로&amp;nbsp;만들고&amp;nbsp;Aggregate&amp;nbsp;경계&amp;nbsp;내부의&amp;nbsp;객체에&amp;nbsp;데해서는&amp;nbsp;루트를&amp;nbsp;거쳐&amp;nbsp;접근할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;하라.&amp;nbsp;Aggregate&amp;nbsp;밖의&amp;nbsp;객체는&amp;nbsp;루트만&amp;nbsp;참조할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;하라. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;내부&amp;nbsp;구성요소에&amp;nbsp;대한&amp;nbsp;일시적인&amp;nbsp;참조는&amp;nbsp;단일&amp;nbsp;연산에서만&amp;nbsp;사용할&amp;nbsp;목적에&amp;nbsp;한해&amp;nbsp;외부로&amp;nbsp;전달될&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;루트를&amp;nbsp;경유하지&amp;nbsp;않고는&amp;nbsp;Aggregate의&amp;nbsp;내부를&amp;nbsp;변경할&amp;nbsp;수&amp;nbsp;없다.&amp;nbsp;이런식으로&amp;nbsp;Aggregate의&amp;nbsp;각&amp;nbsp;요소를&amp;nbsp;배치하면&amp;nbsp;Aggregate&amp;nbsp;안의&amp;nbsp;객체와 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;전체로서의&amp;nbsp;&amp;nbsp;Aggregate의&amp;nbsp;상태를&amp;nbsp;변경할때&amp;nbsp;모든&amp;nbsp;불변식을&amp;nbsp;효과적으로&amp;nbsp;이행할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-FACTORY &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;어떤&amp;nbsp;객체나&amp;nbsp;전체&amp;nbsp;Aggregate를&amp;nbsp;생성하는&amp;nbsp;일이&amp;nbsp;복잡해지거나&amp;nbsp;내부&amp;nbsp;구조를&amp;nbsp;너무&amp;nbsp;많이&amp;nbsp;드러내는&amp;nbsp;경우&amp;nbsp;FACTORY가&amp;nbsp;캡슐화를&amp;nbsp;제공해준다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;복잡한&amp;nbsp;객체와&amp;nbsp;Aggregated의&amp;nbsp;인스턴스를&amp;nbsp;생성하는&amp;nbsp;책임을&amp;nbsp;별도의&amp;nbsp;객체로&amp;nbsp;옮겨라. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FACTORY를&amp;nbsp;잘&amp;nbsp;설계학&amp;nbsp;위한&amp;nbsp;두가지&amp;nbsp;기본&amp;nbsp;요건 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;각&amp;nbsp;생성&amp;nbsp;방법은&amp;nbsp;원자적이어야&amp;nbsp;한다,&amp;nbsp;생성된&amp;nbsp;객체나&amp;nbsp;Aggregate의&amp;nbsp;불변식을&amp;nbsp;모두&amp;nbsp;지켜야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;생성된&amp;nbsp;클래스보다는&amp;nbsp;생성하고자&amp;nbsp;하는&amp;nbsp;타입으로&amp;nbsp;추상화돼야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;생성자만으로&amp;nbsp;충분한&amp;nbsp;경우 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;클래스가&amp;nbsp;타입인&amp;nbsp;경우,&amp;nbsp;인터페이스를&amp;nbsp;구현하는&amp;nbsp;식으로&amp;nbsp;다형적으로&amp;nbsp;사용되지&amp;nbsp;않는&amp;nbsp;경우 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;클라이언트가&amp;nbsp;strategy를&amp;nbsp;선택하는&amp;nbsp;한&amp;nbsp;방법으로서&amp;nbsp;구현체에&amp;nbsp;관심이&amp;nbsp;있는&amp;nbsp;경우 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;클라이언트가&amp;nbsp;객체의&amp;nbsp;속성을&amp;nbsp;모두&amp;nbsp;이용할&amp;nbsp;수&amp;nbsp;있어서&amp;nbsp;클라이언트에게&amp;nbsp;노출된&amp;nbsp;생성자&amp;nbsp;내에서&amp;nbsp;객체&amp;nbsp;생성이&amp;nbsp;중첩되지&amp;nbsp;않는&amp;nbsp;경우 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;생성자가&amp;nbsp;복잡하지&amp;nbsp;않은&amp;nbsp;경우 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;공개&amp;nbsp;생성자가&amp;nbsp;FACTORY와&amp;nbsp;동일한&amp;nbsp;규칙을&amp;nbsp;반드시&amp;nbsp;준수해야&amp;nbsp;하는&amp;nbsp;경우,&amp;nbsp;이때&amp;nbsp;해당&amp;nbsp;규칙은&amp;nbsp;생성된&amp;nbsp;객체의&amp;nbsp;모든&amp;nbsp;불변식을&amp;nbsp;충족하는&amp;nbsp;원자적인&amp;nbsp;연산이어야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;인터페이스&amp;nbsp;설계 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;각&amp;nbsp;연산은&amp;nbsp;원자적이어야한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FACTORY는&amp;nbsp;자신에게&amp;nbsp;전달된&amp;nbsp;인자와&amp;nbsp;결합될&amp;nbsp;것이다.&amp;nbsp;입력&amp;nbsp;매개변수를&amp;nbsp;신경&amp;nbsp;써야한다.&amp;nbsp;아니면&amp;nbsp;의존성의&amp;nbsp;덫이&amp;nbsp;만들어질&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;명확한&amp;nbsp;모델을&amp;nbsp;발견하는&amp;nbsp;것이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;다소&amp;nbsp;불명확한&amp;nbsp;개념을&amp;nbsp;모델링&amp;nbsp;하는&amp;nbsp;법 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;명시적인&amp;nbsp;제약조건 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;흔히&amp;nbsp;제약조건은&amp;nbsp;암시적인&amp;nbsp;상태로&amp;nbsp;존재하며,&amp;nbsp;이를&amp;nbsp;명시적으로&amp;nbsp;표현하면&amp;nbsp;서계를&amp;nbsp;대폭&amp;nbsp;개선할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(간단한&amp;nbsp;불변식의&amp;nbsp;경우에는&amp;nbsp;내용물을&amp;nbsp;변경하는&amp;nbsp;개별&amp;nbsp;연산&amp;nbsp;안에&amp;nbsp;조건&amp;nbsp;로직을&amp;nbsp;사용해서&amp;nbsp;불변식을&amp;nbsp;보장할&amp;nbsp;수&amp;nbsp;있다,) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;제약조건을&amp;nbsp;자체적인&amp;nbsp;메서드로&amp;nbsp;분리하면&amp;nbsp;제약조건에&amp;nbsp;이름을&amp;nbsp;부여해서&amp;nbsp;제약조건을&amp;nbsp;멱확하게&amp;nbsp;표현할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;도메인&amp;nbsp;객체로서의&amp;nbsp;프로세스 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;알고리즘&amp;nbsp;자체&amp;nbsp;또는&amp;nbsp;그것의&amp;nbsp;일부를&amp;nbsp;하나의&amp;nbsp;객체로&amp;nbsp;만드는&amp;nbsp;것이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-specification&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;다른&amp;nbsp;객체에&amp;nbsp;대한&amp;nbsp;제약조건을&amp;nbsp;기술하며,&amp;nbsp;제약조건은&amp;nbsp;존재할&amp;nbsp;수도&amp;nbsp;존재하지&amp;nbsp;않을&amp;nbsp;수도&amp;nbsp;있따.(또,&amp;nbsp;명시된&amp;nbsp;기준을&amp;nbsp;만족하는지&amp;nbsp;검사할&amp;nbsp;수&amp;nbsp;있다) &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;매우&amp;nbsp;상이해&amp;nbsp;보이는&amp;nbsp;애플리케이션&amp;nbsp;기능을&amp;nbsp;하나로&amp;nbsp;통합해&amp;nbsp;준다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;객체가&amp;nbsp;어떤&amp;nbsp;요건을&amp;nbsp;충족시키거나&amp;nbsp;특정&amp;nbsp;목적으로&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있는지&amp;nbsp;가늠하고자&amp;nbsp;객체를&amp;nbsp;검증 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;컬렉션&amp;nbsp;내의&amp;nbsp;객체를&amp;nbsp;선택 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;특정한&amp;nbsp;요구사항을&amp;nbsp;만족하는&amp;nbsp;새로운&amp;nbsp;객체의&amp;nbsp;생성을&amp;nbsp;명시 &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.검증&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.선택(또는&amp;nbsp;질의)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.요청&amp;nbsp;구축&amp;nbsp;생성&amp;nbsp;(specification을&amp;nbsp;사용해서&amp;nbsp;생성기의&amp;nbsp;인터페이스를&amp;nbsp;정의하면&amp;nbsp;생성할&amp;nbsp;결과물을&amp;nbsp;명시적으로&amp;nbsp;인터페이스에&amp;nbsp;포함시킬&amp;nbsp;수&amp;nbsp;있따.) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;생성기의&amp;nbsp;구현을&amp;nbsp;인터페스로부터&amp;nbsp;분리할&amp;nbsp;수&amp;nbsp;있따.&amp;nbsp;specification은&amp;nbsp;생성할&amp;nbsp;결과물에&amp;nbsp;대한&amp;nbsp;요구사항은&amp;nbsp;선언하지만&amp;nbsp;결과물을&amp;nbsp;생성하는&amp;nbsp;방법은&amp;nbsp;정의하지&amp;nbsp;않는다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;specification을&amp;nbsp;사용한&amp;nbsp;인터페이스는&amp;nbsp;생성&amp;nbsp;규칙을&amp;nbsp;명시적으로&amp;nbsp;전해주므로&amp;nbsp;개발자들이&amp;nbsp;연산의&amp;nbsp;세부적인&amp;nbsp;사항을&amp;nbsp;이해하지&amp;nbsp;않고도&amp;nbsp;생성기의&amp;nbsp;결과물을&amp;nbsp;예상할수있따. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;생성기는&amp;nbsp;단순히&amp;nbsp;specification에&amp;nbsp;포함된&amp;nbsp;조건에&amp;nbsp;따라&amp;nbsp;객체를&amp;nbsp;생성하는&amp;nbsp;반면&amp;nbsp;생성&amp;nbsp;요청을&amp;nbsp;표현하는&amp;nbsp;코드는&amp;nbsp;클아이언트에&amp;nbsp;존재하므로&amp;nbsp;더&amp;nbsp;유연한&amp;nbsp;인터페이스를&amp;nbsp;얻거나&amp;nbsp;더&amp;nbsp;유연하게&amp;nbsp;개선할&amp;nbsp;수&amp;nbsp;있따. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;유연한&amp;nbsp;설계를&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;패턴&amp;nbsp;집합 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-intention-revealing&amp;nbsp;interface(의도를&amp;nbsp;드러내는&amp;nbsp;인터페이스) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;도메인&amp;nbsp;개념을&amp;nbsp;반영하도록&amp;nbsp;클래스와&amp;nbsp;메서드의&amp;nbsp;이름을&amp;nbsp;지어야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;결과와&amp;nbsp;목적만을&amp;nbsp;표현하도록&amp;nbsp;클래스와&amp;nbsp;연산의&amp;nbsp;이름을&amp;nbsp;부여하라 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-side-effect-free&amp;nbsp;function(부수효과가&amp;nbsp;없는&amp;nbsp;함수) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;명령과&amp;nbsp;질의를&amp;nbsp;엄격하게&amp;nbsp;분리된&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;연산으로&amp;nbsp;유지하는&amp;nbsp;것이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;명령과&amp;nbsp;질의를&amp;nbsp;분리하는&amp;nbsp;대신&amp;nbsp;value&amp;nbsp;Object를&amp;nbsp;생성해서&amp;nbsp;반환한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-assertion &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assertion을&amp;nbsp;사용하면&amp;nbsp;명령&amp;nbsp;entity&amp;nbsp;부수효과가&amp;nbsp;명확해지고&amp;nbsp;다루기&amp;nbsp;쉬워진다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-conceptual&amp;nbsp;contour(개념적&amp;nbsp;윤곽) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;도메인을&amp;nbsp;중요&amp;nbsp;영역을&amp;nbsp;나누는&amp;nbsp;것과&amp;nbsp;관련한&amp;nbsp;직관을&amp;nbsp;감안해서&amp;nbsp;설계요소를&amp;nbsp;응집력있는&amp;nbsp;단위로&amp;nbsp;분해해라.&amp;nbsp;계속적인&amp;nbsp;리팩터링을&amp;nbsp;토대로&amp;nbsp;변경되는&amp;nbsp;부분과&amp;nbsp;변경되지&amp;nbsp;않는&amp;nbsp;부분을&amp;nbsp;나누는&amp;nbsp;중심&amp;nbsp;축을&amp;nbsp;식별하고, &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;변경을&amp;nbsp;분리하기&amp;nbsp;위한&amp;nbsp;패턴을&amp;nbsp;명확하게&amp;nbsp;표현하는&amp;nbsp;conceptual&amp;nbsp;contour &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-standalone&amp;nbsp;class(독립형&amp;nbsp;클래스) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;의존성을&amp;nbsp;낮춰야&amp;nbsp;함 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;낮은&amp;nbsp;결합도는&amp;nbsp;객체&amp;nbsp;설계의&amp;nbsp;기본&amp;nbsp;원리다.&amp;nbsp;가능한&amp;nbsp;한&amp;nbsp;늘&amp;nbsp;결합도를&amp;nbsp;낮추고자&amp;nbsp;노력하라.&amp;nbsp;현재&amp;nbsp;싱황과&amp;nbsp;무관한&amp;nbsp;모든&amp;nbsp;개념을&amp;nbsp;제거하라.&amp;nbsp;그러면&amp;nbsp;클래스가&amp;nbsp;완전히&amp;nbsp;독립적으로&amp;nbsp;바뀌고&amp;nbsp;단독으로&amp;nbsp;컴토하고&amp;nbsp;이해할&amp;nbsp;수&amp;nbsp;있을&amp;nbsp;것이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-closure&amp;nbsp;of&amp;nbsp;operation(연산의&amp;nbsp;닫힘) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;적절한&amp;nbsp;위치에&amp;nbsp;반환&amp;nbsp;타입과&amp;nbsp;인자&amp;nbsp;타입이&amp;nbsp;동일한&amp;nbsp;연산을&amp;nbsp;정의하라&amp;nbsp;구현자가&amp;nbsp;연산에&amp;nbsp;사용되는&amp;nbsp;상태를&amp;nbsp;포함하고&amp;nbsp;있다면&amp;nbsp;연산의&amp;nbsp;인자로&amp;nbsp;구현자를&amp;nbsp;사용하는&amp;nbsp;것이&amp;nbsp;효과적이므로&amp;nbsp;인자의&amp;nbsp;타입과&amp;nbsp;반환&amp;nbsp;타입을&amp;nbsp;구현자의&amp;nbsp;타입과&amp;nbsp;동일하게&amp;nbsp;정의한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;주로&amp;nbsp;VALUE&amp;nbsp;OBJECT의&amp;nbsp;연산을&amp;nbsp;정의하는&amp;nbsp;데&amp;nbsp;주로&amp;nbsp;사용된다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;분석&amp;nbsp;패턴 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-strategy&amp;nbsp;객체&amp;nbsp;(분기를&amp;nbsp;둬서&amp;nbsp;어떤&amp;nbsp;policy를&amp;nbsp;전달하느냐를&amp;nbsp;결정) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-composite&amp;nbsp;내부에&amp;nbsp;포함된&amp;nbsp;모든&amp;nbsp;구성요소를&amp;nbsp;포괄한느&amp;nbsp;추상타입을&amp;nbsp;정의해서&amp;nbsp;사용하는&amp;nbsp;것 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-flyweight&amp;nbsp;value&amp;nbsp;object집합이&amp;nbsp;자주사용&amp;nbsp;되는&amp;nbsp;경우&amp;nbsp;적합 &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- &lt;br /&gt;&lt;br /&gt;bounded&amp;nbsp;context&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;context&amp;nbsp;map &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;sharedd&amp;nbsp;kernel(공유&amp;nbsp;커널) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;밀접하게&amp;nbsp;연관된&amp;nbsp;애플리케이션을&amp;nbsp;대상으로&amp;nbsp;작업중인&amp;nbsp;팀&amp;nbsp;간의&amp;nbsp;협력이&amp;nbsp;조율되지&amp;nbsp;않는다면&amp;nbsp;잠시&amp;nbsp;동안은&amp;nbsp;작업을&amp;nbsp;진행할&amp;nbsp;수&amp;nbsp;있겠지만&amp;nbsp;각&amp;nbsp;팀이&amp;nbsp;만들어낸&amp;nbsp;결과물을&amp;nbsp;함께&amp;nbsp;조합하기는&amp;nbsp;쉬빚&amp;nbsp;않을것이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;두&amp;nbsp;팀&amp;nbsp;간에&amp;nbsp;공유하기로&amp;nbsp;한&amp;nbsp;도메인&amp;nbsp;모델의&amp;nbsp;부분집합을&amp;nbsp;명시하라.&amp;nbsp;여기에는&amp;nbsp;모데르이&amp;nbsp;부분집합&amp;nbsp;뿐만&amp;nbsp;아니라&amp;nbsp;모델&amp;nbsp;요소와&amp;nbsp;연관된&amp;nbsp;코드나&amp;nbsp;데이터베이스&amp;nbsp;설계의&amp;nbsp;부분집합까지도&amp;nbsp;포함된다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;명시적으로&amp;nbsp;공유하는&amp;nbsp;부분들은&amp;nbsp;특별한&amp;nbsp;상태를&amp;nbsp;가지며,&amp;nbsp;다른&amp;nbsp;팀과의&amp;nbsp;협의&amp;nbsp;없이는&amp;nbsp;변경할&amp;nbsp;수&amp;nbsp;없다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;기능&amp;nbsp;시스템을&amp;nbsp;자주&amp;nbsp;통합하라.&amp;nbsp;하지만&amp;nbsp;개별&amp;nbsp;팀에서&amp;nbsp;수행하는&amp;nbsp;CI빈도보다는&amp;nbsp;더&amp;nbsp;적은&amp;nbsp;빈도로&amp;nbsp;통합하라.&amp;nbsp;통합할&amp;nbsp;때는&amp;nbsp;양&amp;nbsp;팀에서&amp;nbsp;작성한&amp;nbsp;테스트를&amp;nbsp;모두&amp;nbsp;실행하라. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;customer/supplier/&amp;nbsp;development&amp;nbsp;team(고객/공급자&amp;nbsp;개발&amp;nbsp;팀) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;한&amp;nbsp;하위&amp;nbsp;시스템이&amp;nbsp;다른&amp;nbsp;시스템에&amp;nbsp;본질적으로&amp;nbsp;데이터를&amp;nbsp;공급할&amp;nbsp;때가&amp;nbsp;있다.&amp;nbsp;하류&amp;nbsp;컴포넌트는&amp;nbsp;상류&amp;nbsp;컴포넌트에&amp;nbsp;피드백을&amp;nbsp;거의&amp;nbsp;제공하지&amp;nbsp;않는&amp;nbsp;분석&amp;nbsp;작업이나&amp;nbsp;여타&amp;nbsp;다른&amp;nbsp;기능을&amp;nbsp;수행하며,&amp;nbsp;모든&amp;nbsp;의존선을&amp;nbsp;단방향으로&amp;nbsp;흐른다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;상류&amp;nbsp;하위&amp;nbsp;시스템과&amp;nbsp;하위&amp;nbsp;시스템은&amp;nbsp;자연스럽게&amp;nbsp;두개의&amp;nbsp;bounded&amp;nbsp;context로&amp;nbsp;나뉜다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;두&amp;nbsp;팀&amp;nbsp;간에&amp;nbsp;명확한&amp;nbsp;고객/공급자&amp;nbsp;관계를&amp;nbsp;확립하라.&amp;nbsp;계획&amp;nbsp;회의에서&amp;nbsp;하류&amp;nbsp;팀이&amp;nbsp;상류&amp;nbsp;팀에&amp;nbsp;대한&amp;nbsp;고객&amp;nbsp;역할을&amp;nbsp;맡게&amp;nbsp;하라.&amp;nbsp;하류&amp;nbsp;요구사항에&amp;nbsp;대한&amp;nbsp;작업을&amp;nbsp;협상하고&amp;nbsp;이에&amp;nbsp;대한&amp;nbsp;예산을&amp;nbsp;책정해서&amp;nbsp;모든&amp;nbsp;이들이&amp;nbsp;일정과&amp;nbsp;약속을&amp;nbsp;이해할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;하라. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;결과로&amp;nbsp;예상되는&amp;nbsp;인터페이스를&amp;nbsp;검증하게&amp;nbsp;될&amp;nbsp;자동화된&amp;nbsp;인수&amp;nbsp;테스트를&amp;nbsp;함께&amp;nbsp;개발하라&amp;nbsp;이&amp;nbsp;테스트를&amp;nbsp;상류&amp;nbsp;팀의&amp;nbsp;테스트&amp;nbsp;스위트에&amp;nbsp;추가해서&amp;nbsp;지속적인&amp;nbsp;통합의&amp;nbsp;일부로&amp;nbsp;실행되게&amp;nbsp;하라. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;conformist&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sharedd&amp;nbsp;kernel&amp;nbsp;밀접하게&amp;nbsp;조율하는&amp;nbsp;두&amp;nbsp;팀&amp;nbsp;간의&amp;nbsp;협력관계를&amp;nbsp;다룬다면,&amp;nbsp;conformist는&amp;nbsp;협력에&amp;nbsp;관심이&amp;nbsp;없는&amp;nbsp;팀과의&amp;nbsp;통합문제를&amp;nbsp;다룬다.&amp;nbsp;독립적인&amp;nbsp;모델을&amp;nbsp;포기하는&amp;nbsp;것 &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;ANTICORRUPTION&amp;nbsp;LAYER&amp;nbsp;(오류방지계층) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;클라이언트&amp;nbsp;고유의&amp;nbsp;도메인&amp;nbsp;모델&amp;nbsp;측면에서&amp;nbsp;기능을&amp;nbsp;제공할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;격리&amp;nbsp;계층을&amp;nbsp;만들어라.&amp;nbsp;격치&amp;nbsp;계층은&amp;nbsp;기존에&amp;nbsp;이미&amp;nbsp;존재하는&amp;nbsp;인터페이스를&amp;nbsp;거쳐&amp;nbsp;다른&amp;nbsp;시스템과&amp;nbsp;통신하므로&amp;nbsp;다른&amp;nbsp;시스템을&amp;nbsp;거의&amp;nbsp;수정하지&amp;nbsp;않아도&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;해당&amp;nbsp;계층에서는&amp;nbsp;내부적으로&amp;nbsp;필요에&amp;nbsp;따라&amp;nbsp;두모델을&amp;nbsp;상대로&amp;nbsp;양방향으로&amp;nbsp;번역을&amp;nbsp;수행한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;보통&amp;nbsp;service의&amp;nbsp;집합(간혹&amp;nbsp;entitiy)&amp;nbsp;으로&amp;nbsp;표현된다.&amp;nbsp;연결&amp;nbsp;계층 &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;separate&amp;nbsp;ways&amp;nbsp;(각자의&amp;nbsp;길) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;우리는&amp;nbsp;철저하게&amp;nbsp;요구사항들을&amp;nbsp;조사해야&amp;nbsp;한다.&amp;nbsp;두&amp;nbsp;기능&amp;nbsp;간의&amp;nbsp;관계가&amp;nbsp;필수적인&amp;nbsp;것이&amp;nbsp;아니라면&amp;nbsp;두&amp;nbsp;기능은&amp;nbsp;서로&amp;nbsp;관계를&amp;nbsp;끊을&amp;nbsp;수도&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;OPEN&amp;nbsp;HOST&amp;nbsp;SERVICE(공개&amp;nbsp;호스트&amp;nbsp;서비스) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;하위&amp;nbsp;시스템을&amp;nbsp;필요로&amp;nbsp;하는&amp;nbsp;곳이&amp;nbsp;많다면&amp;nbsp;좀더&amp;nbsp;유연한&amp;nbsp;접근법이&amp;nbsp;필요하다.&amp;nbsp;어떤&amp;nbsp;하위&amp;nbsp;시스템을&amp;nbsp;다른&amp;nbsp;여러&amp;nbsp;&amp;nbsp;하위&amp;nbsp;시스템과&amp;nbsp;통합해야&amp;nbsp;할&amp;nbsp;경우&amp;nbsp;각&amp;nbsp;하위&amp;nbsp;시스템에&amp;nbsp;대한&amp;nbsp;번역기를&amp;nbsp;조정한다면&amp;nbsp;팀&amp;nbsp;전체가&amp;nbsp;교착&amp;nbsp;상태에&amp;nbsp;빠질수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;하위&amp;nbsp;시스템&amp;nbsp;접근과&amp;nbsp;관련된&amp;nbsp;프로토콜을&amp;nbsp;일련의&amp;nbsp;service로&amp;nbsp;정의하라.&amp;nbsp;프로토콜을&amp;nbsp;공개해서&amp;nbsp;개발&amp;nbsp;중인&amp;nbsp;시스템과&amp;nbsp;통합하고자&amp;nbsp;하는&amp;nbsp;모든&amp;nbsp;이들의&amp;nbsp;해당&amp;nbsp;프로토콜을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;하라.&amp;nbsp;새로운&amp;nbsp;통합&amp;nbsp;요구사항을&amp;nbsp;처리하게끔&amp;nbsp;프로토콜을&amp;nbsp;개선하고 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;확장하되&amp;nbsp;특정한&amp;nbsp;한&amp;nbsp;팀에서&amp;nbsp;요청해&amp;nbsp;오는&amp;nbsp;독특한&amp;nbsp;요구사항은&amp;nbsp;제외하라.&amp;nbsp;그와&amp;nbsp;같은&amp;nbsp;특수한&amp;nbsp;경우에는&amp;nbsp;일회성&amp;nbsp;번역기로&amp;nbsp;프로토콜을&amp;nbsp;보강해서&amp;nbsp;공유&amp;nbsp;프로토콜을&amp;nbsp;단순하고&amp;nbsp;일관되게&amp;nbsp;유지하라. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;PUBLISHED&amp;nbsp;LANGUAGE(공표된&amp;nbsp;언어) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;두&amp;nbsp;bounded&amp;nbsp;context의&amp;nbsp;모델&amp;nbsp;간에&amp;nbsp;이뤄지는&amp;nbsp;번역에는&amp;nbsp;공통의&amp;nbsp;언어가&amp;nbsp;필요하다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;필요한&amp;nbsp;도메인&amp;nbsp;정보를&amp;nbsp;표현할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;적절히&amp;nbsp;문서화된&amp;nbsp;공유&amp;nbsp;언어를&amp;nbsp;공통의&amp;nbsp;의사소통&amp;nbsp;매개체로&amp;nbsp;사용해서&amp;nbsp;필요에&amp;nbsp;따라&amp;nbsp;해당&amp;nbsp;언어로,&amp;nbsp;또는&amp;nbsp;해당&amp;nbsp;언어로부터&amp;nbsp;번역을&amp;nbsp;수행하라 &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;경계의&amp;nbsp;변형 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;규모가&amp;nbsp;큰&amp;nbsp;bounded&amp;nbsp;context가&amp;nbsp;선호되는&amp;nbsp;경우 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;사용자의&amp;nbsp;작업&amp;nbsp;흐름이&amp;nbsp;단일화된&amp;nbsp;모델을&amp;nbsp;토대로&amp;nbsp;처리될&amp;nbsp;때&amp;nbsp;더&amp;nbsp;매끄럽게&amp;nbsp;진행된다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;개별적인&amp;nbsp;두&amp;nbsp;모델의&amp;nbsp;매핑을&amp;nbsp;더하는&amp;nbsp;것보다&amp;nbsp;일관성&amp;nbsp;있는&amp;nbsp;하나의&amp;nbsp;모델을&amp;nbsp;이해하기가&amp;nbsp;더&amp;nbsp;쉽다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;두&amp;nbsp;모델&amp;nbsp;간의&amp;nbsp;번역이&amp;nbsp;어려울&amp;nbsp;수&amp;nbsp;있따. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;공유&amp;nbsp;언어를&amp;nbsp;토대로&amp;nbsp;팀의&amp;nbsp;의사소통이&amp;nbsp;명확해진다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;규모가&amp;nbsp;작은&amp;nbsp;bounded&amp;nbsp;context가&amp;nbsp;선호되는&amp;nbsp;경우 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;개발자&amp;nbsp;간의&amp;nbsp;의사소통에&amp;nbsp;따른&amp;nbsp;과부하가&amp;nbsp;줄어든다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;소규모&amp;nbsp;팀과&amp;nbsp;고드&amp;nbsp;기반을&amp;nbsp;토대로&amp;nbsp;ci가&amp;nbsp;쉬워진다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;대형&amp;nbsp;컨텍스트에는&amp;nbsp;용도가&amp;nbsp;다양한&amp;nbsp;추상화&amp;nbsp;모델을&amp;nbsp;요구할&amp;nbsp;수도&amp;nbsp;있는데,&amp;nbsp;이&amp;nbsp;경우&amp;nbsp;제공하기&amp;nbsp;힘든&amp;nbsp;기술이&amp;nbsp;필요할&amp;nbsp;때가&amp;nbsp;있따. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;각기&amp;nbsp;다른&amp;nbsp;모델은&amp;nbsp;특수한&amp;nbsp;요구사항을&amp;nbsp;해결하는&amp;nbsp;데&amp;nbsp;도움이&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;디스틸레이션 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;규모가&amp;nbsp;큰&amp;nbsp;시스템에서는&amp;nbsp;격리된&amp;nbsp;도메인조차도&amp;nbsp;관리할&amp;nbsp;수&amp;nbsp;없을&amp;nbsp;정도로&amp;nbsp;복잡해질지도&amp;nbsp;모른다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;디스틸레이션은&amp;nbsp;혼합된&amp;nbsp;요소를&amp;nbsp;분리해서&amp;nbsp;본질을&amp;nbsp;좀더&amp;nbsp;값지고&amp;nbsp;유용한&amp;nbsp;형태로&amp;nbsp;뽑아내는&amp;nbsp;과정이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CORE&amp;nbsp;DOMAIN의&amp;nbsp;추출!! &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;GENERIC&amp;nbsp;SUBDOMAIN(일반&amp;nbsp;하위&amp;nbsp;도메인) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;모델의&amp;nbsp;일부는&amp;nbsp;전문&amp;nbsp;지식을&amp;nbsp;포착하거나&amp;nbsp;전달하지&amp;nbsp;않고&amp;nbsp;복잡성을&amp;nbsp;더하곤&amp;nbsp;한다.&amp;nbsp;부수적인&amp;nbsp;요소는&amp;nbsp;core&amp;nbsp;domain을&amp;nbsp;식별하고&amp;nbsp;이해하는&amp;nbsp;일을&amp;nbsp;더욱&amp;nbsp;어렵게&amp;nbsp;만든다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;현재&amp;nbsp;진행&amp;nbsp;중인&amp;nbsp;프로젝트를&amp;nbsp;위한&amp;nbsp;것이&amp;nbsp;아닌&amp;nbsp;응집력&amp;nbsp;있느&amp;nbsp;하위&amp;nbsp;도메인을&amp;nbsp;식별하라.&amp;nbsp;이러한&amp;nbsp;하위&amp;nbsp;도메인에서&amp;nbsp;일반화된&amp;nbsp;모델&amp;nbsp;요소를&amp;nbsp;추출해서&amp;nbsp;별도&amp;nbsp;module에&amp;nbsp;배치하라&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;일단&amp;nbsp;하위&amp;nbsp;도메인이&amp;nbsp;분리되고&amp;nbsp;나면&amp;nbsp;해당&amp;nbsp;하위&amp;nbsp;도메인의&amp;nbsp;계속&amp;nbsp;되는&amp;nbsp;개발에&amp;nbsp;대해서는&amp;nbsp;core&amp;nbsp;domain보다&amp;nbsp;낮은&amp;nbsp;우선순위를&amp;nbsp;부여하고&amp;nbsp;그&amp;nbsp;일에&amp;nbsp;핵심&amp;nbsp;개발자를&amp;nbsp;배치하지&amp;nbsp;않는다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;DOMAIN&amp;nbsp;VISION&amp;nbsp;STATEMENT(도메인&amp;nbsp;비전&amp;nbsp;선언문) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;프로젝트&amp;nbsp;초기에는&amp;nbsp;대개&amp;nbsp;모델이&amp;nbsp;존재조차&amp;nbsp;하지&amp;nbsp;않지만&amp;nbsp;모델의&amp;nbsp;개발에&amp;nbsp;집중해야&amp;nbsp;할&amp;nbsp;필요성은&amp;nbsp;이미&amp;nbsp;거기에&amp;nbsp;있다&amp;nbsp;개발이&amp;nbsp;후반부에&amp;nbsp;이르면&amp;nbsp;모델을&amp;nbsp;심층적으로&amp;nbsp;연구하지&amp;nbsp;않아도&amp;nbsp;되는&amp;nbsp;시스템의&amp;nbsp;가치를&amp;nbsp;설명할&amp;nbsp;필요가&amp;nbsp;생긴다 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;많은&amp;nbsp;프로젝트&amp;nbsp;팀에서는&amp;nbsp;관리를&amp;nbsp;위해&amp;nbsp;'비전&amp;nbsp;선언서'를&amp;nbsp;작성한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;약&amp;nbsp;한&amp;nbsp;페이지&amp;nbsp;분량으로&amp;nbsp;CORE&amp;nbsp;DOMAIN을&amp;nbsp;짧게&amp;nbsp;기술하고&amp;nbsp;그것이&amp;nbsp;가져올&amp;nbsp;가치에&amp;nbsp;해당하는&amp;nbsp;가치제안을&amp;nbsp;작성하라! &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;디스틸레이션&amp;nbsp;문서 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Core&amp;nbsp;domain&amp;nbsp;과&amp;nbsp;core의&amp;nbsp;구성요소&amp;nbsp;사이에서&amp;nbsp;일어나는&amp;nbsp;상호작용을&amp;nbsp;기술하는&amp;nbsp;매우&amp;nbsp;간결한&amp;nbsp;문서 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;core&amp;nbsp;domain의&amp;nbsp;본질적인&amp;nbsp;면면의&amp;nbsp;윤곽을&amp;nbsp;드러낸다면&amp;nbsp;디스틸레이션&amp;nbsp;문서는&amp;nbsp;모델&amp;nbsp;변경의&amp;nbsp;중요성을&amp;nbsp;나타내는&amp;nbsp;실질적인&amp;nbsp;지표로&amp;nbsp;작용한다.&amp;nbsp;모델이나&amp;nbsp;코드&amp;nbsp;변경이&amp;nbsp;디스틸레이션&amp;nbsp;문서에&amp;nbsp;영향을&amp;nbsp;주면&amp;nbsp;다른&amp;nbsp;팀원과의 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;사으이가&amp;nbsp;필요하다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;cohesive&amp;nbsp;mechanism(응집렬&amp;nbsp;있는&amp;nbsp;메커니즘) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;개념적으로&amp;nbsp;cohesive&amp;nbsp;mechanism을&amp;nbsp;별도의&amp;nbsp;경량&amp;nbsp;프레임워크로&amp;nbsp;분할하라&amp;nbsp;이제&amp;nbsp;도메인의&amp;nbsp;다른&amp;nbsp;요소들은&amp;nbsp;해법의&amp;nbsp;복잡성을&amp;nbsp;프레임워크에&amp;nbsp;위임해서&amp;nbsp;문제를&amp;nbsp;표현하는&amp;nbsp;데&amp;nbsp;집중할&amp;nbsp;수&amp;nbsp;있따. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;알고리즘을&amp;nbsp;빼서&amp;nbsp;프레임워크화&amp;nbsp;하라! &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;메커니즘이&amp;nbsp;도메인&amp;nbsp;모델에&amp;nbsp;통합돼&amp;nbsp;있었다면&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;점에서&amp;nbsp;비용이&amp;nbsp;발생했을&amp;nbsp;것이다.&amp;nbsp;모델은&amp;nbsp;추후&amp;nbsp;선택사항에&amp;nbsp;제한을&amp;nbsp;두면서&amp;nbsp;특정한&amp;nbsp;문제&amp;nbsp;해결&amp;nbsp;방법과&amp;nbsp;결합됐을&amp;nbsp;것이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;segregated&amp;nbsp;core(분리된&amp;nbsp;핵심) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;core&amp;nbsp;하위&amp;nbsp;도메인을&amp;nbsp;식별한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;새로운&amp;nbsp;module관련&amp;nbsp;클래스를&amp;nbsp;옮긴다.&amp;nbsp;이때&amp;nbsp;module의&amp;nbsp;이름은&amp;nbsp;관련&amp;nbsp;개념에&amp;nbsp;따라&amp;nbsp;짓는다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;개념을&amp;nbsp;직접적으로&amp;nbsp;표현하지&amp;nbsp;않는&amp;nbsp;서버&amp;nbsp;데이터와&amp;nbsp;기능으로&amp;nbsp;코드를&amp;nbsp;리팩터링한다.&amp;nbsp;core&amp;nbsp;하위&amp;nbsp;도메인의&amp;nbsp;불순물을&amp;nbsp;제거하고&amp;nbsp;그곳에서&amp;nbsp;다른&amp;nbsp;패키지를&amp;nbsp;참조하는&amp;nbsp;바를&amp;nbsp;명시적이로&amp;nbsp;그&amp;nbsp;자체로도&amp;nbsp;이해할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;상태로&amp;nbsp;만든다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4.&amp;nbsp;새로생긴&amp;nbsp;module의&amp;nbsp;관계와&amp;nbsp;상호작용을&amp;nbsp;더욱&amp;nbsp;단순하고&amp;nbsp;전달력&amp;nbsp;있게&amp;nbsp;만든다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;abstract&amp;nbsp;core(추상화된&amp;nbsp;핵심) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;별도&amp;nbsp;module의&amp;nbsp;하위&amp;nbsp;도메인&amp;nbsp;간에&amp;nbsp;상호작용이&amp;nbsp;활발한&amp;nbsp;경우&amp;nbsp;module&amp;nbsp;간에&amp;nbsp;참조가&amp;nbsp;많이&amp;nbsp;만들어져야&amp;nbsp;해서&amp;nbsp;분할의&amp;nbsp;가치가&amp;nbsp;상당수&amp;nbsp;사라지거나,&amp;nbsp;또는&amp;nbsp;상호작용이&amp;nbsp;간접적으로&amp;nbsp;일어나야&amp;nbsp;해서모델이&amp;nbsp;불분명해진다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;모델의&amp;nbsp;가장&amp;nbsp;근본적인&amp;nbsp;개념을&amp;nbsp;식별해서&amp;nbsp;그것을&amp;nbsp;별도의&amp;nbsp;클래스나&amp;nbsp;추상&amp;nbsp;클래스,&amp;nbsp;또는&amp;nbsp;별도&amp;nbsp;인터페이스로&amp;nbsp;수정하라&amp;nbsp;이&amp;nbsp;추상&amp;nbsp;모델이&amp;nbsp;중요&amp;nbsp;컴포넌트&amp;nbsp;간에&amp;nbsp;발생하는&amp;nbsp;상호작용을&amp;nbsp;대부분&amp;nbsp;표현할&amp;nbsp;수&amp;nbsp;있게끔&amp;nbsp;설계하라. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;대규모&amp;nbsp;구조 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;책임&amp;nbsp;계층&amp;nbsp;을&amp;nbsp;나누어라 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;각&amp;nbsp;객별&amp;nbsp;객체에&amp;nbsp;손수&amp;nbsp;만든&amp;nbsp;책임이&amp;nbsp;할달돼&amp;nbsp;있다면&amp;nbsp;가이드라인드&amp;nbsp;없고,&amp;nbsp;균일함도&amp;nbsp;없고,&amp;nbsp;넓은&amp;nbsp;범위에&amp;nbsp;걸친&amp;nbsp;도메인을&amp;nbsp;동시에&amp;nbsp;다룰&amp;nbsp;능력도&amp;nbsp;없는&amp;nbsp;셈이다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;큰&amp;nbsp;모델에&amp;nbsp;응집력을&amp;nbsp;부여하려면&amp;nbsp;그러한&amp;nbsp;책임할당에&amp;nbsp;특정&amp;nbsp;구조를&amp;nbsp;도입하는&amp;nbsp;것이&amp;nbsp;도움이&amp;nbsp;된다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ex)&amp;nbsp;의사결정지원,&amp;nbsp;정책,운영,잠재기능&amp;nbsp;등 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;평가 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;context&amp;nbsp;map을&amp;nbsp;그려라&amp;nbsp;일관된&amp;nbsp;context&amp;nbsp;map&amp;nbsp;을&amp;nbsp;그릴&amp;nbsp;수&amp;nbsp;있는가?&amp;nbsp;그렇지&amp;nbsp;않다면&amp;nbsp;모호한&amp;nbsp;상황이&amp;nbsp;있는가? &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;프로젝트상의&amp;nbsp;언어를&amp;nbsp;쓰는&amp;nbsp;데&amp;nbsp;힘써라.&amp;nbsp;유비쿼터스&amp;nbsp;언어가&amp;nbsp;있는거&amp;nbsp;유비쿼터서은어가&amp;nbsp;개발에&amp;nbsp;도움을&amp;nbsp;줄&amp;nbsp;만큼&amp;nbsp;풍부한가? &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;무성이&amp;nbsp;중요한지&amp;nbsp;이해하라&amp;nbsp;core&amp;nbsp;domain을&amp;nbsp;식별했는가?&amp;nbsp;domain&amp;nbsp;vision&amp;nbsp;statement가&amp;nbsp;있는가?&amp;nbsp;domain&amp;nbsp;vision&amp;nbsp;statement를&amp;nbsp;작성할수있는가? &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4.&amp;nbsp;프로젝트&amp;nbsp;사용하는&amp;nbsp;기술이&amp;nbsp;DDD에&amp;nbsp;유리한가&amp;nbsp;불리한가 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <category>WEB</category>
      <author>도랜니</author>
      <guid isPermaLink="true">https://torenyground.tistory.com/98</guid>
      <comments>https://torenyground.tistory.com/98#entry98comment</comments>
      <pubDate>Fri, 3 Apr 2020 00:06:39 +0900</pubDate>
    </item>
    <item>
      <title>clean code(클린 코드) 정리</title>
      <link>https://torenyground.tistory.com/97</link>
      <description>&lt;p&gt;1.&amp;nbsp;변수,&amp;nbsp;함수,&amp;nbsp;이름을&amp;nbsp;분명하게&amp;nbsp;짓기 &lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;함수는&amp;nbsp;최대한&amp;nbsp;작게&amp;nbsp;하나의&amp;nbsp;기능만&amp;nbsp;담당(들여쓰기&amp;nbsp;수준은&amp;nbsp;1단이나&amp;nbsp;2단을&amp;nbsp;넘어서지&amp;nbsp;않도록&amp;nbsp;한다.) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;함수당&amp;nbsp;추상화&amp;nbsp;수준은&amp;nbsp;하나로! &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;내려가기&amp;nbsp;규칙(추상화가&amp;nbsp;높은순&amp;nbsp;부터&amp;nbsp;낮은순&amp;nbsp;대로) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;서술적인&amp;nbsp;이름&amp;nbsp;사용 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;모듈&amp;nbsp;내에서&amp;nbsp;함수&amp;nbsp;이름은&amp;nbsp;같은&amp;nbsp;문구&amp;nbsp;명사&amp;nbsp;동사&amp;nbsp;ex(inclusePages,setPages..) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;인수(매개변수)&amp;nbsp;3개는&amp;nbsp;가능한&amp;nbsp;피하고&amp;nbsp;4개이상은&amp;nbsp;이유가&amp;nbsp;필요하지만,&amp;nbsp;이유가&amp;nbsp;있어도&amp;nbsp;사용하면&amp;nbsp;안된다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;플래그&amp;nbsp;인수는&amp;nbsp;안좋다.&amp;nbsp;이미&amp;nbsp;그걸&amp;nbsp;인수로&amp;nbsp;준&amp;nbsp;것&amp;nbsp;자체가&amp;nbsp;함수가&amp;nbsp;두&amp;nbsp;역할을&amp;nbsp;한다는&amp;nbsp;것&amp;nbsp;이기&amp;nbsp;떄문 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;오류&amp;nbsp;코드보다&amp;nbsp;예외를&amp;nbsp;사용하라! &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;try/catch&amp;nbsp;블록&amp;nbsp;뽑아내기&amp;nbsp;(함수로&amp;nbsp;따로&amp;nbsp;분리&amp;nbsp;해&amp;nbsp;내기) &lt;br /&gt;&lt;br /&gt;3.주석을&amp;nbsp;가능한&amp;nbsp;줄이도록&amp;nbsp;꾸준히&amp;nbsp;노력해야&amp;nbsp;한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;코드로&amp;nbsp;의도를&amp;nbsp;표현하라(많은&amp;nbsp;경우데&amp;nbsp;주석을&amp;nbsp;함수로&amp;nbsp;만들어&amp;nbsp;표현해도&amp;nbsp;충분하다.) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;좋은&amp;nbsp;주석 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;법적인&amp;nbsp;주석(저작권&amp;nbsp;정보,&amp;nbsp;소유권&amp;nbsp;정보)&amp;nbsp;ex)&amp;nbsp;첫머리&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;정보를&amp;nbsp;제공하는&amp;nbsp;주석&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;의도를&amp;nbsp;설명하는&amp;nbsp;주석&amp;nbsp;&amp;nbsp;//스레드를&amp;nbsp;대량&amp;nbsp;생성하는&amp;nbsp;방법으로&amp;nbsp;어떻게든&amp;nbsp;경쟁&amp;nbsp;조건을&amp;nbsp;만들려&amp;nbsp;시도한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;의미를&amp;nbsp;명료하게&amp;nbsp;밝히는&amp;nbsp;주석//&amp;nbsp;a==a&amp;nbsp;a!=b&amp;nbsp;..... &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;결과를&amp;nbsp;경고하는&amp;nbsp;주석&amp;nbsp;//&amp;nbsp;여유시간이&amp;nbsp;충분하지&amp;nbsp;않다면&amp;nbsp;실행하지&amp;nbsp;마십시오. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;TODO&amp;nbsp;주석&amp;nbsp;'앞으로&amp;nbsp;할일'&amp;nbsp;프로그래머가필요하다&amp;nbsp;여기지만&amp;nbsp;당장&amp;nbsp;구현하기&amp;nbsp;어려운&amp;nbsp;업무를&amp;nbsp;기술 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;중요성을&amp;nbsp;강조하는&amp;nbsp;주석 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;공개&amp;nbsp;API를&amp;nbsp;구현한다면&amp;nbsp;Javadocs를&amp;nbsp;작성하라! &lt;br /&gt;&lt;br /&gt;종속함수&amp;nbsp;한&amp;nbsp;함수가&amp;nbsp;다른&amp;nbsp;함수를&amp;nbsp;호출한다면&amp;nbsp;두&amp;nbsp;함수는&amp;nbsp;세로로&amp;nbsp;가까이&amp;nbsp;배친한다.&amp;nbsp;또한&amp;nbsp;가능&amp;nbsp;하다면&amp;nbsp;호출하는&amp;nbsp;함수를&amp;nbsp;호출되는&amp;nbsp;함수보다&amp;nbsp;먼저&amp;nbsp;배치한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;호출되는&amp;nbsp;함수를&amp;nbsp;호출하는&amp;nbsp;함수보다&amp;nbsp;나중에&amp;nbsp;배치한다.&amp;nbsp;그러면&amp;nbsp;소스&amp;nbsp;코드&amp;nbsp;모듈이&amp;nbsp;고차원에서&amp;nbsp;저차원으로&amp;nbsp;자연스럽게&amp;nbsp;내려간다. &lt;br /&gt;&lt;br /&gt;개념적&amp;nbsp;유사성&amp;nbsp;개념적은&amp;nbsp;친화도가&amp;nbsp;높을수록&amp;nbsp;코드를&amp;nbsp;가까이&amp;nbsp;배치한다.&amp;nbsp;ex)함수에서&amp;nbsp;다른&amp;nbsp;함수호출&amp;nbsp;,&amp;nbsp;비슷한&amp;nbsp;기능을&amp;nbsp;하는&amp;nbsp;함수들&amp;nbsp; &lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;객체&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;자료의&amp;nbsp;추상화&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;객체는&amp;nbsp;추상화&amp;nbsp;뒤로&amp;nbsp;자료를&amp;nbsp;숨긴&amp;nbsp;채&amp;nbsp;자료를&amp;nbsp;다루는&amp;nbsp;함수만&amp;nbsp;공개한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;자료구조는&amp;nbsp;자료를&amp;nbsp;그대로&amp;nbsp;공개하며&amp;nbsp;별다른&amp;nbsp;함수는&amp;nbsp;제공하지&amp;nbsp;않는다. &lt;br /&gt;&lt;br /&gt;5.&amp;nbsp;오류&amp;nbsp;코드보다&amp;nbsp;예외를&amp;nbsp;사용하라 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;오류&amp;nbsp;함수&amp;nbsp;사용&amp;nbsp;(분리) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;try&amp;nbsp;catch&amp;nbsp;finally&amp;nbsp;문부터&amp;nbsp;작성하라 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;미확인(unchecked)&amp;nbsp;예뢰를&amp;nbsp;사용하라 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;checked&amp;nbsp;예외&amp;nbsp;는&amp;nbsp;컴파일&amp;nbsp;단계에서&amp;nbsp;확인되며&amp;nbsp;반드시&amp;nbsp;처리해야&amp;nbsp;하는&amp;nbsp;예외입니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IOException &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SQLException &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;Unchecked&amp;nbsp;예외&amp;nbsp;는&amp;nbsp;실행&amp;nbsp;단계에서&amp;nbsp;확인되며&amp;nbsp;명시적인&amp;nbsp;처리를&amp;nbsp;강제하지는&amp;nbsp;않는&amp;nbsp;예외입니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NullPointerException &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IllegalArgumentException &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IndexOutOfBoundException &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SystemException &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;단점&amp;nbsp;:&amp;nbsp;해당&amp;nbsp;함수&amp;nbsp;뿐만아니라&amp;nbsp;호출하는&amp;nbsp;함수도&amp;nbsp;수정을&amp;nbsp;해줘야&amp;nbsp;하기&amp;nbsp;때문에&amp;nbsp;OCP를&amp;nbsp;위반하게된다 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;예외에&amp;nbsp;의미를&amp;nbsp;제공하라&amp;nbsp;(예외를&amp;nbsp;던질&amp;nbsp;때는&amp;nbsp;전후&amp;nbsp;상황을&amp;nbsp;충분히&amp;nbsp;덧붙인다.&amp;nbsp;오류&amp;nbsp;메시지에&amp;nbsp;정보를&amp;nbsp;담아&amp;nbsp;예외와&amp;nbsp;함께&amp;nbsp;던진다) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;감싸기&amp;nbsp;클래스&amp;nbsp;작성 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;정상&amp;nbsp;흐름을&amp;nbsp;정의하라. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;외부&amp;nbsp;API를&amp;nbsp;감싸&amp;nbsp;독자적인&amp;nbsp;예외를&amp;nbsp;던지고,&amp;nbsp;코드&amp;nbsp;위에&amp;nbsp;처리기를&amp;nbsp;정의해&amp;nbsp;중단된&amp;nbsp;계산을&amp;nbsp;처리한다.&amp;nbsp;때로는&amp;nbsp;중단이&amp;nbsp;적합하지&amp;nbsp;않은&amp;nbsp;때도&amp;nbsp;있다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;예외가&amp;nbsp;발생한다면&amp;nbsp;기본&amp;nbsp;값&amp;nbsp;객체를&amp;nbsp;만들어서&amp;nbsp;반환한다.&amp;nbsp;이를&amp;nbsp;특수&amp;nbsp;사례&amp;nbsp;패턴이라고&amp;nbsp;한다&amp;nbsp;그러면&amp;nbsp;따로&amp;nbsp;예외적인&amp;nbsp;상활을&amp;nbsp;처리할&amp;nbsp;필요가&amp;nbsp;없다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;null을&amp;nbsp;반환하지&amp;nbsp;마라! &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;예외를&amp;nbsp;던지거나&amp;nbsp;특수&amp;nbsp;사례&amp;nbsp;객체를&amp;nbsp;던져라!! &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;null을&amp;nbsp;전달하지&amp;nbsp;마라!! &lt;br /&gt;&lt;br /&gt;6.경계 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;외부&amp;nbsp;코드를&amp;nbsp;우리&amp;nbsp;코드에&amp;nbsp;깔끔하게&amp;nbsp;처리&amp;nbsp;하는&amp;nbsp;기법과&amp;nbsp;기교 &lt;br /&gt;&lt;br /&gt;7.&amp;nbsp;TDD&amp;nbsp;법칙 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;F.I.R.S.T. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;빠르게(테스트는&amp;nbsp;빨리&amp;nbsp;돌아야한다.),&amp;nbsp;독립적으로(각&amp;nbsp;테스트&amp;nbsp;서로&amp;nbsp;의존&amp;nbsp;x),&amp;nbsp;반복가능하게(어느&amp;nbsp;환경에서라도&amp;nbsp;테스트가&amp;nbsp;돌아야한다.),&amp;nbsp;자가&amp;nbsp;검증하는(테스트는&amp;nbsp;성공&amp;nbsp;아니면&amp;nbsp;실패로&amp;nbsp;결과를&amp;nbsp;알수&amp;nbsp;있어야한다.), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;적시에(테스트는&amp;nbsp;적시에&amp;nbsp;작성해야&amp;nbsp;한다.&amp;nbsp;단위테스트는&amp;nbsp;테스트하려는&amp;nbsp;실제&amp;nbsp;코드를&amp;nbsp;구현하기&amp;nbsp;직전에&amp;nbsp;구현한다.) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;첫번쨰&amp;nbsp;법칙&amp;nbsp;:&amp;nbsp;실패하는&amp;nbsp;단위&amp;nbsp;테스트를&amp;nbsp;작성할&amp;nbsp;때까지&amp;nbsp;실제&amp;nbsp;코드를&amp;nbsp;작성하지&amp;nbsp;않는다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;두번째&amp;nbsp;법칙&amp;nbsp;:&amp;nbsp;컴파일은&amp;nbsp;실패하지&amp;nbsp;않으면서&amp;nbsp;실행이&amp;nbsp;실패하는&amp;nbsp;정도로만&amp;nbsp;단위&amp;nbsp;테스트를&amp;nbsp;작성한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;세번째&amp;nbsp;법칙&amp;nbsp;:&amp;nbsp;현재&amp;nbsp;실패하는&amp;nbsp;테스트를&amp;nbsp;통과할&amp;nbsp;정도로만&amp;nbsp;실제&amp;nbsp;코도를&amp;nbsp;작성한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;테스트는&amp;nbsp;유연성,&amp;nbsp;유지보수성,&amp;nbsp;재사용성을&amp;nbsp;제공한다.&amp;nbsp;(테스트&amp;nbsp;케이스가&amp;nbsp;있다면&amp;nbsp;변경이&amp;nbsp;쉬워진다) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;깨끗한&amp;nbsp;테스트&amp;nbsp;코드를&amp;nbsp;만들려면&amp;nbsp;가독성이&amp;nbsp;좋아야&amp;nbsp;한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;명확한&amp;nbsp;분류&amp;nbsp;(ex&amp;nbsp;세가지&amp;nbsp;부분으로&amp;nbsp;나뉜다&amp;nbsp;1.&amp;nbsp;테스트&amp;nbsp;자료를&amp;nbsp;만든다.&amp;nbsp;2.&amp;nbsp;테스트&amp;nbsp;자료를&amp;nbsp;조작한다&amp;nbsp;3.&amp;nbsp;조작한&amp;nbsp;결과가&amp;nbsp;올바른지&amp;nbsp;확인한다.) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;테스트&amp;nbsp;당&amp;nbsp;assert&amp;nbsp;하나&amp;nbsp;보다는&amp;nbsp;--&amp;gt;&amp;nbsp;테스트&amp;nbsp;당&amp;nbsp;개념&amp;nbsp;하나!! &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;저자:&amp;nbsp;훌륭한&amp;nbsp;지침이라고&amp;nbsp;생각한다&amp;nbsp;하지만&amp;nbsp;떄로는&amp;nbsp;함수&amp;nbsp;하나에&amp;nbsp;여러&amp;nbsp;assert&amp;nbsp;문을&amp;nbsp;넣기도&amp;nbsp;한다.&amp;nbsp;단지&amp;nbsp;assert문&amp;nbsp;개수는&amp;nbsp;최대한&amp;nbsp;줄여야&amp;nbsp;좋다는&amp;nbsp;생각 &lt;br /&gt;&lt;br /&gt;8.&amp;nbsp;클래스 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;클래스는&amp;nbsp;작아야한다! &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;캡슐화 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;변수와&amp;nbsp;유틸리티&amp;nbsp;함수는&amp;nbsp;가능한&amp;nbsp;공개하지&amp;nbsp;않는&amp;nbsp;편이&amp;nbsp;낫다&amp;nbsp;하지만&amp;nbsp;반드시&amp;nbsp;숨겨야&amp;nbsp;한다는&amp;nbsp;법칙도&amp;nbsp;없다.(테스트&amp;nbsp;코드를&amp;nbsp;위해&amp;nbsp;protected로&amp;nbsp;선언) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;하지만&amp;nbsp;캡슐화를&amp;nbsp;풀어주는&amp;nbsp;결정은&amp;nbsp;언제나&amp;nbsp;최후의&amp;nbsp;수단 &lt;br /&gt;9.&amp;nbsp;시스템 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;시스템&amp;nbsp;제작과&amp;nbsp;시스템&amp;nbsp;사용을&amp;nbsp;분리하라 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;소프트웨어&amp;nbsp;시스템은&amp;nbsp;(애플리케이션&amp;nbsp;객체를&amp;nbsp;제작하고&amp;nbsp;의존성을&amp;nbsp;서로&amp;nbsp;'연결'하는)&amp;nbsp;준비&amp;nbsp;과정과&amp;nbsp;(준비과정&amp;nbsp;이우헤&amp;nbsp;이어지는)&amp;nbsp;런타임&amp;nbsp;로직을&amp;nbsp;분리하여야&amp;nbsp;한다.&lt;/p&gt;</description>
      <category>Java</category>
      <author>도랜니</author>
      <guid isPermaLink="true">https://torenyground.tistory.com/97</guid>
      <comments>https://torenyground.tistory.com/97#entry97comment</comments>
      <pubDate>Mon, 16 Mar 2020 19:40:45 +0900</pubDate>
    </item>
    <item>
      <title>mongodb  샤딩 정리 -3</title>
      <link>https://torenyground.tistory.com/96</link>
      <description>&lt;p&gt;샤딩 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;각각의&amp;nbsp;데이터가&amp;nbsp;어떤&amp;nbsp;서버에&amp;nbsp;들어있는지를&amp;nbsp;저장하고&amp;nbsp;알려주는&amp;nbsp;역할이&amp;nbsp;필요하다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;이처럼&amp;nbsp;샤딩을&amp;nbsp;하고&amp;nbsp;난&amp;nbsp;이후의&amp;nbsp;역할이&amp;nbsp;분배된&amp;nbsp;구성&amp;nbsp;요소들을&amp;nbsp;하나로&amp;nbsp;묶어&amp;nbsp;'샤드&amp;nbsp;클러스트'라고&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;샤드&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;애플리케이션이&amp;nbsp;사용할&amp;nbsp;데이터를&amp;nbsp;나눠서&amp;nbsp;저장하고&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;설정서버 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;애플리케이션&amp;nbsp;데이터를&amp;nbsp;제외하고&amp;nbsp;샤드&amp;nbsp;클러스터가&amp;nbsp;작동하기&amp;nbsp;위해&amp;nbsp;필요한&amp;nbsp;모든&amp;nbsp;정보를&amp;nbsp;저장한다.&amp;nbsp;이런&amp;nbsp;정보를&amp;nbsp;메타데이터라고한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;라우터 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;샤드와&amp;nbsp;설정&amp;nbsp;서버가&amp;nbsp;특정&amp;nbsp;정보를&amp;nbsp;저장하는&amp;nbsp;역할을&amp;nbsp;했다면&amp;nbsp;라우터는&amp;nbsp;직접적으로&amp;nbsp;드라이버의&amp;nbsp;명령을&amp;nbsp;받아서&amp;nbsp;어떤&amp;nbsp;작업을&amp;nbsp;수행할지&amp;nbsp;판단하고&amp;nbsp;결과물을&amp;nbsp;가져다&amp;nbsp;드라이버에&amp;nbsp;넘겨주는&amp;nbsp;역할을&amp;nbsp;한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mongod&amp;nbsp;프로세스와&amp;nbsp;mongos&amp;nbsp;프로세스가&amp;nbsp;서로&amp;nbsp;통신&amp;nbsp;그&amp;nbsp;후&amp;nbsp;-&amp;gt;&amp;nbsp;샤드에&amp;nbsp;데이터&amp;nbsp;저장 &lt;br /&gt;&lt;br /&gt;샤드키 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;샤드&amp;nbsp;클러스터에서&amp;nbsp;정보를&amp;nbsp;어떻게&amp;nbsp;나누어&amp;nbsp;저장하느지에&amp;nbsp;따라서&amp;nbsp;성능상의&amp;nbsp;문제가&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;예를들어&amp;nbsp;자주&amp;nbsp;사용하는&amp;nbsp;정보가&amp;nbsp;한쪽&amp;nbsp;샤드에&amp;nbsp;몰리는&amp;nbsp;상황을&amp;nbsp;생각해보자 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;이런&amp;nbsp;경우,&amp;nbsp;대부분의&amp;nbsp;샤드는&amp;nbsp;쉬고&amp;nbsp;있는데도&amp;nbsp;서비스&amp;nbsp;속도가&amp;nbsp;저하되는&amp;nbsp;상황이&amp;nbsp;발생한다.&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;따라서&amp;nbsp;정보를&amp;nbsp;나누는&amp;nbsp;기준을&amp;nbsp;잘&amp;nbsp;설정해야한다.&amp;nbsp;기준이&amp;nbsp;되는&amp;nbsp;값이&amp;nbsp;샤드키이다. &lt;br /&gt;&lt;br /&gt;프라이머리&amp;nbsp;샤드는&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;각각의&amp;nbsp;데이터베이스에&amp;nbsp;샤딩을&amp;nbsp;허용할수있다.&amp;nbsp;샤딩을&amp;nbsp;적용받은&amp;nbsp;데이터베이스는&amp;nbsp;프라이머리&amp;nbsp;샤드를&amp;nbsp;필수적으로&amp;nbsp;사져야&amp;nbsp;한다, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;데이터베이스&amp;nbsp;내에서&amp;nbsp;컬렉션을&amp;nbsp;저장하는&amp;nbsp;기본샤드다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;수직적&amp;nbsp;샤드 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1번샤드&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2번샤드 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{A데이터베이스&amp;nbsp;컬렉션}&amp;nbsp;{A데이터베이스&amp;nbsp;컬렉션}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{B데이터베이스&amp;nbsp;컬렉션}&amp;nbsp;{B데이터베이스&amp;nbsp;컬렉션} &lt;br /&gt;&lt;br /&gt;수평적&amp;nbsp;샤드 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1번&amp;nbsp;샤드&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2번&amp;nbsp;샤드&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3번&amp;nbsp;샤드 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{가&amp;nbsp;컬렉션}&amp;nbsp;{나&amp;nbsp;컬렉션의&amp;nbsp;1/3}&amp;nbsp;&amp;nbsp;&amp;nbsp;{나&amp;nbsp;컬렉션의&amp;nbsp;1/3}&amp;nbsp;&amp;nbsp;&amp;nbsp;{다&amp;nbsp;컬렉션의&amp;nbsp;1/3} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;나&amp;nbsp;컬렉션이&amp;nbsp;크기가&amp;nbsp;클&amp;nbsp;경우 &lt;br /&gt;&lt;br /&gt;청크 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;샤드&amp;nbsp;사이에&amp;nbsp;분할된&amp;nbsp;정보를&amp;nbsp;효과적으로&amp;nbsp;관리하기&amp;nbsp;위해&amp;nbsp;'청크'를&amp;nbsp;사용한다.&amp;nbsp;샤드키값을&amp;nbsp;기준으로&amp;nbsp;한&amp;nbsp;도큐먼트의&amp;nbsp;묶음&amp;nbsp;이다&amp;nbsp;(각각의&amp;nbsp;청크는&amp;nbsp;샤드키를&amp;nbsp;기준으로&amp;nbsp;상한값과&amp;nbsp;하한값을&amp;nbsp;갖는다. &lt;br /&gt;밸런서 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;어떤&amp;nbsp;청크가&amp;nbsp;64mb를&amp;nbsp;넘어버리면,&amp;nbsp;둘로&amp;nbsp;쪼개지면서&amp;nbsp;크기가&amp;nbsp;반으로&amp;nbsp;줄어든다.&amp;nbsp;또한,&amp;nbsp;한쪽&amp;nbsp;샤드에&amp;nbsp;청크가&amp;nbsp;몰릴경우&amp;nbsp;샤드&amp;nbsp;클러스터의&amp;nbsp;밸런스가&amp;nbsp;샤드사이의&amp;nbsp;청크를&amp;nbsp;교환해준다 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sh.stopbalancer() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;도큐먼트가&amp;nbsp;대량으로&amp;nbsp;입력되거나&amp;nbsp;삭제되어서&amp;nbsp;밸런싱을&amp;nbsp;머추어야하는&amp;nbsp;상황 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;샤드를&amp;nbsp;추가하거나&amp;nbsp;데이터를&amp;nbsp;복구할&amp;nbsp;때&amp;nbsp;쓰면&amp;nbsp;좋다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;범위&amp;nbsp;샤딩 &lt;br /&gt;샤드키&amp;nbsp;설정&amp;nbsp;원칙 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;값의&amp;nbsp;종류가&amp;nbsp;다양해야한다&amp;nbsp;이유는&amp;nbsp;청크&amp;nbsp;분리&amp;nbsp;불가능&amp;nbsp;예시&amp;nbsp;성별,카테고리,대분류 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;값이&amp;nbsp;골고루&amp;nbsp;분포해야한다&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;청크&amp;nbsp;분리&amp;nbsp;불가능,특정&amp;nbsp;샤드&amp;nbsp;작업&amp;nbsp;편중&amp;nbsp;예시&amp;nbsp;성씨,신장,체중 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;값이&amp;nbsp;지속적으로&amp;nbsp;증가/감소되지&amp;nbsp;않아야&amp;nbsp;한다&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;특정&amp;nbsp;샤드&amp;nbsp;작업&amp;nbsp;편중&amp;nbsp;예시&amp;nbsp;신장,재고,수정날짜 &lt;br /&gt;해시&amp;nbsp;샤딩 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;값의&amp;nbsp;종류가&amp;nbsp;다양해야&amp;nbsp;한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;값이&amp;nbsp;골고루&amp;nbsp;분포해야한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;값이&amp;nbsp;지속적으로&amp;nbsp;증가.&amp;nbsp;감소되지&amp;nbsp;않아야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;샤딩&amp;nbsp;구역&amp;nbsp;설정 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;샤드&amp;nbsp;클러스터에&amp;nbsp;범위&amp;nbsp;샤딩&amp;nbsp;혹인&amp;nbsp;해시샤딩을&amp;nbsp;구성하고&amp;nbsp;나서&amp;nbsp;'샤딩&amp;nbsp;구역'&amp;nbsp;을&amp;nbsp;설정할&amp;nbsp;수있다.&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ex&amp;nbsp;샤드키&amp;nbsp;'1'&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;샤드키&amp;nbsp;'2' &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;구역{KR}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;구역{US} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sh.addShardTag(&quot;샤드&amp;nbsp;이름&quot;,&quot;태그&amp;nbsp;이름&quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sh.addShardTagRange( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&amp;lt;데이터베이스&amp;gt;.&amp;lt;컬렉션&amp;gt;&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;lt;샤드키&amp;gt;:&amp;lt;최솟값&amp;gt;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;lt;샤드키&amp;gt;:&amp;lt;최대값&amp;gt;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;태그&amp;nbsp;이름&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;최솟값으&amp;nbsp;가지지&amp;nbsp;않으면&amp;nbsp;MinKey를&amp;nbsp;최댃값을&amp;nbsp;가지지&amp;nbsp;않으면&amp;nbsp;MaxKey로&amp;nbsp;범위를&amp;nbsp;설정하면&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;샤딩구역이&amp;nbsp;필요한&amp;nbsp;경우 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;샤드&amp;nbsp;성능이&amp;nbsp;다른&amp;nbsp;경우 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;특정&amp;nbsp;정보를&amp;nbsp;일부&amp;nbsp;샤드에&amp;nbsp;나누어&amp;nbsp;저장해야&amp;nbsp;하는&amp;nbsp;경우 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;지역별로&amp;nbsp;읽기&amp;nbsp;쓰기가&amp;nbsp;빈번한&amp;nbsp;경우 &lt;br /&gt;&lt;br /&gt;실습 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/db/data/config0-0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/db/data/config0-1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/db/data/config0-2 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;설정&amp;nbsp;서버&amp;nbsp;구성 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mkdir&amp;nbsp;-p&amp;nbsp;/db/data/config0-0/rs0-0&amp;nbsp;/db/data/config0-0/rs0-1&amp;nbsp;/db/data/config0-0/rs0-2 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;실행 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mongod&amp;nbsp;--configsvr&amp;nbsp;--replSet&amp;nbsp;config0&amp;nbsp;--port&amp;nbsp;27018&amp;nbsp;--bind_ip&amp;nbsp;localhost&amp;nbsp;--dbpath&amp;nbsp;/db/data/config0-0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mongo&amp;nbsp;--port&amp;nbsp;27018 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rs.initiate({ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_id:&quot;config0&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;configsvr:ture, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;members:&amp;nbsp;[ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:0,host:&quot;localhost:27018&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:0,host:&quot;localhost:27019&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:0,host:&quot;localhost:27020&quot;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;] &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;샤드&amp;nbsp;구성 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/db/data/shard0-0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/db/data/shard0-1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/db/data/shard0-2 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;설정&amp;nbsp;서버&amp;nbsp;구성 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mkdir&amp;nbsp;-p&amp;nbsp;/db/data/shard-0/rs0-0&amp;nbsp;/db/data/shard0-0/rs0-1&amp;nbsp;/db/data/shard0-0/rs0-2 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;실행 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mongod&amp;nbsp;--shardsvr&amp;nbsp;--replSet&amp;nbsp;shard0&amp;nbsp;--port&amp;nbsp;27021&amp;nbsp;--bind_ip&amp;nbsp;localhost&amp;nbsp;--dbpath&amp;nbsp;/db/data/shard0-0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mongo&amp;nbsp;--port&amp;nbsp;27021 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rs.initiate({ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_id:&quot;shard0&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;configsvr:ture, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;members:&amp;nbsp;[ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:0,host:&quot;localhost:27021&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:0,host:&quot;localhost:27022&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:0,host:&quot;localhost:27023&quot;,arbiterOnly:true} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;] &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;몽구스&amp;nbsp;설정하기&amp;nbsp;샤드클러스트를&amp;nbsp;이용하기&amp;nbsp;위해서&amp;nbsp;필요한&amp;nbsp;인스턴스이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mongos&amp;nbsp;--configdb&amp;nbsp;config0/localhost:27018&amp;nbsp;--port&amp;nbsp;20000 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mongo&amp;nbsp;--port&amp;nbsp;20000&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sh.addShard(&quot;shard0/localhost:27021&quot;) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;user&amp;nbsp;config &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.shards.find()&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.shards.find()&lt;/a&gt;&amp;nbsp;결과를&amp;nbsp;확인&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mongo&amp;nbsp;--port&amp;nbsp;20000 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;show&amp;nbsp;dbs &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;car_accident &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;use&amp;nbsp;car_accident &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;show&amp;nbsp;collections &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sh.enableSharding(&quot;car_accident&quot;)&amp;nbsp;-&amp;gt;&amp;nbsp;데이터베이스에&amp;nbsp;샤딩을&amp;nbsp;활성화 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;범위&amp;nbsp;샤딩&amp;nbsp;구성하기 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.by_month.createIndex({country:1}) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sh.shardCollection(&quot;car_accident.by_month&quot;,{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;country:1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;헤시&amp;nbsp;샤딩&amp;nbsp;구성하기 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.area.createIndex(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.area.createIndex(&lt;/a&gt;{country:&quot;hashed&quot;}) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sh.shardCollection(&quot;&lt;a href=&quot;car_accident.area&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;car_accident.area&lt;/a&gt;&quot;,{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;country:&quot;hashed&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mongod&amp;nbsp;설정&amp;nbsp;파일&amp;nbsp;사용 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/etc/&lt;a href=&quot;mongod.conf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;mongod.conf&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;설정&amp;nbsp;사진들.. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;샤드&amp;nbsp;클러스터&amp;nbsp;관리하기 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;설정&amp;nbsp;서버&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;use&amp;nbsp;config&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;show&amp;nbsp;collections&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;여러&amp;nbsp;컬렉션들이&amp;nbsp;나옴&amp;nbsp;필요하면&amp;nbsp;찾아보기&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;use&amp;nbsp;config &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.status.find()&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.status.find()&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//shards&amp;nbsp;조회 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;sh.status()&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;sh.status()&lt;/a&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//클러스터&amp;nbsp;상태&amp;nbsp;확인하기 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;사용자&amp;nbsp;인증 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;security: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;authorization:&amp;nbsp;enabled &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <author>도랜니</author>
      <guid isPermaLink="true">https://torenyground.tistory.com/96</guid>
      <comments>https://torenyground.tistory.com/96#entry96comment</comments>
      <pubDate>Wed, 11 Mar 2020 15:25:46 +0900</pubDate>
    </item>
    <item>
      <title>mongodb 복제 정리 -2</title>
      <link>https://torenyground.tistory.com/95</link>
      <description>&lt;p&gt;복제 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;목적&amp;nbsp;:&amp;nbsp;서비스&amp;nbsp;중인&amp;nbsp;mongodb&amp;nbsp;인스턴스에&amp;nbsp;문제가&amp;nbsp;생겼을&amp;nbsp;때,&amp;nbsp;정보가&amp;nbsp;복제된&amp;nbsp;다른&amp;nbsp;인스턴스를&amp;nbsp;이용해서&amp;nbsp;문제가&amp;nbsp;생긴&amp;nbsp;인스턴스를&amp;nbsp;대체하는&amp;nbsp;것이다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;하지만,&amp;nbsp;복제된&amp;nbsp;인스턴스는&amp;nbsp;변경된&amp;nbsp;정보를&amp;nbsp;동기화하는데&amp;nbsp;시간이&amp;nbsp;걸린다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;복제를&amp;nbsp;수행&amp;nbsp;하기&amp;nbsp;위해서는&amp;nbsp;여러&amp;nbsp;mongod&amp;nbsp;인스턴스가&amp;nbsp;모인&amp;nbsp;&quot;묶음&quot;이&amp;nbsp;필요하다.&amp;nbsp;이&amp;nbsp;묶음에&amp;nbsp;속하게&amp;nbsp;되면&amp;nbsp;서로의&amp;nbsp;정보를&amp;nbsp;동기화한다.&amp;nbsp;이런&amp;nbsp;묶음을&amp;nbsp;복제세트라고하고&amp;nbsp;이에는&amp;nbsp;3가지로&amp;nbsp;구성된다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;클라이언트와&amp;nbsp;읽기&amp;nbsp;및&amp;nbsp;쓰기&amp;nbsp;작업을&amp;nbsp;하는&amp;nbsp;'프라이머리&amp;nbsp;구성원'&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;프라이머리&amp;nbsp;구성원의&amp;nbsp;정보를&amp;nbsp;동기화하는&amp;nbsp;'세컨더리&amp;nbsp;구성원' &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;정보를&amp;nbsp;저장하지는&amp;nbsp;않고&amp;nbsp;복제&amp;nbsp;세트의&amp;nbsp;복구를&amp;nbsp;돕는&amp;nbsp;'아비터&amp;nbsp;구성원'&amp;nbsp;이렇게&amp;nbsp;세&amp;nbsp;가지&amp;nbsp;종류의&amp;nbsp;구성원이&amp;nbsp;복제&amp;nbsp;세트를&amp;nbsp;구성한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;서로&amp;nbsp;살아&amp;nbsp;있는지&amp;nbsp;10초마다&amp;nbsp;핑을&amp;nbsp;보내는&amp;nbsp;작업을&amp;nbsp;수행한다.&amp;nbsp;이를&amp;nbsp;하트비트라고한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;복제&amp;nbsp;세트&amp;nbsp;구성원의&amp;nbsp;기능 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;프라이머리&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;세컨더리&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;아비터 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;주요역할&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;클라이언트와&amp;nbsp;정보교환&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;프라이머리&amp;nbsp;정보&amp;nbsp;복제&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;투표진행 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;정보저장&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;O&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;O&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;선거에서역할&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;문제가&amp;nbsp;발생&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;피선거권,선거권&amp;nbsp;보유&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;선거권&amp;nbsp;보유 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;새컨더리가&amp;nbsp;프라이머리가&amp;nbsp;되고&amp;nbsp;프라미어리보다&amp;nbsp;최신의&amp;nbsp;정보는&amp;nbsp;지운다.&amp;nbsp;그래서&amp;nbsp;롤백이&amp;nbsp;되는데&amp;nbsp;소실되어서는&amp;nbsp;안되는&amp;nbsp;민감한&amp;nbsp;정보를&amp;nbsp;저장해야&amp;nbsp;하는&amp;nbsp;경우에는&amp;nbsp;WriteConcern을&amp;nbsp;보수적으로&amp;nbsp;설정해야한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mongod &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--replSet&amp;nbsp;&amp;lt;복제&amp;nbsp;세트&amp;nbsp;이름&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--port&amp;nbsp;&amp;lt;포트번호&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--bind_ip&amp;nbsp;&amp;lt;연결할아이피&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--dbpath&amp;nbsp;&amp;lt;정보를&amp;nbsp;저장할&amp;nbsp;경로&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--oplogSize&amp;nbsp;&amp;lt;오피로그&amp;nbsp;크기&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mkdir&amp;nbsp;-p&amp;nbsp;/db/data/rs-0&amp;nbsp;/db/data/rs-1&amp;nbsp;/db/data/rs-2 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;포트&amp;nbsp;27018,&amp;nbsp;27019,&amp;nbsp;27020 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mongo&amp;nbsp;--port&amp;nbsp;27018&amp;nbsp;실행&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//rs()이라는&amp;nbsp;이름의&amp;nbsp;복제&amp;nbsp;세트로&amp;nbsp;묶는다 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rs.initiate({ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_id:&quot;rs0&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;members:[ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:0,host:&quot;localhost:27018&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:0,host:&quot;localhost:27019&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:0,host:&quot;localhost:27020&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;] &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;rs.status()&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;rs.status()&lt;/a&gt;&amp;nbsp;//&amp;nbsp;상세&amp;nbsp;정보 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;프라이머리에서&amp;nbsp;데이터&amp;nbsp;넣고,&amp;nbsp;세컨더리에서&amp;nbsp;조회 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rs.slaveOk()&amp;nbsp;//세컨더리는&amp;nbsp;기본값으로&amp;nbsp;셸을&amp;nbsp;사용하지&amp;nbsp;못하게&amp;nbsp;되어있다.&amp;nbsp;사용가능하게&amp;nbsp;하기 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;배포&amp;nbsp;환경에&amp;nbsp;복제&amp;nbsp;세트&amp;nbsp;구성 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;mongod.conf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;mongod.conf&lt;/a&gt;&amp;nbsp;파일을&amp;nbsp;수정해서&amp;nbsp;인스턴스의&amp;nbsp;기본&amp;nbsp;값이&amp;nbsp;외부와&amp;nbsp;연결이&amp;nbsp;가능하도록&amp;nbsp;설정해야&amp;nbsp;한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/etc/&lt;a href=&quot;mongod.conf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;mongod.conf&lt;/a&gt;&amp;nbsp;결로에&amp;nbsp;설정파일&amp;nbsp;존재 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;net: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bindIp:&amp;nbsp;127.0.0.1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;port:&amp;nbsp;27017 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;복제&amp;nbsp;세트&amp;nbsp;세부&amp;nbsp;설정 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;rs.conf()&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;rs.conf()&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rs.reconfig(&amp;lt;복제옵션&amp;gt;)&amp;nbsp;//&amp;nbsp;세컨더리의&amp;nbsp;우선순위&amp;nbsp;변경&amp;nbsp;가능 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;새로운&amp;nbsp;구성원을&amp;nbsp;복제&amp;nbsp;세트에&amp;nbsp;추가하려고&amp;nbsp;할때&amp;nbsp;add&amp;nbsp;명령어를&amp;nbsp;이용하면&amp;nbsp;추가&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;rs.add(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;rs.add(&lt;/a&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;host:, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;설정값들.. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;rs.remove(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;rs.remove(&lt;/a&gt;&quot;128.20.1.33&quot;)&amp;nbsp;//복제&amp;nbsp;세트에서&amp;nbsp;제외&amp;nbsp;하고자&amp;nbsp;할&amp;nbsp;떄에는&amp;nbsp;해당&amp;nbsp;구성원의&amp;nbsp;인스턴스를&amp;nbsp;종류하고,&amp;nbsp;remove&amp;nbsp;명령어를&amp;nbsp;주어서&amp;nbsp;구성원을&amp;nbsp;제외하면&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;읽기&amp;nbsp;선호&amp;nbsp;설정이&amp;nbsp;가능하다&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;기본은&amp;nbsp;프라이머리에서&amp;nbsp;읽어오지만,&amp;nbsp;읽기&amp;nbsp;작업을&amp;nbsp;분산시킬수&amp;nbsp;있다.&amp;nbsp;(&amp;nbsp;드라이버에서&amp;nbsp;관리,&amp;nbsp;식제&amp;nbsp;개발할&amp;nbsp;떄에는&amp;nbsp;드라이버의&amp;nbsp;설정에&amp;nbsp;맞추어&amp;nbsp;개발해야&amp;nbsp;한다.) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.프라이머리&amp;nbsp;구성원에서&amp;nbsp;읽는&amp;nbsp;상태 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.프라이머리&amp;nbsp;구성원에서&amp;nbsp;우선적으로&amp;nbsp;읽는&amp;nbsp;상태(읽기&amp;nbsp;작업이&amp;nbsp;밀리게&amp;nbsp;되면&amp;nbsp;세컨더리로부터&amp;nbsp;정보를&amp;nbsp;불러오기&amp;nbsp;때문에&amp;nbsp;변경사항&amp;nbsp;반영이&amp;nbsp;좀&amp;nbsp;늦을수&amp;nbsp;있다.) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.세컨더리&amp;nbsp;구성원에서&amp;nbsp;읽는&amp;nbsp;상태 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4.세컨더리&amp;nbsp;구성원에서&amp;nbsp;우선적으로&amp;nbsp;읽는&amp;nbsp;상태 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5.가까운&amp;nbsp;구성원에서&amp;nbsp;읽는&amp;nbsp;상태&amp;nbsp;(&amp;nbsp;정보&amp;nbsp;변경&amp;nbsp;반영이&amp;nbsp;클라이언트마다&amp;nbsp;제각각이&amp;nbsp;될&amp;nbsp;우려가&amp;nbsp;있다.) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;동기화&amp;nbsp;작동&amp;nbsp;방식 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;오피로그&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Mongodb&amp;nbsp;인스턴스&amp;nbsp;내에서&amp;nbsp;변경된&amp;nbsp;정보&amp;nbsp;내역을&amp;nbsp;저장한&amp;nbsp;특별한&amp;nbsp;Capped&amp;nbsp;컬렉션이다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.oplog.rs.find().limit(1).pretty()&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.oplog.rs.find().limit(1).pretty()&lt;/a&gt;&amp;nbsp;//&amp;nbsp;조회 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//사진 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;초기&amp;nbsp;동기화 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;새로운&amp;nbsp;세컨더리를&amp;nbsp;추가했을&amp;nbsp;때&amp;nbsp;오피로그의&amp;nbsp;정보만으로&amp;nbsp;동기화를&amp;nbsp;수행할&amp;nbsp;수&amp;nbsp;없다면&amp;nbsp;'초기&amp;nbsp;동기화'를&amp;nbsp;수행하게&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReadConcern&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;그냥&amp;nbsp;프라이머리에&amp;nbsp;기록된&amp;nbsp;정보를&amp;nbsp;가져올지,&amp;nbsp;아니면&amp;nbsp;대다수의&amp;nbsp;복제&amp;nbsp;세트에&amp;nbsp;기록된&amp;nbsp;정보를&amp;nbsp;가져올지&amp;nbsp;정할&amp;nbsp;수있다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;local&amp;nbsp;단계&amp;nbsp;majority(여러&amp;nbsp;개의&amp;nbsp;도큐먼트를&amp;nbsp;작업하는&amp;nbsp;트랜잭션에&amp;nbsp;이&amp;nbsp;옵션을&amp;nbsp;사용하려면)&amp;nbsp;단계&amp;nbsp;linearizable&amp;nbsp;단계&amp;nbsp;(시간옵션을&amp;nbsp;설정&amp;nbsp;해주어야함) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor.readConcern(&quot;linearizable&quot;).maxTimeMS(10000) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//쿼리의&amp;nbsp;결과로&amp;nbsp;나온&amp;nbsp;커서&amp;nbsp;뒤에&amp;nbsp;readConcern이라는&amp;nbsp;명령어를&amp;nbsp;이용하면&amp;nbsp;읽어오는&amp;nbsp;정보에&amp;nbsp;관련&amp;nbsp;옵션을&amp;nbsp;붙일수있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.rating.aggregate(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.rating.aggregate(&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[{$match:{rating:{$lt:5}}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;readConcern:{level:&quot;majority&quot;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session&amp;nbsp;=db.getMongo().startSession() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.startTransaction({readConcern:{lecel:&quot;snapshot&quot;}}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteConcern:{w:&quot;majority&quot;}}); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.commitTransaction(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.endSession(); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteConcern &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;복제&amp;nbsp;세트에&amp;nbsp;장애가&amp;nbsp;발생했을&amp;nbsp;때&amp;nbsp;중요한&amp;nbsp;정보가&amp;nbsp;사라질지,&amp;nbsp;유지될지&amp;nbsp;결정할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w&amp;nbsp;:&amp;nbsp;복제&amp;nbsp;세트의&amp;nbsp;어느정도의&amp;nbsp;구성원에&amp;nbsp;쓰기&amp;nbsp;작업이&amp;nbsp;완료되어야&amp;nbsp;전체&amp;nbsp;쓰기&amp;nbsp;작업이&amp;nbsp;완료되었다고&amp;nbsp;판단할지&amp;nbsp;결정하는&amp;nbsp;옵션 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j&amp;nbsp;:&amp;nbsp;쓰기&amp;nbsp;작업은&amp;nbsp;메모리에&amp;nbsp;변경&amp;nbsp;사항을&amp;nbsp;남겼다가&amp;nbsp;일정&amp;nbsp;주기로&amp;nbsp;디스크에&amp;nbsp;변경&amp;nbsp;사항을&amp;nbsp;기록&amp;nbsp;디스크&amp;nbsp;변경사항을&amp;nbsp;임시로&amp;nbsp;저장하는&amp;nbsp;작업을&amp;nbsp;저널링이라고&amp;nbsp;한다.&amp;nbsp;저널링은&amp;nbsp;장애가&amp;nbsp;발생해도&amp;nbsp;기록이&amp;nbsp;남기&amp;nbsp;때문에&amp;nbsp;복구가&amp;nbsp;가능하다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wtimeout&amp;nbsp;:&amp;nbsp;w&amp;nbsp;옵션에서&amp;nbsp;설정한&amp;nbsp;구성원들을&amp;nbsp;기다릴&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;최대시간&amp;nbsp;,&amp;nbsp;시간이&amp;nbsp;지나면&amp;nbsp;에러&amp;nbsp;반환&amp;nbsp;이미&amp;nbsp;실행한&amp;nbsp;쓰기&amp;nbsp;작업&amp;nbsp;자체는&amp;nbsp;취소되지&amp;nbsp;않는다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.rating.aggregate(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.rating.aggregate(&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&amp;nbsp;{$match:{rating:{$lt:5}}}],{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writeConcern:{w:&quot;majority&quot;,j:t} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ession&amp;nbsp;=db.getMongo().startSession() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.startTransaction({readConcern:{lecel:&quot;snapshot&quot;}}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteConcern:{w:&quot;majority&quot;}}); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.commitTransaction(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.endSession(); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;오피로그의&amp;nbsp;크기 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;세컨더리가&amp;nbsp;동기화를&amp;nbsp;끝내지&amp;nbsp;못했는데&amp;nbsp;오피로그의&amp;nbsp;크기가&amp;nbsp;작아&amp;nbsp;동기화할&amp;nbsp;데이터가&amp;nbsp;지워진다면&amp;nbsp;가지고&amp;nbsp;있는&amp;nbsp;데이터를&amp;nbsp;모두&amp;nbsp;지우고&amp;nbsp;초기&amp;nbsp;동기화&amp;nbsp;과정을&amp;nbsp;가지게&amp;nbsp;된다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;다행히&amp;nbsp;4.0&amp;nbsp;버전&amp;nbsp;이상부터는&amp;nbsp;대다수의&amp;nbsp;세컨더리에서&amp;nbsp;오피로그를&amp;nbsp;동기화하지&amp;nbsp;못했으면&amp;nbsp;프라이머리의&amp;nbsp;오피로그를&amp;nbsp;삭제하지&amp;nbsp;않는&amp;nbsp;기술이&amp;nbsp;탑재&amp;nbsp;되었다 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;세컨더리를&amp;nbsp;잠깐&amp;nbsp;복제&amp;nbsp;세트에서&amp;nbsp;제외&amp;nbsp;했다가&amp;nbsp;다시&amp;nbsp;포함시키는&amp;nbsp;상황 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;물리적으로&amp;nbsp;백업된&amp;nbsp;정보를&amp;nbsp;인스턴스에&amp;nbsp;덮어씌우고&amp;nbsp;세컨더리를&amp;nbsp;복제&amp;nbsp;세트에&amp;nbsp;추가하는&amp;nbsp;상황 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;오피로그&amp;nbsp;크기&amp;nbsp;수정하기 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;use&amp;nbsp;local &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.oplog.rs.stats().maxSize&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.oplog.rs.stats().maxSize&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.adminCommand({replSetResizeOplog:ture,size:16834}) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;동기화&amp;nbsp;상태&amp;nbsp;확인 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rs.printSlaveReplicationInfo()&lt;/p&gt;</description>
      <author>도랜니</author>
      <guid isPermaLink="true">https://torenyground.tistory.com/95</guid>
      <comments>https://torenyground.tistory.com/95#entry95comment</comments>
      <pubDate>Wed, 11 Mar 2020 11:14:21 +0900</pubDate>
    </item>
    <item>
      <title>mongodb 정리 -1</title>
      <link>https://torenyground.tistory.com/94</link>
      <description>&lt;p&gt;1.&amp;nbsp;스키마가&amp;nbsp;자주&amp;nbsp;바뀌는&amp;nbsp;환경 &lt;br /&gt;ex)&amp;nbsp; &lt;br /&gt;1.애자일&amp;nbsp;개발&amp;nbsp;방법론이나&amp;nbsp;나선형&amp;nbsp;모델의&amp;nbsp;시제품을&amp;nbsp;만들&amp;nbsp;때와&amp;nbsp;같이&amp;nbsp;최종적인&amp;nbsp;개발&amp;nbsp;명세가&amp;nbsp;확정되지&amp;nbsp;않는&amp;nbsp;상황 &lt;br /&gt;2.로깅을&amp;nbsp;하기&amp;nbsp;위한&amp;nbsp;용도로&amp;nbsp;사용할&amp;nbsp;수도&amp;nbsp;있다.&amp;nbsp;다양한&amp;nbsp;형식의&amp;nbsp;로그를&amp;nbsp;기록할&amp;nbsp;때에도&amp;nbsp;매우&amp;nbsp;유용하다. &lt;br /&gt;2.&amp;nbsp;분산&amp;nbsp;컴퓨팅&amp;nbsp;환경 &lt;br /&gt;샤딩과&amp;nbsp;복제를&amp;nbsp;DBMS&amp;nbsp;수준에서&amp;nbsp;지원해서&amp;nbsp;여러&amp;nbsp;관련&amp;nbsp;기능들을&amp;nbsp;보다&amp;nbsp;효과적으로&amp;nbsp;적용할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;-복제는&amp;nbsp;'고가용성'&amp;nbsp;환경이&amp;nbsp;필요할때&amp;nbsp;고려해볼만하다.&amp;nbsp;(항상&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;상태) &lt;br /&gt;-샤딩은&amp;nbsp;저장용량이&amp;nbsp;늘어나면서&amp;nbsp;읽기,쓰기&amp;nbsp;속도가&amp;nbsp;필요한&amp;nbsp;만큼&amp;nbsp;나오지&amp;nbsp;않을&amp;nbsp;때&amp;nbsp;적용할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;*&amp;nbsp;리눅스에서&amp;nbsp;mongodb설치시&amp;nbsp;권한&amp;nbsp;설정&amp;nbsp;(sudo&amp;nbsp;chmod&amp;nbsp;-R&amp;nbsp;go+w&amp;nbsp;/data/db &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;도큐먼트는&amp;nbsp;BSON&amp;nbsp;구조는&amp;nbsp;값으로&amp;nbsp;매우&amp;nbsp;다양한&amp;nbsp;데이터&amp;nbsp;타입을&amp;nbsp;가진다. &lt;br /&gt;&lt;br /&gt;db.dropDatabase()&amp;nbsp; &lt;br /&gt;&lt;a href=&quot;db.collection.drop()&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.collection.drop()&lt;/a&gt; &lt;br /&gt;db.collection.renameCollection(바꿀이름) &lt;br /&gt;&lt;br /&gt;Capped&amp;nbsp;컬렉션 &lt;br /&gt;정해진&amp;nbsp;크기를&amp;nbsp;초과하게&amp;nbsp;되면,&amp;nbsp;자동으로&amp;nbsp;가장&amp;nbsp;오래된&amp;nbsp;데이터를&amp;nbsp;삭제하게된다 &lt;br /&gt;db.createCollection(&amp;lt;컬렉션이름&amp;gt;,{capped:true,&amp;nbsp;size:&amp;lt;제한할&amp;nbsp;크기&amp;gt;) &lt;br /&gt;capped&amp;nbsp;컬렉션은&amp;nbsp;로그&amp;nbsp;데이터나,&amp;nbsp;일정&amp;nbsp;시간&amp;nbsp;동안만&amp;nbsp;보관하는&amp;nbsp;통계&amp;nbsp;데이터를&amp;nbsp;보관하고&amp;nbsp;싶을&amp;nbsp;때&amp;nbsp;유용하게&amp;nbsp;사용&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;뷰 &lt;br /&gt;집계&amp;nbsp;파이프라인&amp;nbsp;문법&amp;nbsp;사용 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;WriteConcern &lt;br /&gt;mongodb는&amp;nbsp;기본적으로&amp;nbsp;메모리메&amp;nbsp;미리&amp;nbsp;저장한&amp;nbsp;후,&amp;nbsp;천천히장기&amp;nbsp;저장장치로&amp;nbsp;데이터를&amp;nbsp;옮긴다.&amp;nbsp;따라서&amp;nbsp;데이터베이스에&amp;nbsp;갑저가&amp;nbsp;문제(정전&amp;nbsp;등)이&amp;nbsp;생기면&amp;nbsp;메모리에만&amp;nbsp;담겨&amp;nbsp;있어 &lt;br /&gt;데이터가&amp;nbsp;손실&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;db.user.insertMany(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.user.insertMany(&lt;/a&gt;{다큐먼트1},{다큐먼트2}&amp;nbsp;....) &lt;br /&gt;여러&amp;nbsp;다큐먼트를&amp;nbsp;한번에&amp;nbsp;넣기&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;find&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;쿼리&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.containerBox.find(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.containerBox.find(&lt;/a&gt;{name:&quot;가위&quot;}) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;점연산자&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;{name:{firstName:&quot;Karoid&quot;,lastName:&quot;Jeong&quot;}} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.A.find(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.A.find(&lt;/a&gt;{&quot;name.firstName&quot;::Karoid&quot;}) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;{numbers:&amp;nbsp;[101,32,21,11]} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.A.find(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.A.find(&lt;/a&gt;{&quot;numbers.0&quot;:52) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;프로젝션 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;어떤&amp;nbsp;도큐먼트를&amp;nbsp;불러올지를&amp;nbsp;결정하는&amp;nbsp;파라미터 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.containerBox.find(null,&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.containerBox.find(null,&lt;/a&gt;{name:true}) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.containerBox.find(null,&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.containerBox.find(null,&lt;/a&gt;{name:1}) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;null&amp;nbsp;=&amp;gt;&amp;nbsp;{name:'가위'}&amp;nbsp;&amp;nbsp;조건&amp;nbsp;찾기 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;cursor&amp;nbsp;커서&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;모든&amp;nbsp;정보를&amp;nbsp;직접&amp;nbsp;반환하지&amp;nbsp;않고&amp;nbsp;커서를&amp;nbsp;반환한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;toArray()를&amp;nbsp;메소드를&amp;nbsp;사용하면&amp;nbsp;커서로부터&amp;nbsp;정보를&amp;nbsp;전부&amp;nbsp;가져올&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;만약&amp;nbsp;find문의&amp;nbsp;모든&amp;nbsp;값이&amp;nbsp;다&amp;nbsp;필요하지&amp;nbsp;않다면&amp;nbsp;toArray&amp;nbsp;메소드는&amp;nbsp;비효율적이다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;또,&amp;nbsp;필요한&amp;nbsp;도큐먼트의&amp;nbsp;총&amp;nbsp;크기가&amp;nbsp;매우&amp;nbsp;크다면&amp;nbsp;toArray&amp;nbsp;메소드를&amp;nbsp;사용&amp;nbsp;할&amp;nbsp;시&amp;nbsp;메모리&amp;nbsp;용량을&amp;nbsp;초과&amp;nbsp;할수도있다. &lt;br /&gt;&lt;br /&gt;수정 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;replaceOne&amp;nbsp;(대체) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;기존의&amp;nbsp;값&amp;nbsp;유지&amp;nbsp;되지않고,&amp;nbsp;교체되어&amp;nbsp;버린다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&lt;a href=&quot;db.user.replaceOne(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.user.replaceOne(&lt;/a&gt;{username:&quot;karoid&quot;},{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;username:&quot;Karpoid&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;status:&quot;Sleep&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;points:100, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;password:2222 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},(upsert:true)) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;upsert&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;참/거짓&amp;nbsp;값을&amp;nbsp;설정할&amp;nbsp;수&amp;nbsp;있다,&amp;nbsp;참값으로&amp;nbsp;설정된&amp;nbsp;경우&amp;nbsp;쿼리로&amp;nbsp;찾은&amp;nbsp;도큐먼트가&amp;nbsp;없다면,&amp;nbsp;찾은&amp;nbsp;내용으로&amp;nbsp;도큐먼트를&amp;nbsp;생성해서&amp;nbsp;수정하게&amp;nbsp;된다.&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;updateOne,&amp;nbsp;updateMany&amp;nbsp;(수정) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-db.containerBox.updateMany({name:&quot;bear&quot;},{$set:{name:&quot;teddy&amp;nbsp;bear&quot;,category:&quot;toy&quot;}}) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;($unset&amp;nbsp;도큐먼트상의&amp;nbsp;field&amp;nbsp;필드를&amp;nbsp;제거한다.) &lt;br /&gt;&lt;br /&gt;수정&amp;nbsp;배열&amp;nbsp;연산자 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.character.insertMany([ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{name:'x',inventory:['pen','cloth','pen']}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{name:'y',inventory:['book','cloth'],position:{x:1,y:5}}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{name:'z',inventory:['wood','pen'],position:{x:0,y:9}} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.character.updateMany({},{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$set:{&quot;inventory.$[penElem]&quot;:&quot;pencil&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{arrayFilters:[{penElem:'pen'}]} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$set:{&quot;inventory.$[]&quot;:&quot;pencil&quot;}&amp;nbsp;-&amp;gt;&amp;nbsp;배열에&amp;nbsp;pen&amp;nbsp;요소가&amp;nbsp;두개&amp;nbsp;있어도&amp;nbsp;모두&amp;nbsp;pencil로&amp;nbsp;바뀌게&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;삭제는&amp;nbsp;수정과&amp;nbsp;매우&amp;nbsp;유사하다 &lt;br /&gt;&lt;br /&gt;트랜잭션&amp;nbsp;명령어 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session&amp;nbsp;=&amp;nbsp;db.getMongo()startSesstion() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session().startTransaction({readConcern&amp;nbsp;:{level:&quot;snapshot&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writeConcern:{w:&quot;majority&quot;}}); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;원하는&amp;nbsp;작업을&amp;nbsp;수행&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.commitTransaction(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.endSession();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;문제가&amp;nbsp;생길&amp;nbsp;경우&amp;nbsp;중간에&amp;nbsp;작업을&amp;nbsp;취소&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.abortTransaction(); &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$text&amp;nbsp;연산자 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MongoDB의&amp;nbsp;$text&amp;nbsp;연산자는&amp;nbsp;해당&amp;nbsp;컬렉션의&amp;nbsp;텍스트&amp;nbsp;인덱스&amp;nbsp;안에서만&amp;nbsp;작동하기&amp;nbsp;때문에,&amp;nbsp;문자열&amp;nbsp;인덱스를&amp;nbsp;생성해야&amp;nbsp;한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.stores.insertMany([&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.stores.insertMany([&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:1,&amp;nbsp;name&amp;nbsp;:&quot;java&amp;nbsp;Hut&quot;,description:&quot;Coffee&amp;nbsp;and&amp;nbsp;cakes&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:2,&amp;nbsp;name&amp;nbsp;:&quot;asdf&quot;,description:&quot;Coffee&amp;nbsp;and&amp;nbsp;cakes&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:3,&amp;nbsp;name&amp;nbsp;:&quot;xcxc&quot;,description:&quot;Coffee&amp;nbsp;and&amp;nbsp;cakes&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:4,&amp;nbsp;name&amp;nbsp;:&quot;hhh&quot;,description:&quot;Coffee&amp;nbsp;and&amp;nbsp;cakes&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:5,&amp;nbsp;name&amp;nbsp;:&quot;jjj&quot;,description:&quot;Coffee&amp;nbsp;and&amp;nbsp;cakes&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:6,&amp;nbsp;name&amp;nbsp;:&quot;jkkt&quot;,description:&quot;Coffee&amp;nbsp;and&amp;nbsp;cakes&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:7,&amp;nbsp;name&amp;nbsp;:&quot;ccc&quot;,description:&quot;Coffee&amp;nbsp;and&amp;nbsp;cakes&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.stores.createIndex(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.stores.createIndex(&lt;/a&gt;{name:&quot;text&quot;,description:&quot;text&quot;})&amp;nbsp;-&amp;nbsp;문자열&amp;nbsp;인덱스를&amp;nbsp;생성 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.stores.find(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.stores.find(&lt;/a&gt;{$text:{$search:&quot;bake&amp;nbsp;coffee&amp;nbsp;cake&quot;}}) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;대소문자를&amp;nbsp;구분하지&amp;nbsp;않고&amp;nbsp;검색을&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.stores.find(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.stores.find(&lt;/a&gt;{$text:{$search:&quot;\&quot;coffee&amp;nbsp;shop\&quot;&quot;}}) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;여러&amp;nbsp;단어를&amp;nbsp;띄어쓰기와&amp;nbsp;함께&amp;nbsp;사용하게&amp;nbsp;되면&amp;nbsp;해당&amp;nbsp;단어들&amp;nbsp;중&amp;nbsp;일부만&amp;nbsp;포함된&amp;nbsp;도큐먼트라도&amp;nbsp;불러오게&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.stores.find(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.stores.find(&lt;/a&gt;{$text&amp;nbsp;:{$search:&quot;shopped&quot;}}) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shop이라는&amp;nbsp;단어의&amp;nbsp;진행형인&amp;nbsp;shopping이&amp;nbsp;포함된&amp;nbsp;도큐먼트를&amp;nbsp;불러온다 &lt;br /&gt;&lt;br /&gt;배열&amp;nbsp;연산자 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.inventory.find(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.inventory.find(&lt;/a&gt;{tags:{$elemMatch:{$gt:10,%lt:5}}}) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;하나라도&amp;nbsp;두&amp;nbsp;조건을&amp;nbsp;동시에&amp;nbsp;만족하는&amp;nbsp;값을&amp;nbsp;가져옴 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.inventory.find(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.inventory.find(&lt;/a&gt;{tags:{$all:[&quot;red&quot;,&quot;blank&quot;]}}) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;순서와&amp;nbsp;상관없이&amp;nbsp;모든&amp;nbsp;요소를&amp;nbsp;가지는&amp;nbsp;값을&amp;nbsp;가져옴 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.inventory.find(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.inventory.find(&lt;/a&gt;{&quot;tags&quot;:{size:3},....}) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;배열의&amp;nbsp;해당&amp;nbsp;크기와&amp;nbsp;같은&amp;nbsp;도큐먼트를&amp;nbsp;찾는다 &lt;br /&gt;&lt;br /&gt;프로젝션&amp;nbsp;연산자 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;프로젝션에서는&amp;nbsp;점연산자가&amp;nbsp;첫번째&amp;nbsp;배열을&amp;nbsp;가르키지&amp;nbsp;않는다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$slice등을&amp;nbsp;사용 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.inventory.find(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.inventory.find(&lt;/a&gt;{},tags:{$slice:1}}) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tags&amp;nbsp;필드의&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;요소만&amp;nbsp;출력&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;마지막&amp;nbsp;요소로부터&amp;nbsp;n개를&amp;nbsp;출력하고&amp;nbsp;싶다면&amp;nbsp;연산자의&amp;nbsp;값으로&amp;nbsp;-n을&amp;nbsp;설정하면&amp;nbsp;된다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{$slice:[1,2]} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elemMatch &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;배열&amp;nbsp;속에서&amp;nbsp;특정&amp;nbsp;조건을&amp;nbsp;만족하는&amp;nbsp;요소만&amp;nbsp;노출 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$연산자&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tags&amp;nbsp;필드의&amp;nbsp;값&amp;nbsp;중&amp;nbsp;&quot;red&quot;를&amp;nbsp;갖는&amp;nbsp;도큐먼트를&amp;nbsp;찾는경우 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.inventory.find(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.inventory.find(&lt;/a&gt;{tags:&quot;red&quot;},{&quot;tags.$&quot;:true}) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;집계&amp;nbsp;명령어 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;집계&amp;nbsp;방법론과&amp;nbsp;효율성 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;도큐먼트를&amp;nbsp;집계하는&amp;nbsp;방법은&amp;nbsp;크게&amp;nbsp;세&amp;nbsp;가지가&amp;nbsp;있다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;데이터베이스의&amp;nbsp;모든&amp;nbsp;정보를&amp;nbsp;불러와&amp;nbsp;애플리케이션&amp;nbsp;단게에서&amp;nbsp;집계하는&amp;nbsp;방법 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;MongoDB의&amp;nbsp;맵-리듀스&amp;nbsp;기능을&amp;nbsp;이용하는&amp;nbsp;방법 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;MongoDB의&amp;nbsp;집계&amp;nbsp;파이프라인&amp;nbsp;기능을&amp;nbsp;이용하는&amp;nbsp;방법&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;집계&amp;nbsp;파이프라인은&amp;nbsp;MongoDB&amp;nbsp;내부에서&amp;nbsp;작동,&amp;nbsp;다른&amp;nbsp;방법들은&amp;nbsp;정보교환을&amp;nbsp;위해&amp;nbsp;메모리가&amp;nbsp;필요하게&amp;nbsp;된다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;집계&amp;nbsp;파이프라인&amp;nbsp;방식으로&amp;nbsp;원하는&amp;nbsp;결과를&amp;nbsp;얻지&amp;nbsp;못할&amp;nbsp;수도&amp;nbsp;있다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;그럴&amp;nbsp;경우,&amp;nbsp;맵-리듀스&amp;nbsp;방식을&amp;nbsp;사용하면&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;맵-리듀스의&amp;nbsp;작동&amp;nbsp;방식&amp;nbsp;1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Rating &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:1,rating:1,user_id:2}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{1:2}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:1,value:2} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:1,rating:1,user_id:2}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;map&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{2:3}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:2,value:3} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{3:[4,1]}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:3,value:2} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{4:[5,8]}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:4,value:2} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.rating.mapReduce(mapper,&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.rating.mapReduce(mapper,&lt;/a&gt;&amp;nbsp;reducer,&amp;nbsp;{out:{inline:1}}) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;맵-리듀스의&amp;nbsp;작동&amp;nbsp;방식&amp;nbsp;2 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Rating&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reduce&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;중간&amp;nbsp;결과물 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:1,rating:1,user_id:2}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{1:2}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-----&amp;nbsp;{_id:1,value:2} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:1,rating:1,user_id:2}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;map&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{2:3}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:2,value:3} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{3:[4,1]}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:3,value:2} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{4:[5,8]}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;---&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{_id:4,value:2}&amp;nbsp;&amp;nbsp;최종결과물 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reduce&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;파이프라인&amp;nbsp;방식 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$project&amp;nbsp;(어떤&amp;nbsp;필드를&amp;nbsp;만들고&amp;nbsp;어떤&amp;nbsp;필드를&amp;nbsp;숨길지&amp;nbsp;설정) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.rating.aggregate([&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.rating.aggregate([&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$project:{_id:0,rating:1,hello:&quot;new&amp;nbsp;field&quot;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&quot;rating&quot;:1,&quot;hello&quot;:&quot;new&amp;nbsp;field&quot;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.rating.aggregate([&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.rating.aggregate([&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$project:{_id:0,multiply:{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$multiply:[$_id&quot;,&quot;user_id&quot;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&quot;multiply&quot;:2}&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$group(그룹화이다.) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.rating.aggregate([&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.rating.aggregate([&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$group:{_id:&quot;$rating&quot;,count:{$sum:1}} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$match(도큐먼트를&amp;nbsp;필터링해서&amp;nbsp;반환한다.&amp;nbsp;find문과&amp;nbsp;비슷한&amp;nbsp;역할이다.) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.rating.aggregate([&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.rating.aggregate([&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$match:{rating:{$gte:4}} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$group:{_id:&quot;$rating&quot;,user_ids:{$push:&quot;$user_id&quot;}} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&quot;_id&quot;&amp;nbsp;:5&amp;nbsp;,&quot;user_ids:[11,12,10,9]} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;평점이&amp;nbsp;4&amp;nbsp;이상인&amp;nbsp;사용자의&amp;nbsp;id들을&amp;nbsp;배열의&amp;nbsp;형태로&amp;nbsp;정리 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.rating.aggregate([&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.rating.aggregate([&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$match:{rating:{$gte:4}} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$group:{_id:&quot;$rating&quot;,user_ids:{$push:&quot;$user_id&quot;}} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$unwind:&quot;$user_ids&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&quot;_id&quot;&amp;nbsp;:5&amp;nbsp;,&quot;user_ids:9} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&quot;_id&quot;&amp;nbsp;:5&amp;nbsp;,&quot;user_ids:10} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&quot;_id&quot;&amp;nbsp;:5&amp;nbsp;,&quot;user_ids:11} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$out(도큐먼트를&amp;nbsp;저장) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.rating.aggregate([&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.rating.aggregate([&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$match:{rating:{$gte:4}} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$group:{_id:&quot;$rating&quot;,user_ids:{$push:&quot;$user_id&quot;}} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$unwind:&quot;$user_ids&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$out:&quot;user_ids_by_rating&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$limit(입력&amp;nbsp;도큐먼트&amp;nbsp;중&amp;nbsp;지정된&amp;nbsp;숫자만큼만&amp;nbsp;출력) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$skip(입력&amp;nbsp;도큐먼트&amp;nbsp;중&amp;nbsp;지정된&amp;nbsp;숫자만큼&amp;nbsp;건너뛰고&amp;nbsp;출력) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$sort(도큐먼스틑&amp;nbsp;정렬&amp;nbsp;1이면&amp;nbsp;오름차순,-1이면&amp;nbsp;내림차순) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;뷰&amp;nbsp;생성하고&amp;nbsp;삭제하기 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.createView(&amp;lt;뷰&amp;nbsp;이름&amp;gt;,&amp;lt;출처&amp;nbsp;컬렉션&amp;gt;,&amp;lt;파이프라인&amp;nbsp;스테이지&amp;nbsp;배열&amp;gt;,) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;프로젝트&amp;nbsp;연산자&amp;nbsp;전부&amp;nbsp;사용하지&amp;nbsp;못하고,&amp;nbsp;사용할&amp;nbsp;수있는&amp;nbsp;명령어가&amp;nbsp;제한적이다. &lt;br /&gt;&lt;br /&gt;데이터&amp;nbsp;모델링과&amp;nbsp;인덱싱 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;레퍼런스&amp;nbsp;방식 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;정보의&amp;nbsp;양이&amp;nbsp;늘어날수록&amp;nbsp;크기가&amp;nbsp;작은&amp;nbsp;도큐먼트의&amp;nbsp;개수가&amp;nbsp;늘어나게&amp;nbsp;된다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;도큐먼트의&amp;nbsp;크기는&amp;nbsp;작고,&amp;nbsp;정보를&amp;nbsp;추가하려면&amp;nbsp;도큐먼트를&amp;nbsp;추가한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;연결된&amp;nbsp;정보를&amp;nbsp;모두&amp;nbsp;불러오는데&amp;nbsp;더&amp;nbsp;오래&amp;nbsp;걸린다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;연결된&amp;nbsp;정보를&amp;nbsp;일부만&amp;nbsp;불러올&amp;nbsp;때&amp;nbsp;더&amp;nbsp;빠르다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;임베디드&amp;nbsp;방식 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;도큐먼트의&amp;nbsp;크기가&amp;nbsp;무한히&amp;nbsp;커질&amp;nbsp;수도&amp;nbsp;있다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;도큐먼트의&amp;nbsp;크기는&amp;nbsp;크고,&amp;nbsp;정보를&amp;nbsp;추가하려면&amp;nbsp;도큐먼트를&amp;nbsp;수정한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;임베디드&amp;nbsp;되어&amp;nbsp;있는&amp;nbsp;정보를&amp;nbsp;더&amp;nbsp;빨리&amp;nbsp;불러&amp;nbsp;올&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;도큐먼트&amp;nbsp;전체를&amp;nbsp;읽어야&amp;nbsp;해서&amp;nbsp;느리다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;장점&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;기본적인&amp;nbsp;도큐먼트&amp;nbsp;생성&amp;nbsp;및&amp;nbsp;삭제&amp;nbsp;작업은&amp;nbsp;하나의&amp;nbsp;도큐먼트에&amp;nbsp;대해&amp;nbsp;원자성이&amp;nbsp;지켜진다.&amp;nbsp;(하지만&amp;nbsp;최근&amp;nbsp;mongodb가&amp;nbsp;트랜잭션을&amp;nbsp;지원하면서&amp;nbsp;크게&amp;nbsp;장점이&amp;nbsp;되지&amp;nbsp;않는다.&amp;nbsp;다수의&amp;nbsp;도큐먼트도&amp;nbsp;원자성을&amp;nbsp;보존할&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;거의&amp;nbsp;대부분의&amp;nbsp;글을&amp;nbsp;노출시켜야&amp;nbsp;한다면&amp;nbsp;레퍼런스&amp;nbsp;방식이&amp;nbsp;좋은&amp;nbsp;성능 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;하나의&amp;nbsp;서버에서는&amp;nbsp;읽는&amp;nbsp;다면&amp;nbsp;속도차이가&amp;nbsp;별로&amp;nbsp;나지&amp;nbsp;않지만&amp;nbsp;여러대의&amp;nbsp;서버로&amp;nbsp;샤딩&amp;nbsp;되어&amp;nbsp;있다면&amp;nbsp;속도&amp;nbsp;차이가&amp;nbsp;날&amp;nbsp;수&amp;nbsp;밖에&amp;nbsp;없다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;결론&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;주로&amp;nbsp;읽기&amp;nbsp;작업&amp;nbsp;위주&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;주로&amp;nbsp;쓰기&amp;nbsp;작업&amp;nbsp;위주 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;도큐먼트가&amp;nbsp;크다&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;임베디드&amp;nbsp;된&amp;nbsp;정보를&amp;nbsp;대부분&amp;nbsp;불러올때&amp;nbsp;유리&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;불리하다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;도큐먼트가&amp;nbsp;작다&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;임베디드&amp;nbsp;된&amp;nbsp;정보를&amp;nbsp;자주&amp;nbsp;불러와야&amp;nbsp;하면&amp;nbsp;유리&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;조금&amp;nbsp;불리하다. &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;다중키&amp;nbsp;인덱스 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;배열&amp;nbsp;값에&amp;nbsp;대한&amp;nbsp;검색&amp;nbsp;상황을&amp;nbsp;대비에&amp;nbsp;'배열에&amp;nbsp;대한&amp;nbsp;인덱스'를&amp;nbsp;지원 &lt;br /&gt;텍스트&amp;nbsp;인덱스 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$text&amp;nbsp;연산자를&amp;nbsp;사용하기&amp;nbsp;위해서&amp;nbsp;생성&amp;nbsp;되어야&amp;nbsp;하는&amp;nbsp;인덱스가&amp;nbsp;바로&amp;nbsp;텍스트&amp;nbsp;인덱스,&amp;nbsp;영어의&amp;nbsp;경우&amp;nbsp;단어의&amp;nbsp;원형으로&amp;nbsp;인덱스를&amp;nbsp;생성&amp;nbsp;한국어는&amp;nbsp;형태소별&amp;nbsp;지원이&amp;nbsp;되지&amp;nbsp;않음 &lt;br /&gt;해시&amp;nbsp;인덱스 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;핵시인덱스를&amp;nbsp;포함한&amp;nbsp;복합인덱스&amp;nbsp;생성불가,&amp;nbsp;배열을&amp;nbsp;값으로&amp;nbsp;가지는&amp;nbsp;필드에&amp;nbsp;설정&amp;nbsp;불가 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;주로&amp;nbsp;해시샤딩으로&amp;nbsp;사용하는&amp;nbsp;것이&amp;nbsp;일반적 &lt;br /&gt;&lt;br /&gt;인덱스&amp;nbsp;명령어 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;단일키&amp;nbsp;인덱스 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.movie.createIndex(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.movie.createIndex(&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{평점:1&amp;nbsp;},) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;복학키&amp;nbsp;인덱스 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.movie.createIndex(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.movie.createIndex(&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{평점:1,점수:-1}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;다중키&amp;nbsp;인덱스&amp;nbsp;(임베디드&amp;nbsp;도큐먼트) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.movie.createIndex(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.movie.createIndex(&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&quot;리뷰.제목&quot;:1}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;텍스트&amp;nbsp;인덱스가 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.movie.createIndex(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.movie.createIndex(&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{제목:&quot;text&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;해시&amp;nbsp;인덱스 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;db.movie.createIndex(&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.movie.createIndex(&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{배급시&amp;nbsp;:&quot;hashed&quot;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{name:&quot;배급사&amp;nbsp;해시&amp;nbsp;인덱스&quot;}&amp;nbsp;-&amp;gt;&amp;nbsp;인덱스&amp;nbsp;이름&amp;nbsp;설정가능 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TTL&amp;nbsp;인덱스 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;일정&amp;nbsp;시간이&amp;nbsp;지나면&amp;nbsp;자동으로&amp;nbsp;도큐먼트를&amp;nbsp;삭제하도록&amp;nbsp;만들어줌 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;고유&amp;nbsp;인덱스&amp;nbsp;(같은&amp;nbsp;값이&amp;nbsp;저장되는&amp;nbsp;것을&amp;nbsp;방지할&amp;nbsp;수있게&amp;nbsp;도와준다.) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{unique:&amp;nbsp;true} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;인덱스&amp;nbsp;조회&amp;nbsp;및&amp;nbsp;삭제&amp;nbsp;명령 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.collection.getIndexes()&amp;nbsp;컬렉션의&amp;nbsp;모든&amp;nbsp;인덱스를&amp;nbsp;보여준다 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.collection.dropIndex(인덱스&amp;nbsp;설정&amp;nbsp;혹은&amp;nbsp;이름)&amp;nbsp;인덱스&amp;nbsp;삭제 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.collection.dropIndexs()&amp;nbsp;모든&amp;nbsp;인덱스&amp;nbsp;삭제 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;find.explain()&amp;nbsp;어떤&amp;nbsp;과정을&amp;nbsp;거쳐서&amp;nbsp;쿼리가&amp;nbsp;진행되었는지&amp;nbsp;확인&amp;nbsp;가능하다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;만약&amp;nbsp;인덱스가&amp;nbsp;사용되었다면&amp;nbsp;IXSCAN&amp;nbsp;스테이지가&amp;nbsp;포홤된&amp;nbsp;쿼리&amp;nbsp;계획이&amp;nbsp;나타나야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(*파이프라인에서는&amp;nbsp;&lt;a href=&quot;db.rating.explain().aggregate)&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;db.rating.explain().aggregate)&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;모든&amp;nbsp;쿼리를&amp;nbsp;explain으로&amp;nbsp;확인&amp;nbsp;할수&amp;nbsp;없으니&amp;nbsp;프로파일러를&amp;nbsp;통하여&amp;nbsp;확인가능 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.setProfilingLevel(2) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.setProfilingLevel(1,50)&amp;nbsp;50ms&amp;nbsp;이상인&amp;nbsp;작업은&amp;nbsp;모두&amp;nbsp;기록하게&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;현재&amp;nbsp;실행되고&amp;nbsp;있는&amp;nbsp;잠금필드 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.currentOp() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <author>도랜니</author>
      <guid isPermaLink="true">https://torenyground.tistory.com/94</guid>
      <comments>https://torenyground.tistory.com/94#entry94comment</comments>
      <pubDate>Fri, 6 Mar 2020 19:04:57 +0900</pubDate>
    </item>
    <item>
      <title>Design Thinking</title>
      <link>https://torenyground.tistory.com/93</link>
      <description>&lt;p&gt;혁신이란&amp;nbsp;늘&amp;nbsp;한&amp;nbsp;발&amp;nbsp;먼저&amp;nbsp;움직이고&amp;nbsp;빠르게&amp;nbsp;행동&amp;nbsp;할&amp;nbsp;때&amp;nbsp;가능하다. &lt;br /&gt;&lt;br /&gt;기술&amp;nbsp;(&amp;nbsp;구현&amp;nbsp;가능성)&amp;nbsp;사업(시장성)&amp;nbsp;인간적&amp;nbsp;가치(사용성,적합성) &lt;br /&gt;&lt;br /&gt;혁신을&amp;nbsp;원한다면&amp;nbsp;이&amp;nbsp;세가지의&amp;nbsp;균형이&amp;nbsp;중요하다. &lt;br /&gt;&lt;br /&gt;만드는&amp;nbsp;역량보다&amp;nbsp;더&amp;nbsp;중요한&amp;nbsp;것은&amp;nbsp;만들대상이다.&amp;nbsp;사람들이&amp;nbsp;필요로&amp;nbsp;하는&amp;nbsp;부분을&amp;nbsp;만들&amp;nbsp;때&amp;nbsp;지속가능성&amp;nbsp;역시&amp;nbsp;생길&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;사무실에서&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;것은&amp;nbsp;없으니&amp;nbsp;현장으로&amp;nbsp;나가라. &lt;br /&gt;2.&amp;nbsp;고객&amp;nbsp;개발에&amp;nbsp;애자일&amp;nbsp;개발을&amp;nbsp;접목하라. &lt;br /&gt;3.&amp;nbsp;실패는&amp;nbsp;탐색&amp;nbsp;절차의&amp;nbsp;필수적인&amp;nbsp;요소이다. &lt;br /&gt;4.&amp;nbsp;끊임없이&amp;nbsp;반복하고&amp;nbsp;전환하라. &lt;br /&gt;5.&amp;nbsp;고객과&amp;nbsp;만나는&amp;nbsp;순간&amp;nbsp;어떤&amp;nbsp;사업&amp;nbsp;계획도&amp;nbsp;무의미하므로&amp;nbsp;비즈니스&amp;nbsp;모델&amp;nbsp;캔버스를&amp;nbsp;활용하라. &lt;br /&gt;6.&amp;nbsp;가설을&amp;nbsp;검증하고자&amp;nbsp;실험과&amp;nbsp;테스트를&amp;nbsp;설계하라. &lt;br /&gt;7.&amp;nbsp;시장&amp;nbsp;유형에&amp;nbsp;맞춰라,&amp;nbsp;시장&amp;nbsp;유형에&amp;nbsp;따라&amp;nbsp;모든&amp;nbsp;게&amp;nbsp;바뀐다. &lt;br /&gt;8.&amp;nbsp;스타트업은&amp;nbsp;기존&amp;nbsp;기업과&amp;nbsp;다른&amp;nbsp;지표를&amp;nbsp;쓴다. &lt;br /&gt;9.&amp;nbsp;빠른&amp;nbsp;의사&amp;nbsp;결정,&amp;nbsp;순환&amp;nbsp;주기,&amp;nbsp;속도,&amp;nbsp;박자를&amp;nbsp;중시한다. &lt;br /&gt;10.&amp;nbsp;열정이&amp;nbsp;가장&amp;nbsp;중요하다. &lt;br /&gt;11.&amp;nbsp;스타트업의&amp;nbsp;직책은&amp;nbsp;대기업의&amp;nbsp;직책과&amp;nbsp;다르다. &lt;br /&gt;12.&amp;nbsp;필요할&amp;nbsp;때만&amp;nbsp;쓰고&amp;nbsp;아껴라. &lt;br /&gt;13.&amp;nbsp;배운&amp;nbsp;것을&amp;nbsp;소통하고&amp;nbsp;공유하라. &lt;br /&gt;14.&amp;nbsp;성공적인&amp;nbsp;고객&amp;nbsp;개발은&amp;nbsp;합의에서&amp;nbsp;시작한다.&lt;/p&gt;</description>
      <category>Design Thinking</category>
      <author>도랜니</author>
      <guid isPermaLink="true">https://torenyground.tistory.com/93</guid>
      <comments>https://torenyground.tistory.com/93#entry93comment</comments>
      <pubDate>Fri, 6 Mar 2020 17:57:44 +0900</pubDate>
    </item>
    <item>
      <title>마이크로서비스에서 DDD 사용하기</title>
      <link>https://torenyground.tistory.com/92</link>
      <description>&lt;p&gt;&lt;br /&gt;경계된&amp;nbsp;컨텍스트&amp;nbsp;:&amp;nbsp;하나&amp;nbsp;이상의&amp;nbsp;경계된&amp;nbsp;컨텍스트를&amp;nbsp;포함하는&amp;nbsp;마이크로서비스를&amp;nbsp;만들지&amp;nbsp;말아야&amp;nbsp;한다. &lt;br /&gt;전체&amp;nbsp;컨텍스트를&amp;nbsp;하나의&amp;nbsp;마이크로서비스에&amp;nbsp;매핑할&amp;nbsp;수&amp;nbsp;있으면&amp;nbsp;더&amp;nbsp;좋다,&amp;nbsp;이는&amp;nbsp;컨텍스트가&amp;nbsp;실제로&amp;nbsp;경계되어&amp;nbsp;있음을 &lt;br /&gt;나타내는&amp;nbsp;것이다. &lt;br /&gt;&lt;br /&gt;유비쿼터스&amp;nbsp;언어&amp;nbsp;:&amp;nbsp;마이크로서비스가&amp;nbsp;사용하는&amp;nbsp;언어가&amp;nbsp;유비쿼터스&amp;nbsp;언어임을&amp;nbsp;보장해야&amp;nbsp;하므로,&amp;nbsp;노출된&amp;nbsp;오퍼레이션과 &lt;br /&gt;인터페이스는&amp;nbsp;컨텍스트&amp;nbsp;도메인&amp;nbsp;언어로&amp;nbsp;표현된다. &lt;br /&gt;&lt;br /&gt;컨텍스트&amp;nbsp;모델&amp;nbsp;:&amp;nbsp;비록&amp;nbsp;마이크로서비스가&amp;nbsp;제공하는&amp;nbsp;인터페이스에&amp;nbsp;노출되지&amp;nbsp;않는&amp;nbsp;엔티티라&amp;nbsp;하더라도,&amp;nbsp;마이크로서비스가 &lt;br /&gt;사용하는&amp;nbsp;모델은&amp;nbsp;경계된&amp;nbsp;컨텍스트&amp;nbsp;내에서&amp;nbsp;정의되야&amp;nbsp;하고,&amp;nbsp;유비쿼터스&amp;nbsp;언어를&amp;nbsp;사용해야&amp;nbsp;한다. &lt;br /&gt;컨텍스트&amp;nbsp;매핑:&amp;nbsp;마지막으로&amp;nbsp;마이크로서비스의&amp;nbsp;의존성과&amp;nbsp;결합을&amp;nbsp;이해하기&amp;nbsp;위해&amp;nbsp;전체&amp;nbsp;시스템의&amp;nbsp;컨텍스트&amp;nbsp;매핑을&amp;nbsp;검토해야한다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;마이크로서비스는&amp;nbsp;비즈니스&amp;nbsp;역량을&amp;nbsp;중심으로&amp;nbsp;모델링되며,&amp;nbsp;컨텍스트&amp;nbsp;매핑에서&amp;nbsp;보여주는&amp;nbsp;바와&amp;nbsp;같이&amp;nbsp;컨텍스트 &lt;br /&gt;도메인은&amp;nbsp;느슨하게&amp;nbsp;연결되며,&amp;nbsp;경계된&amp;nbsp;컨텍스트로서&amp;nbsp;단일&amp;nbsp;책임을&amp;nbsp;갖게&amp;nbsp;된다. &lt;br /&gt;경계된&amp;nbsp;컨텍스트를&amp;nbsp;구현한&amp;nbsp;마이크로서비스는&amp;nbsp;구현을&amp;nbsp;쉽게&amp;nbsp;은닉할&amp;nbsp;수있으며,&amp;nbsp;자연히&amp;nbsp;격리되므로&amp;nbsp;독립적인&amp;nbsp;배포가&amp;nbsp;가능하다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*&amp;nbsp;실행가능한&amp;nbsp;jar만들기 &lt;br /&gt;&lt;br /&gt;build/plugins&amp;nbsp;태그&amp;nbsp;아래에&amp;nbsp;POM을&amp;nbsp;수정 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;true &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;spring&amp;nbsp;application&amp;nbsp;설정에서&amp;nbsp;값&amp;nbsp;받아오기 &lt;br /&gt;@Value(value&amp;nbsp;=&quot;\${&lt;a href=&quot;service.message.text&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;service.message.text&lt;/a&gt;}&quot;&amp;nbsp;//표현식&amp;nbsp;사용&amp;nbsp;&quot;#{'\${&lt;a href=&quot;service.message.text&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;service.message.text&lt;/a&gt;}'&amp;nbsp;=='advance'}&quot; &lt;br /&gt;사용&amp;nbsp;$text &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;SERVICE.MESSAGE.TEXT=&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SERVICE.MESSAGE.TEXT=&lt;/a&gt;&quot;HELLO&quot; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;json&amp;nbsp; &lt;br /&gt;직렬화&amp;nbsp;‫SimpleObject(&quot;hi&quot;,&quot;kotlin&quot;)&quot;&amp;nbsp; &lt;br /&gt;복잡한&amp;nbsp;직렬화&amp;nbsp;ComplexObject(object1&amp;nbsp;=&amp;nbsp;SimpleObject(&quot;more&quot;,&quot;complex&quot;)) &lt;br /&gt;(data&amp;nbsp;class&amp;nbsp;ComplexObject(var&amp;nbsp;object1&amp;nbsp;:&amp;nbsp;SimpleObject?&amp;nbsp;=null)) &lt;br /&gt;&lt;br /&gt;null&amp;nbsp;값&amp;nbsp;처리&amp;nbsp;어노테이션 &lt;br /&gt;@JsonInclude(Include.NON_NULL) &lt;br /&gt;또는 &lt;br /&gt;spring.jackson.default-property-inclusion&lt;/p&gt;</description>
      <category>Spring</category>
      <author>도랜니</author>
      <guid isPermaLink="true">https://torenyground.tistory.com/92</guid>
      <comments>https://torenyground.tistory.com/92#entry92comment</comments>
      <pubDate>Thu, 5 Mar 2020 11:48:20 +0900</pubDate>
    </item>
  </channel>
</rss>