<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>눈가락★</title>
    <link>https://eyeballs.tistory.com/</link>
    <description>어서오세요. 
시간을 담는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Sun, 28 Jun 2026 18:59:17 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>눈가락</managingEditor>
    <image>
      <title>눈가락★</title>
      <url>https://tistory1.daumcdn.net/tistory/2926090/attach/5f374869e0ea4c3bb9b39f9758d52fd2</url>
      <link>https://eyeballs.tistory.com</link>
    </image>
    <item>
      <title>[English] Nice Expressions from Animal-Crossing</title>
      <link>https://eyeballs.tistory.com/745</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;- We&lt;b&gt; are in it for the long haul&lt;/b&gt;!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Now then&lt;/b&gt;, we will need to&lt;b&gt; look up&lt;/b&gt; your application.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Just follow your &lt;b&gt;instinct&lt;/b&gt; and choose an island with a layout that &lt;b&gt;looks appealing&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I'm sorry, that was just a &lt;b&gt;hypothetical&lt;/b&gt; question.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- The&lt;b&gt; chartered&lt;/b&gt; flight for Deserted Island Gateway Package is ready for boarding.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Any customers waiting to board should &lt;b&gt;make their way to&lt;/b&gt; the gate &lt;b&gt;at this time&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Please&amp;nbsp;&lt;b&gt;make&amp;nbsp;your&amp;nbsp;way&amp;nbsp;to&lt;/b&gt;&amp;nbsp;the&amp;nbsp;meeting&amp;nbsp;room.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Wanna &lt;b&gt;get left behind&lt;/b&gt;?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I will&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;turn it over to&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;you, Mr. Nook.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I will &lt;b&gt;pass&amp;nbsp;it over to&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;you, Mr. Nook.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;First things first&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I think this spot will&lt;b&gt; do the trick&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- A&amp;nbsp;little&amp;nbsp;oil&amp;nbsp;will&amp;nbsp;&lt;b&gt;do&amp;nbsp;the&amp;nbsp;trick&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Just&amp;nbsp;a&amp;nbsp;few&amp;nbsp;minutes&amp;nbsp;of&amp;nbsp;heat&amp;nbsp;will&amp;nbsp;&lt;b&gt;do&amp;nbsp;the&amp;nbsp;trick&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- You can find them &lt;b&gt;scattered about&lt;/b&gt; the island.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Autumn&amp;nbsp;leaves&amp;nbsp;were&lt;b&gt;&amp;nbsp;scattered&amp;nbsp;about&amp;nbsp;&lt;/b&gt;the&amp;nbsp;garden.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;I&amp;nbsp;suspect&lt;/b&gt;&amp;nbsp;they&amp;nbsp;are&amp;nbsp;real&amp;nbsp;apples&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;No way&lt;/b&gt; I'm gonna let you &lt;b&gt;show&lt;/b&gt; me &lt;b&gt;up&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A: I just finished the report &lt;b&gt;ahead of&lt;/b&gt; schedule!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B: Nice, but &lt;b&gt;no way&lt;/b&gt; I'm gonna let you &lt;b&gt;show &lt;/b&gt;me&lt;b&gt; up&lt;/b&gt;. I'll finish mine in ten minutes.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I trust you &lt;b&gt;had some success&lt;/b&gt; &lt;b&gt;foraging for&lt;/b&gt; tree branches?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Allow me to&lt;b&gt; lighten your load&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Our next task is to &lt;b&gt;round up&lt;/b&gt; something to &lt;b&gt;snack on.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- When you &lt;b&gt;come across&lt;/b&gt; &lt;b&gt;someone&lt;/b&gt; in trouble....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Such kindness will surely find its&lt;b&gt; way back to you&lt;/b&gt;!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Sorry to &lt;b&gt;place&lt;/b&gt; &lt;b&gt;such a burden on&lt;/b&gt; &lt;b&gt;you&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;I&amp;rsquo;m sorry to &lt;b&gt;put you through&lt;/b&gt; this trouble/inconvenience/&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;such a terrible experience&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- you will &lt;b&gt;make a donation&lt;/b&gt;?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- we want you to &lt;b&gt;have the honor.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- We'd like you to&lt;b&gt; pick out&lt;/b&gt; the perfect location for the new shop!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- I guess &lt;b&gt;that's it for&lt;/b&gt; my flimsy axe....&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- It's &lt;b&gt;the end of the line for&lt;/b&gt; my trusty flimsy shovel...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span data-copy-service-computed-style=&quot;font-family: sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom-width: 0px; border-bottom-style: none; border-bottom-color: rgb(230, 232, 240);&quot; data-subtree=&quot;aimfl,mfl&quot;&gt;I bet this island is about to become&lt;b&gt; a whole lot livelier&lt;/b&gt;!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom-width: 0px; border-bottom-style: none; border-bottom-color: rgb(230, 232, 240);&quot; data-subtree=&quot;aimfl,mfl&quot;&gt;(lively - livelier - liveliest)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- W&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;e &lt;b&gt;have&lt;/b&gt; &lt;b&gt;got our work cut out&lt;/b&gt; for us if we are going to open by tomorrow&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(have got = have)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I can buy these from you &lt;b&gt;for a total of&lt;/b&gt; 420 Bells.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;At long last&lt;/b&gt;, our museum has opened! &lt;b&gt;This very day&lt;/b&gt;, &lt;b&gt;no less&lt;/b&gt;!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(no less : 다름 아닌!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- An impressive &lt;b&gt;feat&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Finishing the project on time with no budget was&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;an impressive feat&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;The museum is open to the public free of&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;admission&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- You will find there are entrances &lt;b&gt;to&lt;/b&gt; the left, &lt;b&gt;to&lt;/b&gt; the right, and &lt;b&gt;into&lt;/b&gt; the basement.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Each one leads to exhibit rooms &lt;b&gt;wherein&lt;/b&gt; the donations collected&lt;b&gt; thus far&lt;/b&gt; have been &lt;b&gt;put on display&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(wherein : -한 곳에서)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- The donation process has &lt;b&gt;been streamlined&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;- I will happily &lt;b&gt;oblige&lt;/b&gt;!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;By all means&lt;/b&gt;, do please take a look at our magnificent collections. It is surely a thing of wonder.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(By all means : 부디, 아무렴요/그럼요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Can I borrow your pen?&quot; / &quot;By all means.&quot;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- If &lt;b&gt;any happen to&lt;/b&gt; &lt;b&gt;find their way into your possession&lt;/b&gt;, I would be most eager to see them!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(happen to : 우연히 -하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;I &lt;b&gt;happened to&lt;/b&gt; meet an old friend on the street.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;I don't remember buying this book, but it somehow&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;found its way into my possession&lt;/b&gt;. 우연히 갖게 된다는 뉘앙스)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I can &lt;b&gt;assist&lt;/b&gt; you!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;As it happens&lt;/b&gt;, these crop-eating pests use &lt;b&gt;straw-like mouths&lt;/b&gt; to pierce plants and drink the juices.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- The spider&lt;b&gt; is renowned for&lt;/b&gt; having eight eyes and eight legs...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Some will eat creatures &lt;b&gt;several tiems larger than&lt;/b&gt; themselves.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- They have also been known to&lt;b&gt; ambush&lt;/b&gt; their victims, &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;some even &lt;b&gt;chase down&lt;/b&gt; their meals.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- Their long antennae and &lt;b&gt;bulging eyes&lt;/b&gt; &lt;b&gt;turn my stomach&lt;/b&gt;. &lt;b&gt;Unappetizing&lt;/b&gt; indeed..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- what a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;wretched&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;thing...&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- This is making me feel rather&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;woozy&lt;/b&gt;...&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;rest assured&lt;/b&gt; the wretched thing will get the best of care here.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- It &lt;b&gt;looks rather like&lt;/b&gt; the heads of snakes.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;(꽤, 상당히 : &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;It is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;rather&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;cold today&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;차라리 : I &lt;b&gt;would rather&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;stay home&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;than&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;go out.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;-보다, -대신 : I chose the blue one&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;rather than&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;the red one&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- You &lt;b&gt;have&lt;/b&gt; &lt;b&gt;a knack for&lt;/b&gt; finding valuable fossils.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- The cultural development in this island is &lt;b&gt;a worthy endeavor&lt;/b&gt; indeed.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;In the meantime&lt;/b&gt;, I shall &lt;b&gt;return these to&lt;/b&gt; you. Please &lt;b&gt;think on&lt;/b&gt; what I've siad. The museum &lt;b&gt;await&lt;/b&gt;s.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- This &lt;b&gt;is&lt;/b&gt; practically &lt;b&gt;synonymous with&lt;/b&gt; the word &quot;dinosaur&quot; and &lt;b&gt;for good reason&lt;/b&gt;!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I &lt;b&gt;am&lt;/b&gt; just &lt;b&gt;relieved that&lt;/b&gt;&amp;nbsp;I will never have to escape one.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- whether they are &lt;b&gt;impulse snaps&lt;/b&gt; or brilliant &lt;b&gt;compositions&lt;/b&gt;!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;I'm more of&lt;/b&gt; a dogfish person...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;I'm more of&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;a tea person&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;than a coffee person.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- They are &lt;b&gt;all about&lt;/b&gt; &lt;b&gt;getting &lt;/b&gt;emotions &lt;b&gt;across&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;The teacher used pictures to get the idea across.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- We've been here for a little while, and it's really starting to &lt;b&gt;come along&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;My English skills are&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;coming along&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;nicely.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;We are just overwhelmed that&lt;/b&gt; you even thought to come visit us!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Something tells me that&lt;/b&gt; today is your lucky day.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;My gut tells me that&lt;/b&gt; today is your lucky day.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;I have a feeling that&lt;/b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;today is your lucky day.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- How about if I stop by&lt;b&gt; every so often&lt;/b&gt; to sell some of our wares?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- In the black cabinet, with the tools and other &lt;b&gt;miscellaneous goods.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- With our new shop come three new services!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I've heard the turnip market is about to &lt;b&gt;take off&lt;/b&gt; here on the island.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- We will buy any turnips you have &lt;b&gt;on hand&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ...And &lt;b&gt;I think that wraps it up&lt;/b&gt;!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Sorry, that explanation &lt;b&gt;went on&lt;/b&gt; for a bit.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- You can use a slingshot to &lt;b&gt;knock&lt;/b&gt; items out of the sky.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- You never know when you might want to &lt;b&gt;bring something down&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;May as well&lt;/b&gt; you &lt;b&gt;carry one around with you&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ..But your first time is special! Enjoy these miles, &lt;b&gt;courtesy of&lt;/b&gt; Nook Inc!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I'm sorry to &lt;b&gt;put you on hold&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Could you please &lt;b&gt;hold&lt;/b&gt; for a moment?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- &lt;b&gt;For some time now&lt;/b&gt; I &lt;b&gt;have been&lt;/b&gt; advertising the gateway pakcage...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(For some time now = &lt;span data-copy-service-computed-style=&quot;font-family: sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom-width: 0px; border-bottom-style: none; border-bottom-color: rgb(230, 232, 240);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;For a while now, &lt;/span&gt;&lt;span data-copy-service-computed-style=&quot;font-family: sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom-width: 0px; border-bottom-style: none; border-bottom-color: rgb(230, 232, 240);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;Lately, Recently)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- And wouldn't you know, &lt;b&gt;out of the blue&lt;/b&gt; we have 3 interested parties!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- None of our applicants &lt;b&gt;are too fond of the notion of&lt;/b&gt; sleeping in tents, &lt;b&gt;you see&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I'm afraid I&lt;b&gt; got caught up in the excitement of&lt;/b&gt; persuading them to move here.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;b&gt; In my hour of need... &lt;/b&gt;It &lt;b&gt;most certainly&lt;/b&gt; must be fate.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;As if I have a choice&lt;/b&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;As if I have any other choice&lt;/b&gt;...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- With zero-interest financing and an extremely &lt;b&gt;lax repayment plan&lt;/b&gt;, anything is possible!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Now, &lt;b&gt;regarding&lt;/b&gt; the&lt;b&gt; aformentioned&lt;/b&gt; research...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I &lt;b&gt;fervently&lt;/b&gt; hope you will donate your precious finds &lt;b&gt;to the cause&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- It seems to&lt;b&gt; have specialized in&lt;/b&gt; eating plants &lt;b&gt;up high&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- It &lt;b&gt;likely&lt;/b&gt; needed to eat more or less every walking hour.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I'd &lt;b&gt;pay&lt;/b&gt; him&lt;b&gt; a visit&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I bet you&lt;b&gt; were up to your ear&lt;/b&gt; holes in weeds when you first arrived.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I can't say &lt;b&gt;I have much in the way of news&lt;/b&gt; to report to you today.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;There wasn't&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;much in the way of&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;entertainment at the party.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;She doesn't have&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;much in the way of&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;experience.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Now, &lt;b&gt;where to begin&lt;/b&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Makes it pretty easy to identify your &lt;b&gt;blurry silhouette&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I haven't gotten a &lt;b&gt;reception&lt;/b&gt; this sweet and &lt;b&gt;bubbly.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I will &lt;b&gt;leave the searching to you&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- The pieces are &lt;b&gt;crammed&lt;/b&gt; back in here.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;My closet is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;crammed&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;with old clothes.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;The subway was&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;crammed&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;with commuters.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I promise to &lt;b&gt;return the favor&lt;/b&gt;!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- No one knows who sends the gifts &lt;b&gt;attached to&lt;/b&gt; balloons to our island.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- I was cleanin' my house and found this old DIY recipe &lt;b&gt;I'd thought up&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;She&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;thought up&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;a brilliant plan to save money.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- No need to &lt;b&gt;pull them&lt;/b&gt; all &lt;b&gt;out&lt;/b&gt;!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- It has hooks on its feet that help it to &lt;b&gt;cling&lt;/b&gt; tightly &lt;b&gt;to&lt;/b&gt; trees.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- If you ask me, this is &lt;b&gt;an insult to&lt;/b&gt; violins!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- The information in your Passport app can be used to&lt;b&gt; spur&lt;/b&gt; conversation, so please &lt;b&gt;make full use of it&lt;/b&gt;!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;A cup of coffee usually helps&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;spur&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;my creativity.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Fireflies &lt;b&gt;light up&lt;/b&gt; the night sky, &lt;b&gt;taking my mind off the stresses&lt;/b&gt; of the day.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>English</category>
      <author>눈가락</author>
      <guid isPermaLink="true">https://eyeballs.tistory.com/745</guid>
      <comments>https://eyeballs.tistory.com/745#entry745comment</comments>
      <pubDate>Fri, 22 May 2026 16:33:24 +0900</pubDate>
    </item>
    <item>
      <title>[IT] dbt 공부</title>
      <link>https://eyeballs.tistory.com/744</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/david-changwoolee/data-modeling-project&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;dbt 실습 repo&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; dbt 란 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL 기반 데이터 변환 도구.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ETL 의 Transformation 을 담당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt 로 만들어진 (데이터 처리를 위한) SQL은 재사용이 가능하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;dependency 관리가 수월&lt;/b&gt;하다는 것이 큰 장점임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;또한 dbt 는 테스트 기능 역시 제공하며&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서화 및 배포까지 도와줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt 는 데이터 모델링 작업을 위한 데이터 처리를 하는 데 많이 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; dbt 알아야 하는 개념들 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;//model&lt;/li&gt;
&lt;li&gt;//ref()&lt;/li&gt;
&lt;li&gt;//source()&lt;/li&gt;
&lt;li&gt;//source freshness&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;//incremental model, table, view&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;//materialized : table, view&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;//macro&lt;/li&gt;
&lt;li&gt;//jinja&lt;/li&gt;
&lt;li&gt;//snapshot&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;//seed&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;dependency. dag graph 를 본다는 의미&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;test - schema test, singular test, custom test, whatnot&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;dbt core - 오픈소스, CLI 기반, 로컬 개발&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;dbt cloud - SaaS, UI 제공, 스케줄링, 협업 기능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;1.&amp;nbsp;Incremental&lt;br /&gt;2.&amp;nbsp;Snapshot&lt;br /&gt;3.&amp;nbsp;Test&lt;br /&gt;4.&amp;nbsp;Airflow&amp;nbsp;+&amp;nbsp;dbt&amp;nbsp;운영&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 jinja 에 대해 알아보자&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt 에서 자주 사용하는 sql 언어 포맷임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;jinja&lt;/b&gt; 는&lt;b&gt; SQL 을 동적으로 생성하기 위한 템플릿 언어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt 가 Jinja를 만나서 jinja 를 실행하면 : select * from&amp;nbsp;&lt;b&gt;{{&amp;nbsp;ref('stg_orders')&amp;nbsp;}}&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr;&lt;br /&gt;jinja 위치에 실제 SQL 이 생성되어 교체됨 : select * from&amp;nbsp;&lt;b&gt;analytics.stg_orders&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr;&lt;br /&gt;그리고 warehouse 에서 실제 SQL이 실행됨(warehouse 는 jinja 해석 못 함. jinja 는 dbt 를 위한 것임)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. {{}} : 표현식. 값을 출력할 때 사용함. {{}} 위치에 정해진 값이 변환되어 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- {{ ref('stg_orders') }} 는 -&amp;gt; analytics.stg_orders 로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- {{ target.schema }} 는 &amp;nbsp;-&amp;gt; analytics_dev 로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- {{ target.name }} 은 -&amp;gt; dev 혹은 prod 로 변환됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;target.schema, target.name 은 profiles.yml&amp;nbsp;에 설정된 값을 가져오는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, dbt_project.yml 에 직접 넣은 값을 아래처럼 읽어올 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 dbt_project.yml 에 아래 부분이 포함되어있다고 하자&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;vars:&lt;br /&gt;&amp;nbsp; country: CA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델.sql 내에서 다음과 같이 불러올 수 있음&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;select&amp;nbsp;*&lt;br /&gt;from&amp;nbsp;customers&lt;br /&gt;&lt;br /&gt;where&amp;nbsp;country='&lt;b&gt;{{&amp;nbsp;var(&quot;country&quot;)&amp;nbsp;}}&lt;/b&gt;'&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. {% %} : 제어문. 조건문, 반복문 등에 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;jinja가 포함된 쿼리문&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;dbt 가 jinja 를 처리한 이후 쿼리문&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot; rowspan=&quot;2&quot;&gt;select *&lt;br /&gt;from orders&lt;br /&gt;&lt;b&gt;{% if target.name == 'prod' %}&lt;/b&gt;&lt;br /&gt;&lt;b&gt;where is_deleted = false&lt;/b&gt;&lt;br /&gt;&lt;b&gt;{%&amp;nbsp;endif&amp;nbsp;%}&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&amp;lt; prod 환경일 때, where 문이 존재함 &amp;gt;&lt;br /&gt;select *&lt;br /&gt;from orders&lt;br /&gt;where is_deleted = false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&amp;lt; dev 환경일 때, where 문이 없음 &amp;gt;&lt;br /&gt;select *&lt;br /&gt;from orders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;{%&amp;nbsp;set&amp;nbsp;&lt;/b&gt;cols&amp;nbsp;=&amp;nbsp;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'col1',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'col2',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'col3',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'col4'&lt;br /&gt;]&amp;nbsp;&lt;b&gt;%}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;select&lt;br /&gt;{% for col in cols %}&lt;br /&gt;cast({{ col }} as string)&lt;br /&gt;&lt;b&gt;{% if not loop.last %} , {% endif %}&lt;/b&gt;&lt;br /&gt;{% endfor %}&lt;br /&gt;from&amp;nbsp;orders&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;select&lt;br /&gt;cast(col1&amp;nbsp;as&amp;nbsp;string),&lt;br /&gt;cast(col2&amp;nbsp;as&amp;nbsp;string),&lt;br /&gt;cast(col3&amp;nbsp;as&amp;nbsp;string),&lt;br /&gt;cast(col4&amp;nbsp;as&amp;nbsp;string)&lt;br /&gt;from&amp;nbsp;orders&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{% set myval = 100 %} 이런식으로 set 을 사용하여 변수를 생성할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성한 변수는 where amount &amp;gt; {{ myval }} 처럼 불러와서 사용함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{% if not loop.last %}&lt;span&gt;&amp;nbsp;&lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;{% endif %} : 반복문 마지막이 아니라면, ' , ' 를 추가함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. {# #} : 주석&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, {# this is a comment #} 는 컴파일할 때 무시됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jinja 를 이용하여 만들어진 모델.sql 의 실제 SQL 문을 보고싶을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt compile 을 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; dbt project 디렉토리 구조 gi&amp;gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;dbt_project/&lt;br /&gt;├──&amp;nbsp;models/&lt;br /&gt;│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;staging/&lt;br /&gt;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;├── stg_****.sql&lt;br /&gt;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;├── sources.yml&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;└──&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;schema.yml &amp;nbsp;&lt;br /&gt;│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;intermediate/&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;├── int_****.sql&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;└──&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;schema.yml &amp;nbsp;&lt;br /&gt;│&amp;nbsp;&amp;nbsp;&amp;nbsp;└── marts/&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;├── fact_****.sql&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;├── dim_****.sql&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;└──&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;schema.yml &amp;nbsp;&lt;br /&gt;│&lt;br /&gt;├──&amp;nbsp;seeds/&lt;br /&gt;├──&amp;nbsp;snapshots/&lt;br /&gt;├──&amp;nbsp;macros/&lt;br /&gt;├──&amp;nbsp;tests/&lt;br /&gt;├──&amp;nbsp;analyses/&lt;br /&gt;├──&amp;nbsp;snapshots/&lt;br /&gt;│&lt;br /&gt;├──&amp;nbsp;dbt_project.yml&lt;br /&gt;├──&amp;nbsp;packages.yml&lt;br /&gt;└──&amp;nbsp;profiles.yml&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; models &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt 는 주로 &lt;b&gt;raw 데이터&lt;/b&gt;를 &lt;b&gt;staging 에 적재&lt;/b&gt;하고, &lt;b&gt;intermediate, marts&lt;/b&gt; &lt;b&gt;과정&lt;/b&gt;을 거쳐 데이터를 처리하게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 차원 모델링이나 메달리온 아키텍처와도 연관됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;models 내에 transformation 작업을 진행하는 SQL 이 들어있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;models 내에 &lt;b&gt;SQL 파일들이 실행&lt;/b&gt;되면 나중에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;table 이 되거나&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;view 가 되거나&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;incremental table 이 됨&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이들의 관계를 기반으로 dbt 가 알아서 dependency graph 를 그린다고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;models/staging 단계&lt;/b&gt;에서는 최소한의 transformation 작업이 진행됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 컬럼명 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 타입 정리(캐스팅)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- null 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원본 데이터를 최대한 파괴하지 않는 선에서 작업 진행. lake 로 사용할 수 있도록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;models/intermediate 단계&lt;/b&gt;에서는&lt;span&gt; 복잡한 transformation 을 분리하는 작업이&lt;/span&gt;&amp;nbsp;진행됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말 그대로 중간 계산 과정을 만드는 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- join&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- aggregation&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- business logic&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- reusable logic&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등의 처리를 진행하게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;customer_id,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count(*)&amp;nbsp;as&amp;nbsp;total_orders,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sum(amount)&amp;nbsp;as&amp;nbsp;lifetime_value&lt;br /&gt;from&amp;nbsp;{{&amp;nbsp;ref('stg_orders')&amp;nbsp;}}&lt;br /&gt;group&amp;nbsp;by&amp;nbsp;1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 처리를 위해 &lt;b&gt;엄청 복잡하고 방대한 SQL 이 실행되어야 하는 경우&lt;/b&gt;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이걸 한 번에 다 처리하면 디버깅하기도 어렵고 재사용하기도 어렵고 이해하기도 어려움&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;b&gt;intermediate 과정을 중간에 넣어서, 중간 생산물들을 처리&lt;/b&gt;하도록 하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나중에 최종 테이블 만들기 위한 transformation 작업이 복잡해지지 않고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간결과물 재사용도 가능하도록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;models/marts 단계&lt;/b&gt;에서는 최종 비즈니스 테이블을 만드는 작업이 진행됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기 만들어진 테이블은 BI, analytics teams 가 보고 비즈니스 결정하는 데 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차원모델링의 최종 결과 테이블들(fact, dim tables)이 이 단계에서 생성됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이, 도메인별로 각기 다른 차원 테이블들을 만들어주면 도메인별로 분석하기가 편해짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀 단위의 ownership 을 구분하고 결정하기도 쉬워짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;models/&lt;br /&gt;└──&amp;nbsp;marts/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;finance/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;fct_payments.sql&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;dim_customers.sql&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;marketing/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;fct_campaigns.sql&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;dim_channels.sql&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 models 의 전체적인 flow 를 보면 아래와 같게 됨&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;raw_orders&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr;&lt;br /&gt;stg_orders&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr;&lt;br /&gt;int_customer_orders&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr;&lt;br /&gt;fct_customer_revenue&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt run 하면 dbt 가 위와 같은 dependency graph 를 자동으로 생성해서 처리한다고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(=stage 건너뛰고 marts 먼저 만드는 등 순서를 뒤죽박죽 섞어서 실행하지 않는다는 말)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 models 마다 존재하는 schema.yml 은 뭐냐?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;shecma.yml 은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;test 를 정의&lt;/b&gt;하는 역할&lt;br /&gt;- &lt;b&gt;documentation&lt;/b&gt; &lt;b&gt;만드는&lt;/b&gt; 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;- &lt;b&gt;column 을 설명&lt;/b&gt;하는 역할&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 schema.yml 이 있다고 해보자&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;version:&amp;nbsp;2&lt;br /&gt;&lt;br /&gt;models:&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;stg_orders&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;columns:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;order_id&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tests:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;not_null&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;unique&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;models.columns.tests 항목을 통해, 해당 컬럼의 test 를 설정할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 null 이 존재하는지 확인하는 not_null,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복이 없는지 확인하는 unique 등등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; macros &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재사용 가능한&lt;b&gt; SQL 함수&lt;/b&gt;를 정의해 두는 곳&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말 그대로, &lt;b&gt;진짜 함수(파라미터 받아서 결과 반환하는)를 만들어 두는 곳&lt;/b&gt;임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 아래와 같은 macro(generate_surrogate_key.sql)가 존재하고 내용도 아래와 같다고 하자&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;macros/&lt;br /&gt;└──&amp;nbsp;generate_surrogate_key.sql&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;{%&amp;nbsp;macro&amp;nbsp;&lt;b&gt;cents_to_dollars&lt;/b&gt;(&lt;b&gt;column_name&lt;/b&gt;)&amp;nbsp;%}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{{&amp;nbsp;column_name&amp;nbsp;}}&amp;nbsp;/&amp;nbsp;100.0&lt;br /&gt;{%&amp;nbsp;endmacro&amp;nbsp;%}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 이름은 cents_to_dollars&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 파라미터는 column_name&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 models 내 SQL에서 불러 사용할 수 있음&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;{{&amp;nbsp;cents_to_dollars('amount')&amp;nbsp;}}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 macro 를 사용해야 하나?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 &lt;b&gt;코드 중복을 제거&lt;/b&gt;해줄 수 있기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 코드를 다양한 곳에서 똑같이 쓸 필요가 없고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 macro 하나만 수정하면 나머지에 전부 적용되기 때문에 관리하기도 편함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; dbt_project.yml &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일 내부에는 프로젝트의 핵심 설정 파일이 들어있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;dbt 프로젝트 전체의 동작 방식을 정의&lt;/b&gt;하는 중앙 설정 파일임.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(&lt;span&gt;Docker Compose의 docker-compose.yml 같은 거라고 보면 된대!)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 내가 아래와 같은 sql 을 만들고 dbt run 을 하면&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;models/staging/stg_orders.sql&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;select * from raw.orders&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt 는 이 sql 을 실행하기 위해 갖가지 정보가 필요함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 테이블 어디에 만들지?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- view 로 만들어야 하나? table 로 만들어야 하나? 아니면 incremental?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 어떤 schema 에 만들지?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 어떤 db 에 만들지? 등등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 정보들을 제공하는 곳이 바로 dbt_project.yml 임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt_project.yml 파트별로 예를 들어봄&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;name: my_project&lt;br /&gt;version:&amp;nbsp;'1.0'&lt;br /&gt;config-version:&amp;nbsp;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;name 은 dbt 프로젝트의 이름임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt init my_project 명령어를 실행해서 만들어졌을 것임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;version 은 프로젝트의 버전. CI/CD 에서 사용된다고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;config-version 은 설정파일 포맷 버전인데, 2로 고정됨. 왜 넣는지는 모르겠음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;model-paths:&amp;nbsp;[&quot;models&quot;]&lt;br /&gt;seed-paths:&amp;nbsp;[&quot;seeds&quot;]&lt;br /&gt;snapshot-paths:&amp;nbsp;[&quot;snapshots&quot;]&lt;br /&gt;macro-paths:&amp;nbsp;[&quot;macros&quot;]&lt;br /&gt;test-paths:&amp;nbsp;[&quot;tests&quot;]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 config 를 줬기 때문에 dbt 가 어느 디렉터리에서 정보를 가져가야 할 지 알게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를테면, model-path: [&quot;models&quot;] 로 설정된 부분으로 인해, dbt 는 &quot;model 들은 'models' 디렉터리 안에 있구나&quot; 라고 인식함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;models:&lt;br /&gt;&amp;nbsp;&amp;nbsp;my_project:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;staging:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+materialized:&amp;nbsp;view&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+schema:&amp;nbsp;staging&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intermediate:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+materialized:&amp;nbsp;ephemeral&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;marts:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+materialized:&amp;nbsp;table&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+schema:&amp;nbsp;marts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 config 의 'models'는 'model 에 대한 설정'을 의미함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;models 이하에 나오는 config 를 통해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 models(SQL 파일들)을 어떻게 처리해야 할 지 알 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;my_project 는 프로젝트 이름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 name: my_project 와 연결됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(프로젝트 이름을 굳이 다시 넣었다는 말은.. dbt_project.yml 내에 여러 프로젝트의 config 가 들어갈 수 있다는 말인가?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;materialized 가 뭐하는거야?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL 결과를 warehouse 에 어떤 형태로 저장할지 결정하는 부분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL 을 실행한 후 결과를 table 로 만들 수 있고, view 로 만들 수 있고, 혹은 incremental table 로 만들 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 보면, 각각의 SQL 파일들마다 materialized 가 있는게 아니고, 각 단계(staging, intermediate, marts)마다 materialized 가 존재함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, materialized 는 하나의 단계 전체적으로 적용된다고 볼 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 각 테이블마다 각기 다른 materialized 를 적용하고 싶다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 SQL 파일 내에 {{ config(materialized='table') }} 처럼 적용하면 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 적용된 설정은, dbt_project.yml 에 설정된 materialized 보다 우선시됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 materialized 는 dbt_project.yml 단위로 설정함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐면 각 단계가 공통의 특징을 따르기 때문에.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 dbt 의 기본 materialized 값은 view 임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;model 내에 설정 &amp;gt; dbt_project.yml 내에 설정 &amp;gt; default(view)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+materialized : view&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 view 는 실제 데이터를 저장하지 않는 가상 테이블임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;create view 명령어 실행되어 생성되는 뷰 그거 맞음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;query 실행되는 런타임마다 그때 그때 계산되어 생성 및 사용되기 때문에, 항상 최신 데이터를 갖고 있음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 매 런타임마다 계산되기 때문에, &lt;b&gt;select 퍼포먼스가 느림&lt;/b&gt;&lt;br /&gt;실제 테이블을 만들지 않기 때문에 &lt;b&gt;차지하는 storage 적음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심지어 view 는 BI tool 에서도 접근이 가능함. &lt;b&gt;BI tool 이 view 테이블에 접근할 때마다 view 쿼리를 계속 재실행한다는 말이지.....&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;view 는 staging 처리할 때 자주 사용된다고 하는데.. 그 이유가, 굳이 물리적인 테이블을 만들 필요가 없어서..?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;staging 을 위한 sql 이 비용이 적은 이유(타입 캐스팅 혹은 컬럼명 변경 등)는 알겠어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 view 처럼 런타임에 실행해도 무리가 없다는 거지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 staging 은 ground truth 역할(lake 마냥)을 해야하기 때문에 무조건 물리적인 테이블로 만들어둬야 하지 않나?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+materialized : table&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 table 은 실제 데이터를 저장하는 물리적인 테이블을 의미함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 storage 용량을 차지하며 생성될 때 갖고있는 데이터를 그대로 보관하게 되며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 view 와 달리 select 실행시 재계산을 하지 않아도 되기 때문에 select 퍼포먼스가 빠름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 incremental 과의 차이점은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+materialized : incremental&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경분만 table 에 업데이트 함. hudi 의 upsert 와 같은 느낌인거지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 기존 테이블이 없으면 새로운 table 을 만들고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 테이블에 데이터가 없으면 새로 데이터를 추가하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 테이블에 데이터가 있으면 변경된 부분만 업데이트 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;incremental 이 적용되는 model 쿼리를 한 번 보자&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;select&amp;nbsp;*&lt;br /&gt;from&amp;nbsp;orders&lt;br /&gt;where&amp;nbsp;updated_at&amp;nbsp;&amp;gt;&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select&amp;nbsp;max(updated_at)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from&amp;nbsp;{{&amp;nbsp;this&amp;nbsp;}}&lt;br /&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 {{ this }} 를 통해 자기 자신 테이블에서 최신 날짜만 가져온 후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최신 날짜 이후로 들어온 데이터만 추출해서 incremental 로 업데이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+materialized : ephemeral&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 table이나 view 는 생성하지 않지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL 내부에 inline 된다고....(????)&lt;br /&gt;ephemeral 로 설정된 model SQL 을 실행해도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;warehouse 내에 object 를 생성하지 않음(그건 view 도 마찬가지잖아?-&amp;gt; 개발자 입장에서는 view 도 object를 만들지 않는것 처럼 보이는데, 실제로 warehouse 입장에서는 object 처럼 보인다고 함. 그래서 select * from my_view 같이 from 에 view 를 넣은 쿼리가 가능함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다르게 말하면, ephemeral 로 만들어진 결과는 from 를 통해 불러올 수 없음(view는 이게 가능함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ephemeral 로 설정된 model SQL 은 downstream SQL 에서 CTE 처럼 삽입된다고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예제에서 intermediate 부분에 ephemeral 이 설정되어있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;marts 에 table 이 설정되어 있잖아&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;intermediate 및 marts SQL model 이 아래와 같다고 하자&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;--&amp;nbsp;&lt;b&gt;int_orders.sql&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;select&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;customer_id,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sum(amount)&amp;nbsp;as&amp;nbsp;total_amount&lt;br /&gt;from&amp;nbsp;{{&amp;nbsp;ref('stg_orders')&amp;nbsp;}}&lt;br /&gt;group&amp;nbsp;by&amp;nbsp;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;--&amp;nbsp;fct_customer_revenue.sql&lt;br /&gt;&lt;br /&gt;select&amp;nbsp;*&lt;br /&gt;from&amp;nbsp;&lt;b&gt;{{&amp;nbsp;ref('int_orders')&amp;nbsp;}}&lt;/b&gt;&lt;br /&gt;where&amp;nbsp;total_amount&amp;nbsp;&amp;gt;&amp;nbsp;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 실행시키면, ephemeral 로 설정된 int_orders 의 쿼리가 fct_customer_revenue 쿼리 안으로 쏙 들어감&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;select&amp;nbsp;*&lt;br /&gt;from&amp;nbsp;&lt;b&gt;(&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;customer_id,&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sum(amount)&amp;nbsp;as&amp;nbsp;total_amount&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from&amp;nbsp;stg_orders&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;group&amp;nbsp;by&amp;nbsp;1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;)&lt;/b&gt;&amp;nbsp;as&amp;nbsp;int_orders&lt;br /&gt;where&amp;nbsp;total_amount&amp;nbsp;&amp;gt;&amp;nbsp;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 보고 inline 이 된다고 한 거임....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;view 랑 ephemeral 의 차이는 알았는데, 그럼 각각은 무슨 장단점이 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- view 는 warehouse 에서 조회가능한 object를 주르륵 만들기 때문에, 여러개의 view 를 만들면 지저분해질 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ephemeral 은 지저분하지 않음(....이게 장점인가?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;ephemeral 은 object 생성이 어려우니 디버깅하기가 어려움.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, view 처럼 select 해서 직접 값을 볼 수 없으니 ephemeral 로직이 잘 실행되었는지 아닌지 몰라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;ephemeral 을 사용&lt;/b&gt;하면 &lt;b&gt;하나의 큰 nested sql 이 생성&lt;/b&gt;됨. 한 번에 큰 계산을 하게되는 상황이 발생할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- downstream 에서 동일한 ephemeral 을 여러번 사용하면, 중복 계산이 되기 때문에 퍼포먼스가 좋지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 ephemeral 은 언제 쓰는거야?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;warehouse object 를 만들 가치가 없는 경우에 쓴다고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;warehouse 안에 독립된 객체(table,view 등)으로 보관할 필요가 없을 때 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;table, view 등의 객체는 select 로 조회가 가능하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BI tool 에서 접근도 가능하고, 디버깅 대상으로 중요함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ephemeral 은 downstream 에 필요한 작은 조치를 취하는 쿼리를 시랳ㅇ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 phone 넘버에서 '-' 를 제거하는 쿼리나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kg을 g으로 변환하는 쿼리 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 구우우욷이 warehouse 에 객체로 남기지 않아도 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select 로 접근할 필요가 없고 디버깅 할 필요도 없기 때문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; seeds &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이곳에 &lt;b&gt;csv 파일&lt;/b&gt;을 넣어두면, &lt;b&gt;dbt 가 warehouse 에 자동으로 upload&lt;/b&gt; 한다고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작은 reference table 을 만드는 용도&lt;/b&gt;로 사용한다고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 아래와 같은 csv 를 파일을 넣어두면....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;country_codes.csv&lt;br /&gt;currency_codes.csv&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무슨 일이 벌어지지? 어느 db 에 만드는거야? 함부로 table 만드는 권한은 어떻게 갖고있는거지?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; tests &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;custom test 를 저장&lt;/b&gt;하는 곳&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 아래와 같이 내가 원하는 테스트를 만들어 넣음&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;tests/&lt;br /&gt;└──&amp;nbsp;assert_positive_revenue.sql&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;select&amp;nbsp;*&lt;br /&gt;from&amp;nbsp;{{&amp;nbsp;ref('fct_orders')&amp;nbsp;}}&lt;br /&gt;where&amp;nbsp;revenue&amp;nbsp;&amp;lt;&amp;nbsp;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과가 나타난다면, 실패하는 거임...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * 의 결과가 나타나지 말아야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ref('fct_orders') 는 fact table 대상으로 테스트를 진행한다는 말이 될 것 같음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 여기 tests 디렉터리 내에 있는 테스트와, schema.yml 내에 있는 테스트의 차이는?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt; snapshots &amp;gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;변경 이력 추적용이라는데 뭔 소린지 모르겠음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;lt; analyses &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ad-hoc SQL 을 저장하는 곳이라는데 뭔 소린지 모르겠음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; ref() &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 계속 봐왔겠지만, ref() 는 다른 모델의 객체(table, view) 를 가져오는 역할을 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ref() 덕분에 데이터 모델 간 의존성(dependency)가 정의될 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가령, 아래와 같은 모델이 있다고 하자&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;fct_orders.sql&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;select&amp;nbsp;*&lt;br /&gt;from&amp;nbsp;&lt;b&gt;{{&amp;nbsp;ref('stg_orders')&amp;nbsp;}}&lt;/b&gt;&lt;br /&gt;where&amp;nbsp;amount&amp;nbsp;&amp;gt;&amp;nbsp;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 {{ ref('stg_orders') }} 의 의미는, &quot;stg_orders 모델의 결과(stg_orders.sql 의 결과)를 참조&quot; 임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 fct_orders.sql 이 실행될 때, {{ ref('stg_orders') }} 위치에 stg_orders 의 결과(db.table) 로 치환됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를테면 &quot;select * from sales_dev.stg_orders where amount &amp;gt; 0&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구체적으로 아래 단계를 따라서 ref() 가 실행됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- dbt 가 ref('stg_orders') 발견&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- stg_orders 모델이 존재하는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- dependency 에 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실제 relation 이름을 계산 (여기서 relation 이름은, stg_orders.sql 실행 결과의 db.schema.table 이름)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- fct_orders.sql 의 from 에 위치한 ref() 를 relation 이름을 치환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stg_orders.sql 에 업데이트가 발생해도 위 fct_orders.sql 은 그대로 stg_orders 의 결과를 참조함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가령 stg_orders.sql 의 결과 테이블 db 가 sales_dev 에서 sales_prod 로 바뀌어도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 fct_orders.sql 은 영향이 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;b&gt;ref() 를 사용하는 더 중요한 이유&lt;/b&gt;, &lt;b&gt;바로 dependency graph 를 생성&lt;/b&gt;한다는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt 는 ref() 로 연결된 모델sql들을 보고 dependency graph 를 만듦&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 맞춰 실행할 순서를 정함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 dependency graph 가 없으면, dbt 는 어떤 모델sql 을 먼저 실행해야할지 모르게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt run 실행시 아래와 같은 select 사용이 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. dbt run --select fct_customer_revenue&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. dbt run --select +fct_customer_revenue&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. dbt run --select fct_customer_revenue+&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제 DAG 하나를 기준으로 이해해보자&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;raw.orders&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr;&lt;br /&gt;stg_orders&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr;&lt;br /&gt;int_customer_orders&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr;&lt;br /&gt;&lt;b&gt;fct_customer_revenue&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr;&lt;br /&gt;customer_dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. dbt run --select fct_customer_revenue&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select 된 fct_customer_revenue 하나만 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, fct_customer_revenue 모델 sql 을 실행한다는 의미.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fct_customer_revenue 실행에 필요한 부분(upstream) stg_orders, int_customer_orders 는 이미 warehouse 존재해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐면 dbt 는 upstream 을 자동으로 실행하지 않기 때문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. dbt run --select +fct_customer_revenue&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select 된 fct_customer_revenue 를 upstream 포함하여 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, stg_orders, int_customer_orders, fct_customer_revenue 모델 sql 을 모두 실행한다는 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. dbt run --select fct_customer_revenue+&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select 된 fct_customer_revenue 과 그 이후의 downstream 을 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, fct_customer_revenue, customer_dashboard 모델 sql 을 실행한다는 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간 모델을 수정했을 때, 이후 모델들까지 수정분을 적용할 때 사용되는 명령어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 +fct_customer_revenue+ 도 많이 사용한다고 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 다른 모델은 건들지 않고 해당 stream 만 실행하고싶을 때 사용하는 명령어인 듯...?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헷갈릴 수 있는 부분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- dependency graph : 누가 누구에게 의존하는지 표현하는 그래프&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- lineage : 데이터가 어디서 와서 어디로 흘러가는가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 실무에서는 결국 둘이 동일한 dag 화면을 본다고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; source.yml &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 파일 내 staging 부분에 sources.yml(혹은 source.yml) 이 존재함&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;models/&lt;br /&gt;├──&amp;nbsp;staging/&lt;br /&gt;&lt;b&gt;│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;sources.yml&lt;/b&gt;&lt;br /&gt;│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;stg_orders.sql&lt;br /&gt;│&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;stg_customers.sql&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일은 &quot;dbt 프로젝트의 최초 입력 데이터(input)를 정의&quot;하는 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 데이터라고 해서 s3 나 local 의 csv, json, txt 등을 의미하는 건 아님&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt 가 아닌 다른 프로그램(spark, kafka 등)에 의해 생성되어 warehouse 내에 테이블로 저장된 데이터를 의미함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(dbt 는 warehouse 내 테이블 데이터를 가공하는 역할이기 때문에 s3, local 에서 데이터를 가져오지 않음....)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sources.yml 이 아래처럼 생겼다고 하자&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;version:&amp;nbsp;2&lt;br /&gt;&lt;br /&gt;sources:&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&amp;nbsp;- name:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;raw&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;database:&amp;nbsp;analytics&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;schema: raw&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tables:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;orders&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; columns:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - name: order_id&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;description: Unique order identifier&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tests:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- not_null&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- unique&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - name: price&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;description: price for order&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - name: customers&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; loaded_at_field: updated_at&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; freshness:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; warn_after:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; count: 1&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; period: hour&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; error_after:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; count: 4&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; period: hour&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;version:&amp;nbsp;2&lt;br /&gt;&lt;br /&gt;sources:&lt;br /&gt;&amp;nbsp;&amp;nbsp;- name: raw&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;description: Raw operational data&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;database: analytics&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;schema: raw&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tables:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- name: orders&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;description: Customer orders&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loaded_at_field: updated_at&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;freshness:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;warn_after:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count:&amp;nbsp;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;period: hour&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error_after:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count:&amp;nbsp;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;period: hour&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;columns:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- name: order_id&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;description: Unique order identifier&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tests:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;not_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;&amp;nbsp;&amp;nbsp;- unique&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- name: customer_id&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;description: Customer identifier&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tests:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- not_null&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- name: customers&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;description: Customer master data&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;columns:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- name: customer_id&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tests:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;not_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;&amp;nbsp;&amp;nbsp;-&amp;nbsp;unique&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- sources.name : source 그룹 이름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- sources.database : warehouse 의 database&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- sources.schema : warehouse 의 schema&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- sources.tables.name : source 데이터가 들어있는 테이블 이름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- sources.tables.columns : source 데이터가 들어있는 테이블의 컬럼 정의&lt;br /&gt;- sources.tables.columns.name : source 데이터가 들어있는 테이블의 컬럼 이름&lt;br /&gt;- sources.tables.columns.tests : source 데이터가 들어있는 테이블의 컬럼 테스트&lt;br /&gt;- sources.tables.loaded_at_field : source 데이터가 들어있는 테이블의 최신값 기준 컬럼&lt;br /&gt;- sources.tables.freshness : source 데이터가 들어있는 테이블의 freshness 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 정의된 source 테이블로부터 데이터를 읽는 dbt의 모델.sql 은 아래와 같음&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;select&amp;nbsp;*&lt;br /&gt;from&lt;b&gt;&amp;nbsp;{{&amp;nbsp;source('raw',&amp;nbsp;'orders')&amp;nbsp;}}&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt 가 위 쿼리를 실행하면 아래처럼 해석하고 실행함&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;select *&lt;br /&gt;from&lt;b&gt; analytics.raw.orders&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt docs generate 를 통해 문서를 만들게 되면, source.yml 내용을 기반으로 문서에 '이런 곳에서 외부 데이터를 가져와!'라고 써 줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 실행 명령어 : dbt test&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;freshness 검사 실행 명령어 : dbt source freshness&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; source() &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ref() 가 모델.sql 로부터 생성된 결과 객체를 참조하는 문법이라면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;source() 는 dbt 밖에 존재하는 원본 데이터를 참조하는 문법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 모델.sql 에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;원본 데이터를 읽을 때 source() 를 사용&lt;/b&gt;하고&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모델.sql 에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;upstream 모델.sql 을 읽을 때 ref() 를 사용&lt;/b&gt;함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, source.yml 이 아래처럼 생겼고&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;version:&amp;nbsp;2&lt;br /&gt;&lt;br /&gt;sources:&lt;br /&gt;&amp;nbsp;&amp;nbsp;- name: &lt;b&gt;raw&lt;/b&gt; &amp;nbsp;&amp;lt;- source 이름&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;database:&amp;nbsp;analytics&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;schema:&amp;nbsp;raw&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tables:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;&lt;b&gt;orders &amp;nbsp;&lt;/b&gt;&amp;lt;- table 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 orders 테이블로부터 데이터를 가져오는 모델.sql 쿼리는 아래와 같음&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;select&amp;nbsp;*&lt;br /&gt;from {{ source('raw', 'orders') }} &amp;nbsp; &amp;lt;- 첫번째인자 : source 이름, 두번째인자 : table 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 orders 는 (dbt 와 연관없는) 외부에서 만들어진 테이블임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가령 spark, kafka 등이 warehouse 에 만든 테이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 우리는 source() 를 사용해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt 에게 'raw 라는 이름의 외부 소스가 warehouse 에 존재하고, 거기에 'orders' 라는 테이블이 존재한단다'라고 알려주는 것임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 예제를 보자. source.yml 이 아래처럼 생겼고&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;sources:&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;&lt;b&gt;raw&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;database:&amp;nbsp;analytics&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;schema:&amp;nbsp;raw&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tables:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;&lt;b&gt;orders&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;&lt;b&gt;customers&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 orders, customers 테이블로부터 데이터를 가져오는 모델.sql 쿼리는 아래와 같음&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;select *&lt;br /&gt;from&amp;nbsp;{{&amp;nbsp;source('raw',&amp;nbsp;'orders')&amp;nbsp;}}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;select *&lt;br /&gt;from {{ source('raw', 'customers') }}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;source() 를 만나면, dbt 는 이 문장을 아래와 같이 해석하게 됨&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;select *&lt;br /&gt;from&amp;nbsp;&lt;b&gt;analytics.raw.orders&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;source freshness 라는 개념이 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'원본 데이터가 얼마나 최신인가?'를 검사하는 설정이라고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a-&amp;gt;b-&amp;gt;c 순으로 흐르는 stream 이 있는데 a 부분에서 데이터 공급이 멈추면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b, c 도 데이터 처리를 못하게 될 것임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;데이터를 처리하지 못한 만큼의 시간&quot;을 계산해서 조치를 취하는 것이 freshness 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a 가 들어오지 않으면 dbt 가 계속 실행하는 것에 의미가 없기 때문에 dbt run 을 중단하고 알람을 발생하도록 만들꺼야&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;freshness 를 통해 에러 혹은 알람이 발생하면, 데이터 파이프라인이 죽었다고 생각할 수 있음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 아래와 같이 freshness 를 추가한 source.yml 이 존재한다고 하자&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;sources:&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;raw&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tables:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;name:&amp;nbsp;shipments&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loaded_at_field:&amp;nbsp;updated_at&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;freshness:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;warn_after:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count:&amp;nbsp;2&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;period:&amp;nbsp;hour&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error_after:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count:&amp;nbsp;6&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;period:&amp;nbsp;hour&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;updated_at 기준으로 데이터 최신성을 판단 할 것이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2시간 이상 최신 데이터가 들어오지 못하면 경고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6시간 이상 최신 데이터가 들어오지 못하면 에러를 발생시키라고 설정한 내용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt source freshness 명령어로 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt 가 실제로 확인하는 것은 '현재 시간'-'마지막 업데이트된 시간' 의 차이임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 업데이트 된 시간은 아래처럼 구함&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;select max(updated_at) from raw.shupments&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하자면, source() (source.yml) 의 의의는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 원본 데이터 문서화 : 외부 소스가 어디인지 알 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Lineage 생성 : DAG 의 가장 처음 부분을 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Data Quality Test : 테스트도 할 수 있나봄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Freshness Monitoring : 데이터 적재 파이프라인 장애를 감지함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 환경 분리 : Dev, Stage, Prod 를 분리. 그럼에도 source() 를 통해 모델.sql 에는 영향이 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; seed &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt 의 철학은 'warehouse 내에 존재하는 데이터(테이블)를 transformation 한다'임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 source() 를 통해 외부로부터 가져온 데이터를 테이블로 만들고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 테이블로부터 dbt 작업이 시작됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;source() 를 통해 유입되는 raw 데이터는 kafka, spark 등을 통해 진행되는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데.. 국가코드, 환율매핑, 우편번호매핑 등 정적이고 이미 정해져있는 데이터들은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굳이 spark 를 사용해서 파이프라인을 만들고 warehouse 에 넣을 가치가 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 dbt 는 자체적으로, 이런 정적이고 작은 csv 데이터를 warehouse 테이블로 만들어서 사용하는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 바로 seed 라는 기능임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 프로젝트 구조가 있다고 하자&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;my_dbt_project&lt;br /&gt;├──&amp;nbsp;models&lt;br /&gt;├──&amp;nbsp;macros&lt;br /&gt;&lt;b&gt;├──&amp;nbsp;seeds&lt;/b&gt;&lt;br /&gt;&lt;b&gt;│&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;country_codes.csv&lt;/b&gt;&lt;br /&gt;└──&amp;nbsp;dbt_project.yml&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;csv 파일 안에는 잘 정리된 국가 코드가 들어있음&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;lt; country_codes.csv &amp;gt;&lt;br /&gt;&lt;br /&gt;country_code,country_name&lt;br /&gt;KR,Korea&lt;br /&gt;CA,Canada&lt;br /&gt;US,United&amp;nbsp;States&lt;br /&gt;JP,Japan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dbt seed 명령을 실행하면, dbt 가 create table country_codes 명령어를 실행하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;country_codes&lt;span&gt;&amp;nbsp; 테이블에 csv &lt;/span&gt;&lt;/span&gt;데이터를 넣게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후, 일반적인 모델처럼 사용함&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;select&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;o.order_id,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c.country_name&lt;br /&gt;&lt;br /&gt;from&amp;nbsp;orders&amp;nbsp;o&lt;br /&gt;&lt;br /&gt;left&amp;nbsp;join&amp;nbsp;&lt;b&gt;{{&amp;nbsp;ref('country_codes')&amp;nbsp;}}&lt;/b&gt;&amp;nbsp;c&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;on&amp;nbsp;o.country_code&amp;nbsp;=&amp;nbsp;c.country_code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 ref 를 사용한 이유는, dbt 가 생성한 객체라서.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부에서 생성한 객체라면 source 를 쓰겠지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;seed 설정은 dbt_project.yml 에서 가능&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;seeds:&lt;br /&gt;&amp;nbsp;&amp;nbsp;my_project:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+schema: reference&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+column_types:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;country_code: varchar(2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;country_name:&amp;nbsp;varchar(100)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;seeds:&lt;br /&gt;&amp;nbsp;&amp;nbsp;- name: country_codes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;columns:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- name: country_code&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tests:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;unique&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;not_null&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;seed 는 데이터 크기가 매우 작을 때, 변하지 않을 때, 운영 시스템이 아닐 때, csv 를 git으로 관리 가능할 때 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환율처럼 매일 변경되는 데이터나 자주 업데이트되는 데이터는 seed 대신 source를 통해 테이블로 만들어서 사용해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; snapshot &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;snapshot 은 '행(row)의 변경 이력을 저장'하는 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 행이 업데이트 되어 컬럼 값이 덮어쓰여진 후, 해당 행에 대해 '과거 데이터는 뭐야?'라고 물어보면 알 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 덮어쓰여져서 이미 사라졌기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 과거 내용을 쿼리하는 케이스를 위해 snapshot 을 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;snapshot 을 사용하면, 테이블이 자동으로 SCD type 2 가 됨&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 새로운 값들이 과거 값을 덮어쓰지 않고 새로 추가됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 마디로, &lt;b&gt;snapshot은 현재 상태 테이블을 이력테이블로 변환하는 용도&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, snapshots/customer_snapshot.sql 이라는 snapshot 을 만듦&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;{%&amp;nbsp;snapshot&amp;nbsp;customer_snapshot&amp;nbsp;%}&lt;br /&gt;&lt;br /&gt;{{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;target_schema='snapshot',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unique_key='customer_id', &amp;nbsp;&amp;lt;- 기존 row 를 식별하는 키&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strategy='check', &amp;nbsp;&amp;lt;- snapshot 하는 방식&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;check_cols=['city']&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;}}&lt;br /&gt;&lt;br /&gt;select&amp;nbsp;*&lt;br /&gt;from&amp;nbsp;{{&amp;nbsp;source('raw','customers')&amp;nbsp;}}&lt;br /&gt;&lt;br /&gt;{%&amp;nbsp;endsnapshot&amp;nbsp;%}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 strategy 는 check, timestamp 가 올 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;timestamp : row 의 마지막 업데이트 시간(updatedat 등)이 업데이트되면, 새로운 row 로 추가(실무에서 더 선호되는 전략)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;check&lt;/span&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;row 의 1개 이상의 컬럼들이 업데이트되면, 새로운 row 로 추가&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;- check_cols : &amp;nbsp;'check' strategy 를 사용할 때, 변경을 감지할 컬럼들의 리스트. 모든 컬럼을 감시하려면&lt;/span&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;check_cols='all' 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 설정한 후, dbt snapshot 을 실행 (dbt run 으로 실행되지 않으나, dbt build 에는 포함되기 때문에 실행됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 snapshot 기능을 이용하여 SCD type2 가 된 테이블을 만들어짐&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;customer_id&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;city&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;dbt_valid_from&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;dbt_valid_to&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;Seoul&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;2026-01-01&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;2026-02-01&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;Vancouver&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;2026-02-01&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;null&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 테이블 대상으로 과거 특정 날짜 데이터에 쿼리를 날릴 수 있음&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;select&amp;nbsp;*&lt;br /&gt;from&amp;nbsp;customer_snapshot&lt;br /&gt;where&amp;nbsp;'2026-01-15'&lt;br /&gt;between&amp;nbsp;dbt_valid_from&lt;br /&gt;and&amp;nbsp;coalesce(dbt_valid_to,'9999-12-31')&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;append-only 인 테이블은 과거 데이터를 덮어쓰는 성격의 데이터가 아니기 때문에, snapshot 이 불필요함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;snapshot 은 주로 상태(계정정보, 가격, 등급, 상태 등)가 변경되는 테이블에서 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; packages &amp;gt;&lt;/p&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;packages.yml 에 dbt 가 사용하는 패키지들(미리 설정된 기능들)를 리스팅해두고, 한 번에 받을 수 있음&lt;br /&gt;(데이터베이스(Warehouse), Spark, Kafka 같은 외부 인프라에 직접 설치하는 프로그램 아님)&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;이 패키지들은 &lt;b&gt;다른 dbt 개발자들이 미리 만들어둔&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;dbt 모델, SQL 매크로, 테스트 코드의 묶음&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;dbt 안에서 가져와 내 프로젝트의 개발 시간을 줄이는 용도로 사용함&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;예를 들어, 가장 대표적인 dbt 전용 패키지인&lt;span&gt;&amp;nbsp;&lt;/span&gt;dbt-utils를 설치해 봄&lt;br /&gt;(dbt-utils : 날짜 계산, 중복 제거 등 자주 쓰는 SQL 매크로 제공)&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;br /&gt;프로젝트 root directory 에 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;packages.yml&lt;span&gt; 파일을 아래와 같이 설정&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f4f6f7; color: #000000; text-align: start;&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot;&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;packages:
  - package: dbt-labs/dbt_utils
    version: 1.1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;아래 dbt 명령어를 통해 package 다운&lt;/div&gt;
&lt;div style=&quot;background-color: #f4f6f7; color: #000000; text-align: start;&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot;&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;dbt deps
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;명령어를 실행하면 &lt;b&gt;dbt 패키지 허브&lt;/b&gt;에서 소스코드를 다운함&lt;br /&gt;프로젝트 내&lt;span&gt;&amp;nbsp;&lt;/span&gt;dbt_packages/dbt_utils&lt;span&gt;&amp;nbsp;&lt;/span&gt;폴더가 생성되며, &lt;br /&gt;이제부터 dbt 모델.sql 안에서 다음과 같이 매크로를 바로 사용할 수 있음&lt;/div&gt;
&lt;div style=&quot;background-color: #f4f6f7; color: #000000; text-align: start;&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot;&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 두 컬럼의 값을 합쳐서 고유한 ID(해시값)를 만드는 dbt-utils 매크로 사용 예시
select
    {{ dbt_utils.generate_surrogate_key(['user_id', 'signup_date']) }} as user_hash_id,
    user_id,
    signup_date
from {{ ref('raw_users') }}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; dbt 명령어들 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 dbt 프로젝트 개발 흐름을 살펴보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개발(모델.sql, yml 설정 등) -&amp;gt; compile 진행 -&amp;gt; run -&amp;gt; test -&amp;gt; docs 만들기 -&amp;gt; 배포&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 흐름대로 개발하며 필요한 dbt 명령어들을 알아보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 836px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;명령어&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;언제 사용되는가&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 171px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 171px;&quot;&gt;dbt run&lt;br /&gt;&lt;br /&gt;특정 모델만 실행하려면&lt;br /&gt;dbt run --select stg_orders&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;특정 계층(stage,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;intermediate 등)만 실행하려면&lt;br /&gt;dbt run --select staging&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 171px;&quot;&gt;개발(모델.sql, yml 설정 등)이 마무리 된 후 실행&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 171px;&quot;&gt;dependency&lt;b&gt; 순서대로 모델.sql 을 실행&lt;/b&gt;하고&lt;br /&gt;dependency graph 를 만들고&lt;br /&gt;&lt;b&gt;warehouse 에 테이블을 만듦&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;모델.sql 을 create view, create table 명령어로 바꿔서 실행&lt;br /&gt;&lt;br /&gt;테스트해주는 거 아님&lt;br /&gt;freshness 검사해주는 거 아님&lt;br /&gt;문서 만들어주는 거 아님&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 57px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 57px;&quot;&gt;dbt compile&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 57px;&quot;&gt;SQL 디버깅 할 때 사용&lt;br /&gt;실제로 생성된 SQL 문을 눈으로 확인하며 디버깅 진행&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 57px;&quot;&gt;jinja 를 실제 SQL 쿼리문으로 변환&lt;br /&gt;이 명령문을 통해 나온 SQL 쿼리문은 target/compiled 에 저장됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 114px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 114px;&quot;&gt;dbt test&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 114px;&quot;&gt;배포하기 전에 실행&lt;br /&gt;대개 dbt run -&amp;gt; dbt test 순으로 실행된다고 함&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 114px;&quot;&gt;데이터 품질 검사 진행&lt;br /&gt;&lt;br /&gt;sources.yml, schema.yml, seed, test 디렉터리 내 tests 를 실행&lt;br /&gt;예를 들어, tests unique 는&lt;br /&gt;group by id having count(*) &amp;gt; 1 을 실행하여 결과가 나타나는지 확인하는 것으로 테스트를 진행한다고 함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;dbt build&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;dbt run, dbt test, dbt seed, dbt snapshot 모두 한 번에 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;dbt seed&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 19px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;seeds/mycsv.csv 등 csv 파일을 테이블로 만들 때 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 57px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 57px;&quot;&gt;dbt source freshness&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 57px;&quot;&gt;파이프라인의 가장 처음에 실행&lt;br /&gt;source freshness 실행 -&amp;gt; dbt build(dbt run -&amp;gt; dbt test)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 57px;&quot;&gt;source 의 마지막 업데이트 날짜와 현재 날짜 간 차이를 계산하여 처리(경고 혹은 에러)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 152px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 152px;&quot;&gt;dbt docs generate&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 152px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 152px;&quot;&gt;문서를 생성&lt;br /&gt;생성된 문서는 lineage 를 포함하여 json 파일로 저장됨&lt;br /&gt;&lt;br /&gt;target/catalog.json:&amp;nbsp;웨어하우스(데이터베이스)에서&amp;nbsp;추출한&amp;nbsp;테이블&amp;nbsp;및&amp;nbsp;스키마&amp;nbsp;메타데이터.&lt;br /&gt;target/manifest.json:&amp;nbsp;사용자가&amp;nbsp;작성한&amp;nbsp;dbt&amp;nbsp;모델,&amp;nbsp;테스트,&amp;nbsp;소스&amp;nbsp;및&amp;nbsp;DAG(계보)&amp;nbsp;정보.&lt;br /&gt;target/index.html: 문서 웹사이트를 렌더링하는 기본 UI 템플릿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 38px;&quot;&gt;dbt docs serve&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 38px;&quot;&gt;프로젝트 분석이 필요할 때&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 38px;&quot;&gt;문서 서버를 실행함&lt;br /&gt;브라우저에서 Lineage Graph, Model Doc, Column Desc 등 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 76px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 76px;&quot;&gt;dbt ls&lt;br /&gt;&lt;br /&gt;특정 계층의 모델만 보고싶다면&lt;br /&gt;dbt ls --select staging&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 76px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 76px;&quot;&gt;설정된 모델명들 나열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 114px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 114px;&quot;&gt;dbt debug&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 114px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 114px;&quot;&gt;dbt 프로젝트의 전반적인 구성 확인&lt;br /&gt;&lt;br /&gt;dbt&amp;nbsp;버전&amp;nbsp;확인:&amp;nbsp;현재&amp;nbsp;설치된&amp;nbsp;dbt&amp;nbsp;버전&amp;nbsp;정보&lt;br /&gt;dbt_project.yml&amp;nbsp;검증:&amp;nbsp;프로젝트&amp;nbsp;구성&amp;nbsp;파일의&amp;nbsp;유효성&amp;nbsp;검사&lt;br /&gt;profiles.yml&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;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;dbt deps&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;packages.yml&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일에 정의된 외부 패키지(매크로, 모델, 테스트 등)를 다운로드하여 설치하는 명령어. dbt 를 위한 기능을 다운받음.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; 예상 인터뷰 질문 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span&gt;&lt;span&gt;late arriving data 는 어떻게 처리하는가?&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;DAG selection syntax&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;dbt&amp;nbsp;build&amp;nbsp;--select&amp;nbsp;state:modified&lt;br /&gt;dbt&amp;nbsp;run&amp;nbsp;--select&amp;nbsp;tag:daily&lt;br /&gt;dbt&amp;nbsp;build&amp;nbsp;--select&amp;nbsp;+model+&lt;br /&gt;&lt;br /&gt;등등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;airflow 에서 dbt 실행하는 방법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;BashOperator&lt;/b&gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;task_id=&quot;dbt_build&quot;,&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bash_command=&quot;dbt&amp;nbsp;build&quot;&lt;/b&gt;&lt;br /&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Coding Interview</category>
      <author>눈가락</author>
      <guid isPermaLink="true">https://eyeballs.tistory.com/744</guid>
      <comments>https://eyeballs.tistory.com/744#entry744comment</comments>
      <pubDate>Fri, 22 May 2026 06:29:17 +0900</pubDate>
    </item>
    <item>
      <title>[IT] Data Warehouse + Data Modeling 공부</title>
      <link>https://eyeballs.tistory.com/743</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.udemy.com/course/data-warehouse-the-ultimate-guide/learn/lecture/31675206#content&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.udemy.com/course/data-warehouse-the-ultimate-guide/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; Data Warehouse &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DW란, TB, PB 급의 &lt;b&gt;대규모 데이터&lt;/b&gt;를 기반으로 &lt;b&gt;분석 작업과 리포팅 작업을 하기 위해 사용되는 저장소&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;분석가들이 DW 에 접근&lt;/b&gt;하여 &lt;b&gt;데이터를 분석&lt;/b&gt;할 수 있도록 주로 &lt;b&gt;SQL 을 통해 데이터 분석작업이 진행&lt;/b&gt;됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 &lt;b&gt;지난 5년간 월간 매출액 분석&lt;/b&gt; 등의 분석 작업을 위한 대규모 데이터가 DW 에 저장되며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;의미있는 시간 내에 분석 쿼리가 동작&lt;/b&gt;하여 결과를 볼 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대규모 데이터 대상으로 쿼리하기 때문(OLAP)에, &lt;b&gt;빠른 성능이 요구&lt;/b&gt;되며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;대규모 데이터를 저장하기 위해 확장 가능한 설계&lt;/b&gt;가 필요함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 DW 는 distributed environment 를 활용하여 설계됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;분석가가 분석을 위해 쿼리를 실행하는 저장소&lt;/b&gt;이기 때문에, 사용자 친화적이어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(데이터에 쉽게 접근할 수 있어야하고, 사용시 이슈가 없어야 하고, 빠른 시간 내에 결과를 받을 수 있어야 함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kAhZY/dJMcaarrGOj/YFCefEC9bMErAXUYBI3vTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kAhZY/dJMcaarrGOj/YFCefEC9bMErAXUYBI3vTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kAhZY/dJMcaarrGOj/YFCefEC9bMErAXUYBI3vTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkAhZY%2FdJMcaarrGOj%2FYFCefEC9bMErAXUYBI3vTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;363&quot; height=&quot;238&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 도메인/팀/소스에서 생성된 데이터들을 DW 라는 곳에 모아둠&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분석가들은 DW 에서 필요한 데이터들을 찾아 분석하여, 인사이트를 추출하고 비즈니스에 이용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 데이터 리포팅 및 분석 결과 시각화에도 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 &lt;b&gt;data sources 에서 DW 로 데이터를 적절하게 옮기는 작업을 ETL&lt;/b&gt; 이라고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 옮기는 것이 아니고, &lt;b&gt;분석/집계 가능한 모양&lt;/b&gt;으로, &lt;b&gt;무결성/정합성을 지키며&lt;/b&gt;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;성능에 최적화된 파일포맷/구조로&lt;/b&gt; 옮겨야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; Data Lake vs Data Warehouse &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Lake 와 Data Warehouse 는 모두 centroalized data storage 로 사용되지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장되는 데이터 형식, 데이터 저장 목적, 데이터가 사용되는 방법 등이 다름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 69.4188%; height: 413px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.1768%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 38.1628%; height: 17px;&quot;&gt;DataLake&lt;/td&gt;
&lt;td style=&quot;width: 54.3746%; height: 17px;&quot;&gt;Data Warehouse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 82px;&quot;&gt;
&lt;td style=&quot;width: 21.1768%; height: 82px;&quot;&gt;Data&lt;/td&gt;
&lt;td style=&quot;width: 38.1628%; height: 82px;&quot;&gt;Raw&lt;br /&gt;&lt;b&gt;가공하지 않은 데이터 그대로&lt;/b&gt; 저장&lt;/td&gt;
&lt;td style=&quot;width: 54.3746%; height: 82px;&quot;&gt;Transformed&lt;br /&gt;SQL 을 이용한 분석/집계에 용이하도록, &lt;b&gt;데이터가 테이블 형태로 transfomed&lt;/b&gt; 되어있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;width: 21.1768%; height: 60px;&quot;&gt;Tech&lt;/td&gt;
&lt;td style=&quot;width: 38.1628%; height: 60px;&quot;&gt;Big data&lt;br /&gt;다양한 bigdata 기술을 사용하여 구성됨&lt;/td&gt;
&lt;td style=&quot;width: 54.3746%; height: 60px;&quot;&gt;Database (SQL)&lt;br /&gt;테이블로 구성된 사용자 친화적인 기술&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 78px;&quot;&gt;
&lt;td style=&quot;width: 21.1768%; height: 78px;&quot;&gt;Structure&lt;/td&gt;
&lt;td style=&quot;width: 38.1628%; height: 78px;&quot;&gt;Unstructured&lt;br /&gt;Json, txt, images, videos...등 &lt;b&gt;다양한 형태의 raw data&lt;/b&gt; 가 저장될 수 있음&lt;/td&gt;
&lt;td style=&quot;width: 54.3746%; height: 78px;&quot;&gt;Structured&lt;br /&gt;&lt;b&gt;테이블&lt;/b&gt;에 들어갈 수 있는 형식적인 구조로 transformed 됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.1768%; height: 17px;&quot;&gt;Schema&lt;/td&gt;
&lt;td style=&quot;width: 38.1628%; height: 17px;&quot;&gt;Schema 존재하지 않음&lt;br /&gt;어떤 데이터든 저장 가능&lt;/td&gt;
&lt;td style=&quot;width: 54.3746%; height: 17px;&quot;&gt;&lt;b&gt;테이블 스키마는 사전에 엄격하게 정의&lt;/b&gt;됨. 마치 RDB 처럼&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 125px;&quot;&gt;
&lt;td style=&quot;width: 21.1768%; height: 125px;&quot;&gt;Usage&lt;/td&gt;
&lt;td style=&quot;width: 38.1628%; height: 125px;&quot;&gt;Not defined yet&lt;br /&gt;&lt;b&gt;과거 데이터를 재처리&lt;/b&gt; 할 때 source 로 사용될 수 있고&lt;br /&gt;raw 데이터 자체에서 인사이트 추출해야 할 때 사용될 수 있음 (기계 학습에 이용하는 등)&lt;/td&gt;
&lt;td style=&quot;width: 54.3746%; height: 125px;&quot;&gt;Specific &amp;amp; Ready to be used&lt;br /&gt;&lt;b&gt;집계/분석&lt;/b&gt;에 사용되거나, &lt;b&gt;리포팅&lt;/b&gt;할 때 사용됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.1768%; height: 17px;&quot;&gt;Storage&lt;/td&gt;
&lt;td style=&quot;width: 38.1628%; height: 17px;&quot;&gt;S3 등의 보편적인 데이터를 저장할 수 있는 저장소&lt;/td&gt;
&lt;td style=&quot;width: 54.3746%; height: 17px;&quot;&gt;SQL이 가능한 특정 DW 저장소.&lt;br /&gt;Snowflake, Redshift, BigQuery 등 반드시 &lt;b&gt;DW 전용 플랫폼&lt;/b&gt; 이용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.1768%;&quot;&gt;Cost&lt;/td&gt;
&lt;td style=&quot;width: 38.1628%;&quot;&gt;s3 등 보편적인 저장소 사용하기 때문에 저렴함&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 54.3746%;&quot;&gt;전용 DW 저장소를 사용하기 때문에 비쌈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.1768%; height: 17px;&quot;&gt;Users&lt;/td&gt;
&lt;td style=&quot;width: 38.1628%; height: 17px;&quot;&gt;Data Scientists&lt;/td&gt;
&lt;td style=&quot;width: 54.3746%; height: 17px;&quot;&gt;Data Analysts, Business users&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;source storages 에서 수집(수입)한 데이터들을 그대로 Data Lake 에 보관&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Data Lake 에 보관한 데이터를 batch 형태로 ETL 처리한 후 DW 에 넣음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; Data Warehouse Layers &amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfGXDZ/dJMcaaSwuUe/CUvVVHOmFzpTT0OatgWsy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfGXDZ/dJMcaaSwuUe/CUvVVHOmFzpTT0OatgWsy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfGXDZ/dJMcaaSwuUe/CUvVVHOmFzpTT0OatgWsy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfGXDZ%2FdJMcaaSwuUe%2FCUvVVHOmFzpTT0OatgWsy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;639&quot; height=&quot;258&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Staging : Data Sources 로부터 읽은 raw data 를 읽는 레이어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cleansing : raw data 를 테이블로 만들기 위해&amp;nbsp;transformation 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Core/Data Warehouse : 데이터들을 모두 DW 테이블로 만듦&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; DW 를 사용하는 사용자(분석가) 입장에서는 이 DW 레이어를 single source of truth 로 생각함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Marts : 특정 부서(영업, 마케팅, 재무 등)나 주제(지역, 시간, 비즈니스 케이스 등)에 &lt;b&gt;필요한 데이터만 추출해 구성한 테이블들&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 분석가들이 &lt;b&gt;분석을 위해 미리 집계처리 한 데이터를 저장하는 테이블들&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;효율적인 쿼리 실행을 위해 논리적/물리적 데이터 모델링(차원 모델링) 진행 (fact-dimension tables)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 대규모 DW 테이블이 아닌, 소규모 Data Mart 테이블이기 때문에, 접근하고 쿼리할 때 빠른 퍼포먼스를 볼 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 원하는 DB 를 사용하여 구축할 수 있음 (in-memory DB 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; Dimensional modeling &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대규모 데이터 분석/OLAP/집계&lt;/b&gt; 가 빈번히 발생하는 DW 에서는 &lt;b&gt;성능이 주요 쟁점&lt;/b&gt;이며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;차원 모델링&lt;/b&gt;(Dimensional modeling)으로 테이블을 구성하면 &lt;b&gt;성능적 이점&lt;/b&gt;을 얻을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 DW 에서 차원 모델링을 많이 차용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dimensional modeling 은 크게 두 가지 테이블을 엮어서 만듦&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Fact table&lt;/b&gt; : 비즈니스/이벤트의 &lt;b&gt;측정 가능한 수치 데이터&lt;/b&gt;(Measures)를 담은 &lt;b&gt;트랜잭션 중심의 테이블&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 판매 금액, 수량 등. 비즈니스 진행하면서 행(row)이 계속 쌓이며, 크기가 큼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; PK, FK, 그리고 그 외 데이터(수치, 로그 등) 등의 컬럼들을 갖고 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 수치 데이터로 이루어져 있어서, 집계가 가능한 Fact table이 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; event, transactions, date, time 등의 로그성 데이터가 쌓이는 Fact table 이 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Dimension table&lt;/b&gt; : &lt;b&gt;팩트&amp;nbsp;데이터를&amp;nbsp;분석하기&amp;nbsp;위한&amp;nbsp;기준&lt;/b&gt;(Who,&amp;nbsp;What,&amp;nbsp;Where,&amp;nbsp;When)을&amp;nbsp;담은&amp;nbsp;배경&amp;nbsp;설명&amp;nbsp;테이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 고객명, 상품명, 날짜 등. 대체로 자주 바뀌지 않으며, 크기가 작음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; fact table 의 정보를 설명하기 위한 카테고리, 그룹핑, 필터링 등으로 생각해볼 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 집계(는 가능하지만)하는 것에 의미가 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; PK, FK, 그 외 데이터(카테고리 등)를 가지고 있으며, PK를 이용하여 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;fact table 과&lt;/span&gt;&amp;nbsp;관계를 맺음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;363&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kX5f0/dJMcah5b0rM/FWXit3W4stpXqvFyz76Iuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kX5f0/dJMcah5b0rM/FWXit3W4stpXqvFyz76Iuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kX5f0/dJMcah5b0rM/FWXit3W4stpXqvFyz76Iuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkX5f0%2FdJMcah5b0rM%2FFWXit3W4stpXqvFyz76Iuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;320&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;363&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fact 와 Dimension table 간 '관계'가 존재함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Fact table 의 외래키(FK)를 통해 Dimension table 이 연결됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 연결할까? Fact Table 의 내용을 해석하기 위해 Dimension table 을 사용하기 때문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 dimension table 을 없애고 &lt;b&gt;dimension table의 내용을 하나의 fact table 에 모두 넣으면&lt;/b&gt;(비정규화)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dimension table 이 갖고있는 동일한 정보가 각 fact table 의 row에 따라 &lt;b&gt;중복 저장&lt;/b&gt;되고 스토리지 비용이 증가하게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 dimension table 정보를 업데이트 해야 한다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중복된 수억건의 데이터를 fact table 에서 모두 찾아 업데이트해야하는 불상사&lt;/b&gt;가 발생함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 극단적인 분석 속도가 필요하고, &lt;b&gt;join 비용&lt;/b&gt;(분산환경에서 데이터 운반시 드는 시간적 비용)을 줄여야한다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 fact table 로만 테이블을 구성할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dimension table 을 따로 만들고 fact table와 연결하게 되면(정규화)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 fact tables 에서 하나의 dimension table 을 사용하는 경우, dimension table 을 효율적으로 사용하게 되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 &lt;b&gt;모든 fact tables 가 동일한 dimension table 정보를 이용&lt;/b&gt;할 수 있어서 &lt;b&gt;정보의 차이가 발생하지 않게 됨&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 쿼리를 수행 할 때 성능적 이점도 존재함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dimension table 기준으로 먼저 필터링을 수행하여 필요한 값들만 추출한 뒤, 이를 대용량의 fact table 과 조인하여 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;dimension table 에서 추출한 컬럼값으로 Projection&amp;nbsp;Pushdown&lt;/b&gt; 하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fact table 을 쿼리하는 것이 성능적으로 훨씬 빠르고 자원 소모도 적음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(참고 : DW table 에는 전통적인 DB 에서 사용하는 물리적인 indexing 기능이 존재하지 않음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전통적인 RDB 는 B-Tree 인덱스를 사용하며, 매번 데이터가 들어올 때마다 인덱스 파일을 실시간으로 업데이트 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 DW 는 다루는 데이터 크기가 너무 크기때문에&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(TB, PB 급)&lt;span&gt; &lt;/span&gt;&lt;/span&gt;매번 인덱스 파일을 업데이트 할 수 없음(업데이트 부하)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신, Parquet 등 파일 내 메타데이터를 이용하여 &lt;b&gt;Predicate(Filter) Pushdown&lt;/b&gt; 하거나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Columnar file format 을 이용하여 &lt;b&gt;Projection Pushdown&lt;/b&gt; 하거나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FK 컬럼 기준으로 물리적인 &lt;b&gt;파티셔닝 혹은 클러스터링&lt;/b&gt;을 진행하거나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 작은 파일 헤더만 읽고 이를 이용하여 타겟이 아닌 파일은 걸러내는 &lt;b&gt;블룸 필터링&lt;/b&gt;을 진행하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리 성능을 향상시킴)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; grain &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fact Tables 의 단일 행(row) 이 나타내는 상세 수준을 grain 이라고 부름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grain 논리에 의해, &lt;b&gt;하나의 row는 하나의 실제 이벤트를 의미&lt;/b&gt;하게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 아래 서로 다른 grain 을 갖는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;두 테이블을 볼 수 있으며&lt;/span&gt;,&lt;br /&gt;1번 transaction fact table이 더 상세한 grain 을 갖고 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. transaction fact table :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; grain : 주문 상품 단위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2026-04-17 / 강남점 / 김철수 / 신라면 1봉지 / 1,000원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2026-04-17 / 강변점 / 이영희 / 버터 1개 / 1,500원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2026-04-18 / 송파점 / 홍길동 / 콜라 1통 / 3,000원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. aggregated fact table :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; grain : 상품별 하루동안 총 판매된 액수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2026-04-17 / 강남점 / 신라면 / 총 500봉지 / 총 500,000원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2026-04-17 / 강변점 / 버터 / 총 100개 / 총 150,000원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2026-04-18 / 송파점 / 콜라 / 총 300통 / 총 900,000원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;grain 은 가장 상세한 수준으로 설계하는 것이 좋음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐하면 데이터를 합치는 것(Roll-up)은 언제든 SQL로 가능하지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이미 합쳐져서 들어온 데이터(Summary Grain)를 다시 쪼개는 것은 불가능&lt;/b&gt;하기 때문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 위의 2번 aggregate fact table 에서는 이미 집계가 된 상태로 row 가 존재하기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누가 얼마나 샀는지 쿼리할 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grain 이 무엇인지 결정되어야&amp;nbsp;fact table 에 붙일 수 있는 dimention table 들이 결정됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; DW 에서의 Fact 와 Dimention 테이블 간 연결 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPrpqg/dJMcabDTME0/TpJJlXKIKMnsip6JfbYdHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPrpqg/dJMcabDTME0/TpJJlXKIKMnsip6JfbYdHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPrpqg/dJMcabDTME0/TpJJlXKIKMnsip6JfbYdHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPrpqg%2FdJMcabDTME0%2FTpJJlXKIKMnsip6JfbYdHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;599&quot; height=&quot;293&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;581&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vBU8r/dJMcadPbsfY/hdXYJGuyyd1bYshogqFXAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vBU8r/dJMcadPbsfY/hdXYJGuyyd1bYshogqFXAK/img.png&quot; data-alt=&quot;PowerBI 로 그려진 2개의 fact tables, 3개의 dimension tables&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vBU8r/dJMcadPbsfY/hdXYJGuyyd1bYshogqFXAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvBU8r%2FdJMcadPbsfY%2FhdXYJGuyyd1bYshogqFXAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;774&quot; height=&quot;581&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;581&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PowerBI 로 그려진 2개의 fact tables, 3개의 dimension tables&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 두 테이블 간 PK, FK 가 존재한다고 했는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 전통적인 RDB 처럼 시스템적으로 설정되는 연결이 아님&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔지니어가 논리적으로 생각하기에 PK-FK 로 연결되는, 개념적인 것&lt;br /&gt;두 테이블은 서로 join 문법을 통해 엮이면서 '연결'된다고 말할 수 있으며&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;join 시 사용되는 키들이 바로&lt;span&gt;&amp;nbsp;&lt;/span&gt;PK-FK 관계에 있는 컬럼들임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Snowflake, Redshift, BigQuery 같은 DW 서비스에서 테이블을 만들 때 &lt;b&gt;FOREIGN KEY 선언&lt;/b&gt; 가능하지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;선언의 의미는 단순히 &quot;두 테이블은 이런 관계야&quot;라고 알려주는 메타데이터(힌트)&lt;/b&gt;일 뿐,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실제 데이터가 들어올 때 관계를 일일이 체크하지 않음(=참조 무결성 지켜지지 않음)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조 무결성을 지키지 않는 이유는 적재 성능(Ingestion Performance) 때문임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터가 한 줄 한 줄 들어올때마다 매번 참조무결성을 체크한다면&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대규모 데이터를 다루는 DW 테이블에서 적재 성능이 심각하게 낮아지게 됨&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DW 시스템에서 참조 무결성을 지원하지 않기 때문에,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 엔지니어는 &lt;b&gt;ETL 파이프라인에서 데이터를 무결성 이슈 없이 처리&lt;/b&gt;해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;FOREIGN KEY 선언함으로써, DW 엔진에게 두 테이블의 관계에 대해 알려줄 수 있게 되고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;DW 는 FK 메타데이터를 참고해서 더 빠르고 최적화 된 쿼리 실행계획을 만들 수 있음&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;즉, PK-FK 선언이 의미없이 형식적으로 하는 것이 아니라 실제로 성능에 영향을 줄 수 있는 부분이 됨&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(PK-FK 선언은 분석가가 테이블 간 관계를 더 이해하기 쉽게 만든다는 부가적인 효과도 줌)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 delete/update cascade 는 지원하지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DW 의 데이터는 '한 번 쓰고 여러번 읽는다', 'fact 테이블은 업데이트 하지 않는다' 는 원칙이 있다고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 업데이트/삭제가 발생한다면, 데이터의 역사성/신뢰가 깨질 수 있음(히스토리로 사용 불가)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; Schema &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baAFPF/dJMb99TBqjJ/YbXmkoTagJNuTznllKlRP1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baAFPF/dJMb99TBqjJ/YbXmkoTagJNuTznllKlRP1/img.webp&quot; data-alt=&quot;https://dev.to/puneet_verma_aa1b0f7536c6/understanding-star-schema-vs-snowflake-schema-4hlj&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baAFPF/dJMb99TBqjJ/YbXmkoTagJNuTznllKlRP1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaAFPF%2FdJMb99TBqjJ%2FYbXmkoTagJNuTznllKlRP1%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;727&quot; height=&quot;545&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://dev.to/puneet_verma_aa1b0f7536c6/understanding-star-schema-vs-snowflake-schema-4hlj&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fact, Dimension 테이블들을 어떻게 구성하느냐에 따라서도 성능이 달라짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 사용되는 구성은 Star Schema 와 Snowflake Schema.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 둘은 정규화(Normalization) 정도에 따라 구분됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 74.0697%; height: 106px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 6.72099%; height: 21px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 29.7888%; height: 21px;&quot;&gt;정규화&lt;/td&gt;
&lt;td style=&quot;width: 30.1569%; height: 21px;&quot;&gt;비정규화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 64px;&quot;&gt;
&lt;td style=&quot;width: 6.72099%; height: 64px;&quot;&gt;장점&lt;/td&gt;
&lt;td style=&quot;width: 29.7888%; height: 64px;&quot;&gt;- 데이터 중복이 많이 사라지며 그에 따라&amp;nbsp;storage 비용 절약&lt;br /&gt;- 특정 속성 변경시, 작은 차원테이블 하나만 수정하면 되기 때문에 &lt;b&gt;유지보수 용이&lt;/b&gt;&lt;br /&gt;- 정규화 진행하면 데이터는 한 곳에 존재하기 때문에 수정될 때 &lt;b&gt;데이터 간 불일치 줄임(데이터 무결성)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.1569%; height: 64px;&quot;&gt;- join 횟수가 적기 때문에 &lt;b&gt;검색/집계 쿼리 성능이 좋음&lt;/b&gt;&lt;br /&gt;- DW 엔진은 단일 테이블 대량 스캔에 더 최적화 된 경우가 많음&lt;br /&gt;- 적은 테이블만 사용하면 되기 때문에, &lt;b&gt;사용자 친화적임&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 6.72099%; height: 21px;&quot;&gt;단점&lt;/td&gt;
&lt;td style=&quot;width: 29.7888%; height: 21px;&quot;&gt;-&lt;b&gt; join 진행시 네트워크 셔플링 이슈로 성능 악화&lt;/b&gt;&lt;br /&gt;- 여러 테이블 결합해야해서 쿼리가 복잡해짐&lt;/td&gt;
&lt;td style=&quot;width: 30.1569%; height: 21px;&quot;&gt;- 데이터 중복 발생 가능하며 그에 따라&amp;nbsp;storage 비용 증가&lt;br /&gt;- 데이터 하나 수정하려고 해도, 모든 중복데이터 찾아 수정해야해서 업데이트하기 어려움&lt;br /&gt;- 비정규화 진행될수록 데이터가 중복되기 때문에 무결성 깨질 확률이 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DW, Data Mart 에서 Star Schema 가 보편적으로 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 &lt;b&gt;비즈니스&lt;/b&gt;에 따라, 그리고&lt;b&gt; 무엇을 우선순위로 둘 것인지(성능? 정확성?)&lt;/b&gt;에 따라 &lt;b&gt;사용되는 스키마가 다름&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; Fact Tables 상세 : Additive &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fact table 이 갖는 '수치' 데이터는, '숫자를 더했을 때 비즈니스적 의미가 있는지'에 따라 각각 다음으로 나눌 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eHyzLG/dJMcabKHtDQ/Bz2RHFVDxTY6rQbhYYl08k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eHyzLG/dJMcabKHtDQ/Bz2RHFVDxTY6rQbhYYl08k/img.png&quot; data-alt=&quot;Additive facts&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eHyzLG/dJMcabKHtDQ/Bz2RHFVDxTY6rQbhYYl08k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeHyzLG%2FdJMcabKHtDQ%2FBz2RHFVDxTY6rQbhYYl08k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;327&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Additive facts&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Additive facts : 어떤 차원(시간, 지역, 상품 등)으로 더해도 항상 의미가 있는 수치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 시간, 매출액,&amp;nbsp;판매&amp;nbsp;수량,&amp;nbsp;비용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 오른쪽 위 fact table 의 units 은 카테고리별로 합산해도 의미가 있고, name으로 합산해도 의미가 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; '시간' 차원으로 매출 합산 : 1월 매출 + 2월 매출 = 1~2월 총 매출 (의미있음)&lt;br /&gt;&amp;nbsp; '지역' 차원으로 매출 합산 : 서울 매출 + 부산 매출 = 전국 총 매출 (의미있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; '상품' 차원으로 매출 합산 : 라면 매출 + 콜라 매출 = 전체 상품 매출 (의미있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX0Mv6/dJMcagd89Nu/vbCq47iX7SOtXfcvRlbAX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX0Mv6/dJMcagd89Nu/vbCq47iX7SOtXfcvRlbAX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX0Mv6/dJMcagd89Nu/vbCq47iX7SOtXfcvRlbAX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX0Mv6%2FdJMcagd89Nu%2FvbCq47iX7SOtXfcvRlbAX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;583&quot; height=&quot;294&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Semi-additive&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;facts&lt;/span&gt; : 특정 차원(주로 시간)으로는 더하면 안 되지만, 다른 차원으로는 더해도 되는 수치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 은행 잔고, 창고 재고량, 현재 인원 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 오른쪽 위 fact table 의 balance 는 portfolio 단위로 합산하는 것이 의미가 없음 (아래 붉은 엑스)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; balance 는 그대로인데 날짜마다 합산하면 중복된 값을 더하는 것이기 때문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 대신 portfolio 별로 날짜에 따라 balance 를 합산하는 것은 의미가 있음 (added across types)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1월 1일에 모든 portfolio(USD cash, stocks) 가 갖는 금액이 170달러&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1월 2일에 모든 portfolio(USD cash, stocks) 가 갖는 금액이 270달러&lt;br /&gt;&amp;nbsp; 1월 3일에 모든 portfolio(USD cash, stocks) 가 갖는 금액이 160달러.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이렇게 날짜별로 내 금액이 얼마나 바뀌고있는지 확인하는 차원에서 의미가 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; '지역' 차원으로 재고 합산 : A창고 재고(10개) + B창고 재고(20개) = 전체 재고 30개 (의미있음)&lt;br /&gt;&amp;nbsp; '시간' 차원으로 재고 합산 : 월요일 재고(10개) + 화요일 재고(10개) = 총 재고 20개? (의미없음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 월요일에 있던 재고가 화요일에 그대로 있는 경우가 있으니 총 재고 20개는 의미가 없게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이렇게 &lt;b&gt;시간 차원으로 합산이 불가능한 경우에는 '평균'이나 '마지막 값'을 사용&lt;/b&gt;해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PqEL7/dJMcabDTT5Y/rkxSRUl3OWKHRkbUGCadxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PqEL7/dJMcabDTT5Y/rkxSRUl3OWKHRkbUGCadxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PqEL7/dJMcabDTT5Y/rkxSRUl3OWKHRkbUGCadxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPqEL7%2FdJMcabDTT5Y%2FrkxSRUl3OWKHRkbUGCadxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;320&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Non-additive&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;facts&lt;/span&gt; : 어떤 차원으로도 절대 더해서는 안 되는 수치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 비율(ratio), 단가(price), 할인율(%), 온도, 단가, 이자율 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 더하는 행위가 비즈니스적으로 전혀 의미 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 오른쪽 위 fact table 의 price 는 더하는 것에 의미가 없고 (의미가 있는 '날짜별 매출'은 units 과 곱해야 함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; category 별 판매 금액을 더하는 것도 의미 없음(아래 붉은 엑스)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; '상품' 차원으로 할인율 합산 : A상품 할인율(10%) + B상품 할인율(10%) = 총 할인율 20%? (의미없음)&lt;br /&gt;&amp;nbsp; '시간' 차원으로 온도 합산 : 어제 온도(20&amp;deg;C) + 오늘 온도(20&amp;deg;C) = 이틀간 총 온도 40&amp;deg;C? (의미없음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 할인율처럼 Non-addictive 수치값을 비즈니스에 사용하려면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 할인율을 미리 계산해두지 말고 할인액, 매출액을 따로 컬럼으로 저장해두고 할인율을 구해서 사용하도록 해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; Fact Tables 상세 : Null &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 DW 엔진에서 집계 처리할 때 null 값을 자동으로 처리해줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹은 엔지니어가 직접 COALESCE 이나 NULLIF 등의 함수를 사용하여 처리할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fact table 은 null 이 필요한 경우도 존재하기 때문에, 남겨둘지 대체할지 고려해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제가 되는 부분은, FK 가 null 인 경우임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boHBlE/dJMcahD59Ts/M43NJumpzWblHK1dtDo4f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boHBlE/dJMcahD59Ts/M43NJumpzWblHK1dtDo4f1/img.png&quot; data-alt=&quot;FK 에 null 값이 존재하는 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boHBlE/dJMcahD59Ts/M43NJumpzWblHK1dtDo4f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboHBlE%2FdJMcahD59Ts%2FM43NJumpzWblHK1dtDo4f1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;611&quot; height=&quot;237&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;237&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;FK 에 null 값이 존재하는 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DW 는 참조무결성을 지원하지 않기 때문에 엔지니어가 직접 무결성을 지키도록 쿼리/프로그래밍 해야함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 FK 가 null 인 경우가 발생하지 않도록 조심해야 함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FK 에 null 값이 존재할 때, null 을 -1, 999 등 사용하지 않을 값으로 치환할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBFSJT/dJMb990qm4B/AmZB21lMLqEQ0wyRBQ52GK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBFSJT/dJMb990qm4B/AmZB21lMLqEQ0wyRBQ52GK/img.png&quot; data-alt=&quot;null 값을 999 로 치환&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBFSJT/dJMb990qm4B/AmZB21lMLqEQ0wyRBQ52GK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBFSJT%2FdJMb990qm4B%2FAmZB21lMLqEQ0wyRBQ52GK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;611&quot; height=&quot;255&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;null 값을 999 로 치환&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt; Fact Tables 상세 : Year-to-Date &amp;gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;DW 를 사용하는 분석가들은 데이터를 통해 연간 누계 또는 월간 누계 등&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특정 날짜 동안의 누계를 확인하고 싶은 경우가 많음&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;엔지니어들은 '미리 계산한 누계값을 컬럼에 넣어두자'는 유혹을 받을 때가 많음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러지 말아야 함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 누계에 사용된 날짜값의 row 가 업데이트되면, 해당 누계값도 바뀌어야 하는데&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;영향을 받는 누계값이 많다면, 업데이트로 인한 비용이 상당히 많아지게 될 것&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 어떻게 해야하느냐?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;미리 계산한 누계를 컬럼으로 만들거나 하진 말고,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;fact table 의 grain 에 따라, 원천 값만 저장하고&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;누계는 나중에 필요 할 때마다&lt;/b&gt;&lt;b&gt; 계산해서 사용 &lt;/b&gt;(BI 툴 등을 이용하여 계산)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt; Fact Tables 상세 : 종류 &amp;gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Fact table 은 세 가지 종류가 있음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;'Transactional', 'Periodic Snapshot', 'Accumulating Snapshot'&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Transactional Fact Table :&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dB5fJp/dJMcajaPAyN/45wSkaXJZKVO9zSp6DRGWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dB5fJp/dJMcajaPAyN/45wSkaXJZKVO9zSp6DRGWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dB5fJp/dJMcajaPAyN/45wSkaXJZKVO9zSp6DRGWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdB5fJp%2FdJMcajaPAyN%2F45wSkaXJZKVO9zSp6DRGWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;159&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하나의 row 는 하나의 이벤트, 하나의 트랜잭션을 의미함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;가장 낮은 단위의 grain 을 갖음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;가장 흔한 fact table 이며, 매우 유연하다고 함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;많은 dimension tables 와 연결되어 있는 경우가 흔함(FK 를 많이 갖고 있음)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;트랜잭션이 발생할때마다 row 가 하나씩 늘어나는 구조이기 때문에 크기가 크고 양이 늘어나는 속도도 빠름&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Periodic Snapshot Fact Table :&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bujlsd/dJMcagkTGDv/VvcehYKPR9dV3aEXaA9TsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bujlsd/dJMcagkTGDv/VvcehYKPR9dV3aEXaA9TsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bujlsd/dJMcagkTGDv/VvcehYKPR9dV3aEXaA9TsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbujlsd%2FdJMcagkTGDv%2FVvcehYKPR9dV3aEXaA9TsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;170&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하나의 row 는, 특정 기간 동안 쌓인 이벤트 측정값들을 한번에 집계한 값을 의미함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;집계된 값이 row 로 추가되는 구조라 크기가 엄청 크지 않고 늘어나는 속도도 변변찮음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;적은 dimension tables 와 연결되어 있는 경우가 흔함(FK 를 조금만 갖고 있음)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;특정 기간 동안 이벤트가 전혀 발생하지 않았다면 null 혹은 0 으로 표현하게 됨&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Accumulating Snapshot Fact Table :&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zqD4m/dJMcabcN7m0/zEqmwPTRynd0IBKMkKOeRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zqD4m/dJMcabcN7m0/zEqmwPTRynd0IBKMkKOeRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zqD4m/dJMcabcN7m0/zEqmwPTRynd0IBKMkKOeRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzqD4m%2FdJMcabcN7m0%2FzEqmwPTRynd0IBKMkKOeRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;124&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Periodic Snapshot Fact Table 과 비슷하지만, 특정 기간동안 누적 집계한 값이 아닌&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;'특정 행동이 시작하고 끝나는 동안의 이벤트를 누적 집계'한 값을 갖음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 하나의 프로젝트, 하나의 프로세스, 하나의 작업 과정 등&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;택배 운송장 번호로 볼 수 있는 배송 현황(출고부터 도착까지 단계 단계 정보들)이라고 생각하면 이해하기 쉬움&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Accumulating Snapshot&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Fact Table 를 통해 워크플로 분석이나 프로세스 분석, 프로젝트 단계 등을 분석하기 좋음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;셋 중 가장 덜 사용되는 fact table 이라고 함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Date/Time 값을 FK 로 사용하는 경우가 많음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdPLzK/dJMcahKUb7e/AjV0ghKY1huArcrwwY3wrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdPLzK/dJMcahKUb7e/AjV0ghKY1huArcrwwY3wrk/img.png&quot; data-alt=&quot;세 가지 fact 테이블 종류 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdPLzK/dJMcahKUb7e/AjV0ghKY1huArcrwwY3wrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdPLzK%2FdJMcahKUb7e%2FAjV0ghKY1huArcrwwY3wrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;722&quot; height=&quot;241&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;세 가지 fact 테이블 종류 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt; Fact Tables 상세 : Factless Fact Table &amp;gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nnV5H/dJMcaiJLEhl/iPdnhfv21h2U9Il0u4VRU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nnV5H/dJMcaiJLEhl/iPdnhfv21h2U9Il0u4VRU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nnV5H/dJMcaiJLEhl/iPdnhfv21h2U9Il0u4VRU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnnV5H%2FdJMcaiJLEhl%2FiPdnhfv21h2U9Il0u4VRU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;563&quot; height=&quot;330&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caQG7B/dJMcadIsmrZ/hwzSa9fyBPqptqXme7hKe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caQG7B/dJMcadIsmrZ/hwzSa9fyBPqptqXme7hKe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caQG7B/dJMcadIsmrZ/hwzSa9fyBPqptqXme7hKe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaQG7B%2FdJMcadIsmrZ%2FhwzSa9fyBPqptqXme7hKe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;563&quot; height=&quot;140&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;측량된 수치나 숫자값 등이 아닌,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;특정 이벤트 / 특정 거래의 차원적 측면만 기록하는 fact table 이 존재함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 테이블 내에 fact 가 존재하지 않고, (위의 예제와 같이) dimentional 값만 존재함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt; Fact Tables 상세 : Kimball 차원 모델링으로 fact table 디자인하기 &amp;gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;fact table 을 디자인하기 위한 4가지 지침&lt;/b&gt;이 있으며 &lt;b&gt;Kimball 차원 모델링&lt;/b&gt; 이라고 부름&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Kimball&amp;nbsp;차원&amp;nbsp;모델링의 4가지 지침을 잘 따라서 디자인하면 좋은 fact table 이 완성됨&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;비즈니스 프로세스 선택&lt;/b&gt; (Select the Business Process) :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;분석할 핵심 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;비즈니스&lt;span&gt; &lt;/span&gt;&lt;/span&gt;절차(예: 주문, 매출, 클릭)를 정의&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 매출을 분석하고싶은가? 주문 프로세스를 분석하고싶은가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; DAU/MAU를 분석하고 싶은가? 비즈니스 절차를 분석하고 싶은가? 등등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 마케팅, 물류, 결제 등을 한 번에 모델링하려고 하지 말고, &lt;b&gt;하나의 프로세스에 집중&lt;/b&gt;해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;grain 설정&lt;/b&gt; (Declare the Grain) :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; fact table의 &lt;b&gt;단일 행이 나타내는 grain을 가장 상세한 수준으로 결정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 예를 들어, '하나의 주문건', '하룻동안의 판매 정보', '개별 상품 품목' 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 가장 상세한 수준으로 결정해야 나중에 세세한 비즈니스 질문에 답할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;차원 식별&lt;/b&gt; (Identify Dimensions) :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; '누가, 무엇을, 어디서, 왜, 어떻게'에 해당하는 &lt;b&gt;문맥 데이터&lt;/b&gt;(예: 고객, 제품, 시간, 매장)&lt;b&gt;를 정의&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이 정보를 기반으로 Fact table 과 연결(join) 될 &lt;b&gt;Dimension Tables 가 결정&lt;/b&gt;됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 즉, &lt;b&gt;Fact Table 에서 dimension table 과 연결되는 컬럼이 됨&lt;/b&gt;&lt;br /&gt;&amp;nbsp; 예를 들어,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 누가: 고객(Customer)&lt;br /&gt;&amp;nbsp; 언제: 날짜/시간(Date/Time)&lt;br /&gt;&amp;nbsp; 어디서: 배송지/상점(Location)&lt;br /&gt;&amp;nbsp; 무엇을: 상품(Product)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;fact 식별&lt;/b&gt; (Identify Facts) :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 비즈니스 프로세스에서 측정 가능한 수치 데이터&lt;/b&gt;(예: 판매 금액, 수량)&lt;b&gt;를 정의&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 추후 &lt;b&gt;Fact Table 의 컬럼이 됨&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 예를 들어, 판매 수량, 개당 판매 금액, 할인 금액, 세금, 순매출액 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어봄.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 캐나다의 대형 커피 프랜차이즈를 운영하고 있으며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;어떤 매장에서, 어떤 시간대에, 어떤 메뉴가 가장 많이 팔리는지,&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그리고 쿠폰 사용이 매출에 어떤 영향을 주는지&quot;&lt;/b&gt;를 알고 싶음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 비즈니스 프로세스 선택 : &quot;고객의 결제(Point-of-Sale Sales)&quot; 프로세스를 선택&lt;br /&gt;&amp;nbsp; 왜냐면 이것이 매출 분석의 가장 기본이 되는 핵심 활동이기 때문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- grain 설정 : &lt;b&gt;영수증에 찍힌 개별 항목(Line Item) 하나를 grain 으로 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 고객이 어떤 상품을 구매하였는지 row 단위로 알 수 있도록.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 만약 '영수증 한 장'을 단위로 잡으면, 고객이 '커피 3잔', '라떼 2잔' 샀을 때 각각의 판매량을 분석할 수 없게 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 개별 아이템 단위로 잡아야 가장 세밀한 분석이 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 차원 식별 : grain(영수증 항목)을 설명하기 위해 필요한 모든 관점을 나열 (누가, 언제, 어디서, 무엇을)&lt;br /&gt;&amp;nbsp; 날짜(Date): 판매가 일어난 날짜 (연, 월, 일, 요일, 공휴일 여부 등)&lt;br /&gt;&amp;nbsp; 시간(Time): 판매 시간대 (시, 분, 아침/점심/저녁 피크타임 구분 등)&lt;br /&gt;&amp;nbsp; 매장(Store): 판매가 일어난 장소 (밴쿠버 지점, 토론토 지점, 매장 크기 등)&lt;br /&gt;&amp;nbsp; 상품(Product): 팔린 물건 (아메리카노, 라떼, 사이즈, 카테고리 등)&lt;br /&gt;&amp;nbsp; 결제 수단(Payment): 신용카드, 현금, 모바일 페이 등&lt;br /&gt;&amp;nbsp; 프로모션(Promotion): 적용된 쿠폰이나 할인 이벤트 이름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- fact 식별 : &lt;b&gt;영수증 항목 하나당 기록될 '숫자(측정값)'를 정함&lt;/b&gt;&lt;br /&gt;&amp;nbsp; 판매 수량 (Quantity): 몇 잔 팔렸나? (Additive)&lt;br /&gt;&amp;nbsp; 총 판매 금액 (Gross Revenue): 할인 전 가격 (Additive)&lt;br /&gt;&amp;nbsp; 할인 금액 (Discount Amount): 쿠폰 등으로 깎아준 금액 (Additive)&lt;br /&gt;&amp;nbsp; 순 판매 금액 (Net Revenue): 실제 결제된 금액 (Additive)&lt;br /&gt;&amp;nbsp; 단가 (Unit Price): 상품 하나당 가격 (Non-additive) - 합산하지 않고 참조용으로만 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 Fact Table 은 다음과 같이 생성됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmU4qh/dJMcafM7rKa/1xPkD6DDsslLVrI1i69bR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmU4qh/dJMcafM7rKa/1xPkD6DDsslLVrI1i69bR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmU4qh/dJMcafM7rKa/1xPkD6DDsslLVrI1i69bR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmU4qh%2FdJMcafM7rKa%2F1xPkD6DDsslLVrI1i69bR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;470&quot; height=&quot;411&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;lt; Fact Tables 상세 : PK 로 사용할 컬럼 정하기 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fact Table, Dimension Table 모두 natural key 보다 surrogate key 를 사용하는 것이 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(단, natural key 중 '날짜값'은 PK 로 사용 가능함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- natural key 는 길고 복잡한 경우가 많기 때문에 상대적으로 간단한 surrogate key를 사용하는 것이 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 간단한 key 로 PK-FK 를 설정하게 되면 join 성능에 긍정적인 영향을 줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- natural key 는 업데이트 되는 경우가 있기 때문에 변하지 않을 surrogate key 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 여러 source 로부터 데이터를 가져왔는데 하필 natural key 들이 서로 겹치는 상황이 발생하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; surrogate key를 사용하여 데이터를 구분할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- natural key 가 '알 수 없음', null 등의 값일 때 surrogate key 를 사용하면 -1, 9999 등으로 대체해서 사용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dThM4P/dJMcahjRXex/Wvj7zQEWtDjF9MbzO0DNJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dThM4P/dJMcahjRXex/Wvj7zQEWtDjF9MbzO0DNJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dThM4P/dJMcahjRXex/Wvj7zQEWtDjF9MbzO0DNJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdThM4P%2FdJMcahjRXex%2FWvj7zQEWtDjF9MbzO0DNJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;341&quot; height=&quot;276&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 natural key 는 버려야하는가? 하는 질문을 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;natural key 는 버려도 되지만, 비즈니스적 의미는 갖고 있기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;look up 테이블 하나를 만들어서 surrogate key 와 natural key 를 연결시켜 natural key 도 남기는 방법을 추천함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;분석가 등의 사용자 입장에선 surrogate key 보다 natural key 로 쿼리하는 것이 더 자연스러움&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;surrogate key 가 존재해도&amp;nbsp;&lt;/span&gt;natural key 의 '유일성'이 사라지는 것은 아니기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;surrogate key (PK) 가 다르지만 동일하게 처리해야 하는 rows 를 natural key 로 묶어줄 수 있음&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;예를 들어 kim 이 이사가서 주소가 바뀐 경우(SCD type2로 처리)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Row 1: SK: 101, NK: kim@email.com, City: Vancouver, Current: N&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Row 2: SK: 505, NK: kim@email.com, City: Toronto, Current: Y&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 Surrogate Key 는 서로 다르지만, Natural Key 는 동일하기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 둘이 같은 사람이구나! 라는 것을 알 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, &lt;b&gt;source DB 를 뒤져봐야 하는 경우 Natural Key 를 사용할 수 있음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐면 surrogate key 는 우리가 만든 값이고 sourceDB 에는 없으니까&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;lt; Conformed Dimension Tables &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/urAY9/dJMcaaE2m77/7g02JS1jfH78EhI3yxRsO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/urAY9/dJMcaaE2m77/7g02JS1jfH78EhI3yxRsO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/urAY9/dJMcaaE2m77/7g02JS1jfH78EhI3yxRsO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FurAY9%2FdJMcaaE2m77%2F7g02JS1jfH78EhI3yxRsO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;614&quot; height=&quot;298&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로 다른 두 fact tables 이 공유하는 dimension table을 Conformed Dimension Tables 라고 하며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로 다른 두 fact tables 을 공통된 차원(예: 날짜, 매장 등)을 기준으로 연결하여 분석하는 행위를 Drill across 라고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 &lt;b&gt;dimension 을 연결&lt;/b&gt;함으로써 &lt;b&gt;두 가지 fact tables&lt;/b&gt; (위 예제의 sales 와 cost)를 &lt;b&gt;같이 연결하여 분석 가능함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dapPg4/dJMcacbKYV3/kkP2bHr5DrpJ8Cj0HGqO70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dapPg4/dJMcacbKYV3/kkP2bHr5DrpJ8Cj0HGqO70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dapPg4/dJMcacbKYV3/kkP2bHr5DrpJ8Cj0HGqO70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdapPg4%2FdJMcacbKYV3%2FkkP2bHr5DrpJ8Cj0HGqO70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;345&quot; height=&quot;101&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이, 날짜(Time/Date) dimension 을 연결함으로써,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 월의 비용cost 과 판매sales 를 같이 비교, 분석 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdTD7o/dJMcagL04S7/qgByXkpSpo2UYE36tUbdG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdTD7o/dJMcagL04S7/qgByXkpSpo2UYE36tUbdG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdTD7o/dJMcagL04S7/qgByXkpSpo2UYE36tUbdG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdTD7o%2FdJMcagL04S7%2FqgByXkpSpo2UYE36tUbdG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;365&quot; height=&quot;328&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 스샷은 서로 다른 두 개의 fact tables 가 하나의 conformed dimension table 을 사용할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로 다른 FK 를 사용하도록 설정된 것임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 가능한 이유는, dimension table 에 Date_FK 와 DateMonth_FK 가 join 할 수 있는 컬럼들이 모두 있기 때문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciCUjt/dJMcaa55Jkj/vQfbHOWg8kYKJ3Nkr38km0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciCUjt/dJMcaa55Jkj/vQfbHOWg8kYKJ3Nkr38km0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciCUjt/dJMcaa55Jkj/vQfbHOWg8kYKJ3Nkr38km0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciCUjt%2FdJMcaa55Jkj%2FvQfbHOWg8kYKJ3Nkr38km0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;528&quot; height=&quot;121&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Sales Fact Table 과 조인할 때 : Fact_Sales.Date_FK (20220101) = Date_SK&lt;br /&gt;- Cost Fact&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Table 과 조인할 때&lt;/span&gt;: Fact_Cost.DateMonth_FK (2022-01) = Month_SK&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 Drill Across 수행하는 SQL 예시&lt;/p&gt;
&lt;pre id=&quot;code_1776724689930&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 1. 일 단위 매출을 월 단위로 집계
WITH monthly_sales AS (
    SELECT d.Month_SK, SUM(s.amount) as total_sales
    FROM Fact_Sales s
    JOIN Dim_Date d ON s.Date_FK = d.Date_SK  -- 일 단위 조인
    GROUP BY d.Month_SK
),
-- 2. 월 단위 비용 집계
monthly_cost AS (
    SELECT DateMonth_FK as Month_SK, SUM(cost) as total_cost
    FROM Fact_Cost  -- 이미 월 단위이므로 바로 집계
    GROUP BY DateMonth_FK
)
-- 3. 공통 차원(Month_SK)을 기준으로 Drill Across
SELECT s.Month_SK, s.total_sales, c.total_cost
FROM monthly_sales s
JOIN monthly_cost c ON s.Month_SK = c.Month_SK;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비록&amp;nbsp;팩트&amp;nbsp;테이블에&amp;nbsp;저장된&amp;nbsp;FK의&amp;nbsp;형태나&amp;nbsp;상세도는&amp;nbsp;다르지만,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이들이 바라보는 Dim_Date라는 마스터 테이블은 하나임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;두&amp;nbsp;팩트&amp;nbsp;테이블의&amp;nbsp;FK&amp;nbsp;값이&lt;/b&gt;&amp;nbsp;20220101과&amp;nbsp;2022-01로&amp;nbsp;&lt;b&gt;서로&amp;nbsp;다르더라도&lt;/b&gt;,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값들이 &lt;b&gt;동일한 차원 테이블의 유효한 키(혹은 속성)라면 Drill across 분석에 아무런 문제가 없음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FK의 모양이 같은 게 중요한 것이 아니라, 차원 테이블 내의 속성 정의(이름, 범위, 값의 의미)가 전사적으로 동일해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; 그 외 Dimension tables 종류 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Degenerate Dimensions : 속성&amp;nbsp;정보가&amp;nbsp;거의&amp;nbsp;없고,&amp;nbsp;오직&amp;nbsp;식별&amp;nbsp;번호만&amp;nbsp;의미가&amp;nbsp;있는&amp;nbsp;경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Dimension table 로 따로 설정하지 않고, &lt;b&gt;바로 fact table 에 직접 저장&lt;/b&gt;함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 예를 들어 영수증 번호, 송장 번호 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;영수증 번호는 그 자체로 의미가 있을 뿐 추가로 설명할 속성이 없음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이를 위해 Dimension table 을 만들면 join 만 늘어남&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (이런 개념이 왜 필요한거지? 왜 설명한거야 이건..? 그냥 fact table 의 일반적인 컬럼 중 하나 아니야?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;gt; '&lt;b&gt;dimension' 이라는 것은, 데이터를 식별하고 묶어주는 핵심적인 역할&lt;/b&gt;인데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 영수증 번호, 송장 번호 등의 값은 'dimension' 역할이 가능하기 때문에 차원이라고 부르는 것임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 표면상으로 보면 그냥 fact table 의 컬럼 중 하나일 뿐임)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Junk Dimensions : fact table 에 있는 여러 개의 자잘한 flag, indicator 등을 모아둔 dimension table&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Y/N, 1/0 등으로 나타나는 컬럼들.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;예를 들어,&lt;span&gt; 결제 여부(Y/N), 성별(0,1), 취소 여부(Y/N), 배송 여부(Y/N) 등&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp; fact table 에서 발생 가능한 모든 조합(Y/Y/N, N/N/N, N/Y/Y 등)을 미리 계산해두고 dimension table 로 만들고 연결&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp; 왜 이렇게하느냐?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 플래그들이 너무 많아서 Fact 테이블이 너무 넓어지는 것을 방지하기 위함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Role-playing Dimensions :&amp;nbsp;하나의 Fact&amp;nbsp;테이블에서&amp;nbsp;여러&amp;nbsp;가지&amp;nbsp;역할로&amp;nbsp;재사용되는 Dimensions table.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 예를 들어 fact table 에 주문일, 배송일, 결제일 세 가지 날짜 컬럼이 존재&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 그리고 우리는 Dim_Date 라는 dimension table 하나만 만들고, 주문일/배송일/결제일 분석에 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; JOIN&amp;nbsp;Dim_Date&amp;nbsp;AS&amp;nbsp;Order_Date&amp;nbsp;ON&amp;nbsp;...&lt;br /&gt;&amp;nbsp; JOIN Dim_Date AS Ship_Date ON ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 동일한 구조와 데이터를 가진 dimension table을&lt;/b&gt; &lt;b&gt;논리적으로&amp;nbsp;분리하여&amp;nbsp;사용&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이는 데이터 일관성을 유지하기 위함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;lt; SCD(Slowly Changing Dimension) &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dimension Table 데이터가, 시간이 지남에 따라 어떻게 변화를 관리할 것인가를 다루는 개념&lt;br /&gt;Dimension Table 의 속성이 변경될 때, 그 변경 사항을 어떤 방식으로 반영할지를 정의하는 전략&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 전략을 사용할지 결정하는 것은 '비즈니스 사용자'들임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분석가들이 '이력도 필요해요'라고 하면 type2를 사용하는 것이고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'절대 바뀌면 안 되는 값이에요' 하면 type0 을 사용하는 것이지&lt;br /&gt;&lt;br /&gt;고객 정보, 제품 정보, 주소, 부서 같은 차원 데이터는 (자주는 아니고) 가끔씩 변하기 때문에 &quot;Slowly Changing&quot; 이라고 부름&lt;br /&gt;&lt;br /&gt;주요&amp;nbsp;유형&amp;nbsp;(Type&amp;nbsp;0&amp;nbsp;~&amp;nbsp;Type&amp;nbsp;3)&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;SCD&amp;nbsp;Type&amp;nbsp;0&amp;nbsp;&amp;ndash;&amp;nbsp;변경&amp;nbsp;없음&lt;br /&gt;-&amp;nbsp;변경이&amp;nbsp;발생해도&amp;nbsp;원래&amp;nbsp;값을&amp;nbsp;그대로&amp;nbsp;둠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터의 정체성을 유지하기 위함.&lt;br /&gt;- 예시: 생년월일, 최초 가입일, 원래 주문번호, 이름(고객 이름을 바꾸더라도, 데이터 웨어하우스에는 최초 등록된 이름만 저장)&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;SCD&amp;nbsp;Type&amp;nbsp;1&amp;nbsp;&amp;ndash;&amp;nbsp;덮어쓰기&amp;nbsp;(Overwrite)&lt;br /&gt;-&amp;nbsp;변경&amp;nbsp;발생&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;b&gt;과거는&lt;/b&gt;&amp;nbsp;&lt;b&gt;중요하지&lt;/b&gt;&amp;nbsp;&lt;b&gt;않고&lt;/b&gt;&amp;nbsp;&lt;b&gt;최신&amp;nbsp;상태만&amp;nbsp;필요한&amp;nbsp;경우에&amp;nbsp;사용&lt;/b&gt;&lt;br /&gt;- 예시 : 전화번호(과거 전화번호는 의미가 없음), 이메일 주소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 고객 주소가 &quot;서울&quot; &amp;rarr; &quot;부산&quot;으로 변경되면 차원 테이블에는 부산만 남음.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;과거에&amp;nbsp;고객이&amp;nbsp;서울에&amp;nbsp;살았다&quot;는&amp;nbsp;정보는&amp;nbsp;알&amp;nbsp;수&amp;nbsp;없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 과거 데이터를 포함하여 집계하는 경우, (업데이트가 진행된)현재 속성이 적용되어 데이터 왜곡이 발생할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 즉, &lt;b&gt;과거 데이터 값들이 현재 정보 기준으로 집계되는 문제가 발생할 수 있음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;3. SCD Type 2 &amp;ndash; 이력 관리 (History Tracking). Default Strategy&lt;br /&gt;- 변경 발생 시 &lt;b&gt;데이터의&amp;nbsp;과거&amp;nbsp;이력을&amp;nbsp;보존하기&amp;nbsp;위해&lt;/b&gt;&amp;nbsp;&lt;b&gt;새로운&amp;nbsp;row를&amp;nbsp;추가&lt;/b&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;(start_date)&amp;nbsp;/&amp;nbsp;효력&amp;nbsp;종료일&amp;nbsp;(end_date)&amp;nbsp;/&amp;nbsp;is_current&amp;nbsp;같은&amp;nbsp;컬럼을&amp;nbsp;둠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;예시&amp;nbsp;:&amp;nbsp;고객&amp;nbsp;주소가&amp;nbsp;&quot;서울&quot;&amp;nbsp;-&amp;gt;&amp;nbsp;&quot;부산&quot;&amp;nbsp;으로&amp;nbsp;변경되었다면&amp;nbsp;차원&amp;nbsp;테이블에는&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;row&amp;nbsp;가&amp;nbsp;다&amp;nbsp;들어있게&amp;nbsp;됨&lt;br /&gt;&amp;nbsp;&amp;nbsp;고객&amp;nbsp;&amp;nbsp;주소&amp;nbsp;&amp;nbsp;create_time&amp;nbsp;&amp;nbsp;update_time&amp;nbsp;&amp;nbsp;is_current&lt;br /&gt;&amp;nbsp;&amp;nbsp;eye&amp;nbsp;&amp;nbsp;부산&amp;nbsp;&amp;nbsp;&amp;nbsp;1991-06-25&amp;nbsp;&amp;nbsp;&amp;nbsp;2025-11-04&amp;nbsp;&amp;nbsp;Y&lt;br /&gt;&amp;nbsp;&amp;nbsp;eye&amp;nbsp;&amp;nbsp;서울&amp;nbsp;&amp;nbsp;&amp;nbsp;1991-06-25&amp;nbsp;&amp;nbsp;&amp;nbsp;1991-06-25&amp;nbsp;&amp;nbsp;N&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 예시 : 이커머스에서 카테고리가 재분류(Electronics -&amp;gt; Fashion)되었다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Product_SK&amp;nbsp; Prod_ID (NK)&amp;nbsp; Category&amp;nbsp; &amp;nbsp; &amp;nbsp;Start_Date&amp;nbsp; &amp;nbsp;End_Date&amp;nbsp; &amp;nbsp; &amp;nbsp;Is_Current&lt;br /&gt;&amp;nbsp; 77&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;W-100&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Electronics&amp;nbsp; 2025-01-01&amp;nbsp; 2026-04-15&amp;nbsp; &amp;nbsp;N&lt;br /&gt;&amp;nbsp; 89&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;W-100&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Fashion&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2026-04-16&amp;nbsp; 9999-12-31&amp;nbsp; &amp;nbsp;Y&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dimension table 이 업데이트(동일한 제품의 카테고리만 업데이트) 된 이후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;fact table 는&lt;span&gt; &lt;/span&gt;&lt;/span&gt;Product_SK 가 77대신 89를 사용하여 row 를 만들게 될 것임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;W-100의 총 매출&quot; 등의 쿼리를 하려고 where sk=89 처럼 쿼리하면 77을 갖고있던 row를 다 무시하게 될 것임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우,&lt;b&gt; natural key를 사용하여 dimension table PK 는 다르지만 서로 동일한 제품이구나!를 파악함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT D.prod_id, SUM(F.amount)&lt;br /&gt;FROM fact_table F&lt;br /&gt;JOIN dim_table D&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ON F.product_fk = D.product_sk&lt;br /&gt;&lt;b&gt;WHERE D.Prodid = 'W-100'&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GROUP BY D.prod_id&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- 예시 : 고객 주소가 Vancouver 에서 Toronto 로 변경되었다면,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 과거가 되어버린 데이터의 end_date 를 &quot;변경된 날의 어제 날짜(yesterday)&quot; 로 설정하고&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 새롭게 추가된 데이터의 start_date를 &quot;변경된 날&quot; 로 설정. end_date는 먼 미래로 설정&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Customer_SK&amp;nbsp; Email (NK)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;City&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Start_Date&amp;nbsp; &amp;nbsp; End_Date&amp;nbsp; &amp;nbsp; Is_Current&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 101&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;kim@mail.com&amp;nbsp; Vancouver&amp;nbsp; 2025-11-01&amp;nbsp; 2026-02-02&amp;nbsp; N&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 505&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;kim@mail.com&amp;nbsp; Toronto&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2026-02-03&amp;nbsp; 9999-12-31&amp;nbsp; Y&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 &quot;kim 의 총 매출을 보여주고, 현재 어느 도시(Toronto)에 사는지도 같이 표시해줘&quot; 라고 쿼리해야 한다면&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;is_current 가 y 인 것을 추가로 필터링해줘야 함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SELECT&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d_curr.email,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d_curr.city&amp;nbsp;AS&amp;nbsp;current_city,&amp;nbsp;--&amp;nbsp;현재&amp;nbsp;살고&amp;nbsp;있는&amp;nbsp;도시(Toronto)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SUM(f.sales_amount)&amp;nbsp;AS&amp;nbsp;total_sales&lt;br /&gt;FROM&amp;nbsp;fact_sales&amp;nbsp;f&lt;br /&gt;JOIN dim_customer d_all ON f.customer_sk = d_all.customer_sk -- 과거/현재 모든 SK와 조인하고 그리고&lt;br /&gt;&lt;b&gt;JOIN&amp;nbsp;dim_customer&amp;nbsp;d_curr&amp;nbsp;ON&amp;nbsp;d_all.email&amp;nbsp;=&amp;nbsp;d_curr.email&amp;nbsp;--&amp;nbsp;같은&amp;nbsp;이메일&amp;nbsp;중&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; AND d_curr.is_current = 'Y' -- 현재 유효한 행의 정보만 가져옴.&lt;/b&gt;&lt;br /&gt;GROUP BY d_curr.email, d_curr.city;&amp;nbsp; -- is_current='Y' 에 매칭되는 email, city 단 하나씩만 나옴.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 예제에서 총 세 개의 테이블이 합쳐짐&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. fact_sales (fact_table) : d_all 과 조인되어, dim_customer 정보를 모두 fact_table 로 가져옴&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. d_all : 아무런 필터나 추가 조치없이 그냥 fact_table 에 그대로 존재하는 dimension table&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. d_curr : is_current='Y' 인 email 과 city 만 갖고옴. d_all 와 join 후, d_all 의 모든 row 에 매칭됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;End_Date 를 '9999-12-31' 처럼 &lt;b&gt;현재 유효한 데이터의 종료일을 크게 잡은 이유&lt;/b&gt;는,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리에서 WHERE '2026-04-24' BETWEEN Start_Date AND End_Date 처럼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 시점의 유효 데이터를 찾기 매우 편해지기 때문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최신 정보만 필요할 때, WHERE Is_Current = 'Y' 필터를 걸어 성능 최적화 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;4.&amp;nbsp;SCD&amp;nbsp;Type&amp;nbsp;3&amp;nbsp;&amp;ndash;&amp;nbsp;제한된&amp;nbsp;이력&amp;nbsp;관리&lt;br /&gt;-&amp;nbsp;변경&amp;nbsp;&lt;b&gt;전/후&amp;nbsp;값을&amp;nbsp;컬럼으로&lt;/b&gt; 저장. &lt;b&gt;행을 새로 만들지 않고, 테이블에 '이전 값(Previous Value)' 컬럼을 추가하여 이력 관리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 두 번 이상 업데이트하면 과거 데이터부터 소실됨&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;eye&amp;nbsp;&amp;nbsp;부산&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;서울&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; 논리적 성능 최적화 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kimball 모델링을 따라 fact, dim tables 를 star schema 로 만든다고 하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- dim table 에 Surrogate Key 를 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이유는 위의 &quot;&amp;lt;&amp;nbsp;Fact&amp;nbsp;Tables&amp;nbsp;상세&amp;nbsp;:&amp;nbsp;PK&amp;nbsp;로&amp;nbsp;사용할&amp;nbsp;컬럼&amp;nbsp;정하기&amp;nbsp;&amp;gt;&quot; 부분을 참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 비즈니스별로 SCD type 을 고려&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; history tracking 이 필요한 비즈니스에서는 type2가 필요하지만&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 굳이 필요없다면 공간 낭비, search query 성능 낭비해가면서 history 를 유지할 필요 없는 type1 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- snowfalke schema 보다는 star schema (비정규화 진행)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;dim table&lt;span&gt; 내 데이터 &lt;/span&gt;&lt;/span&gt;중복 관리와 사이즈가 커지는 문제보다, join 으로 인한 성능 하락 이슈가 더 크리티컬하기 때문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; 물리적 성능 최적화 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kimball 모델링을 따라 fact, dim tables 를 star schema 로 만든다고 하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Partitioning, Bucketing&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; fact tables 를 날짜 단위로 파티셔닝함(물론 '날짜' 뿐만 아니라 cardinality 가 낮은 '지역' 등으로 해도 됨..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; partition pruning 을 통해 IO 를 획기적으로 줄일 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 하지만 cardinality 가 높은 key 로 파티셔닝하게되면 small file problem 을 발생시킬 수 있으니 조심&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; bucketing 을 통해 shuffle 을 피하여 join 성능을 올릴 수 있지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; bucketing 이 진행된 key 기준으로만 join 성능이 좋다는 단점이 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 또 '한 번 정한 버켓의 개수'를 늘릴 수 없다는 단점이 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 따라서 데이터가 추가, 업데이트 되는 것을 반영하지 못하거나, 재처리해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (&lt;a href=&quot;https://eyeballs.tistory.com/206&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://eyeballs.tistory.com/206&lt;/a&gt;&amp;nbsp; 의 &amp;lt; join 및 shuffle 이 진행되는 구체적인 과정 &amp;gt; 부분 참고)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Columnar Storage 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이건 parquet, orc 를 말하는 것임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; filter pushdown 을 통해 IO 를 줄일 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Periodic Snapshot Fact Table 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 거대한 fact table 대상으로 자주 집계를 진행하는 부하를 줄이고자,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 자주 처리되는 집계값을 미리 계산해 둔 table 을 만들어서 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 엄밀히 말하면, Periodic Snapshot Fact Table 는 쿼리 최적화를 위한 테이블은 아니고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 필요한 값을 미리 계산해둬서, 사용자가 계산 할 필요가 없게 만들어주는 테이블임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 시점별 상태를 기록하는 용도로 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;Materialized view 를 사용&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Periodic snapshot fact table 과 비슷하면서도 조금 다른 기능&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Materialized view 는 DB엔진 자체에서 추가해주는 기능임&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 사용자는 쿼리 실행시 Materialized view 의 존재를 모르고 쿼리하고,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; DB에서 Materialized view 를 사용하여 쿼리 처리함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Materialized view 는 DB 엔진에 의해 자동으로 채워짐(incremental 혹은 full 방식으로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;nbsp; join 은 broadcast join 으로&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;a href=&quot;https://eyeballs.tistory.com/206&quot;&gt;https://eyeballs.tistory.com/206&lt;/a&gt;&amp;nbsp; 의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt; join 및 shuffle 이 진행되는 구체적인 과정 &amp;gt; 부분 참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Iceberg, Hudi 의 bloom filter indexing 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 검색시, &quot;내가 찾는 데이터가 확실히 없는 파일&quot;을 건너뛸 수 있어서 full scan 방지 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- parquet 데이터 저장 할 때는 정렬한 후에 저장&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; parquet 포맷을 사용하여 데이터를 저장하기 전에 정렬을 미리 해두고 저장해야 좋음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 그래야 parquet 파일별로 각기 의미있는 통계 메타데이터가 갖춰지고, 이를 이용해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Predicate pushdown&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;가능&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 예를 들어, product_key 1번부터 1000번까지의 데이터가 (정렬하지 않은 상태로) 모든 파일에 골고루 퍼져 있다면&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 어떤 파일을 열어도 메타데이터 통계 값에 Min: 1, Max: 1000이 기록되니, 의미가 없게됨&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 만약 정렬된 상태로 저장했다면, 첫번째 파일에 1~100번, 두번째 파일에 101~200번... 등의 통계값이 저장되고&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; predicate pushdown 에 적합하게 됨&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (parquet&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;추가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;설명 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://eyeballs.tistory.com/241&quot;&gt;https://eyeballs.tistory.com/241&lt;/a&gt;)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dimension table (FK) 를 사용해서 fact table 을 쿼리하는 것은 어떤 의미에서 성능향상이 되는걸까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;join 시 사용되는 FK 의 특정값을 이용하여 (predicate pushdown 을 통해) IO 비용을 줄일 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;partitining 을 진행할때는 cardinality 가 낮은(지역, 날짜 등) FK 대상으로만 진행해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(그러지 않으면 small file problem 발생..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면, FK만 쓴다고 빨라지는 것이 아니라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FK를 기준으로 데이터를 &lt;b&gt;물리적으로 정렬하여 저장&lt;/b&gt;했기 때문에 엔진이 메타데이터를 보고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'안 읽어도 되는 파일'을 걸러낼 수 있어서 빠른 것 (&lt;b&gt;predicate pushdown&lt;/b&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 'parquet 데이터 저장 할 때는 정렬한 후에 저장'하라고 썼는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 저장을 어떻게 하느냐에 따라 predicate pushdown 성능이 달라질 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Z-ordering 이라는 정렬 방법을 사용하면, 여러 컬럼을 동시에 정렬 기준으로 삼을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 parquet 등이 갖는 메타데이터를 이용하여 (predicate pushdown 을 통해) IO 를 줄일 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, '안 읽어도 되는 파일'은 읽지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;일반적인 정렬 (ORDER BY date, region) 을 진행하고 저장하는 경우&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;File 1: (1일, A), (1일, B), (1일, C), (1일, D)&lt;br /&gt;File 2: (2일, A), (2일, B), (2일, C), (2일, D)&lt;br /&gt;File 3: (3일, A), (3일, B), (3일, C), (3일, D)&lt;br /&gt;File&amp;nbsp;4:&amp;nbsp;(4일,&amp;nbsp;A),&amp;nbsp;(4일,&amp;nbsp;B),&amp;nbsp;(4일,&amp;nbsp;C),&amp;nbsp;(4일,&amp;nbsp;D)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;만약 WHERE region = 'A' 같은 쿼리를 날리면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메타데이터를 통해 모든 파일에 다 A 가 존재하는 것을 보고 모든 파일을 다 열어보게 됨 (=full scan)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;File 1: region (metadata Min: A, Max: D) -&amp;gt; &quot;A가 구간 안에 있네? 읽어야 함&quot;&lt;br /&gt;File 2: region (&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;metadata&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Min: A, Max: D) -&amp;gt; &quot;A가 구간 안에 있네? 읽어야 함&quot;&lt;br /&gt;File 3: region (&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;metadata&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Min: A, Max: D) -&amp;gt; &quot;A가 구간 안에 있네? 읽어야 함&quot;&lt;br /&gt;File&amp;nbsp;4:&amp;nbsp;region&amp;nbsp;(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;metadata&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Min:&amp;nbsp;A,&amp;nbsp;Max:&amp;nbsp;D)&amp;nbsp;-&amp;gt;&amp;nbsp;&quot;A가&amp;nbsp;구간&amp;nbsp;안에&amp;nbsp;있네?&amp;nbsp;읽어야&amp;nbsp;함&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Z-Ordering (ZORDER(date, region)) 으로 저장하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 'Z'자 모양의 곡선을 그리며 순서대로 번호를 매겨 저장하게 됨&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;File 1: (1일, A), (1일, B), (2일, A), (2일, B) -&amp;gt; [1~2일, A~B지역 모음]&lt;br /&gt;File 2: (1일, C), (1일, D), (2일, C), (2일, D) -&amp;gt; [1~2일, C~D지역 모음]&lt;br /&gt;File 3: (3일, A), (3일, B), (4일, A), (4일, B) -&amp;gt; [3~4일, A~B지역 모음]&lt;br /&gt;File&amp;nbsp;4:&amp;nbsp;(3일,&amp;nbsp;C),&amp;nbsp;(3일,&amp;nbsp;D),&amp;nbsp;(4일,&amp;nbsp;C),&amp;nbsp;(4일,&amp;nbsp;D)&amp;nbsp;-&amp;gt;&amp;nbsp;[3~4일,&amp;nbsp;C~D지역&amp;nbsp;모음]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WHERE region = 'A' 같은 쿼리를 날리면&lt;br /&gt;메타데이터를 통해 몇몇 파일에만 A 가 존재하는 것을 보고 필요한 파일들만 열어보게 됨&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;File 1: region (Min: A, Max: B) -&amp;gt; &quot;A가 구간 안에 있네? 읽음&quot;&lt;br /&gt;File 2: region (Min: C, Max: D) -&amp;gt; &quot;A가 구간 밖에 있네? 안 읽음&quot;&lt;br /&gt;File 3: region (Min: A, Max: B) -&amp;gt; &quot;A가 구간 안에 있네? 읽음&quot;&lt;br /&gt;File 4: region (Min: C, Max: D) -&amp;gt; &quot;A가 구간 밖에 있네? 안 읽음&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 보면 효율이 좋지만, &lt;b&gt;반대로 생각하면, 날짜 기준으로 쿼리했을 때 성능이 떨어진다는 단점이 있음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;z-ordering 을 고려해야하는 상황은, 다양한 컬럼으로 where 조건을 걸고 검색하는 경우가 잦을 때.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Z-Ordering 와 파티셔닝과 차이점 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 파티셔닝은 디렉토리를 물리적으로 쪼개는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Z-Ordering은 &lt;b&gt;파일 내부의 데이터를 재배치&lt;/b&gt;하여 메타데이터(Min/Max)의 효율을 극대화하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;파티셔닝을 날짜, 지역으로 설정한 상황을 가정해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 파티셔닝 되어있을 것임&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;s3://my-data-lake/fact_sales/&lt;br /&gt;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;date=2025-10-22/&lt;br /&gt;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;region=seoul/&lt;br /&gt;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;data_file_1.parquet&lt;br /&gt;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;data_file_2.parquet&lt;br /&gt;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;region=vancouver/&lt;br /&gt;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;data_file_3.parquet&lt;br /&gt;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;date=2025-10-23/&lt;br /&gt;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;region=seoul/&lt;br /&gt;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;region=vancouver/&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여기서 '나는 지역으로만 필터링하고 싶다!' 라면, 모든 데이터를 다 검색해야 함....&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;partitioning 과 z-ordering 을 함께 사용하면 IO 를 획기적으로 줄일 수 있겠지...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 조건절에 자주 등장하는 컬럼 기준으로 partitioning 하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 partition내부 파일들을 z-ordering 하는 방식.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; 데이터 모델링 실습 : 은행 거래 데이터 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0. raw data : 은행 간 계좌이체 진행시 기록되는 로그 데이터&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;trans_id,timestamp,sender_id,sender_name,receiver_id,amount,trans_type,bank_code,bank_name,status&lt;br /&gt;TXN_550,2026-05-05&amp;nbsp;10:30:00,user_kim,김건우,user_lee,50000,폰뱅킹,088,신한은행,성공&lt;br /&gt;TXN_551,2026-05-05&amp;nbsp;11:00:15,user_park,박지성,user_kim,120000,ATM,004,국민은행,성공&lt;br /&gt;TXN_552,2026-05-05&amp;nbsp;11:15:20,user_lee,이강인,user_choi,15000,앱결제,090,카카오뱅크,실패&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;비즈니스&amp;nbsp;프로세스&amp;nbsp;선택&amp;nbsp;(Select&amp;nbsp;the&amp;nbsp;Business&amp;nbsp;Process)&lt;br /&gt;이 파트에서는 'raw 데이터로부터 어떤 집계를 할 수 있을까' 하는 의문에 답을 해 봄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계좌이체 데이터가 있으니, '흠, 시간대별 자금이 어떻게 흐르는지 확인할 수 있겠군',&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'아니면 은행 간 거래 비중이 얼마나 되는지 볼까?',&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'혹은 송금 실패율을 확인해볼까?' 등을 꼽아볼 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 비즈니스 프로세스는 '자금&amp;nbsp;이체(Fund&amp;nbsp;Transfer)&amp;nbsp;이벤트'&lt;br /&gt;&lt;br /&gt;2단계: grain 설정 (Declare the Grain)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파트에서는 가장 낮은 수준으로 fact table 의 row 를 구성할 수 있도록 설정함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &quot;한 명의 사람이 하나의 방법으로 다른 한 사람에게 이체한 기록 한 건&quot; 처럼 가장 작은 단위를 grain 으로 설정할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grain 은 이렇게 설정해두고, '일일 송금 한도'나 '월간 총 이체액' 같은 건 나중에 집계해서 보게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3단계:&amp;nbsp;차원&amp;nbsp;식별&amp;nbsp;(Identify&amp;nbsp;the&amp;nbsp;Dimensions)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고정값을 갖는 dimension 으로 그룹지을 수 있는 컬럼들을 묶어서 dimension table 로 만듦&lt;br /&gt;날짜시간(Date/Time), 보낸이(Sender), 받는이(Receiver), 거래 수단(Transfer Method), 은행정보(Bank), 거래 상태(Status)&lt;br /&gt;여기서 보낸이, 받는이는 하나의 dimension table 로 처리 가능하기 때문에, Role-playing Dimension table 로 사용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4단계:&amp;nbsp;사실&amp;nbsp;식별&amp;nbsp;(Identify&amp;nbsp;the&amp;nbsp;Facts)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분석의 대상이 되는 '측정 가능한 수치값'들을 여기에 넣으면 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이체 금액(Amount), 거래 소요 시간(Latency), 수수료(Fee)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상식적으로 생각해서, dimension table 에 들어가면 길이가 엄청 길어지겠다..싶은 것들은 fact table 에 남겨둬야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이체금액 정보 같은 데이터는 계속해서 생성되는 정보니까 당연히 fact table 에 넣어야 함&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 이를 통해 만들어 본 fact table&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;date_key&amp;nbsp;(FK),sender_key&amp;nbsp;(FK),receiver_key&amp;nbsp;(FK),bank_key&amp;nbsp;(FK),method_key&amp;nbsp;(FK),amount&amp;nbsp;(Fact),fee&amp;nbsp;(Fact),status&lt;br /&gt;20260505,1001 (강하지),1002 (이강인),88,1,50000,500,1(성공)&lt;br /&gt;20260505,1003 (박지성),1001 (정승범),4,2,120000,0,0(실패)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;date 는 왜 dimension table로 만드는걸까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이, 미리 연/월/일/요일/분기 등 다양한 시간 속성을 미리 만들어두면 쿼리 성능과 편의성이 크게 향상되기 때문&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;CREATE&amp;nbsp;TABLE&amp;nbsp;dim_date&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;date_key&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INT&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;PRIMARY&amp;nbsp;KEY,&amp;nbsp;&amp;nbsp;--&amp;nbsp;고유키&amp;nbsp;(예:&amp;nbsp;20230101)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;full_date&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DATE&amp;nbsp;NOT&amp;nbsp;NULL,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;nbsp;실제&amp;nbsp;날짜&amp;nbsp;(YYYY-MM-DD)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;year&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INT&amp;nbsp;NOT&amp;nbsp;NULL,&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;quarter&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INT&amp;nbsp;NOT&amp;nbsp;NULL,&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;month&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INT&amp;nbsp;NOT&amp;nbsp;NULL,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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~12)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;month_name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VARCHAR(15)&amp;nbsp;NOT&amp;nbsp;NULL,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;nbsp;월&amp;nbsp;이름&amp;nbsp;(January,&amp;nbsp;1월&amp;nbsp;등)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;day_of_month&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INT&amp;nbsp;NOT&amp;nbsp;NULL,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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~31)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;day_of_week&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INT&amp;nbsp;NOT&amp;nbsp;NULL,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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=일,&amp;nbsp;7=토)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;day_name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VARCHAR(15)&amp;nbsp;NOT&amp;nbsp;NULL,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;nbsp;요일&amp;nbsp;이름&amp;nbsp;(Monday,&amp;nbsp;월요일&amp;nbsp;등)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;is_weekend&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BOOLEAN&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;&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;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; 데이터 모델링 실습 : 광고 클릭/노출 로그 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0. raw data : 광고가 노출/클릭될 때 기록되는 로그들&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;event_id,timestamp,user_id,ad_id,campaign_id,site_url,placement,action_type,cost_model,cost_amount&lt;br /&gt;log_001,2026-05-05&amp;nbsp;12:00:01,user_88,ad_vancouver_01,CAMP_01,blog.naver.com,상단배너,impression,CPM,0.5&lt;br /&gt;log_002,2026-05-05&amp;nbsp;12:00:05,user_88,ad_vancouver_01,CAMP_01,blog.naver.com,상단배너,click,CPC,150.0&lt;br /&gt;log_003,2026-05-05&amp;nbsp;12:05:10,user_12,ad_tech_05,CAMP_02,youtube.com,영상중간,impression,CPV,1.2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;비즈니스&amp;nbsp;프로세스&amp;nbsp;선택&amp;nbsp;(Select&amp;nbsp;the&amp;nbsp;Business&amp;nbsp;Process)&lt;br /&gt;'raw 데이터로부터 어떤 집계를 할 수 있을까' 하는 의문에 답을 해 봄&lt;br /&gt;해당 데이터는 광고가 노출 및 클릭 될 때마다 기록되니, '시간대별, 일별, 월별 광고 클릭률(ctr)을 계산해볼 수 있겠다',&lt;br /&gt;'아니면 어느 위치의 광고가 가장 많이 클릭되는지 집계해볼까?' 등을 생각해볼 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 비즈니스 프로세스는 '광고 성능 측정' 혹은 '광고 성과 측정(Ad Performance Tracking)'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Grain 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 낮은 단위로 진행해야하므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'한 사람이 하나의 광고를 하나의 디바이스에서 하나의 위치에서 한 번 클릭/노출한 단위'를 grain 으로 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 raw data 그대로 사용해도 될 것 같음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. dimension 식별&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;묶을 수 있는 것들을 묶어보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날짜별로 묶을 수 있고, 유저 정보로 묶을 수 있고..(근데 이 raw 에는 유저정보가 별로 없어서 묶어도 큰 의미는 없을 듯)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광고 정보로 묶을 수 있고, 광고 매체로 묶을 수 있고, 캠페인 정보로 묶을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 '캠페인'이라는 개념을 알고 있어야 dimension 으로 묶이겠구나 라고 판단 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 비즈니스를 잘 이해하고 있어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dim_ad_creative: 광고 소재 정보 (소재Surrogate Key, 광고주명, 배너사이즈, 카테고리 등)&lt;br /&gt;dim_campaign: 캠페인 정보 (캠페인SK, 캠페인명, 시작일, 종료일, 목표 등)&lt;br /&gt;dim_publisher: 매체 정보 (매체SK, 사이트URL, 도메인 카테고리 등)&lt;br /&gt;dim_date:&amp;nbsp;날짜&amp;nbsp;정보&amp;nbsp;(날짜SK,&amp;nbsp;연,&amp;nbsp;월,&amp;nbsp;일,&amp;nbsp;분기,&amp;nbsp;요일&amp;nbsp;등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4단계: fact 식별&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분석의 대상이 되는 '측정 가능한 수치값'들은&lt;br /&gt;클릭 횟수, 노출 횟수, 비용 등.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클릭/노출 될 때마다 쌓이게 되니까 fact table 에 있어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(고정 비용이라면 dimension 에 있어도 될 것 같은데, 고정 비용이 아니라면 fact table 에 있어야 할 듯)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 아래와 같은 fact table 을 만들어 봄&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;date_key&amp;nbsp;(FK),ad_key&amp;nbsp;(FK),campaign_key&amp;nbsp;(FK),publisher_key&amp;nbsp;(FK),&lt;b&gt;is_impression,is_click&lt;/b&gt;,cost&amp;nbsp;(Fact)&lt;br /&gt;20260505,501,10,901,&lt;b&gt;1,0&lt;/b&gt;,0.5&lt;br /&gt;20260505,501,10,901,&lt;b&gt;0,1&lt;/b&gt;,150.0&lt;br /&gt;20260505,702,11,905,&lt;b&gt;1,0&lt;/b&gt;,1.2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 노출 및 클릭을 따로 컬럼으로 만들어서 처리했음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;is_impression, is_click 처럼 0 또는 1의 값을 갖는 컬럼을 만들면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나중에 SUM(is_click)만으로도 전체 클릭 수를 아주 빠르게 계산할 수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 CTR(클릭수/노출수 * 100)계산에도 용이함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CTR 같은 지표는 Fact 테이블에 미리 저장해두지 않고, 필요할 때마다 그때 그때 집계해서 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; 데이터 모델링 실습 : 제조업&amp;nbsp;또는&amp;nbsp;물류&amp;nbsp;센터의&amp;nbsp;재고&amp;nbsp;흐름(Inventory&amp;nbsp;Flow) &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0. raw data :&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;txn_id,event_time,warehouse_id,location,product_id,product_name,txn_type,quantity,unit_cost,worker_id&lt;br /&gt;T-901,2026-05-06&amp;nbsp;09:00:00,WH_VAN,Vancouver_A1,SSD_1TB,삼성&amp;nbsp;SSD,입고(In),100,80000,eng_hong&lt;br /&gt;T-902,2026-05-06&amp;nbsp;10:30:00,WH_VAN,Vancouver_A1,SSD_1TB,삼성&amp;nbsp;SSD,출고(Out),20,80000,eng_hong&lt;br /&gt;T-903,2026-05-06&amp;nbsp;11:00:00,WH_SEO,Seoul_B2,RAM_16G,하이닉스&amp;nbsp;램,입고(In),50,60000,user_kim&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Coding Interview</category>
      <author>눈가락</author>
      <guid isPermaLink="true">https://eyeballs.tistory.com/743</guid>
      <comments>https://eyeballs.tistory.com/743#entry743comment</comments>
      <pubDate>Thu, 16 Apr 2026 02:00:52 +0900</pubDate>
    </item>
    <item>
      <title>[English] 개발 영어 공부2</title>
      <link>https://eyeballs.tistory.com/741</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 영어 공부1 : &lt;a href=&quot;https://eyeballs.tistory.com/683&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://eyeballs.tistory.com/683&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 6116px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Spark&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;was compiled for&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;2.13&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;스파크는 2.13 용으로 컴파일되었다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;It&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;determines&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;when to remove and request executors.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;결정하다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;If the jobs&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;at the head of the queue&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;don't need to use the whole cluster,&amp;nbsp;&lt;b&gt;later jobs&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;can start to run right away&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;대기열의 맨 앞에 있는 jobs&lt;br /&gt;후속 jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 43px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;then later jobs may be delayed&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;significantly&lt;/b&gt;&lt;br /&gt;&lt;b&gt;significant&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;computing resources may be&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;required&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;상당히&amp;nbsp;지연될&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;상당한 컴퓨팅 자원이 요구될 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;This feature&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;is disabled&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;by default.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;기본적으로 비활성화되어있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;b&gt;Newly submitted jobs go into a default pool.&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;새롭게 제출된 작업들은 default pool에 들어간다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;Jobs run&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;in FIFO order&lt;br /&gt;&lt;/b&gt;Jobs run&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;in order.&lt;/b&gt;&lt;br /&gt;Automate A, B, and C&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;in order of importance&lt;/b&gt;.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;data&amp;nbsp;is&amp;nbsp;stored&lt;/span&gt;&lt;b&gt;&amp;nbsp;in&amp;nbsp;chronological&amp;nbsp;order&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;FIFO 순서로 작업이 실행된다.&lt;br /&gt;순서대로&amp;nbsp;작업이&amp;nbsp;실행된다.&lt;br /&gt;중요한 순서대로 자동화하라&lt;br /&gt;시간순으로 저장되어있다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;both&amp;nbsp;of&amp;nbsp;these&amp;nbsp;together&amp;nbsp;&lt;b&gt;make&amp;nbsp;up&lt;/b&gt;&amp;nbsp;the&amp;nbsp;node&lt;br /&gt;Distributed storage refers to a storage architecture&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;made up of&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;multiple computers and disks.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;노드를 만든다.&lt;br /&gt;다양한 컴퓨터와 디스크로 구성된 저장 아키텍처&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;b&gt;The same is true of&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;the C node.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;C노드도 마찬가지다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Our&amp;nbsp;managers&amp;nbsp;&lt;b&gt;deal&amp;nbsp;with&lt;/b&gt;&amp;nbsp;all&amp;nbsp;kinds&amp;nbsp;of&amp;nbsp;clients&amp;nbsp;every&amp;nbsp;day&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;매일 다양한 clients 를 상대한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;b&gt;In my previous project&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;I&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;carried out&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;the responsibilities of...&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;나의 이전 프로젝트에서, 이러이러한 책임을 수행했다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;Project&amp;nbsp;managers&amp;nbsp;usually&amp;nbsp;&lt;b&gt;estimate&lt;/b&gt;&amp;nbsp;new&amp;nbsp;projects&amp;nbsp;by&amp;nbsp;&lt;b&gt;analogy&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;유사사례를 통해 신규 프로젝트를 추정한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;I&amp;nbsp;improved&amp;nbsp;my&amp;nbsp;&lt;b&gt;time&amp;nbsp;management&lt;/b&gt;&amp;nbsp;and&amp;nbsp;&lt;b&gt;organizational&amp;nbsp;skills&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;시간 관리 및 시간 정리 능력을 향상시켰다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;the server performs&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;instructions&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;written in code.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;명령을 수행한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;use only the numbers&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;in given array&lt;/b&gt;.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Cardinality&amp;nbsp;refers&amp;nbsp;to&amp;nbsp;the&amp;nbsp;number&amp;nbsp;of&amp;nbsp;unique&amp;nbsp;values&amp;nbsp;&lt;/span&gt;&lt;b&gt;in&amp;nbsp;a&amp;nbsp;given&amp;nbsp;dataset&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;주어진 배열 내 숫자만 사용하라&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;카디널리티(Cardinality&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;)는&amp;nbsp;특정&amp;nbsp;데이터&amp;nbsp;집합에서&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;고유한&amp;nbsp;값(unique&amp;nbsp;values)의&amp;nbsp;개수를&amp;nbsp;의미한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;I&amp;nbsp;&lt;b&gt;assigned&lt;/b&gt;&amp;nbsp;the&amp;nbsp;number&amp;nbsp;33&amp;nbsp;&lt;b&gt;to&lt;/b&gt;&amp;nbsp;age&amp;nbsp;variable.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;나이 변수에 33을 할당했다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;I&amp;nbsp;created&amp;nbsp;an&amp;nbsp;&lt;b&gt;array&amp;nbsp;of&amp;nbsp;strings&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;문자열 배열을 생성했다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;Debugging is to&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;investigate&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;the program and fix bugs.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;프로그램을 조사하는 것이다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;A program&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;crashes&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;when you divide by zero.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;프로그램이 중단된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;I&amp;nbsp;&lt;b&gt;declared&lt;/b&gt;&amp;nbsp;a&amp;nbsp;function&amp;nbsp;and&amp;nbsp;&lt;b&gt;implemented&lt;/b&gt;&amp;nbsp;it.&amp;nbsp;It&amp;nbsp;works&amp;nbsp;well!&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;함수 하나를 선언했고 구현했다. 잘 동작한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;I&amp;nbsp;&lt;b&gt;instantiated&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;another&amp;nbsp;object&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Student&amp;nbsp;class.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;또 다른 학생 클래스 객체를 인스턴스화했다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;I&amp;nbsp;&lt;b&gt;iterated&lt;/b&gt;(loop)&amp;nbsp;&lt;b&gt;through every element in the list&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;리스트 내 모든 요소를 순회했다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Processing&amp;nbsp;is&amp;nbsp;&lt;b&gt;manipulation&amp;nbsp;of&amp;nbsp;data&amp;nbsp;&lt;/b&gt;by&amp;nbsp;a&amp;nbsp;computer&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;컴퓨터에 의한 데이터 조작이다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Raw&amp;nbsp;data&amp;nbsp;can&amp;nbsp;&lt;b&gt;be&amp;nbsp;converted&amp;nbsp;into&lt;/b&gt;&amp;nbsp;JSON&amp;nbsp;format.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Josn 형태로 변환될 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;b&gt;Maintainability&lt;/b&gt;&amp;nbsp;:&amp;nbsp;It&amp;nbsp;should&amp;nbsp;be&amp;nbsp;&lt;b&gt;stable&lt;/b&gt;&amp;nbsp;when&amp;nbsp;the&amp;nbsp;changes&amp;nbsp;&lt;b&gt;are&amp;nbsp;made&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;변경사항이 적용되었을 때 안정적이어야 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;You&amp;nbsp;need&amp;nbsp;a&amp;nbsp;&lt;b&gt;dedicated&lt;/b&gt;&amp;nbsp;work&amp;nbsp;space&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;전용 작업 공간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Let's&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;move&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;our meeting&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;back an hour&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;한 시간 미루자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;She&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;moved&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;the meeting&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;up&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;a day&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;미팅을 하루 앞당겼다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;The meeting&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;was rescheduled for&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Thursday.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;회의가 목요일로 재조정되었다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;From a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;subjective&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;perspective.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;주관적인 관점에서&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;We&amp;nbsp;will&amp;nbsp;meet&amp;nbsp;in&amp;nbsp;a&amp;nbsp;week&amp;nbsp;and&amp;nbsp;&lt;b&gt;synchronize&amp;nbsp;on&lt;/b&gt;&amp;nbsp;the&amp;nbsp;progress.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;진행 상황을 맞춰보자.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Big data&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;enables&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;you&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;to&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;gather data from many sources.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;데이터를 수집할 수 있게 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;A kafka topic&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;is identified by&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;its name&lt;br /&gt;Each broker&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;is identified with&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;its ID.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;카프카 토픽은 이름으로 식별된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 65px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 65px;&quot;&gt;&lt;b&gt;The&amp;nbsp;sequence&amp;nbsp;of&amp;nbsp;&lt;/b&gt;messages&amp;nbsp;is&amp;nbsp;called&amp;nbsp;a&amp;nbsp;data&amp;nbsp;stream&lt;br /&gt;Sequential messages&lt;br /&gt;received messages&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;in sequence&lt;/b&gt;.&lt;br /&gt;processing&amp;nbsp;data&amp;nbsp;&lt;b&gt;sequentially&lt;/b&gt;&amp;nbsp;is&amp;nbsp;necessary&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 65px;&quot;&gt;메세지의 순서를 데이터 스트림이라고 부른다.&lt;br /&gt;연속된 메세지들&lt;br /&gt;순서대로 수신한 메세지들&lt;br /&gt;연속으로 데이터를 처리하는 것이 필요하다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Topics&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;are split in&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;partitions.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;토픽은 파티션으로 나뉘어진다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;Each message gets an&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;incremental&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;id, called offset.&lt;br /&gt;'Append' adds only the newly arrived data&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;incrementally&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;하나씩 증가하는 id&lt;br /&gt;'Append' 는 새로 추가된 데이터를 증분으로 추가한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;Kafka&amp;nbsp;topics&amp;nbsp;are&amp;nbsp;&lt;b&gt;immutable&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;토픽들은 불변한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 65px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 65px;&quot;&gt;Data&amp;nbsp;&lt;b&gt;is&amp;nbsp;kept&lt;/b&gt;&amp;nbsp;only&amp;nbsp;for&amp;nbsp;a&amp;nbsp;limited&amp;nbsp;time.&lt;br /&gt;Data&amp;nbsp;is&amp;nbsp;maintained&amp;nbsp;only&amp;nbsp;for&amp;nbsp;a&amp;nbsp;limited&amp;nbsp;time.&lt;br /&gt;Data&amp;nbsp;remained&amp;nbsp;only&amp;nbsp;for&amp;nbsp;a&amp;nbsp;limited&amp;nbsp;time.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 65px;&quot;&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;있는다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;b&gt;Over time&lt;/b&gt;, the kafka clients have been changed.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;시간이 지남에 따라...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 51px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 51px;&quot;&gt;The&amp;nbsp;processing&amp;nbsp;of&amp;nbsp;&lt;b&gt;rapidly&amp;nbsp;increasing&amp;nbsp;data&lt;/b&gt;&amp;nbsp;&lt;b&gt;is&amp;nbsp;entrusted&amp;nbsp;to&lt;/b&gt;&amp;nbsp;Hadoop.&lt;br /&gt;I&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;delegated&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;the task to Hadoop&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 51px;&quot;&gt;빠르게 증가하는 데이터 처리를 하둡에게 맡긴다.&lt;br /&gt;하둡에게 그 일을 위임했다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;There&amp;nbsp;are&amp;nbsp;two&amp;nbsp;main&amp;nbsp;&lt;b&gt;methods&amp;nbsp;for&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;data&amp;nbsp;transmission.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;The&amp;nbsp;&quot;streaming&amp;nbsp;type&quot;&amp;nbsp;&lt;b&gt;continuously&amp;nbsp;transmits&amp;nbsp;data&amp;nbsp;as&amp;nbsp;it&amp;nbsp;is&amp;nbsp;generated&lt;/b&gt;,&amp;nbsp;in&amp;nbsp;real&amp;nbsp;time.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;실시간으로 생성되는 데이터를 끊임없이 보내는 방법이다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;Data&amp;nbsp;collected&amp;nbsp;&lt;b&gt;over&amp;nbsp;the&amp;nbsp;past&amp;nbsp;30&amp;nbsp;minutes&lt;/b&gt;&amp;nbsp;is&amp;nbsp;aggregated&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;If&amp;nbsp;you&amp;nbsp;want&amp;nbsp;to&amp;nbsp;&lt;/span&gt;&lt;b&gt;graph&amp;nbsp;&lt;/b&gt;the&amp;nbsp;event&amp;nbsp;trend&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;over the past hour..&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;지난 30분동안 모은 데이터들이 집계되었다.&lt;br /&gt;과거 1시간의 이벤트 수 추이를 그래프로 만들고 싶으면..&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;To analyze data&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;from the past 3 years&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;지난 3년간의 데이터를 분석하기 위해&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Amazon S3 is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;a representative example of&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;object storage.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;대표적인 객체 스토리지다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;it&amp;nbsp;can&amp;nbsp;increase&amp;nbsp;data&amp;nbsp;&lt;b&gt;capacity&lt;/b&gt;&amp;nbsp;in&amp;nbsp;the&amp;nbsp;future.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;향후 데이터 용량을 증가시킬 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Most&amp;nbsp;people&amp;nbsp;&lt;b&gt;are&amp;nbsp;accustomed&lt;/b&gt;&amp;nbsp;&lt;b&gt;to&lt;/b&gt;&amp;nbsp;us&lt;b&gt;ing&lt;/b&gt;&amp;nbsp;SQL&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;SQL 사용에 익숙하다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;This&amp;nbsp;&lt;b&gt;series&amp;nbsp;of&amp;nbsp;procedures&lt;/b&gt;&amp;nbsp;is&amp;nbsp;called&amp;nbsp;the&amp;nbsp;ETL&amp;nbsp;process&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;일련의 절차를 ETL 프로세스라고 부른다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Batch processing is executed according to a fixed&lt;b&gt;&amp;nbsp;daily&amp;nbsp;schedule&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;고정된 일일 일정에 따라 실행된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;If&amp;nbsp;an&amp;nbsp;error&amp;nbsp;occurs,&amp;nbsp;the&amp;nbsp;administrator&amp;nbsp;&lt;b&gt;is&amp;nbsp;notified&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;관리자에게 알려진다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 51px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 51px;&quot;&gt;System failures can occur during big data processing.&lt;br /&gt;Therefore, it is necessary to&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;implement functions to handle&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and retry tasks when errors occur.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 51px;&quot;&gt;처리하는 기능을 구현하는 것이 필수다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;b&gt;Data&amp;nbsp;collected&amp;nbsp;throughout&amp;nbsp;the&amp;nbsp;day&lt;/b&gt;&amp;nbsp;is&amp;nbsp;aggregated&amp;nbsp;&lt;b&gt;overnight&lt;/b&gt;&amp;nbsp;to&amp;nbsp;generate&amp;nbsp;reports.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;하룻동안 수집된 데이터들은 밤사이 집계된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 43px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;b&gt;Unprocessed&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;raw data is stored in a data lake, and only&amp;nbsp;the&amp;nbsp;necessary&amp;nbsp;data&amp;nbsp;is&amp;nbsp;&lt;b&gt;retrieved&lt;/b&gt;&amp;nbsp;and&amp;nbsp;used&amp;nbsp;later.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;미가공한 원시 데이터가 data lake 에 저장된다.&lt;br /&gt;그리고 필요한 데이터만 추출된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Data&amp;nbsp;engineers&amp;nbsp;&lt;b&gt;are&amp;nbsp;responsible&amp;nbsp;for&lt;/b&gt;&amp;nbsp;building,&amp;nbsp;managing,&amp;nbsp;and&amp;nbsp;automating&amp;nbsp;the&amp;nbsp;systems.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;데이터 엔지니어는 책임을 진다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;It&amp;rsquo;s&amp;nbsp;best&amp;nbsp;to&amp;nbsp;start&amp;nbsp;with&amp;nbsp;a&amp;nbsp;small&amp;nbsp;system&amp;nbsp;and&amp;nbsp;&lt;b&gt;gradually&lt;/b&gt;&amp;nbsp;scale&amp;nbsp;it&amp;nbsp;up&amp;nbsp;&lt;b&gt;over&amp;nbsp;time&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;나중에 단계적으로 확장해가는 것이 좋다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;b&gt;In&amp;nbsp;the&amp;nbsp;early&amp;nbsp;stages&lt;/b&gt;,&amp;nbsp;&lt;b&gt;manually&amp;nbsp;collecting&lt;/b&gt;&amp;nbsp;and&amp;nbsp;analyzing&amp;nbsp;data&amp;nbsp;&lt;b&gt;without&amp;nbsp;automation&lt;/b&gt;&amp;nbsp;is&amp;nbsp;called&amp;nbsp;&lt;b&gt;ad&amp;nbsp;hoc&lt;/b&gt;&amp;nbsp;analysis.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;시작 단계에서..&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Searching&amp;nbsp;for&amp;nbsp;data&amp;nbsp;that&amp;nbsp;&lt;b&gt;meets&amp;nbsp;specific&amp;nbsp;criteria&lt;/b&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;특정 기준을 충족하는 데이터 검색하기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;values&amp;nbsp;&lt;b&gt;in&lt;/b&gt;&amp;nbsp;the&amp;nbsp;'time'&amp;nbsp;&lt;b&gt;column&lt;/b&gt;&amp;nbsp;can&amp;nbsp;&lt;b&gt;be&amp;nbsp;tricky&amp;nbsp;to&amp;nbsp;handle&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;time 컬럼값은 다루기가 까다롭다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;The&amp;nbsp;same&amp;nbsp;aggregation&amp;nbsp;is&amp;nbsp;repeated&amp;nbsp;&lt;b&gt;on&amp;nbsp;a&amp;nbsp;regular&amp;nbsp;schedule&lt;/b&gt;&amp;mdash;weekly&amp;nbsp;or&amp;nbsp;monthly&amp;mdash;to&amp;nbsp;&lt;b&gt;observe&amp;nbsp;trends&lt;/b&gt;&amp;nbsp;over&amp;nbsp;time.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;1개월&amp;nbsp;혹은&amp;nbsp;1주일마다&amp;nbsp;정기적인&amp;nbsp;일정으로&amp;nbsp;동일한&amp;nbsp;집계를&amp;nbsp;반복하고&amp;nbsp;그&amp;nbsp;추이를&amp;nbsp;관찰한다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;the number of ad&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;impressions&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;광고&amp;nbsp;노출&amp;nbsp;수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;The&amp;nbsp;number&amp;nbsp;of&amp;nbsp;customers&amp;nbsp;who&amp;nbsp;used&amp;nbsp;the&amp;nbsp;service&amp;nbsp;&lt;b&gt;in&amp;nbsp;a&amp;nbsp;day&lt;/b&gt;.&lt;br /&gt;The number of customers who used the service&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;within a day&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;하루에 서비스를 이용한 고객 수 (하루 전체. 통으로)&lt;br /&gt;하루 이내에 서비스를 이용한 고객수 (24시간 이내에)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Making&amp;nbsp;decisions&amp;nbsp;&lt;b&gt;based&amp;nbsp;on&amp;nbsp;objective&amp;nbsp;data&lt;/b&gt;&amp;nbsp;is&amp;nbsp;called&amp;nbsp;data-driven&amp;nbsp;decision&amp;nbsp;making.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;b&gt;객관적인&amp;nbsp;데이터를&amp;nbsp;근거하여&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;판단하는&amp;nbsp;것을&amp;nbsp;'데이터&amp;nbsp;기반 의사&amp;nbsp;결정'이라고&amp;nbsp;한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;the values in A column are&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;generally&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;higher/lower/similar to the values in B column.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;전체적으로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;As&amp;nbsp;long&amp;nbsp;as&amp;nbsp;you&amp;nbsp;have&amp;nbsp;&lt;b&gt;organized&lt;/b&gt;&amp;nbsp;numerical&amp;nbsp;data&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;정리된 숫자 데이터가 있다면&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;names are&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;listed&amp;nbsp;in&amp;nbsp;rows&lt;/b&gt;, and sales are&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;listed&amp;nbsp;in&amp;nbsp;columns&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;행 방향으로 나열되고, 열 방향으로 나열된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;the numeric data appears&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;at the intersections of rows and columns&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;행과 열의 교차점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;large&amp;nbsp;datasets&amp;nbsp;that&amp;nbsp;can't&amp;nbsp;&lt;b&gt;fully&amp;nbsp;fit&amp;nbsp;in&amp;nbsp;memory&lt;br /&gt;Load&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;all the data&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;into memory.&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;메모리에 다 들어가지 못하는 큰 용량의 데이터&lt;br /&gt;모든 데이터를 메모리에 올린다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;If&amp;nbsp;&lt;b&gt;the&amp;nbsp;wait&amp;nbsp;time&amp;nbsp;&lt;/b&gt;for&amp;nbsp;aggregation&amp;nbsp;increases,&amp;nbsp;all&amp;nbsp;processes&amp;nbsp;&lt;b&gt;slow&amp;nbsp;down&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;대기시간이 늘어나면, 모든 작업들이 느려진다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;your&amp;nbsp;system&amp;nbsp;needs&amp;nbsp;to&amp;nbsp;be&amp;nbsp;designed&amp;nbsp;for&amp;nbsp;it&amp;nbsp;&lt;b&gt;from&amp;nbsp;the&amp;nbsp;start&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;처음부터 그렇게 디자인되어야 했다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;fast&amp;nbsp;data&amp;nbsp;processing&amp;nbsp;&lt;b&gt;is&amp;nbsp;described&amp;nbsp;as&amp;nbsp;having&amp;nbsp;low&amp;nbsp;latency&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;'지연시간(latency)이 적다'고 표현된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;a&amp;nbsp;sharp&amp;nbsp;&lt;b&gt;drop/improvement&lt;/b&gt;&amp;nbsp;&lt;b&gt;in&amp;nbsp;performance&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;급격한 성능 저하/향상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 43px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;The&amp;nbsp;amount&amp;nbsp;of&amp;nbsp;data&amp;nbsp;that&amp;nbsp;can&amp;nbsp;be&amp;nbsp;processed&amp;nbsp;&lt;b&gt;within&amp;nbsp;a&amp;nbsp;certain&amp;nbsp;period&amp;nbsp;of&amp;nbsp;time&amp;nbsp;&lt;/b&gt;is&amp;nbsp;called&amp;nbsp;&quot;&lt;b&gt;throughput&lt;/b&gt;&quot;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;일정 시간 내에 처리할 수 있는 데이터의 양을 처리량(throughput)이라 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;The time you wait for data processing to complete is called &quot;&lt;b&gt;latency&lt;/b&gt;&quot;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;작업이 끝날 때 까지 대기하는 시간을 지연시간(latency)이라 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;b&gt;The&amp;nbsp;presence&amp;nbsp;or&amp;nbsp;absence&amp;nbsp;of&amp;nbsp;&lt;/b&gt;indexes&lt;br /&gt;&lt;b&gt;Which option to choose&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;depends on the situation.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;인덱스 유무&lt;br /&gt;어떤 옵션을 선택할지는 상황에 따라 달라진다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;a&amp;nbsp;query&amp;nbsp;&lt;b&gt;is&amp;nbsp;broken&amp;nbsp;down&amp;nbsp;into&lt;/b&gt;&amp;nbsp;many&amp;nbsp;smaller&amp;nbsp;tasks&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;다수의 작은 태스크로 분해된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;you&amp;nbsp;need&amp;nbsp;to&amp;nbsp;scale&amp;nbsp;both&amp;nbsp;CPU&amp;nbsp;and&amp;nbsp;disk&amp;nbsp;resources&amp;nbsp;&lt;b&gt;in&amp;nbsp;a&amp;nbsp;balanced&amp;nbsp;way.&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;균형있게 자원을 늘려야한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;exploring&amp;nbsp;the&amp;nbsp;data&amp;nbsp;&lt;b&gt;through&amp;nbsp;repeated&amp;nbsp;trial&amp;nbsp;and&amp;nbsp;error&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;반복적인 시행착오를 통해&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;b&gt;In&amp;nbsp;contrast&amp;nbsp;to&lt;/b&gt;&amp;nbsp;ad&amp;nbsp;hoc&amp;nbsp;analysis,&amp;nbsp;you&amp;nbsp;can&amp;nbsp;run&amp;nbsp;queries&amp;nbsp;on&amp;nbsp;a&amp;nbsp;regular&amp;nbsp;schedule&amp;nbsp;to&amp;nbsp;generate&amp;nbsp;reports.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;ad hoc 분석과 대조적으로..&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;you&amp;nbsp;want&amp;nbsp;to&amp;nbsp;&lt;b&gt;take&amp;nbsp;your&amp;nbsp;time&lt;/b&gt;&amp;nbsp;and&amp;nbsp;carefully&amp;nbsp;&lt;b&gt;examine&lt;/b&gt;&amp;nbsp;the&amp;nbsp;data.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;시간을 갖고 차분히 데이터를 보고 싶다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;Metric&amp;nbsp;B&amp;nbsp;is&amp;nbsp;updated&amp;nbsp;&lt;b&gt;once&amp;nbsp;a&amp;nbsp;day&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;B 메트릭은 하루에 한 번 업데이트 된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;b&gt;improvements in&lt;/b&gt;&amp;nbsp;computing&amp;nbsp;power&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;컴퓨팅 성능 향상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;b&gt;There&amp;nbsp;are&amp;nbsp;more/fewer&amp;nbsp;cases&amp;nbsp;now&amp;nbsp;where&lt;/b&gt;&amp;nbsp;building&amp;nbsp;a&amp;nbsp;data&amp;nbsp;mart&amp;nbsp;is&amp;nbsp;unnecessary.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;이러한 경우가 늘어나고/줄어들고 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;Normalization&amp;nbsp;involves&amp;nbsp;splitting&amp;nbsp;tables&amp;nbsp;as&amp;nbsp;much&amp;nbsp;as&amp;nbsp;possible&amp;nbsp;and&amp;nbsp;&lt;b&gt;linking&amp;nbsp;them&lt;/b&gt;&amp;nbsp;using&amp;nbsp;foreign&amp;nbsp;keys.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;Denormalization&amp;nbsp;involves&amp;nbsp;&lt;b&gt;combining&lt;/b&gt;&amp;nbsp;tables&amp;nbsp;as&amp;nbsp;much&amp;nbsp;as&amp;nbsp;possible.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;tables&amp;nbsp;&lt;b&gt;are&amp;nbsp;categorized&amp;nbsp;into&lt;/b&gt;&amp;nbsp;fact&amp;nbsp;tables&amp;nbsp;and&amp;nbsp;dimension&amp;nbsp;tables.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Fact&amp;nbsp;tables&amp;nbsp;store&amp;nbsp;data&amp;nbsp;that&amp;nbsp;&lt;b&gt;accumulates&amp;nbsp;over&amp;nbsp;time.&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;시간에 따라 증가하는 데이터가 저장된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Dimension&amp;nbsp;tables&amp;nbsp;typically&amp;nbsp;&lt;b&gt;store&amp;nbsp;attributes&lt;/b&gt;&amp;nbsp;used&amp;nbsp;to&amp;nbsp;categorize&amp;nbsp;the&amp;nbsp;data.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;A&amp;nbsp;model&amp;nbsp;where&amp;nbsp;a&amp;nbsp;fact&amp;nbsp;table&amp;nbsp;&lt;b&gt;is&amp;nbsp;surrounded&amp;nbsp;by&amp;nbsp;&lt;/b&gt;multiple&amp;nbsp;dimension&amp;nbsp;tables&amp;nbsp;is&amp;nbsp;called&amp;nbsp;a&amp;nbsp;star&amp;nbsp;schema.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Files&amp;nbsp;&lt;b&gt;are&amp;nbsp;replicated&lt;/b&gt;&amp;nbsp;across&amp;nbsp;multiple&amp;nbsp;machines&amp;nbsp;to&amp;nbsp;increase&amp;nbsp;&lt;b&gt;redundancy&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;중복성을 높이기 위해 파일을 복사한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;jobs&amp;nbsp;are&amp;nbsp;&lt;/span&gt;&lt;b&gt;preferably&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;executed&amp;nbsp;&lt;/span&gt;&lt;b&gt;on&amp;nbsp;nodes&amp;nbsp;close&amp;nbsp;to&amp;nbsp;the&amp;nbsp;data&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;가급적, 데이터와 가까운 노드에서 실행한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;spontaneously&lt;br /&gt;simultaneously&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;자발적으로&lt;br /&gt;동시에&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;b&gt;resource&lt;/b&gt;&amp;nbsp;&lt;b&gt;contention(competition&lt;/b&gt;)&amp;nbsp;occurs&amp;nbsp;between&amp;nbsp;jobs&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;자원 쟁탈(경쟁)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;they&amp;nbsp;run&amp;nbsp;&lt;b&gt;only&amp;nbsp;when&lt;/b&gt;&amp;nbsp;&lt;b&gt;no&amp;nbsp;one&amp;nbsp;else&lt;/b&gt;&amp;nbsp;is&amp;nbsp;using&amp;nbsp;the&amp;nbsp;resources.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;누구도 자원을 사용하지 않을 때만&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;Spark&amp;nbsp;keeps&amp;nbsp;&lt;b&gt;intermediate&lt;/b&gt;&amp;nbsp;&lt;b&gt;data&lt;/b&gt;&amp;nbsp;in&amp;nbsp;memory&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;It is safer to process data&amp;nbsp;&lt;/span&gt;&lt;b&gt;in&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;an&amp;nbsp;&lt;b&gt;intermediate&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;table&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;first&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;중간 데이터를 메모리에 보존한다.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;중간 테이블을 만들어 처리하는 게 안전하다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;problems&amp;nbsp;arise&amp;nbsp;when&amp;nbsp;aggregating&amp;nbsp;large&amp;nbsp;amounts&amp;nbsp;of&amp;nbsp;data&amp;nbsp;&lt;b&gt;over&amp;nbsp;a&amp;nbsp;long&amp;nbsp;period&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;장기간에 거쳐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;data&amp;nbsp;&lt;/span&gt;&lt;b&gt;is&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;evenly&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;distributed&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;across&amp;nbsp;all&amp;nbsp;nodes&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;균형있게 분산되어있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;storage&amp;nbsp;and&amp;nbsp;compute&amp;nbsp;nodes&amp;nbsp;&lt;/span&gt;&lt;b&gt;are&amp;nbsp;tightly&amp;nbsp;coupled&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;밀접하게 결합되어있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;it&amp;nbsp;either&amp;nbsp;waits&amp;nbsp;for&amp;nbsp;resources&amp;nbsp;to&amp;nbsp;&lt;b&gt;free&amp;nbsp;up&lt;/b&gt;&amp;nbsp;or&amp;nbsp;fails&amp;nbsp;with&amp;nbsp;an&amp;nbsp;error.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;메모리가 생길 때까지 기다리거나&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;memory usage doesn&amp;rsquo;t increase&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;proportionally&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;비례하여 늘어나지 않는다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;memory&amp;nbsp;consumption&amp;nbsp;&lt;b&gt;remains&amp;nbsp;nearly&amp;nbsp;constant&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;메모리 사용량은 거의 일정하게 유지된다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;You&amp;nbsp;can&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;aggregate&amp;nbsp;data&amp;nbsp;with&amp;nbsp;millions&amp;nbsp;of&amp;nbsp;records&amp;nbsp;&lt;/span&gt;&lt;b&gt;in&amp;nbsp;under&amp;nbsp;one&amp;nbsp;second&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;수백만&amp;nbsp;레코드를&amp;nbsp;갖는&amp;nbsp;데이터를&amp;nbsp;1초&amp;nbsp;미만으로&amp;nbsp;집계할&amp;nbsp;수&amp;nbsp;있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Even&amp;nbsp;if&amp;nbsp;a&amp;nbsp;&lt;/span&gt;&lt;b&gt;partial&amp;nbsp;failure&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;occurs,&amp;nbsp;processing&amp;nbsp;can&amp;nbsp;continue&amp;nbsp;&lt;/span&gt;&lt;b&gt;as&amp;nbsp;a&amp;nbsp;whole&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;부분적으로&amp;nbsp;장애가&amp;nbsp;발생해도,&amp;nbsp;전체적으로&amp;nbsp;처리를&amp;nbsp;계속할&amp;nbsp;수&amp;nbsp;있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 51px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 51px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Tez&amp;nbsp;is&amp;nbsp;&lt;/span&gt;&lt;b&gt;a&amp;nbsp;replacement&amp;nbsp;for&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;MapReduce&amp;nbsp;and&lt;/span&gt;&lt;b&gt;&amp;nbsp;inherits&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;its&amp;nbsp;fault&amp;nbsp;tolerance.&lt;br /&gt;&lt;/span&gt;Tez&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;is an alternative to&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;MapReduce.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 51px;&quot;&gt;Tez&amp;nbsp;는&amp;nbsp;MapReduce&amp;nbsp;를&amp;nbsp;대체하는&amp;nbsp;것이며,&amp;nbsp;그&amp;nbsp;내결함성을&amp;nbsp;계승하고&amp;nbsp;있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Presto&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is the complete opposite of&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Hive&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;presto 는 hive 와 완전히 반대입니다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Presto&amp;nbsp;&lt;/span&gt;&lt;b&gt;is&amp;nbsp;specialized&amp;nbsp;for&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;execut&lt;/span&gt;&lt;b&gt;ing&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;interactive&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;queries.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Presto&amp;nbsp;는&amp;nbsp;대화식&amp;nbsp;쿼리의&amp;nbsp;실행에&amp;nbsp;특화되어&amp;nbsp;있다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;b&gt;excessive&amp;nbsp;usage&lt;/b&gt;&amp;nbsp;can&amp;nbsp;prevent&amp;nbsp;other&amp;nbsp;queries&amp;nbsp;from&amp;nbsp;running.&lt;br /&gt;&lt;b&gt;Excessively&lt;/b&gt;&amp;nbsp;reducing&amp;nbsp;cardinality&amp;nbsp;can&amp;nbsp;lead&amp;nbsp;to&amp;nbsp;significant&amp;nbsp;&lt;b&gt;information&amp;nbsp;loss&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;무리한 사용&lt;br /&gt;카디널리티를 무리하게 낮추면 원래 있던 정보가 크게 손실된다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;it&amp;nbsp;handles&amp;nbsp;schema&amp;nbsp;changes&amp;nbsp;more&amp;nbsp;&lt;/span&gt;&lt;b&gt;flexibly&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;스키마&amp;nbsp;변동에도&amp;nbsp;유연하게&amp;nbsp;대처할&amp;nbsp;수&amp;nbsp;있다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;frequent&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;read/write&amp;nbsp;operations&amp;nbsp;on&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;small&amp;nbsp;amounts&amp;nbsp;of&amp;nbsp;data&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;빈번하게 소량의 데이터를 읽고 쓰는 것&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;It increases&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;the rate of&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;unexpected errors.&lt;br /&gt;&lt;b&gt;the&amp;nbsp;likelihood&amp;nbsp;of&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;unexpected&amp;nbsp;errors&amp;nbsp;increases.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;예상치&amp;nbsp;못한&amp;nbsp;오류&amp;nbsp;발생률을&amp;nbsp;높인다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;It's a design issue&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;rather than&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;a performance problem.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;Massive&amp;nbsp;data&amp;nbsp;should&amp;nbsp;be&amp;nbsp;divided&amp;nbsp;and&amp;nbsp;&lt;/span&gt;&lt;b&gt;processed&amp;nbsp;in&amp;nbsp;parts&amp;nbsp;rather&amp;nbsp;than&amp;nbsp;all&amp;nbsp;at&amp;nbsp;once&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;성능 문제라기&lt;b&gt;보다는&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;설계 문제이다.&lt;br /&gt;한 번에 처리하기&lt;b&gt;보다는&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;부분으로 나눠서 처리해야한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;What&amp;nbsp;is&amp;nbsp;the&amp;nbsp;&lt;/span&gt;&lt;b&gt;optimal&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;file&amp;nbsp;size&amp;nbsp;for&amp;nbsp;efficient&amp;nbsp;processing&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;?&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;효율적으로 처리할 수 있는 파일이 크기는 얼마나 될까?&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 51px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 51px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;These&amp;nbsp;two&amp;nbsp;&lt;/span&gt;&lt;b&gt;differ&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;entirely&amp;nbsp;&lt;/span&gt;&lt;b&gt;in&amp;nbsp;both&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;technical&amp;nbsp;characteristics&amp;nbsp;and&amp;nbsp;tools&amp;nbsp;used,&amp;nbsp;so&amp;nbsp;you&amp;nbsp;must&amp;nbsp;understand&amp;nbsp;their&amp;nbsp;&lt;/span&gt;&lt;b&gt;nature&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;and&amp;nbsp;use&amp;nbsp;them&amp;nbsp;&lt;/span&gt;&lt;b&gt;accordingly&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 51px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;이 둘은 기술적인 특성도, 사용되는 도구도 전혀 다르므로 그 성질을 이해한 다음에 구분해서 사용해야 한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;When&amp;nbsp;handling&amp;nbsp;large&amp;nbsp;volumes&amp;nbsp;of&amp;nbsp;data,&amp;nbsp;break&amp;nbsp;tasks&amp;nbsp;into&amp;nbsp;monthly&amp;nbsp;or&amp;nbsp;daily&amp;nbsp;&lt;b&gt;units&lt;/b&gt;&amp;nbsp;to&amp;nbsp;&lt;b&gt;prevent&amp;nbsp;&lt;/b&gt;any&amp;nbsp;single&amp;nbsp;task&lt;b&gt;&amp;nbsp;from&amp;nbsp;becoming&amp;nbsp;too&amp;nbsp;large.&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;한 달 혹은 하루 단위로 전송하도록 태스크를 분해하여, 너무 커지지 않도록 막는다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;Fluentd&amp;nbsp;only&amp;nbsp;sends&amp;nbsp;messages&amp;nbsp;&lt;/span&gt;&lt;b&gt;in&amp;nbsp;one&amp;nbsp;direction&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;일방적으로 발송하는 것밖에 하지 못한다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;mobile&amp;nbsp;apps&amp;nbsp;often&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;b&gt;go&amp;nbsp;offline&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;span&gt;the device is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;back online&lt;/b&gt;.&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;모바일 앱은 오프라인이 되는 경우가 종종 있다.&lt;br /&gt;다시 온라인 상태가 된다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;It can&amp;nbsp;focus&amp;nbsp;&lt;b&gt;solely&lt;/b&gt;&amp;nbsp;on&amp;nbsp;its&amp;nbsp;own&amp;nbsp;tasks&amp;nbsp;while&amp;nbsp;&lt;b&gt;leaving&amp;nbsp;the&amp;nbsp;rest&amp;nbsp;to&lt;/b&gt;&amp;nbsp;the&amp;nbsp;shared&amp;nbsp;system.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;작업에만 오롯이 전념할 수 있고, 나머지 작업은 공통 시스템에 맡길 수 있다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;b&gt;the&amp;nbsp;two&amp;nbsp;are&amp;nbsp;in&amp;nbsp;a&amp;nbsp;trade-off&amp;nbsp;relationship&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;둘은 트레이드오프&amp;nbsp;관계에&amp;nbsp;있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;you just&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;reached&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;a performance limit&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;성능 한계에 도달했다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;b&gt;regulate&amp;nbsp;the&amp;nbsp;data&amp;nbsp;write&amp;nbsp;rate&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;데이터 쓰기 속도를 조절하라&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span&gt;you&amp;nbsp;need&amp;nbsp;to&amp;nbsp;decide&amp;nbsp;in&amp;nbsp;advance&amp;nbsp;how&amp;nbsp;to&amp;nbsp;operate&amp;nbsp;the&amp;nbsp;system&lt;b&gt;&amp;nbsp;in&amp;nbsp;its&amp;nbsp;absence&lt;/b&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;그것이 없을 때 어떻게 시스템을 운용할지 미리 결정해야한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 51px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 51px;&quot;&gt;Only keep the IDs&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;received&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;within the last hour&lt;/b&gt;, and allow duplicates that&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;arrived later&lt;/b&gt;.&lt;br /&gt;&lt;span&gt;&lt;b&gt;Allow&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;duplicates&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;for&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;late-arriving messages.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 51px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;최근 1 시간 동안 받은 ID 만 기억해두고, 그보다 늦게 온 메세지의 중복은 허용한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;The&amp;nbsp;time&amp;nbsp;a&amp;nbsp;message&amp;nbsp;is&amp;nbsp;generated&amp;nbsp;&lt;/span&gt;&lt;b&gt;on&amp;nbsp;the&amp;nbsp;client&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is called &amp;ldquo;event time,&amp;rdquo; &amp;nbsp;(&lt;/span&gt;&lt;b&gt;on the client side&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;the&amp;nbsp;time&amp;nbsp;the&amp;nbsp;server&amp;nbsp;processes&amp;nbsp;the&amp;nbsp;message&amp;nbsp;is&amp;nbsp;called&amp;nbsp;&amp;ldquo;&lt;b&gt;process&amp;nbsp;time&lt;/b&gt;.&amp;rdquo;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span&gt;the&amp;nbsp;data&amp;nbsp;is&amp;nbsp;arranged&lt;b&gt;&amp;nbsp;in&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;contiguous&amp;nbsp;layout&lt;/b&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;데이터가 연속적으로 배치되어있다.&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span&gt;Eventual consistency guarantees that all replicas will eventually&lt;b&gt;&amp;nbsp;converge&amp;nbsp;to&amp;nbsp;the&amp;nbsp;same&amp;nbsp;value&amp;nbsp;over&amp;nbsp;time&lt;/b&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;시간이 지나면 결국 동일한 값으로 귀결된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;Strong&amp;nbsp;consistency&amp;nbsp;guarantees&amp;nbsp;that&amp;nbsp;all&amp;nbsp;read&amp;nbsp;operations&amp;nbsp;reflect&amp;nbsp;&lt;/span&gt;&lt;b&gt;the&amp;nbsp;most&amp;nbsp;recent&amp;nbsp;write&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;가장 최근의 쓰기를 반영한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;a&amp;nbsp;human&amp;nbsp;&lt;/span&gt;&lt;b&gt;intervenes&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;to&amp;nbsp;resolve&amp;nbsp;the&amp;nbsp;issue.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;사람이&amp;nbsp;개입하여&amp;nbsp;문제를&amp;nbsp;해결한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 42px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;Some&amp;nbsp;tasks&amp;nbsp;can&amp;nbsp;cause&amp;nbsp;new&amp;nbsp;problems&amp;nbsp;if&amp;nbsp;they&amp;nbsp;are&amp;nbsp;not&amp;nbsp;completed&amp;nbsp;&lt;b&gt;by&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;the&amp;nbsp;scheduled&amp;nbsp;time&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 42px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;예정된 시간까지 끝내지 않으면 새로운 문제를 일으키는 태스크도 있다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span&gt;Let's finish it&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;within the allotted time&lt;/b&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span&gt;정해진(할당된) 시간 내에 끝내자.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;There&amp;nbsp;are&amp;nbsp;tools&amp;nbsp;that&amp;nbsp;&lt;/span&gt;notify&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;you&amp;nbsp;when&amp;nbsp;a&amp;nbsp;task&amp;nbsp;&lt;/span&gt;&lt;b&gt;exceeds&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;its&amp;nbsp;expected&amp;nbsp;execution time&lt;/b&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span&gt;작업이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;예상 실행 시간&lt;/b&gt;을 초과할 때 알려주는 도구가 있다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;It&amp;nbsp;is&amp;nbsp;important&amp;nbsp;to&amp;nbsp;&lt;/span&gt;&lt;b&gt;anticipate&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;potential&amp;nbsp;unexpected&amp;nbsp;errors&amp;nbsp;in&amp;nbsp;advance&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;예기치 못한 오류 발생 가능성을 예상하는 것은 중요하다.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;b&gt;Setting&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;the retry interval of a task&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;to&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;10 minutes&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;작업의 재시도 간격을 10분으로 설정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;ldquo;Backfill&amp;rdquo;&amp;nbsp;refers&amp;nbsp;to&amp;nbsp;rerunning&amp;nbsp;tasks&amp;nbsp;&lt;/span&gt;&lt;b&gt;over&amp;nbsp;a&amp;nbsp;specific&amp;nbsp;period&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;by&amp;nbsp;changing&amp;nbsp;the&amp;nbsp;date&amp;nbsp;parameter&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;in&amp;nbsp;sequence&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;lsquo;백필&amp;rsquo;이란 파라미터에 포함된 날짜를 순서대로 바꿔가면서 일정 기간의 태스크를 다시 실행함을 의미한다.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;You&amp;nbsp;can&amp;nbsp;test&amp;nbsp;backfill&amp;nbsp;&lt;/span&gt;&lt;b&gt;gradually&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;테스트 삼아 조금씩 백필을 실행할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;In&amp;nbsp;Airflow,&amp;nbsp;scripts&amp;nbsp;must&amp;nbsp;be&amp;nbsp;written&amp;nbsp;&lt;b&gt;with&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;atomicity&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;and&lt;/span&gt;&amp;nbsp;idempotency&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;Airflow 에서는 원자성과 멱등성을 갖춘 스크립트를 작성해야 한다.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;it&amp;nbsp;helps&amp;nbsp;improve&amp;nbsp;&lt;/span&gt;&lt;b&gt;stability&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;안정성을 높인다.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;An execution with this&lt;b&gt;&amp;nbsp;property&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is&amp;nbsp;called&amp;nbsp;an&amp;nbsp;idempotent&amp;nbsp;operation.&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;이런 특성을 지닌 실행을 idempotent operation 이라고 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;'replacement'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;yields&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;the&amp;nbsp;same&amp;nbsp;result&amp;nbsp;even&amp;nbsp;&lt;/span&gt;&lt;b&gt;when&amp;nbsp;repeated&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;'&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;치환'&lt;/span&gt;은 반복해서 실행해도 동일한 결과를 산출한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;Increase the number of retries&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;while&amp;nbsp;gradually&amp;nbsp;expanding&amp;nbsp;the&amp;nbsp;interval&amp;nbsp;between&amp;nbsp;them&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;재시도 횟수를 늘림과 동시에, 조금씩 재시도 간격을 넓혀나가라&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 42px;&quot;&gt;&lt;span&gt;automatic&amp;nbsp;retries&amp;nbsp;must&amp;nbsp;&lt;b&gt;be&amp;nbsp;disabled&lt;/b&gt;,&amp;nbsp;and&amp;nbsp;recovery&amp;nbsp;should&amp;nbsp;be&amp;nbsp;done&amp;nbsp;manually&amp;nbsp;&lt;b&gt;in&amp;nbsp;case&amp;nbsp;of&amp;nbsp;failure&lt;/b&gt;.&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 42px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;자동 재시도는 반드시 무효로 하고, 오류 발생 시 수작업으로 복구한다.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;b&gt;Adjust&lt;/b&gt;&amp;nbsp;each&amp;nbsp;task&amp;nbsp;so&amp;nbsp;that&amp;nbsp;it&amp;nbsp;has&amp;nbsp;an&amp;nbsp;&lt;b&gt;appropriate&amp;nbsp;size&lt;/b&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;각 태스크가 적절한 크기가 될 수 있도록 조정한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;nodes&amp;nbsp;&lt;b&gt;are&amp;nbsp;connected&amp;nbsp;by&amp;nbsp;&lt;/b&gt;arrows,&amp;nbsp;&lt;br /&gt;and&amp;nbsp;these&amp;nbsp;connections&amp;nbsp;&lt;b&gt;never&amp;nbsp;form&amp;nbsp;cycles&lt;/b&gt;.&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;노드와 노드가 화살표로 연결되며&lt;br /&gt;각 노드 연결이 순환되지 않는다.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;We can reprocess data&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;starting from 7 days ago&lt;/b&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;7일 전 데이터부터 재처리할 수 있다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;A&amp;nbsp;&lt;/span&gt;fast-response&amp;nbsp;database&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;is&amp;nbsp;placed&amp;nbsp;in&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;the&amp;nbsp;serving&amp;nbsp;layer&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;서빙 레이어에 응답이 빠른 데이터베이스를 설치한다&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Since&amp;nbsp;the&amp;nbsp;results&amp;nbsp;of&amp;nbsp;stream&amp;nbsp;processing&amp;nbsp;are&amp;nbsp;used&amp;nbsp;only&amp;nbsp;&lt;/span&gt;&lt;b&gt;temporarily&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;b&gt;slight inaccuracies are acceptable.&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;스트림 처리의 결과는 일시적으로만 사용되며, 정확하지 않아도 큰 문제가 없다.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;Handling&amp;nbsp;messages&amp;nbsp;&lt;b&gt;with&amp;nbsp;a&amp;nbsp;large&amp;nbsp;gap&amp;nbsp;between&lt;/b&gt;&amp;nbsp;processing&amp;nbsp;time&amp;nbsp;and&amp;nbsp;event&amp;nbsp;time&amp;nbsp;is&amp;nbsp;referred&amp;nbsp;to&amp;nbsp;as&amp;nbsp;the&amp;nbsp;&lt;b&gt;out-of-order&amp;nbsp;data&amp;nbsp;problem&lt;/b&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;프로세스 시간과 이벤트 시간의 차이가 큰 메세지를 처리하는 것을 &amp;lsquo;out of order&amp;rsquo; 데이터 문제라고&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;불린다.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;they&amp;nbsp;must&amp;nbsp;be&amp;nbsp;&lt;b&gt;sorted&amp;nbsp;by&lt;/b&gt;&amp;nbsp;event&amp;nbsp;time&amp;nbsp;before&amp;nbsp;aggregation&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;이벤트&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;시간 순서로 정렬하고 집계한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;Therefore,&amp;nbsp;the&amp;nbsp;system&amp;nbsp;must&lt;b&gt;&amp;nbsp;retain&amp;nbsp;the&amp;nbsp;state&amp;nbsp;of&amp;nbsp;past&amp;nbsp;events&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;and&amp;nbsp;re-aggregate&amp;nbsp;the&amp;nbsp;&lt;b&gt;corresponding&amp;nbsp;&lt;/b&gt;window&amp;nbsp;&lt;b&gt;whenever&amp;nbsp;new&amp;nbsp;data&amp;nbsp;arrives&lt;/b&gt;.&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;때문에 과거 이벤트의 상태를 보존하면서, 데이터가 도달할 때마다 해당 윈도우를 재집계한다.&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;Since&amp;nbsp;data&amp;nbsp;cannot&amp;nbsp;be&amp;nbsp;stored&amp;nbsp;&lt;b&gt;indefinitely&lt;/b&gt;,&amp;nbsp;&lt;br /&gt;data&amp;nbsp;that&amp;nbsp;arrives&amp;nbsp;too&amp;nbsp;&lt;b&gt;late&amp;nbsp;beyond&amp;nbsp;a&amp;nbsp;certain&amp;nbsp;time&amp;nbsp;threshold&lt;/b&gt;&amp;nbsp;is&amp;nbsp;ignored.&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;데이터를 무한히 계속 보관할 순 없으므로 일정 시간 이상 늦게 온 데이터는 무시한다.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;In&amp;nbsp;ad&amp;nbsp;hoc&amp;nbsp;data&amp;nbsp;analysis,&amp;nbsp;&lt;/span&gt;&lt;b&gt;interpreters are preferred&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;ad hoc 데이터 분석에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;인터프리터를 선호한다.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;Each&amp;nbsp;tweet&amp;nbsp;&lt;b&gt;is formatted as JSON data with a variable length.&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;각&amp;nbsp;트윗은&amp;nbsp;길이가&amp;nbsp;일정하지&amp;nbsp;않은&amp;nbsp;json&amp;nbsp;데이터로&amp;nbsp;되어&amp;nbsp;있다.&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;Virtual machines allow the entire team to&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;share a consistent setup&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;팀 전원이 같은 환경을 공유할 수 있게 해준다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;extracting&amp;nbsp;data&amp;nbsp;&lt;b&gt;for&amp;nbsp;a&amp;nbsp;specified&amp;nbsp;period&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;The error occurred&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;under&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;the specified conditions&lt;/b&gt;.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;명시된 기간 만큼의 데이터 추출하기&lt;br /&gt;명시된 조건에서 발생했다.&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;overwriting&amp;nbsp;a&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;designated&amp;nbsp;&lt;/b&gt;partition&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;지정된 파티션 덮어쓰기&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;b&gt;As&amp;nbsp;long&amp;nbsp;as&amp;nbsp;the&amp;nbsp;parameters&amp;nbsp;remain&amp;nbsp;the&amp;nbsp;same&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;파라미터만 같다면&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;The&amp;nbsp;functions&amp;nbsp;executed&amp;nbsp;&lt;/span&gt;&lt;b&gt;at&amp;nbsp;this&amp;nbsp;time&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;are&amp;nbsp;serialized&amp;nbsp;and&amp;nbsp;&lt;/span&gt;&lt;b&gt;lazily&amp;nbsp;evaluated&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;이 때 실행되는 함수는 직렬화되어 지연 평가된다.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;If&amp;nbsp;the&amp;nbsp;schedule&amp;nbsp;&lt;/span&gt;&lt;b&gt;is&amp;nbsp;set&amp;nbsp;to&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;@daily,&amp;nbsp;&lt;/span&gt;&lt;b&gt;the&amp;nbsp;task&amp;nbsp;for&amp;nbsp;January&amp;nbsp;1st&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;is&amp;nbsp;executed&amp;nbsp;&lt;/span&gt;&lt;b&gt;at&amp;nbsp;the&amp;nbsp;moment&amp;nbsp;January&amp;nbsp;2nd&amp;nbsp;begins&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;there&amp;nbsp;is&lt;/span&gt;&lt;b&gt;&amp;nbsp;a&amp;nbsp;one-day&amp;nbsp;gap&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;스케줄이 @daily 라면, 1월 1일의 태스크가 실행되는 것은 다음 날 1월 2일이 되는 순간이다.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;1일의 차이가 있다.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 43px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;if&amp;nbsp;more&amp;nbsp;tasks&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;are&amp;nbsp;queued&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;,&amp;nbsp;&lt;/span&gt;they&lt;b&gt;&amp;nbsp;are&amp;nbsp;put&amp;nbsp;on&amp;nbsp;hold&amp;nbsp;until&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;slots&amp;nbsp;become&amp;nbsp;available&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;그 이상의 태스크가 등록되면 빈 자리가 생길 때까지 실행이 보류된다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;Adjust&amp;nbsp;task&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&amp;nbsp;durations&amp;nbsp;so&amp;nbsp;that&amp;nbsp;each&amp;nbsp;one&amp;nbsp;doesn&amp;rsquo;t&lt;/span&gt;&lt;b&gt;&amp;nbsp;take&amp;nbsp;too&amp;nbsp;long&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;각 태스크의 실행 시간이 길어지지 않도록 조절하라&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;It&amp;nbsp;hasn't&amp;nbsp;been&amp;nbsp;that&amp;nbsp;long.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span&gt;그렇게 오래되진 않았어.&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;keep the system&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;in&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;a relaxed state&lt;/b&gt;.&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;항상 여유 있는 상태를 유지하라&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 52px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 52px;&quot;&gt;&lt;b&gt;By automating what was previously a manual reprocessing task&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 52px;&quot;&gt;이전에 수동으로 처리해야 했던 작업을 자동화함으로써&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 86px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 86px;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;a single re-run&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;handles all necessary steps&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 86px;&quot;&gt;필요한 모든 과정을 처리했다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 10px;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;If&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;I were asked to handle&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;tuning, my approach would be:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;first, measure and identify the bottleneck by profiling,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;then&amp;nbsp;research&amp;nbsp;best&amp;nbsp;practices&amp;nbsp;or&amp;nbsp;consult&amp;nbsp;documentation,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;and&amp;nbsp;validate&amp;nbsp;improvements&amp;nbsp;step&amp;nbsp;by&amp;nbsp;step.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 10px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;I&amp;rsquo;d definitely want to confirm&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;the original intent&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;before&amp;nbsp;making&amp;nbsp;any&amp;nbsp;changes.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;반드시 원래 의도를 확인하겠다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;b&gt;I&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;b&gt;was tasked with&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;building a data pipeline&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;데이터 파이프를 구축하게 되었음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;b&gt;To&amp;nbsp;ensure&amp;nbsp;idempotency&lt;/b&gt;,&amp;nbsp;it&amp;nbsp;deletes&amp;nbsp;existing&amp;nbsp;data&amp;nbsp;&lt;b&gt;for&amp;nbsp;each&amp;nbsp;date&amp;nbsp;&lt;/b&gt;and&amp;nbsp;regenerates&amp;nbsp;it&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;날짜&amp;nbsp;단위로&amp;nbsp;기존&amp;nbsp;데이터를&amp;nbsp;삭제하고&amp;nbsp;새로&amp;nbsp;데이터를&amp;nbsp;만듦&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;there&amp;nbsp;was&amp;nbsp;no&amp;nbsp;process&amp;nbsp;&lt;b&gt;in&amp;nbsp;place&lt;/b&gt;&amp;nbsp;to&amp;nbsp;verify&amp;nbsp;data&amp;nbsp;quality.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;데이터 품질 검사를 위한 프로세스가 마련되어 있지 않았다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;I&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;identified and resolved the root causes&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;of the inconsistency&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;원인을 발견하고 해결하였다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;The source team&amp;rsquo;s table had a different primary key (PK) configuration,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;causing&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;duplicate records.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;데이터 복제를 발생시켰다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Some data was missing because their encryption logic&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;malfunctioned&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;during transmission&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;암호화 로직이 잘못 적용되어있었다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;we began receiving&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;accurate&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;data&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;consistently&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;정합성있는 데이터를 받을 수 있게 되었다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;carried out a data cleansing process&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;to remove or&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;obscure&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;PII where it would not affect business decisions.&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;PII 를 제거하거나 가리기 위해 클렌징 작업을 수행했다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;masked the middle part of names with stars&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;to&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;obfuscate&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;the PII&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;모호하게 하기 위해 이름 중간 부분을 별표로 가렸다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 43px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;I&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;applied&amp;nbsp;a&amp;nbsp;retention&amp;nbsp;policy&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;to&amp;nbsp;PII,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;performing a soft delete for&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;any PII older than three months from the current date&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span&gt;PII 에 retention policy 를 적용하여 현재 날짜로부터 3개월이 지난 모든 PII에 대해 소프트 삭제를 수행했다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 51px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 51px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I checked&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;cross-version backward compatibility&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;within the EMR environment to ensure there would be no issues after the upgrade.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 51px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;업그레이드 후 문제가 발생하지 않도록 EMR 환경 내에서 버전 간 하위 호환성을 확인했다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I then&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;provisioned a new EMR cluster with the latest version&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;그런&amp;nbsp;다음&amp;nbsp;최신&amp;nbsp;버전으로&amp;nbsp;새&amp;nbsp;EMR&amp;nbsp;클러스터를&amp;nbsp;프로비저닝했다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;There were KTLO (Keep The Lights On) jobs&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;scheduled by time&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;similar to crontab&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;crontab 처럼, 시간으로 스케줄링 해 둔 KTLO 작업들이 존재함&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;if an upstream job failed,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;it&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;caused downstream failures&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span&gt;상위 작업이 실패하면 하위 작업의 실패를 초래했다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;modified the code to be idempotent&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span&gt;코드를 멱등성을 갖도록 수정했다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;This reduced human error and improved&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;operational efficiency&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span&gt;인적 오류도 감소하고 운영 효율성이 향상되었다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I will&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;proactively&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;seek out and learn technologies I haven't used before.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span&gt;사용해 보지 않은 기술을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;적극적으로&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;찾아 배울 것이다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 43px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I will invest time to take online courses, research best practices, and get hands-on experimentation.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span&gt;온라인 강좌 수강, 모범 사례 연구, 그리고 직접적인 실험을 위해 시간을 투자할 것임&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I&amp;nbsp;will&amp;nbsp;ensure&amp;nbsp;&lt;b&gt;no&amp;nbsp;disruption&amp;nbsp;to&amp;nbsp;my&amp;nbsp;work&lt;/b&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span&gt;업무에 차질이 없도록 하겠다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;work with BA and DS teams, and&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;respond to their requests.&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;업무요청 대응하기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;took over&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;the task of synchronizing data&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;데이터 동기화 작업을 인수인계 받았다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Occasionally, incorrect data would&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;come in&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;from the source table&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span&gt;가끔씩&amp;nbsp;소스&amp;nbsp;테이블에서&amp;nbsp;잘못된&amp;nbsp;데이터가&amp;nbsp;들어오곤&amp;nbsp;했다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;we only found out&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;days later&lt;/b&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;우리는&amp;nbsp;며칠이&amp;nbsp;지나서야&amp;nbsp;알게&amp;nbsp;되었다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;he&amp;nbsp;told&amp;nbsp;me&amp;nbsp;to&amp;nbsp;retrieve&amp;nbsp;the&amp;nbsp;data&amp;nbsp;&lt;b&gt;for&amp;nbsp;that&amp;nbsp;date&lt;/b&gt;&amp;nbsp;again&amp;nbsp;&lt;br /&gt;and&amp;nbsp;move&amp;nbsp;it&amp;nbsp;to&amp;nbsp;the&amp;nbsp;target&amp;nbsp;table.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;그 날짜의 데이터를 다시 가져와서 옮기라고 말했다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;b&gt;arbitrarily&lt;/b&gt;&amp;nbsp;moving&amp;nbsp;&lt;b&gt;past&amp;nbsp;date&amp;nbsp;data&amp;nbsp;&lt;/b&gt;would&amp;nbsp;break&amp;nbsp;consistency.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;임의로 과거 날짜 데이터를 이동하면 일관성이 깨질 수 있다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 43px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I&amp;nbsp;learned&amp;nbsp;that&amp;nbsp;rather&amp;nbsp;than&amp;nbsp;just&amp;nbsp;following&amp;nbsp;instructions&amp;nbsp;&lt;b&gt;blindly&lt;/b&gt;,&lt;br /&gt;I&amp;nbsp;must&amp;nbsp;double-check&amp;nbsp;whether&amp;nbsp;&lt;b&gt;my&amp;nbsp;work&amp;nbsp;is&amp;nbsp;correct&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span&gt;맹목적으로 따라하지 말고, 내가 하는 일이 잘 하는게 맞는지 재확인&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;To&amp;nbsp;minimize&amp;nbsp;risk,&amp;nbsp;I&amp;nbsp;created&amp;nbsp;&lt;b&gt;isolated&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;test resources like a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;dedicated&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;EMR cluster&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;전용 EMR cluster 같이, 분리된 테스트 리소스를 생성했다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;b&gt;Once validated&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;, I&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;safely switched over&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;테스트가 마무리 된 이후 새로운 테이블을 기존 테이블로 안전하게 교체하였다&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;All team members wanted to&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;switch&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;directly to Spark 3 without testing&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;This could lead to a dangerous&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;situation&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;where the entire operation halts&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span&gt;이는&amp;nbsp;전체&amp;nbsp;작업이&amp;nbsp;중단되는&amp;nbsp;위험한&amp;nbsp;상황으로&amp;nbsp;이어질&amp;nbsp;수&amp;nbsp;있다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 69px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 69px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;once&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;I was assigned to handle&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;WebUI processing using Spring.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;b&gt;I was assigned the task&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;of adding functionality to&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;display different screens&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;based on user permissions&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 69px;&quot;&gt;&lt;span&gt;Spring을 사용한 WebUI 처리를 담당하도록 배정받았다.&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;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;I conducted&amp;nbsp;code&amp;nbsp;reviews&amp;nbsp;with&amp;nbsp;team&amp;nbsp;members&amp;nbsp;to&amp;nbsp;double-check&amp;nbsp;&lt;b&gt;for&amp;nbsp;any&amp;nbsp;shortcomings&lt;/b&gt;.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;&lt;span&gt;부족한 점이 없는지 다시 한번 확인했다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 43px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I performed&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;a staging deployment&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;to verify that the screens displayed correctly for users with different permissions.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span&gt;화면이 올바르게 표시되는지 확인하기 위해 스테이징 배포를 수행했다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;I&amp;nbsp;received&amp;nbsp;negative&amp;nbsp;feedback&amp;nbsp;&lt;b&gt;regarding&lt;/b&gt;&amp;nbsp;time&amp;nbsp;management.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span&gt;시간&amp;nbsp;관리에&amp;nbsp;대해&amp;nbsp;부정적인&amp;nbsp;피드백을&amp;nbsp;받았다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 43px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span&gt;I missed the deadline while waiting for approval and&lt;br /&gt;received feedback that&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;I&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;failed to meet timelines&lt;/span&gt;.&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span&gt;승인을 기다리다 마감일을 놓쳤고&lt;/span&gt;&lt;br /&gt;&lt;span&gt;일정을 지키지 못했다는 피드백을 받았다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 69px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 69px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I need approval to&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;proceed&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;with my work&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I applied for approval in advance and requested it multiple times&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;but the response came late&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 69px;&quot;&gt;&lt;span&gt;업무&amp;nbsp;진행을&amp;nbsp;위해&amp;nbsp;승인이&amp;nbsp;필요하다.&lt;br /&gt;사전에&amp;nbsp;승인을&amp;nbsp;신청하고&amp;nbsp;여러&amp;nbsp;차례 요청했다&lt;br /&gt;하지만 답은 늦게 도착했다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 43px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I will&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;be comfortable working independently&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and handling tasks reliably.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span&gt;독립적으로 업무를 수행하고 신뢰할 수 있게 업무를 처리하는 데 익숙해 질 것이다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 33px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 33px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I want to participate in decisions about&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;future direction&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and contribute to the team's future.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 33px;&quot;&gt;&lt;span&gt;향후 방향에 관한 결정에 참여하고 팀의 미래에 기여하고 싶다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;My biggest strength is&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;identifying inefficiencies&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;in systems and improving them.&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I&amp;rsquo;ve developed&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;a strong habit of documentation and logging&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I'll share my thoughts&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;along with&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;materials&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;I researched and gathered beforehand.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span&gt;사전에 조사하고 수집한 자료와 함께 내 생각을 공유할 것이다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;ROW_NUMBER() assigns a unique sequential number to each row,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;regardless of whether&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;the values are the same.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span&gt;&amp;nbsp;값이 같은지 아닌지 상관 없이&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;DENSE_RANK() assigns the same rank to rows with the same value, and&lt;/span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;the next rank is assigned without gaps.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span&gt;다음은 갭 없이&lt;span&gt;&amp;nbsp;&lt;/span&gt;랭크가 부여된다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;RANK() assigns the same rank to rows with the same value, but&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;it leaves gaps&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;in the ranking sequence&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;after ties&lt;/b&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;같은 값을 갖는 랭크 이후 갭이 있다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 52px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 52px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Window&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;functions&amp;nbsp;are&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;functions&amp;nbsp;that&amp;nbsp;&lt;/span&gt;&lt;b&gt;preserve&amp;nbsp;the&amp;nbsp;context&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;of&amp;nbsp;the&amp;nbsp;original&amp;nbsp;data&amp;nbsp;and&amp;nbsp;do&amp;nbsp;not&amp;nbsp;reduce&amp;nbsp;the&amp;nbsp;number&amp;nbsp;of&amp;nbsp;rows&amp;nbsp;after&amp;nbsp;aggregation.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 52px;&quot;&gt;&lt;span&gt;&amp;nbsp;집계 후에 원본 데이터 맥락을 유지한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 70px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 70px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;JOIN&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;combines&amp;nbsp;columns&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;horizontally&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;based&amp;nbsp;on&amp;nbsp;a&amp;nbsp;condition,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;while&amp;nbsp;UNION&amp;nbsp;&lt;/span&gt;&lt;b&gt;combines&amp;nbsp;rows&amp;nbsp;vertically&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;and&amp;nbsp;requires&amp;nbsp;schema&amp;nbsp;compatibility.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 70px;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span&gt;EXISTS ignores null values because it&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;determines&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;whether a row exists.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;(&lt;b&gt;The existence of a row&lt;/b&gt;)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;EXISTS 는 행 존재 여부를 판단하기 때문에 null&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;을 무시함&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span&gt;but&amp;nbsp;I&amp;nbsp;understand&amp;nbsp;the&amp;nbsp;concept&amp;nbsp;and&amp;nbsp;have&amp;nbsp;worked&amp;nbsp;on&amp;nbsp;similar&amp;nbsp;problems&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span&gt;I&amp;rsquo;m&amp;nbsp;not&amp;nbsp;familiar&amp;nbsp;with&amp;nbsp;that&amp;nbsp;term,&amp;nbsp;so&amp;nbsp;I&amp;nbsp;don&amp;rsquo;t&amp;nbsp;want&amp;nbsp;to&amp;nbsp;give&amp;nbsp;an&amp;nbsp;incorrect&amp;nbsp;explanation.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 43px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;If it&amp;rsquo;s something I&amp;rsquo;ve encountered before&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;under a different term,&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;I&amp;rsquo;d be happy to explain from that perspective.&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;혹시 제가 알고있는 개념이라면 보충해서 이야기를 할 수 있을 것 같다&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I haven&amp;rsquo;t worked with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Streaming System&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;yet, so I wouldn&amp;rsquo;t&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;want to explain it&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;inaccurately&lt;/b&gt;.&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 88px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 88px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;If your team uses Streaming System in production,&lt;br /&gt;I&amp;rsquo;d make sure to study by watching online lectures,&lt;br /&gt;understand how I can use and why it was chosen here,&lt;br /&gt;and&amp;nbsp;&lt;b&gt;get&amp;nbsp;hands-on&amp;nbsp;experience&lt;/b&gt;&amp;nbsp;&lt;br /&gt;so&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;I can work with it safely in a production environment&lt;/b&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 88px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I&amp;nbsp;&lt;b&gt;haven&amp;rsquo;t&amp;nbsp;had&amp;nbsp;hands-on&amp;nbsp;experience&amp;nbsp;with&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;performance tuning yet.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;However, I have similar experience&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;in terms of&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;tuning.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;I can&amp;rsquo;t say&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;for certain&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;what the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;exact reasoning&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;was.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;정확한 이유가 무엇이었는지 단정할 수 없다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 43px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;However,&amp;nbsp;&lt;/span&gt;&lt;b&gt;based&amp;nbsp;on&amp;nbsp;my&amp;nbsp;understanding&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;of&amp;nbsp;the&amp;nbsp;system,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;one&amp;nbsp;possible&amp;nbsp;reason&amp;nbsp;could&amp;nbsp;be&amp;nbsp;cost&amp;nbsp;efficiency&amp;nbsp;&lt;b&gt;in&amp;nbsp;this&amp;nbsp;part&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;하지만 제가 이해한 시스템 구조상 이 부분에서는 비용 효율성이 한 가지 이유가 될 수 있다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;I&amp;nbsp;didn&amp;rsquo;t&amp;nbsp;design&amp;nbsp;it&amp;nbsp;myself,&amp;nbsp;so&amp;nbsp;&lt;b&gt;I&amp;rsquo;d&amp;nbsp;avoid&amp;nbsp;making&amp;nbsp;assumptions.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;The requester wanted data&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;processed with&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;the desired transformation&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;and wished to receive the data via SFTP&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;according to a set schedule&lt;/b&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;Throughout this process&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;the requester and I discussed how to handle duplicate data,&lt;br /&gt;the final number of files,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;and how to notify us if issues occur.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;요청자는 원하는 변환 방식으로 처리된 데이터를 원했으며,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;정해진 일정에 따라 SFTP를 통해 데이터를 수신하기를 원했다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;이 과정 전반에 걸쳐 요청자와 저는 중복 데이터 처리 방법,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;최종 파일 수, 문제 발생 시 통보 방식에 대해 논의했다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 86px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 86px;&quot;&gt;We conducted many tests and&lt;br /&gt;completed the work as the requester wanted.&lt;br /&gt;As a result, I successfully built the data pipeline,&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;and the requester received&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;the desired data&lt;/b&gt;.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 86px;&quot;&gt;&lt;span&gt;우리는 여러 차례 테스트를 수행하고&lt;/span&gt;&lt;br /&gt;&lt;span&gt;요청자가 원하는 대로 작업을 완료했습니다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;그 결과, 데이터 파이프라인 구축에 성공했으며&lt;/span&gt;&lt;br /&gt;&lt;span&gt;요청자는 원하는 데이터를 수령했습니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Just retrieve&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;the data for the date the issue&lt;span&gt;&amp;nbsp;&lt;/span&gt;was created&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&amp;nbsp;이슈를 만든 날짜의 데이터를 찾아라.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;I&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;proceeded&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;with the task that way&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span&gt;그 방식으로 작업을 진행했다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Therefore,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;arbitrarily&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;moving&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;past date data&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;would break consistency.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 35px;&quot;&gt;&lt;span&gt;따라서 과거 날짜 데이터를 임의로 이동하면 일관성이 깨질 것이다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;We &lt;b&gt;only&lt;/b&gt; discovered this much later.&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span&gt;그제서야, 나중에야, 뒤늦게서야...(아쉬움)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;S3&amp;nbsp;doesn't&amp;nbsp;&lt;b&gt;have&amp;nbsp;the&amp;nbsp;concept&amp;nbsp;of&lt;/b&gt;&amp;nbsp;directories.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 21px;&quot;&gt;&lt;span&gt;&amp;nbsp;s3 는 디렉토리 개념이 없다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 70px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 70px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Durability refers to&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;the potential for&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;data loss.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Durability refers to&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;the likelihood of&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;not lossing data.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Availability refers to&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;the probability of&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;being able to read data without issues.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 70px;&quot;&gt;&lt;span&gt;Durability : 데이터를 잃어버릴 가능성. 99.999999999%&lt;br /&gt;Availability&amp;nbsp;:&amp;nbsp;데이터를&amp;nbsp;문제없이&amp;nbsp;읽을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;확률&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 43px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;We can&lt;/span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;use&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;tags as&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;indicators&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;for&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;distinguishing pusrposes&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;when&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;settling accounts&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;later.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 43px;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;s3 bucket 에 tag 를 달면, 나중에 정산할 때 구분을 위한 지표로&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;사용 가능함&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Glue Crawlers parse and&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;infer&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;from the csv file&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;Glue&amp;nbsp;Crawlers&amp;nbsp;는&amp;nbsp;이&amp;nbsp;csv&amp;nbsp;파일의&amp;nbsp;정보를&amp;nbsp;분석하고&amp;nbsp;추론함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;It remembers &lt;b&gt;how far&lt;/b&gt; it previously collected data and &lt;br /&gt;&lt;b&gt;resumes&lt;/b&gt; collection &lt;b&gt;from the point where it stopped&lt;/b&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;이것은 이전에 데이터를 수집한 지점을 기억하고&lt;/span&gt;&lt;br /&gt;&lt;span&gt;중단된 지점부터 수집을 재개한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;There&amp;nbsp;are&amp;nbsp;&lt;b&gt;spaces&amp;nbsp;before&amp;nbsp;and&amp;nbsp;after&lt;/b&gt;&amp;nbsp;the&amp;nbsp;name.&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;고객명&amp;nbsp;앞뒤&amp;nbsp;공백&amp;nbsp;있음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>English</category>
      <author>눈가락</author>
      <guid isPermaLink="true">https://eyeballs.tistory.com/741</guid>
      <comments>https://eyeballs.tistory.com/741#entry741comment</comments>
      <pubDate>Mon, 26 Jan 2026 13:37:50 +0900</pubDate>
    </item>
    <item>
      <title>[Spark] interview questions</title>
      <link>https://eyeballs.tistory.com/739</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spark 이론 정리 :&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://eyeballs.tistory.com/m/206&quot;&gt;https://eyeballs.tistory.com/m/206&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Spark 질문은 &lt;b&gt;원리 + 실무 판단력&lt;/b&gt;을 보기 위함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Spark UI 언급 = 실무 경험 신뢰도 급상승&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;모든 질문에 완벽할 필요 없음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;왜 그렇게 했는지 설명할 수 있으면 충분&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;What is Apache Spark and why is it used?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;Apache&amp;nbsp;Spark&amp;nbsp;is&amp;nbsp;a&amp;nbsp;distributed&amp;nbsp;data&amp;nbsp;processing&amp;nbsp;framework&amp;nbsp;designed&amp;nbsp;for&amp;nbsp;large-scale&amp;nbsp;data&amp;nbsp;processing.&amp;nbsp;&lt;br /&gt;It&amp;nbsp;provides&amp;nbsp;in-memory&amp;nbsp;computation,&amp;nbsp;fault&amp;nbsp;tolerance,&amp;nbsp;and&amp;nbsp;a&amp;nbsp;high-level&amp;nbsp;API,&amp;nbsp;&lt;br /&gt;which&amp;nbsp;makes&amp;nbsp;batch&amp;nbsp;and&amp;nbsp;iterative&amp;nbsp;workloads&amp;nbsp;much&amp;nbsp;faster&amp;nbsp;compared&amp;nbsp;to&amp;nbsp;traditional&amp;nbsp;MapReduce.&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;What is the difference between RDD and DataFrame?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;RDD&amp;nbsp;is&amp;nbsp;a&amp;nbsp;low-level&amp;nbsp;API&amp;nbsp;that&amp;nbsp;provides&amp;nbsp;fine-grained&amp;nbsp;control&amp;nbsp;but&amp;nbsp;lacks&amp;nbsp;automatic&amp;nbsp;optimization.&amp;nbsp;&lt;br /&gt;DataFrames&amp;nbsp;are&amp;nbsp;higher-level,&amp;nbsp;schema-aware,&amp;nbsp;and&amp;nbsp;benefit&amp;nbsp;from&amp;nbsp;Catalyst&amp;nbsp;Optimizer&amp;nbsp;and&amp;nbsp;Tungsten&amp;nbsp;execution&amp;nbsp;engine,&amp;nbsp;&lt;br /&gt;so&amp;nbsp;they&amp;nbsp;are&amp;nbsp;generally&amp;nbsp;preferred&amp;nbsp;for&amp;nbsp;most&amp;nbsp;workloads.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;What is lazy evaluation in Spark?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;Spark&amp;nbsp;does&amp;nbsp;not&amp;nbsp;execute&amp;nbsp;transformations&amp;nbsp;immediately.&amp;nbsp;&lt;br /&gt;Instead,&amp;nbsp;it&amp;nbsp;builds&amp;nbsp;a&amp;nbsp;logical&amp;nbsp;execution&amp;nbsp;plan&amp;nbsp;and&amp;nbsp;only&amp;nbsp;triggers&amp;nbsp;computation&amp;nbsp;when&amp;nbsp;an&amp;nbsp;action&amp;nbsp;is&amp;nbsp;called,&amp;nbsp;&lt;br /&gt;which&amp;nbsp;allows&amp;nbsp;Spark&amp;nbsp;to&amp;nbsp;optimize&amp;nbsp;the&amp;nbsp;execution&amp;nbsp;plan.&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;What is the difference between transformation and action?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;Transformations&amp;nbsp;define&amp;nbsp;how&amp;nbsp;data&amp;nbsp;should&amp;nbsp;be&amp;nbsp;processed&amp;nbsp;and&amp;nbsp;are&amp;nbsp;lazily&amp;nbsp;evaluated,&amp;nbsp;&lt;br /&gt;while&amp;nbsp;actions&amp;nbsp;trigger&amp;nbsp;the&amp;nbsp;actual&amp;nbsp;execution&amp;nbsp;and&amp;nbsp;return&amp;nbsp;results&amp;nbsp;or&amp;nbsp;write&amp;nbsp;data.&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;Explain Spark&amp;rsquo;s execution flow.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;When&amp;nbsp;an&amp;nbsp;action&amp;nbsp;is&amp;nbsp;called,&amp;nbsp;Spark&amp;nbsp;creates&amp;nbsp;a&amp;nbsp;job,&amp;nbsp;which&amp;nbsp;is&amp;nbsp;divided&amp;nbsp;into&amp;nbsp;stages&amp;nbsp;based&amp;nbsp;on&amp;nbsp;shuffle&amp;nbsp;boundaries.&amp;nbsp;&lt;br /&gt;Each&amp;nbsp;stage&amp;nbsp;consists&amp;nbsp;of&amp;nbsp;tasks&amp;nbsp;that&amp;nbsp;are&amp;nbsp;executed&amp;nbsp;in&amp;nbsp;parallel&amp;nbsp;on&amp;nbsp;executors.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;What is a shuffle and why is it expensive?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;A&amp;nbsp;shuffle&amp;nbsp;involves&amp;nbsp;redistributing&amp;nbsp;data&amp;nbsp;across&amp;nbsp;executors,&amp;nbsp;usually&amp;nbsp;during&amp;nbsp;joins&amp;nbsp;or&amp;nbsp;aggregations.&amp;nbsp;&lt;br /&gt;It&amp;nbsp;is&amp;nbsp;expensive&amp;nbsp;because&amp;nbsp;it&amp;nbsp;requires&amp;nbsp;disk&amp;nbsp;I/O,&amp;nbsp;network&amp;nbsp;transfer,&amp;nbsp;and&amp;nbsp;serialization.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;What causes shuffle in Spark?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;Operations&amp;nbsp;like&amp;nbsp;groupBy,&amp;nbsp;reduceByKey,&amp;nbsp;join,&amp;nbsp;distinct,&amp;nbsp;and&amp;nbsp;repartition&amp;nbsp;can&amp;nbsp;trigger&amp;nbsp;shuffle&amp;nbsp;&lt;br /&gt;because&amp;nbsp;they&amp;nbsp;require&amp;nbsp;data&amp;nbsp;to&amp;nbsp;be&amp;nbsp;reorganized&amp;nbsp;across&amp;nbsp;partitions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;How do you optimize joins in Spark?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;I&amp;nbsp;try&amp;nbsp;to&amp;nbsp;reduce&amp;nbsp;shuffle&amp;nbsp;by&amp;nbsp;using&amp;nbsp;broadcast&amp;nbsp;joins&amp;nbsp;when&amp;nbsp;one&amp;nbsp;dataset&amp;nbsp;is&amp;nbsp;small&amp;nbsp;enough.&amp;nbsp;&lt;br /&gt;I&amp;nbsp;also&amp;nbsp;ensure&amp;nbsp;proper&amp;nbsp;partitioning&amp;nbsp;and&amp;nbsp;avoid&amp;nbsp;skewed&amp;nbsp;join&amp;nbsp;keys&amp;nbsp;when&amp;nbsp;possible.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;What is data skew and how do you handle it?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;Data&amp;nbsp;skew&amp;nbsp;occurs&amp;nbsp;when&amp;nbsp;a&amp;nbsp;few&amp;nbsp;keys&amp;nbsp;dominate&amp;nbsp;the&amp;nbsp;data&amp;nbsp;distribution,&amp;nbsp;causing&amp;nbsp;some&amp;nbsp;tasks&amp;nbsp;to&amp;nbsp;take&amp;nbsp;much&amp;nbsp;longer.&amp;nbsp;&lt;br /&gt;Common&amp;nbsp;approaches&amp;nbsp;include&amp;nbsp;salting&amp;nbsp;keys,&amp;nbsp;filtering&amp;nbsp;hot&amp;nbsp;keys,&amp;nbsp;or&amp;nbsp;using&amp;nbsp;broadcast&amp;nbsp;joins.&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;What is partitioning and why is it important?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;Partitioning&amp;nbsp;determines&amp;nbsp;how&amp;nbsp;data&amp;nbsp;is&amp;nbsp;distributed&amp;nbsp;across&amp;nbsp;executors.&amp;nbsp;&lt;br /&gt;Proper&amp;nbsp;partitioning&amp;nbsp;improves&amp;nbsp;parallelism&amp;nbsp;and&amp;nbsp;resource&amp;nbsp;utilization,&amp;nbsp;&lt;br /&gt;while&amp;nbsp;poor&amp;nbsp;partitioning&amp;nbsp;can&amp;nbsp;lead&amp;nbsp;to&amp;nbsp;performance&amp;nbsp;bottlenecks.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;What is the difference between repartition and coalesce?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;repartition&amp;nbsp;increases&amp;nbsp;or&amp;nbsp;decreases&amp;nbsp;partitions&amp;nbsp;and&amp;nbsp;triggers&amp;nbsp;a&amp;nbsp;shuffle,&amp;nbsp;&lt;br /&gt;while&amp;nbsp;coalesce&amp;nbsp;typically&amp;nbsp;reduces&amp;nbsp;partitions&amp;nbsp;without&amp;nbsp;a&amp;nbsp;full&amp;nbsp;shuffle.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;When would you cache or persist data?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;I cache data when it is reused multiple times across different actions, especially if the computation is expensive. &lt;br /&gt;I choose the storage level based on memory availability.&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;How does Spark handle failures?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;Spark&amp;nbsp;uses&amp;nbsp;lineage&amp;nbsp;information&amp;nbsp;to&amp;nbsp;recompute&amp;nbsp;lost&amp;nbsp;partitions.&amp;nbsp;&lt;br /&gt;If&amp;nbsp;a&amp;nbsp;task&amp;nbsp;or&amp;nbsp;executor&amp;nbsp;fails,&amp;nbsp;Spark&amp;nbsp;retries&amp;nbsp;the&amp;nbsp;task&amp;nbsp;automatically&amp;nbsp;on&amp;nbsp;another&amp;nbsp;executor.&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;Why is Parquet commonly used with Spark?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;Parquet&amp;nbsp;is&amp;nbsp;a&amp;nbsp;columnar&amp;nbsp;storage&amp;nbsp;format&amp;nbsp;that&amp;nbsp;supports&amp;nbsp;compression&amp;nbsp;and&amp;nbsp;predicate&amp;nbsp;pushdown,&amp;nbsp;&lt;br /&gt;which&amp;nbsp;reduces&amp;nbsp;I/O&amp;nbsp;and&amp;nbsp;improves&amp;nbsp;query&amp;nbsp;performance.&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;How do you debug a slow Spark job?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;I&amp;nbsp;start&amp;nbsp;by&amp;nbsp;checking&amp;nbsp;Spark&amp;nbsp;UI&amp;nbsp;to&amp;nbsp;identify&amp;nbsp;slow&amp;nbsp;stages&amp;nbsp;or&amp;nbsp;skewed&amp;nbsp;tasks,&amp;nbsp;&lt;br /&gt;then&amp;nbsp;review&amp;nbsp;shuffle&amp;nbsp;size,&amp;nbsp;partition&amp;nbsp;count,&amp;nbsp;&lt;br /&gt;and&amp;nbsp;executor&amp;nbsp;utilization&amp;nbsp;before&amp;nbsp;applying&amp;nbsp;optimizations.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;Spark execution model 종류 및 차이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;Spark execution flow (논리적 모델, 물리적 모델, stage, task 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;partition, parallelism. input 파일 개수와 partition 의 관계?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;join 종류와 어떤 상황에서 어떤 join 을 선택해야 하는지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;executor 실패시 어떻게 되는지, 어떻게 복구할건지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;skew 발생시 어떻게 대응할지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;Why is this spark job slow? 느려지는 경우 어디서부터 어떻게 원인 찾고 해결할래?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;How would you optimize it? 튜닝 방법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 34px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px;&quot;&gt;What&amp;nbsp;are&amp;nbsp;the&amp;nbsp;RDD's&amp;nbsp;in&amp;nbsp;Spark?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Spark UI 에서 확인해야 하는 포인트&lt;br /&gt;&lt;a href=&quot;https://eyeballs.tistory.com/715&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://eyeballs.tistory.com/715&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&amp;lt; Jobs Tab &amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;- 몇 개의 job이 실행되었는지&lt;br /&gt;&lt;/span&gt;&lt;span&gt;- 어떤 action이 job을 트리거했는지&lt;br /&gt;&lt;br /&gt;하나의 action 이 하나의 job 을 만듦. 꼭 기억하자&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt; Stages Tab&amp;nbsp;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;- Stage 실행 시간&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;- Shuffle Read / Write 크기&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;- Failed / Skipped stages&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Stage 경계(boundary) 는 shuffle 기준으로 나뉨&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&amp;lt; Tasks 상세 화면&amp;nbsp;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- Task 실행 시간 분포&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- 특정 task만 유난히 느린지 (skew 발생 여부 확인)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- Input size 차이&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;몇몇 task 가 특출나게 오래 실행된다면, skew 를 의심해볼 수 있음&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&amp;lt; SQL Tab (DataFrame 사용 시)&amp;nbsp;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- Physical Plan&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- BroadcastHashJoin 여부&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- SortMergeJoin 사용 여부&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;물리적 실행 계획을 보고 어떤 join 전략이 사용되었는지 확인할 수 있음&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&amp;lt; Storage Tab &amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- 캐시된 DataFrame/RDD&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- 메모리 사용량&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- Storage Level&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;lt; Executors Tab &amp;gt;&lt;br /&gt;&lt;br /&gt;- Executor 수&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- CPU/Memory 사용률&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- Shuffle Read/Write per executor&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- GC time&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;각 노드의 리소스가 고르게 쓰이고있는지 확인 가능함&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;br /&gt;면접에서 다음과 같이 말하면 좋음&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;When a Spark job is slow, I usually start with the &lt;b&gt;Spark UI&lt;/b&gt;, especially the &lt;b&gt;Stages and Tasks tabs&lt;/b&gt;, &lt;br /&gt;to identify &lt;b&gt;shuffle-heavy stages&lt;/b&gt; or &lt;b&gt;data skew&lt;/b&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Coding Interview</category>
      <author>눈가락</author>
      <guid isPermaLink="true">https://eyeballs.tistory.com/739</guid>
      <comments>https://eyeballs.tistory.com/739#entry739comment</comments>
      <pubDate>Thu, 22 Jan 2026 07:47:58 +0900</pubDate>
    </item>
  </channel>
</rss>