<?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>Wed, 15 Apr 2026 01:41:39 +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>[IT] 최용락 교수님 데이터 모델링 공부 필기</title>
      <link>https://eyeballs.tistory.com/742</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/quzbmlYO7Rc?si=VmDoQ5gdQ-_V-EZp&amp;amp;t=2103&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/quzbmlYO7Rc?si=VmDoQ5gdQ-_V-EZp&amp;amp;t=2103&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; 데이터 모델링이란 &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;DB 사용자들이 필요로 하는 &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;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;다르게 말하면, BI 팀에서 원하는 정보를 쉽고 빠르게 쿼리할 수 있도록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최적의 테이블 구조를 설계하는 것&lt;/b&gt; (최적의 테이블 관계를 구축해두고, 데이터 IO 도 빠르게 할 수 있도록 설정해두고)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nSdD0/dJMcajodklw/9V3kZ1kcsrQzoEMR2Mjst1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nSdD0/dJMcajodklw/9V3kZ1kcsrQzoEMR2Mjst1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nSdD0/dJMcajodklw/9V3kZ1kcsrQzoEMR2Mjst1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnSdD0%2FdJMcajodklw%2F9V3kZ1kcsrQzoEMR2Mjst1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;492&quot; height=&quot;279&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Entity&lt;/b&gt;(개체) : 테이블. ex) 학과 테이블, 학생 테이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Relationship&lt;/b&gt; : 테이블 간 관계. ex) 학생이 듣는 과목 코드(FK)-학과 코드(PK)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Attribute&lt;/b&gt; : 테이블의 스키마. ex) 학생 테이블에는 학번, 이름, 주소, 성별, 전공 등 (key 값을 포함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Identifier : 테이블의 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;위 그림에서 네모박스는 Entity, 그리고 가장 첫 번째 속성은 PK&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; 데이터 모델링 마인드 &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;읽는 순서를 바꾸거나, fact 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFxgL3/dJMcacpaFRv/cuKOjVyWZDUbsXZFKWEeyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFxgL3/dJMcacpaFRv/cuKOjVyWZDUbsXZFKWEeyK/img.png&quot; data-alt=&quot;객체란, 처리를 위해 메모리에 올린 데이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFxgL3/dJMcacpaFRv/cuKOjVyWZDUbsXZFKWEeyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFxgL3%2FdJMcacpaFRv%2FcuKOjVyWZDUbsXZFKWEeyK%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;582&quot; height=&quot;231&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;객체란, 처리를 위해 메모리에 올린 데이터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;논리 데이터 모델링은 Entity(테이블) 를 파악하는 작업으로 시작&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Entity 란, 정보를 갖고 있거나 그에 대한 정보를 알아야 하는 유무형의 사물이나 객체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;정보를 갖고 있는 thing&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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; Entity 특성 &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;Entity 는 2 가지 특성이 존재함. 이 두 가지 특성이 없으면 Entity 가 아님&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;- 상호 배타성(Mutual Exclusivity) : 모든 인스턴스는 하나의 Entity에만 속해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;하나의 데이터(Instance)는 논리적으로 단 하나의 엔티티에만 소속&lt;/b&gt;되어야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;Entity 간의 경계가 모호하면 데이터가 중복되고 정합성이 깨지게 됨&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 예를 들어, A table 에 내 이름 정보가 있는데 B table 에도 내 이름 정보가 있으면 안 됨&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; '커피'라는 정보가 음료table 에도 들어갈 수 있고 각성제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;- 식별성(Identifiability) : Entity 내에 포함된 모든 인스턴스들은 유일한 식별자에 의해 식별 가능해야 함. PK 말하는 거임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;Entity 는 무조건 PK 를 포함&lt;/b&gt;해야 함. 그래서 row(instance) 를 유일하게 식별해낼 수 있어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;식별성을 갖추지 못하면, 데이터 update, delete 를 할 수 없게 됨&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 동일한 값을 갖는 여러 instances 에서 내가 원하는 것만 업데이트 할 수 없게 되니까&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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; Entity 유형 &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;Entity 는 3 가지 유형으로 존재함&lt;/p&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;Fundamental Entity&lt;/b&gt; : 특정 범주에 속하지 않는 기본 개념(특성) 정보를 포함하는 Entity&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 정보 처리를 위해 기본적으로 존재하는 코드성 Entity&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;물리적&amp;nbsp;실체가&amp;nbsp;있음&lt;/b&gt;&amp;nbsp;(사람,&amp;nbsp;물건)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 다른 Entity 에 의존하지 않고 독립적으로 생성될 수 있어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 예를 들어, 강사 Entity - 가르치는 강의가 없어도 시스템에 등록될 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 상품 Entity, 고객 Entity, 계좌 Entity 등&lt;/p&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;Conceptual Entity&lt;/b&gt; : 업무 처리를 위한 무형의 개념/과정을 체계화 시킨 Entity&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;눈에 보이진 않지만, 데이터를 분류하거나 관리하기 위한 규칙을 정의&lt;/b&gt;할 때 사용되는 Entity&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 예를 들어, 강의 카테고리 Entity - 프로그래밍, 자료구조 등 '카테고리' 자체는 보이지 않지만 강의를 논리적으로 구분지어줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 구독 플랜 Entity - 서비스의 정책을 (실체는 없지만) 데이터화함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 부서 Entity - 눈에 보이지 않지만 A부서, B부서 등 체계화 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 전공 Entity, 학기 Entity, 등급 Entity, 거래 상태 Entity 등&lt;/p&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;Associate/Intersection Entity&lt;/b&gt; : 두 개 이상의 Entity 를 결합할 때 사용되는 Entity.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 두 Entity(Entity 종류에 상관없음) 사이에서 일어나는 '이벤트'를 기록하는 Entity&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 예를 들어, 수강신청(Enrollment) - 학생 Entity 와 강의 Entity 를 같이 묶어주는 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 장바구니 - 고객Entity 와 상품Entity 를 묶어주는 Entity&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 결제내역 - 고객 Entity 와 주문 Entity 를 묶어주는 Entity (이력이 저장됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Associate Entity 는 Entity 와 Entity 간 M:N 관계를 연결짓기 위해 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(RDB 는 Associate Entity 없이 M:N 를 표현할 수 없음)&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;386&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CGAtU/dJMcajhtThW/2KYitF3mekQ9k4vcMw9n70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CGAtU/dJMcajhtThW/2KYitF3mekQ9k4vcMw9n70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CGAtU/dJMcajhtThW/2KYitF3mekQ9k4vcMw9n70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCGAtU%2FdJMcajhtThW%2F2KYitF3mekQ9k4vcMw9n70%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;386&quot; height=&quot;326&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;326&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;M:N 관계 예: 한 명의 학생은 여러 강의를 들을 수 있음(1:N).&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 강의는 여러 학생들에 의해 수강됨(M:1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 둘을 연결하는 '수강신청' Entity 는 M:N이 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 Associate Entity 는, 양 쪽 Entity로부터 PK 를 FK 로 가져와서 자신의 PK 로 사용하고, 연결 정보를 row 로 표현함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;M:N 관계를 엉성하게 모델링해두면, 최악의 경우 CARTESIAN JOIN 이 발생할 수 있고 성능 악화로 이어짐&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 말하면,&lt;b&gt; Catesian product 를 피하는 방법으로 associate entity 를 사용할 수 있음&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;Fundamental Entity 는 데이터의 근간(Master)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Conceptual Entity 는 데이터의 분류 및 정의&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Associate Entity 는 의존적관계 및 트랜잭션 기록&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;데이터 모델링을 처음 시작할 때, Fundamental Entity 를 먼저 찾고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 주변에 Conceptual Entity 를 세우고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 둘 사이의 상호작용을 Associate Entity로 정의해볼 수 있음&lt;br /&gt;&lt;br /&gt;특히 &lt;b&gt;Associate Entity는 Fact Table의 모태&lt;/b&gt;가 되는 경우가 많음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 수강신청 Entity에 수강료, 신청일시 같은 측정값(Measure)이 붙기 시작하면 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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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; Entity 구분 &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;PK-FK 로 연결된 두 Entity 를 부를 때, 상위 Entity, 하위 Entity 라고 부르는 경우가 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영어로는 Super Type Entity, Sub Type Entity&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;425&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TKPuW/dJMcaiQpI8u/VAu74H9OHFcvFBvTNF0Vp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TKPuW/dJMcaiQpI8u/VAu74H9OHFcvFBvTNF0Vp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TKPuW/dJMcaiQpI8u/VAu74H9OHFcvFBvTNF0Vp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTKPuW%2FdJMcaiQpI8u%2FVAu74H9OHFcvFBvTNF0Vp1%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;425&quot; height=&quot;320&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;320&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;상위 Entity : 다른 Entity에 의해 PK 가 FK 로 사용된(연결된) Entity. 위 예제에서 '고객 Entity', '부서 Entity', '특기 Entity'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;하위 Entity&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;: FK 를 갖고있는 Entity (=다른 Entity의 PK 를 FK 로 가지고 있는 경우). 위 예제에서 '계좌 Entity', '사원 Entity'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하위 Entity 가&amp;nbsp;상위 Entity 가 될 수 있음 (&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;Entity 가 다른&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Entity와 관계를 맺게되는 경우)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예제에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고객Entity 가 상위, 계좌Entity 가 하위,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계좌Entity 가 상위, 거래Entity 가 하위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 계좌Entity 처럼 Entity 는 상위도, 하위도 될 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 Entity 는 관계로 맺어지므로, 모든 Entity 들은 상위/하위로 구분이 지어지게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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; Entity 정의 &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;Entity 명칭, Entity 설명, Entity 범주(카테고리), 약어 및 동의어, 데이터 출현 건수 및 예상 변화 등을 고려하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Entity 이름 : 단수의 의미있는 이름으로 명명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상호배타성 : 하나의 정보는 하나의 Entity 에 들어가도록(필요한 정보 찾을 때 어떤 Entity에 있는지 바로 알 수 있도록)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크기 및 사용성 : Entity의 총 길이, 사용 빈도, 메모리 사용량 등을 고려. 성능을 올리기 위함&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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; Entity 사례들 &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;1.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDdf5f/dJMcabDNP0d/0l50P7LKKgMaOFTqpaqb11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDdf5f/dJMcabDNP0d/0l50P7LKKgMaOFTqpaqb11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDdf5f/dJMcabDNP0d/0l50P7LKKgMaOFTqpaqb11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDdf5f%2FdJMcabDNP0d%2F0l50P7LKKgMaOFTqpaqb11%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;285&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;285&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;a) 공통 코드 Entity 에 0으로 시작하는 코드는 전산실, 1로 시작하는 코드는 방송실,..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면, 공통 코드 Entity 를 읽고 프로그래밍으로 '0으로 시작하는가? 전산실' 이렇게 따로 처리를 해줘야 함&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;따라서, 하나의 Entity 에 여러 의미를 갖도록 하지 말자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b) 공통 코드 Entity 를 프로그래밍 없이 관계를 맺어서 사원 테이블에 적용하려고 하면, 관계가 너무 복잡해짐&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3PqGn/dJMcaax8yIL/ybfqEOcfQ57VQBlmcoEQ8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3PqGn/dJMcaax8yIL/ybfqEOcfQ57VQBlmcoEQ8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3PqGn/dJMcaax8yIL/ybfqEOcfQ57VQBlmcoEQ8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3PqGn%2FdJMcaax8yIL%2FybfqEOcfQ57VQBlmcoEQ8k%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;388&quot; height=&quot;275&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;275&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;c) 부서, 직종 등을 각각의 Entity 로 잘게 나눠서, 각각 관계를 맺도록 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리 퍼포먼스는 a, b 에 비해 좋을지 모르나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Entity 가 늘어나면 늘어날수록 관리하기가 힘들어짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, &lt;b&gt;논리적 모델링에서 Entity 가 늘어나는 경우도 고려&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;d) 핵심적인 Entity 만 따로 만들어두고(부서, 직종, 직위), 나머지들은 공통 코드 Entity 로 하나로 묶어서 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러면 Entity가 늘어나는 일을 방지할 수 있음&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;439&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zbhH0/dJMcabKBrV0/X534uriyKCeG1dNkYiNsT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zbhH0/dJMcabKBrV0/X534uriyKCeG1dNkYiNsT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zbhH0/dJMcabKBrV0/X534uriyKCeG1dNkYiNsT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzbhH0%2FdJMcabKBrV0%2FX534uriyKCeG1dNkYiNsT1%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;439&quot; height=&quot;292&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;292&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;단일 사례를 각각의 Entity 로 만들면, 사례가 늘어날수록 Entity 도 같이 늘어나서 확장성이 떨어짐.&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;단일 사례를 Entity 로 만들지 말고, 하나의 Entity 로 만들어서 관리&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUxPd4/dJMcacQeUeM/gQBac3M1fCOHqofeQcns5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUxPd4/dJMcacQeUeM/gQBac3M1fCOHqofeQcns5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUxPd4/dJMcacQeUeM/gQBac3M1fCOHqofeQcns5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUxPd4%2FdJMcacQeUeM%2FgQBac3M1fCOHqofeQcns5k%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;523&quot; height=&quot;308&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;308&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;a) 품목 Entity 는 자주 자주 쿼리되는 Entity 임. 대중소구분 Entity 들이 모두 연결되어 있으니 성능이 좋지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 소구분Entity 가 없는 품목을 저장할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b) 자주 쿼리되는 품목 Entity 하나의 Entity(소구분)만 연결되어 있어서 쿼리 성능이 좋으나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대중소Entity 들의 PK가 계속 길어지는 단점이 발생&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;524&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QtN89/dJMcaiiB60d/zsTx8kKpkRlR6uTC9bvOc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QtN89/dJMcaiiB60d/zsTx8kKpkRlR6uTC9bvOc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QtN89/dJMcaiiB60d/zsTx8kKpkRlR6uTC9bvOc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQtN89%2FdJMcaiiB60d%2FzsTx8kKpkRlR6uTC9bvOc1%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;524&quot; height=&quot;284&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;284&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;c) PK 가 길어지지 않도록, 상위 Entity 의 PK 만 유지함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 만약, 품목 Entity 가 중구분Entity 와 join 해야하는 상황이 발생하면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반드시 소구분 Entity 와 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 data-ke-size=&quot;size16&quot;&gt;d) 그럼 소구분 Entity 를 join하지 않고 바로 중, 대구분 Entity 로 join할 수 있도록, 품목 Entity 에 대중소 FK를 모두 넣으면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 가장 안 좋은 케이스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐면 Circular&amp;nbsp;Dependency/Relationship 가 발생하기 때문.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;- Entity A: Department (부서) -&amp;gt; 부서를 관리하는 '부서장(Employee)' 정보를 FK로 설정&lt;br /&gt;- Entity B: Employee (직원) -&amp;gt; 직원이 소속된 '부서(Department)' 정보를 FK로 설정&lt;br /&gt;이렇게 되면 A가 B를 참조하고, B가 다시 A를 참조하는 형태가 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Circular Dependency 를 만들면 어떤 일이 발생하는가?&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;- 쿼리 진행시 잘못하면 무한루프에 빠질 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 Circular Dependency 가 발생하면, 아래처럼 해결할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 위 예제에서 &quot;부서장&quot;이라는 관계를 별도의 Entity로 분리하거나 속성을 재정의함&lt;br /&gt;&amp;nbsp; Employee 테이블에서 dept_id는 유지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Department 테이블의 manager_id 는 없애고, Department_History, Manager_Assignment 같은 Associate Entity를 만들어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &quot;누가 언제부터 언제까지 어느 부서의 장이었는지&quot;를 기록&lt;br /&gt;- 플래그(Flag) 또는 상태값 활용&lt;br /&gt;&amp;nbsp; 물리적인 FK 연결 대신, 비즈니스 로직으로 처리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 한쪽의 FK 연결을 끊고 Employee Entity 에 is_manager 같은 컬럼을 추가. 이렇게 논리적인 관계만 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Associate Entity 를 추가하여 Circular Relationship 이슈를 해결하는 예제&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr68sE/dJMcabKCugm/4EzAPJQJLHWZYsgAahQJE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr68sE/dJMcabKCugm/4EzAPJQJLHWZYsgAahQJE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cr68sE/dJMcabKCugm/4EzAPJQJLHWZYsgAahQJE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr68sE%2FdJMcabKCugm%2F4EzAPJQJLHWZYsgAahQJE0%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;364&quot; height=&quot;332&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;332&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sqa3n/dJMcaiv7PaE/IfM7fwxjhy40cDfk4VZaf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sqa3n/dJMcaiv7PaE/IfM7fwxjhy40cDfk4VZaf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sqa3n/dJMcaiv7PaE/IfM7fwxjhy40cDfk4VZaf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsqa3n%2FdJMcaiv7PaE%2FIfM7fwxjhy40cDfk4VZaf0%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;305&quot; height=&quot;298&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;298&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;위 구매의뢰 Entity 에서는 여러 자재를 가져올 수 있고(1:N)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자재 Entity 에서는 여러 구매의뢰에 매칭될 수 있음(M:1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 발생되는 M:N 관계는 Associate Entity 등으로 반드시 처리해줘야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;439&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0JDxN/dJMcagE8snH/TYvUyiu60hqKjNQ5OmZS50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0JDxN/dJMcagE8snH/TYvUyiu60hqKjNQ5OmZS50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0JDxN/dJMcagE8snH/TYvUyiu60hqKjNQ5OmZS50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0JDxN%2FdJMcagE8snH%2FTYvUyiu60hqKjNQ5OmZS50%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;439&quot; height=&quot;292&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;292&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;부동산매물 Entity, 판매자 Entity, 구매자 Entity.... 등등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 역할을 모두 Entity 로 만들지 말라는 이야기임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역할이 추가되면? 예를 들어 중개인 Entity 가 추가되거나, 보험Entity 가 추가되면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계약Entity 에 끝도없이 추가되기 때문에 관리가 복잡해짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역할을 모두 Entity 로 만들지 말고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Entity 하나에 몰아넣으라고 말하는 것 같음. 근데 정확하게 이해는 못 함....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추가될 수 있는 부분은 하나의 Entity 로 만들어보자&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xUNhm/dJMcac3KA3R/yUpWQKpwaJNOx676LHbl1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xUNhm/dJMcac3KA3R/yUpWQKpwaJNOx676LHbl1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xUNhm/dJMcac3KA3R/yUpWQKpwaJNOx676LHbl1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxUNhm%2FdJMcac3KA3R%2FyUpWQKpwaJNOx676LHbl1K%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;520&quot; height=&quot;298&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;관계를 맺지 않은 Entity가 없도록 해야 함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모든 Entity 는 다른 Entity 와 관계를 맺어야 함&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKbfsK/dJMcad2DhcU/AilkVVCYlak44LawPcuYe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKbfsK/dJMcad2DhcU/AilkVVCYlak44LawPcuYe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKbfsK/dJMcad2DhcU/AilkVVCYlak44LawPcuYe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKbfsK%2FdJMcad2DhcU%2FAilkVVCYlak44LawPcuYe0%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;449&quot; height=&quot;298&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;298&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;동의어를 따로따로 Entity 로 만들지 말아야 함&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;사실 다 동일한 의미를 갖고 있잖아&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 &lt;b&gt;하나의 Entity 를 만들고 공통으로 사용하는 방향이 좋음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특별한 취급이 필요하다면 위에 작업자 Entity&amp;nbsp; 처럼 따로 만들어도 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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; Entity 관계 정의 &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;두 개 이상의 Entity 간 명명된 의미있는 연결. 관계.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Entity와 Entity 간 연결은 식별자(PK, FK) 기준으로 설정됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Entity 간 참조 무결성(&lt;b&gt;Referential Integrity&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;참조 무결성 예) 자식 Entity 는 부모 Entity 가 갖지 않은 값을 가질 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 부모 Entity(부서)는 다음과 같음&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 33.8357%; height: 85px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.2852%;&quot;&gt;dept_id(PK)&lt;/td&gt;
&lt;td style=&quot;width: 82.9627%;&quot;&gt;dept_name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.2852%;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 82.9627%;&quot;&gt;데이터 엔지니어링부서&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.2852%;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;width: 82.9627%;&quot;&gt;비즈니스 분석부서&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 Entity(직원) 는 다음과 같음&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 51.9767%; height: 52px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;emp_id&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;emp_name&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;dept_id (FK)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;101&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;눈가락&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;102&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;머릿가락&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;103&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;손가락&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;20&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;이 때 부모 Entity 에 없는 값을 이용하여 자식 Entity 에 값을 넣을 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가령 104, 홍길동, 90 이런 값을 넣을 수 없음 (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;Entity 간 관계를 ERD 로 그릴 때 아래와 같은 기호를 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1ANIm/dJMcah46G2l/XsBdNkx7F9s39hKGfkBk6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1ANIm/dJMcah46G2l/XsBdNkx7F9s39hKGfkBk6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1ANIm/dJMcah46G2l/XsBdNkx7F9s39hKGfkBk6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1ANIm%2FdJMcah46G2l%2FXsBdNkx7F9s39hKGfkBk6K%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;254&quot; height=&quot;91&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;91&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;| (Mandatory/One): 선 위에 수직선 하나가 있으면 '1' 또는 '반드시 하나'. 숫자로 따졌을 때 하나만 연결됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &quot;연결이 하나만 있을 수 있더라&quot;&lt;br /&gt;O (Optional/Zero): 동그라미는 '0'을 뜻하며, 관계가 없을 수도 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &quot;연결이 없을 수 있더라&quot;&lt;br /&gt;&amp;gt; (Multiple/Many): 세 갈래로 갈라지는 모양(까마귀 발). '다수(Many)'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &quot;연결이 여럿 있을 수 있더라&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최소 몇 개, 최대 몇 개가 가능한지 등을 보여주기 위해서 이런 notation 을 사용&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n4cVi/dJMcacbEbRa/T4kjgAkgPkP7XxAC8s58m0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n4cVi/dJMcacbEbRa/T4kjgAkgPkP7XxAC8s58m0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n4cVi/dJMcacbEbRa/T4kjgAkgPkP7XxAC8s58m0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn4cVi%2FdJMcacbEbRa%2FT4kjgAkgPkP7XxAC8s58m0%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;413&quot; height=&quot;264&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;264&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;246&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biwwfg/dJMcagE82j2/1VoqGkZE6I55QAx5RAxdb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biwwfg/dJMcagE82j2/1VoqGkZE6I55QAx5RAxdb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biwwfg/dJMcagE82j2/1VoqGkZE6I55QAx5RAxdb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbiwwfg%2FdJMcagE82j2%2F1VoqGkZE6I55QAx5RAxdb0%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;348&quot; height=&quot;407&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;288&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;왼쪽이 사원 Entity 이고, 5개의 서로 다른 관계로 Entity 와 연결됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 1:1 관계 : 사원과 매니저. 사원과 성별&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 사원 한 명이 두 개 이상의 성별을 가질 수 없음. 그래서 1:1 관계가 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 반드시 하나의 instance 와만 매칭됨. 다수 매칭될 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 사원과 이름의 경우, 이름이 바뀌는 경우가 발생할 수 있어서 1:N 관계로 생각될 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 1:0, 1: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;&amp;nbsp; 프로필사진이 있는 사원도 있고 없는 사원도 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 1:1, 1: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;&amp;nbsp; 프로젝트에 참여하지 않은 사원은 없음(1:0은 아님)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 1:0, 1:1, 1: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;&amp;nbsp; 성과가 존재한다면 무조건 하나 이상 존재함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 1: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;아래 ERD 를 보고 Notation 들을 이해해보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;398&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lOabQ/dJMcabX7JGT/rLZNPPWkXrhVviTZvUidz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lOabQ/dJMcabX7JGT/rLZNPPWkXrhVviTZvUidz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lOabQ/dJMcabX7JGT/rLZNPPWkXrhVviTZvUidz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlOabQ%2FdJMcabX7JGT%2FrLZNPPWkXrhVviTZvUidz1%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;398&quot; height=&quot;323&quot; data-origin-width=&quot;398&quot; data-origin-height=&quot;323&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;285&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ItWXj/dJMcacvYP75/lkTf7GknXnKhNPAZdIdZ3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ItWXj/dJMcacvYP75/lkTf7GknXnKhNPAZdIdZ3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ItWXj/dJMcacvYP75/lkTf7GknXnKhNPAZdIdZ3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FItWXj%2FdJMcacvYP75%2FlkTf7GknXnKhNPAZdIdZ3K%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;404&quot; height=&quot;371&quot; data-origin-width=&quot;285&quot; data-origin-height=&quot;262&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;추가로, 신체사항Entity 와 병역사항Entity 는 1:1 관계이기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사원 Entity 자체에 넣어도 문제는 발생하지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사원 Entity 는 수시로 IO 되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신체사항, 병역사항은 1년에 두 세번밖에 IO되지 않는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사원 Entity를 부를 때마다 신체/병역 사항이 계속 불린다면 이건 메모리 낭비가 될 수 밖에 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, &lt;b&gt;자주 접근하지 않는 정보들은 1:1 관계의 Entity 로 만들어서 따로 빼두는 것이 좋음&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MifLb/dJMcabqiUkv/7yDxxNJ8laTMgntOxzri81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MifLb/dJMcabqiUkv/7yDxxNJ8laTMgntOxzri81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MifLb/dJMcabqiUkv/7yDxxNJ8laTMgntOxzri81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMifLb%2FdJMcabqiUkv%2F7yDxxNJ8laTMgntOxzri81%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;595&quot; height=&quot;275&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCZ29d/dJMcagrz8C8/QY11ERu3mFV39wTmGVuhGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCZ29d/dJMcagrz8C8/QY11ERu3mFV39wTmGVuhGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCZ29d/dJMcagrz8C8/QY11ERu3mFV39wTmGVuhGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCZ29d%2FdJMcagrz8C8%2FQY11ERu3mFV39wTmGVuhGk%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;600&quot; height=&quot;285&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;285&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;교차 관계를 Associate Entity 표현하는 것이 아주아주아주아주 중요함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;양쪽 Entity 의 PK 를 묶은 FK 두 개를 Associate Entity 의 PK로 사용(이것은 Composite Key 라고 함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 notation 은, 위 이미지의 빨간 선과 같이 뒤집어서 연결해주면 됨&lt;/p&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 중 어느 것을 먼저 두느냐도 성능에 영향을 미침&lt;/p&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 가 Associate Entity 에 두 번 이상 들어가야 하는 경우가 발생하기도 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Composite Key 를 PK 로 사용하면 두 번 이상 들어가게 만들 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우가 발생하면, 두 Entity 의 FK 중 하나를 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Associate Entity&lt;span&gt;&amp;nbsp;의&amp;nbsp;&lt;/span&gt;&lt;/span&gt;attribute 로만 참조하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Associate Entity PK 를 FK 하나+Surrogate 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;Associate Entity&lt;span&gt;&amp;nbsp;에&amp;nbsp;&lt;/span&gt;&lt;/span&gt;surrogate 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;522&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWIxp5/dJMcadVTkF5/i0PWsTDoycc1X6EJkioZK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWIxp5/dJMcadVTkF5/i0PWsTDoycc1X6EJkioZK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWIxp5/dJMcadVTkF5/i0PWsTDoycc1X6EJkioZK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWIxp5%2FdJMcadVTkF5%2Fi0PWsTDoycc1X6EJkioZK0%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;522&quot; height=&quot;256&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;256&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;Identifying Relationship : Sub Entitry 가 갖는 FK 가 PK 로 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 예) 주문Entity - 주문항목 Entity&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Non-&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Identifying Relationship :&lt;span&gt; Sub Entitry 가 갖는 FK 를&amp;nbsp; PK 로 사용되지 않고 attribute 로 사용됨&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; 예) 거래처 Entity - 주문 Entity, 주문항목 Entity - 품목 Entity&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: #333333; text-align: start;&quot;&gt;&lt;span&gt;FK 를 PK 로 사용할 지 말지 의사소통 할 때 사용하는 용어라고 함&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;471&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K7HnI/dJMcabcIAHi/JG6sc16Q1xkCoizD8ro4vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K7HnI/dJMcabcIAHi/JG6sc16Q1xkCoizD8ro4vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K7HnI/dJMcabcIAHi/JG6sc16Q1xkCoizD8ro4vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK7HnI%2FdJMcabcIAHi%2FJG6sc16Q1xkCoizD8ro4vk%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;471&quot; height=&quot;304&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;두 Entity 간 연결이 두 번 이상 발생하는 경우도 조재함&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;/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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcsFk5/dJMcabDO4P8/1ynkoo0oLukrVNJVJkCItk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcsFk5/dJMcabDO4P8/1ynkoo0oLukrVNJVJkCItk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcsFk5/dJMcabDO4P8/1ynkoo0oLukrVNJVJkCItk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcsFk5%2FdJMcabDO4P8%2F1ynkoo0oLukrVNJVJkCItk%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;303&quot; height=&quot;201&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;201&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;중복 관계는 Associate Entity 를 통해 해결 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;620&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nAdt8/dJMcabDO3WQ/4q69RkkelYg9B91BmyBqX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nAdt8/dJMcabDO3WQ/4q69RkkelYg9B91BmyBqX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nAdt8/dJMcabDO3WQ/4q69RkkelYg9B91BmyBqX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnAdt8%2FdJMcabDO3WQ%2F4q69RkkelYg9B91BmyBqX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;620&quot; height=&quot;331&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;331&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;중간에 X 있는 것이 and, 없는 것이 or.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 DB 쿼리 작성할 때는 or 되도록 사용하지 말라고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;and 로 바꿔서 처리하라고....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(물론 누가봐도 성능상 or 사용이 유리할 때는 or를 사용해야지)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;514&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BliAR/dJMcabjxML1/utMkuhkTObFn5Z47Vn4zQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BliAR/dJMcabjxML1/utMkuhkTObFn5Z47Vn4zQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BliAR/dJMcabjxML1/utMkuhkTObFn5Z47Vn4zQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBliAR%2FdJMcabjxML1%2FutMkuhkTObFn5Z47Vn4zQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;514&quot; height=&quot;277&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;277&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;lt; identifiers &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;- SuperKey : 유일성을 보장하는 키 묶음. 키가 엄청 길어지는 것은 신경쓰지 않는 슈퍼맨임...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 학번은 SuperKey가 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 주민번호도 SuperKey 가 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 학번+주민번호 도 SuperKey 가 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 학번 + 주민번호 + 이름 도 SuperKey 가 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 유일성만 보장한다면 어떻게 연결하던 SuperKey 가 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CandidateKey : SuperKey 중에서 minimality 를 보장하는 키. CandidateKey 중에서 PK를 선택함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 학번은 SuperKey 중에 가장 짧기 때문에 CandidateKey가 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 주민번호도 가장 짧기 때문에 CandidateKey 가 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 학번+주민번호는 짧지 않기 때문에 CandidateKey가 될 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SuperKey, CandidateKey 는 논리적인 개념일 뿐이고 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;- PrimaryKey : CandidateKey 중에서 실제로 DB 에 사용되는 하나의 키&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;모든 Entity 에서는 PK 가 반드시 존재해야 함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; PK 는 null 이 되지 말아야 하며, 모든 instnaces 를 구분할 수 있어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 가능한 짧게 만들어야 하며(indexing 성능 때문에) 단순하게 만들어야 함(너무 많은 컬럼 조합하지 말라는 말)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 컬럼 하나로 만들거나, 두 개 컬럼 조합해서 만들거나, FK 랑 조합해서 만들거나, surrogatekey 랑 조합해서 만들거나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 참고로, &lt;b&gt;PK 는 업데이트가 가능&lt;/b&gt;함(!). update table set mypk = 0 where mypk = 1; 이 실제로 동작하는 말임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 업데이트 된다고 해서 막 바꿔도 된다는 말은 아니고, &lt;b&gt;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;- AlternateKey : CandidateKey 중에서 PK 가 되지 못한 키.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sort, if, where 등에 자주 사용될 수 있으며, 자주 사용된다면 index 를 추가해서 사용함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;302&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n6pKU/dJMcabw26IA/gXkzxpI0FRZgjriQ8599mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n6pKU/dJMcabw26IA/gXkzxpI0FRZgjriQ8599mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n6pKU/dJMcabw26IA/gXkzxpI0FRZgjriQ8599mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn6pKU%2FdJMcabw26IA%2FgXkzxpI0FRZgjriQ8599mk%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;302&quot; height=&quot;183&quot; data-origin-width=&quot;302&quot; data-origin-height=&quot;183&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;302&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgH7zp/dJMcacQg6oO/hjO8uX5rmMozt3GtHOkDC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgH7zp/dJMcacQg6oO/hjO8uX5rmMozt3GtHOkDC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgH7zp/dJMcacQg6oO/hjO8uX5rmMozt3GtHOkDC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgH7zp%2FdJMcacQg6oO%2FhjO8uX5rmMozt3GtHOkDC0%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;302&quot; height=&quot;183&quot; data-origin-width=&quot;302&quot; data-origin-height=&quot;183&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;윗부분은 품목분류 Entity 와 품목 Entity 가 상하위 관계를 갖고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;품목 Entity 와 재고영역 Entity 사이에 M:N 관계가 발생해서 재고 Associate Entity 를 만듦&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 재고 Entity 의 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;그래서 차라리 상위 Entity 에서부터 PK 를 줄여서,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Associate Entity 의 PK 가 줄어들 수 있도록 조치함&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;477&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmfUZl/dJMcahxiAGr/sILikq8S61zWnOt5zm5KO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmfUZl/dJMcahxiAGr/sILikq8S61zWnOt5zm5KO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmfUZl/dJMcahxiAGr/sILikq8S61zWnOt5zm5KO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmfUZl%2FdJMcahxiAGr%2FsILikq8S61zWnOt5zm5KO0%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;477&quot; height=&quot;194&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;194&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LrF50/dJMcahjME9e/1T5pUOZpFNZLb5S5gwEMqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LrF50/dJMcahjME9e/1T5pUOZpFNZLb5S5gwEMqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LrF50/dJMcahjME9e/1T5pUOZpFNZLb5S5gwEMqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLrF50%2FdJMcahjME9e%2F1T5pUOZpFNZLb5S5gwEMqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;458&quot; height=&quot;317&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;317&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;품목 Entity 와 구매발주 Entity 사이의 구매발주품목 Associate Entity 가 생성됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 품목코드 FK 는 attribute 로만 사용되었고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구매발주번호 FK( + 구매발주품목순번 surrogate key) 는 PK로 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 왜 이렇게 했는가? 구매발주Entity 와 구매발주품목Entity 를 자주 묶어서 쿼리한다는 걸 알고 있어서.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게&lt;b&gt; Associate Entity 에서는, 자주 사용되는 FK 만 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;추가로, 입고 Entity 에서 모든 FK 를 다 attribute 로 내렸음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 FK 를 PK로 사용하면 복잡해지기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PK 를 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;583&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8f1ED/dJMcaaro5Em/rk4RBamvEkFrx0sPDR25eK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8f1ED/dJMcaaro5Em/rk4RBamvEkFrx0sPDR25eK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8f1ED/dJMcaaro5Em/rk4RBamvEkFrx0sPDR25eK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8f1ED%2FdJMcaaro5Em%2Frk4RBamvEkFrx0sPDR25eK%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;257&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;257&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;여러 컬럼의 조합으로 PK 를 만들 때, 조합 순서도 퍼포먼스에 영향을 끼침&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실적1 Entity 는 지점코드-상품코드-분류... 순서이고&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실적2&lt;span&gt;&amp;nbsp;&lt;/span&gt;Entity 는 년도-월-지점코드-상품코드... 순서임&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;501&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvEGBq/dJMcaju4Lhf/0Ub5EQcRakXjdBB3FFQo4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvEGBq/dJMcaju4Lhf/0Ub5EQcRakXjdBB3FFQo4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvEGBq/dJMcaju4Lhf/0Ub5EQcRakXjdBB3FFQo4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvEGBq%2FdJMcaju4Lhf%2F0Ub5EQcRakXjdBB3FFQo4K%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;501&quot; height=&quot;309&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;309&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;412&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LIvEE/dJMb9965EzK/c98SEWfHmE0pys7eIKpIqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LIvEE/dJMb9965EzK/c98SEWfHmE0pys7eIKpIqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LIvEE/dJMb9965EzK/c98SEWfHmE0pys7eIKpIqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLIvEE%2FdJMb9965EzK%2Fc98SEWfHmE0pys7eIKpIqk%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;412&quot; height=&quot;175&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;하지만 쿼리의 where 절에 무엇이 들어가냐에 따라 쿼리 성능이 달라짐&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;where 절에 '코드'가 포함되어있는데, 이 '코드'컬럼이 PK 의 앞쪽에 위치한 실적1Entity 의 성능이 더 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;PK 를 구성하는 컬럼 중 앞쪽에 있는 컬럼으로 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;376&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OpJxT/dJMcagFaFaS/uqw6WToePwI14qx0VfKbd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OpJxT/dJMcagFaFaS/uqw6WToePwI14qx0VfKbd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OpJxT/dJMcagFaFaS/uqw6WToePwI14qx0VfKbd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOpJxT%2FdJMcagFaFaS%2Fuqw6WToePwI14qx0VfKbd0%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;376&quot; height=&quot;269&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;269&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;위 제품 Entity 보다는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 제품 Entity 가 더 나은 설계가 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'제품코드' 라는 컬럼은 제품구분,생산공장,순선이 모두 조합된 정보를 갖고 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'생산공장별로...' 라는 쿼리를 수행한다면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 제품 Entity 는&amp;nbsp; PK 를 substring 으로 잘라서 사용해야하는데 이건 성능이 나오지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 제품 Entity 처럼, 제품코드는 그대로 갖고있되&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘라서 써야하는 부분들(제품코드, 생산공장)을 attribute 로 또 만들어서 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 PK 를 substring 하지 않아도 되기 때문에 성능이 나옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로, 제품코드, 생산공장 정보를 갖고 있는 Entity를 따로 만들면 나중에 쿼리할 때 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 제품Entity 가 10만개 정보를 갖고 있고 제품구분Entity 는 10개 정보를 갖고있다고 하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제품Entity 에서 1인 것을 찾아 full scan 하는 것보다,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제품구분코드 1인 것을 찾을 때, 제품구분 Entity 에서 먼저 1을 찾고 제품 Entity와 join해서 찾는 게 빠르다고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(join할 때도 full scan 하지 않나...?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index 가 없는데, 제품 Entity 에서 1을 수집할 때 join 으로 full scan 을 피할 수 있나?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 비슷한 예제를 하나 더 살펴보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZJBv2/dJMcaju4LIs/KyVF101bBtvuHnNSryKKak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZJBv2/dJMcaju4LIs/KyVF101bBtvuHnNSryKKak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZJBv2/dJMcaju4LIs/KyVF101bBtvuHnNSryKKak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZJBv2%2FdJMcaju4LIs%2FKyVF101bBtvuHnNSryKKak%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;520&quot; height=&quot;309&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;309&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;제품 Entity 의 '제품코드'는 여러 컬럼의 조합으로 이루어짐(브랜드,복잡종류,년도,시즌.....)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a 는 쿼리할 때 PK 를 substring 으로 잘라써야하니 성능이 좋지 않고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b 는 PK 가 너무 길고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c 가 적절한 모델링이 될 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 e 처럼 다른 Entity 를 설정하고 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;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;401&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4JOdv/dJMcadInfV9/QLEeaVAPa0duHnAAAFLXn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4JOdv/dJMcadInfV9/QLEeaVAPa0duHnAAAFLXn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4JOdv/dJMcadInfV9/QLEeaVAPa0duHnAAAFLXn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4JOdv%2FdJMcadInfV9%2FQLEeaVAPa0duHnAAAFLXn1%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;401&quot; height=&quot;309&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;309&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;위 사원 Entity 의 경우, 사번 하나 당 운전면허번호가 하나만 들어오게 되어있음&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;이런 경우, 운전면허번호를 위한 Entity 를 하나 더 만들어서 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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>눈가락</category>
      <author>눈가락</author>
      <guid isPermaLink="true">https://eyeballs.tistory.com/742</guid>
      <comments>https://eyeballs.tistory.com/742#entry742comment</comments>
      <pubDate>Fri, 10 Apr 2026 03:38:16 +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>
    <item>
      <title>[Data Engineer] interview questions</title>
      <link>https://eyeballs.tistory.com/737</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;Continue from below posting.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://eyeballs.tistory.com/m/729&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://eyeballs.tistory.com/m/729&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;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;SQL 데이터베이스와 NoSQL 데이터베이스의 주요 차이점은?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;구조: SQL 데이터베이스는 &lt;b&gt;구조화된 스키마&lt;/b&gt;를 사용하는 반면, NoSQL 데이터베이스는 &lt;b&gt;스키마가 없거나 유연한 스키마&lt;/b&gt;를 사용&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;확장성: SQL 데이터베이스는 &lt;b&gt;scale-up&lt;/b&gt; 이 더 용이한 경우가 많고, NoSQL 데이터베이스는 일반적으로 &lt;b&gt;scale-out&lt;/b&gt; 이 더 용이함&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;데이터 모델: SQL 데이터베이스는 &lt;b&gt;테이블과 행을 사용&lt;/b&gt;하는 반면, NoSQL 데이터베이스는 &lt;b&gt;document, Key-Value&lt;/b&gt; 또는 그래프와 같은 다양한 모델을 사용할 수 있음&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;ACID 준수: SQL 데이터베이스는 일반적으로 &lt;b&gt;ACID를 보장&lt;/b&gt;하는 반면, NoSQL 데이터베이스는 성능 및 확장성을 위해 일부 &lt;b&gt;ACID 속성을 희생&lt;/b&gt;할 수 있음&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&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;정규화와 비정규화 차이?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;br /&gt;정규화 : &lt;b&gt;데이터 중복을 최소화&lt;/b&gt;하여 &lt;b&gt;무결성을 높이는 과정&lt;/b&gt;&lt;br /&gt;삽입,삭제,수정 이상(Anomaly)을 없애기 때문에, 무결성이 높아짐&lt;br /&gt;join 쿼리가 필수이므로 쿼리 성능은 높지 않음&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;정규화를 진행하면, 테이블들을 최대한 나누고, 각 테이블들을 외래키를 통해 연결&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;비정규화 : 성능 향상을 위해 &lt;b&gt;의도적으로 데이터를 중복&lt;/b&gt;시켜 조회 속도를 높이는 과정&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;비정규화를 진행하면, 테이블들을 최대한 결합&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://eyeballs.tistory.com/m/504&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://eyeballs.tistory.com/m/504&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&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;저장 프로시저(stored procedure)란?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;저장 프로시저는 데이터베이스에 저장되고 &lt;b&gt;한 번의 호출로 실행&lt;/b&gt;될 수 있는 &lt;b&gt;미리 컴파일된 SQL 문&lt;/b&gt;&amp;nbsp;모음&lt;br /&gt;매개변수를 받아 복잡한 연산을 수행하고 결과를 반환할 수 있어 성능 향상과 코드 재사용성 증대에 기여&lt;br /&gt;&lt;br /&gt;마치 import 하여 사용할 수 있는 함수같음&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://eyeballs.tistory.com/m/504&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://eyeballs.tistory.com/m/504&lt;/a&gt;&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;람다 아키텍처란?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;b&gt;실시간으로 데이터 확인&lt;/b&gt;하기 위해 (&lt;/span&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;결과는 부정확하지만)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;b&gt;데이터 스트림 처리를 하는 부분&lt;/b&gt;을 만들고&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;b&gt;똑같은 데이터를 배치 데이터 플로우로 처리&lt;/b&gt;하여 나중에 일, 월 등의 긴 주기를 갖고 배치처리 한 결과를 &lt;b&gt;정확한 결과&lt;/b&gt;&lt;b&gt;로 보는 것&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;배치 처리 결과는 서빙레이어라는 부분에 모여서 사용자에게 서빙됨&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;배치 결과가 나오기 전까지,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;스트리밍으로 처리된 결과는 참고용&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;으로 볼 수 있음&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;람다 아키텍처의 단점은 &lt;b&gt;같은 로직을 두 번 사용&lt;/b&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;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2398&quot; data-origin-height=&quot;1292&quot;&gt;&lt;a href=&quot;https://cazton.com/images/consulting/lambda-architecture/lambda-architecture-spark-hadoop-cazton.webp&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LkKBr/dJMcaiPyRKr/3zImeStHiSKHuxhqtsFIu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLkKBr%2FdJMcaiPyRKr%2F3zImeStHiSKHuxhqtsFIu0%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; alt=&quot;https://cazton.com/images/consulting/lambda-architecture/lambda-architecture-spark-hadoop-cazton.webp&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;323&quot; data-origin-width=&quot;2398&quot; data-origin-height=&quot;1292&quot;/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;람다를 대체하기 위해 카파 아키텍처를 선택할 수 있음&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;b&gt;카파 아키텍처&lt;/b&gt;는 배치와 서빙 레이어를 완전히 없애고 &lt;b&gt;스트리밍 부분만 남긴 것&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;kafka 에 데이터 쌓아두는 기간을 늘림&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;과거 데이터를 재처리하고 싶다면, kafka 로부터 다시 읽음&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;카파의 단점&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;&lt;/span&gt;&lt;b&gt;부하가 급격하게 높아질 수 있다&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;는 것&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;예를 들어 재처리를 위해 과거 한달 데이터를 한 번에 보내면 스트리밍 처리에 부하가 높아질 수 있음&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://eyeballs.tistory.com/m/574&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://eyeballs.tistory.com/m/574&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://eyeballs.tistory.com/m/720&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://eyeballs.tistory.com/m/720&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&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;데이터 파이프라인에서 진행 가능한 테스트 방법들&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;br /&gt;- 개별 구성 요소에 대한 &lt;b&gt;단위 테스트&lt;/b&gt; &lt;br /&gt;- 구성 요소들이 서로 제대로 작동하는지 확인하기 위한&lt;b&gt; integrity 통합 테스트&lt;/b&gt;. 각 구성 요소들의 interface 가 잘 연결되는지 확인&lt;br /&gt;- 전체 파이프라인에 대한 &lt;b&gt;엔드투엔드 테스트&lt;/b&gt;&lt;br /&gt;- 데이터 무결성을 보장하기 위한 &lt;b&gt;데이터 유효성 검사 테스트&lt;/b&gt; &lt;br /&gt;&lt;b&gt;&amp;nbsp; - 무결성 테스트&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; - 정합성 테스트&lt;/b&gt;&lt;br /&gt;- 이슈 테스트&lt;br /&gt;&amp;nbsp; - &lt;b&gt;다양한 부하 조건에서의 성능 테스트&lt;/b&gt; &lt;br /&gt;&amp;nbsp; - 오류 처리 검증을 위한 &lt;b&gt;오류 주입 테스트&lt;/b&gt; &lt;br /&gt;- 변경 후 회귀 테스트&lt;/span&gt;&lt;br /&gt;&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;데이터 양이 갑자기 증가하는데 수직적,&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;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;스파크 리소스를 늘릴 수 없다면,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;lsquo;처리해야 할 데이터의 양&amp;rsquo;과 &amp;lsquo;재처리 범위&amp;rsquo;를 줄이고&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;lsquo;파이프라인의 성격&amp;rsquo;을 바꿔야 함&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;파이프라인: MySQL &amp;rarr; binlog (CDC) &amp;rarr; Spark &amp;rarr; Lakehouse&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;span&gt;&lt;span&gt;목표: 데이터 파이프라인의 안정성을 유지하고, 작업 실패나 이슈 등 방지&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;핵심 질문은: &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;ldquo;정말 10배 데이터를 &amp;lsquo;똑같이&amp;rsquo; 처리해야 하는가?&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1. 가장 먼저 해야 할 것: CDC 범위 줄이기 (&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;CDC 대상 컬럼 / 테이블 재검토)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;MySQL 데이터가 10배 늘었다고 해서, 그 모든 데이터가 가치 있지 않을 수 있음&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;확인해야 할 질문:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;실제로 downstream(DS/BA)가 쓰는 테이블은?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;변경이 의미 있는 컬럼은?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;audit / debug 용 데이터가 섞여 있지 않은가? -&amp;gt; 데이터 처리에서 제외시킬 수 있는 부분&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span&gt;&lt;span&gt;대응&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span&gt;binlog 수집 대상 테이블 축소&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;CDC 제외 테이블 분리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;변경이 없는 테이블은 snapshot 주기 조정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span&gt;&lt;span&gt;즉, &lt;b&gt;꼭 필요한 데이터만 처리하도록 만듦&lt;br /&gt;입력 데이터 자체를 줄이는 게 가장 큰 효과&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;2. Append-only + Incremental 처리 강제&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;여기서 append-only 란, 일단 append 로 저장하고 추후 재처리를 진행.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Hudi upsert 진행시, 덮어쓰기 위한 데이터를 찾는 과정에서&lt;br /&gt;partition 을 찾을 수 없다면 full scan 이 발생하게 되므로 엄청난 오버헤드가 발생함&lt;br /&gt;&lt;/span&gt;&lt;span&gt;따라서, Hudi upsert 스캔에서 full scan 방지를 위해 반드시 partition pruning 되어야 함&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;Partition 전략 재설계 (필수)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;❌ 잘못된 예:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;partition = ingestion_date&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;➡️ 하루에 10배 &amp;rarr; 하루 partition 하나 &amp;rarr; hotspot&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;✅ 개선:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;partition = event_date&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;or&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;partition = (event_date, hash(user_id))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;  &amp;ldquo;한 배치가 건드리는 파일 수&amp;rdquo;를 줄이는 게 핵심&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;event_time 으로 파티셔닝하게되면, late-arriving data 처리는 (일단은) 생략되어 데이터양이 줄어듦&lt;br /&gt;late-arriving data 는 나중에 다시 처리하면 됨&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;3. Spark 작업 자체를 가볍게 만들기&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Spark executor 못 늘리면, executor가 할 일을 줄여야 함&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;Shuffle 최소화&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;broadcast join 가능하게 dimension 크기 제한&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;skew key 탐지 (user_id, order_id, Skew Join Hint 등)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;Task 수 줄이기&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;불필요한 repartition 제거&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;coalesce() 적극 사용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;CDC 이벤트 정규화 (중요)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;MySQL binlog는 종종:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;update 하나 &amp;rarr; multiple events&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;같은 PK에 대한 잦은 변경&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;span&gt;&lt;span&gt;해결&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Spark 이전 단계에서 collapse, 같은&amp;nbsp;PK&amp;nbsp;+&amp;nbsp;window&amp;nbsp;내&amp;nbsp;&amp;rarr;&amp;nbsp;최신&amp;nbsp;1개만&amp;nbsp;유지&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;예: &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;key + max(updated_at)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span&gt;&lt;span&gt;➡️ 처리 데이터 수가 실제 변경 row 수로 줄어듦&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. &amp;ldquo;실시간에 가깝게&amp;rdquo;에서 &amp;ldquo;지연 허용&amp;rdquo;으로 전환&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;리소스 고정이면 선택지는 둘 중 하나:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;1.&amp;nbsp;Throughput&amp;nbsp;을&amp;nbsp;유지하는&amp;nbsp;걸&amp;nbsp;선택.&amp;nbsp;그럼&amp;nbsp;Latency&amp;nbsp;는&amp;nbsp;포기해야&amp;nbsp;함&lt;br /&gt;2.&amp;nbsp;Latency&amp;nbsp;를&amp;nbsp;유지하는&amp;nbsp;걸&amp;nbsp;선택.&amp;nbsp;그럼&amp;nbsp;데이터가&amp;nbsp;누락되거나&amp;nbsp;작업이&amp;nbsp;실패할&amp;nbsp;수&amp;nbsp;있음&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;따라서, 현실적으로 &quot;지연 허용 + 안정성 유지&quot; &lt;/span&gt;&amp;nbsp;를 선택해야 함&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;방법&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;micro-batch 크기 축소&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;backlog 누적 허용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;SLA 재정의 (예: T+1 &amp;rarr; T+2)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;5. &amp;ldquo;절대 하면 안 되는 대응&amp;rdquo; (면접에서 말하면 감점)&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;ldquo;Spark executor 더 달라고 요청한다&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;ldquo;지금은 어쩔 수 없다&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;ldquo;하드웨어 증설이 답이다&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&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;&amp;ldquo;리소스는 고정되어 있으니, 저는 파이프라인의 성격을 바꾸겠습니다.&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;이 질문에서 면접관이 진짜 보고 싶은 것&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;- 데이터 엔지니어링 관점&lt;br /&gt;- 시스템 트레이드오프 이해&lt;br /&gt;- 현실적인 판단&lt;br /&gt;- 리소스 제약 하 설계&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;데이터가 10배로 들어오는 상황에서 리소스를 늘릴 수 없을 때, 내가 생각한 방법&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;- 들어오는 데이터는 일단 모두 lake house 에 넣고, lakehouse 에서 한 번의 배치가 건드는 데이터 범위를 제한. &lt;br /&gt;여기서 lake house 는 s3 처럼 무한한 저장 공간을 갖는다는 전제임&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;- 데이터 처리 병목 지점을 프로파일링해서 해결해야 함. 셔플 사이즈 이슈, IO 이슈 등이 발생할 가능성이 높음&lt;br /&gt;&lt;br /&gt;- 데이터 처리하는 코드를 튜닝해야 함. 이를테면, 파티션 사이즈를 조절한다던지(AQE 등), 셔플을 최대한 줄일 수 있도록 broadcast join 을 활용한다던지(dimension table이 충분히 작아야 함), repartition 대신 coleasce 를 사용하고 groupbykey 대신 reducebykey 를 사용한다던지, skew 발생을 막기 위해 skew join hint 등을 사용한다던지. 물론 이것들은 '데이터양이 늘어났을 때 대책'이 아니라 일반적인 튜닝 방법임. 이걸 미리 해둬야 함&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;- 데이터양이 많아졌기 때문에, 읽는 데이터 양을 줄여야 함. 예를 들어, 데이터를 읽는 코드가 날짜 기준으로(날짜 파티셔닝 된 상태) 데이터를 읽는다면, 그 날짜 내 데이터를 모두 한 번에 읽는게 아니라 한 job이 스캔하는 파일 수 / 파티션 수를 제한해서 조금씩 읽고 처리하도록 만든다던가&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;하루치 데이터를 &amp;rarr; 1시간 단위 / shard 단위 / hash bucket 단위로 쪼개서 &amp;rarr; 여러 번 실행&lt;br /&gt;&lt;br /&gt;- hudi 의 upsert 비용이 비싸기 때문에, 일단 append-only 로 데이터를 저장하고, 나중에 처리하는 것으로 진행. 이것은 throughput 은 지키되 latency 를 희생(DS/BA 가 사용 가능한 데이터는 나중에 생김)하는 방법.&lt;br /&gt;&lt;br /&gt;&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;데이터&amp;nbsp;파티셔닝의&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: 100%;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #050446; text-align: start;&quot;&gt;데이터 파티셔닝은 분산 시스템에서 데이터 세트를 &lt;b&gt;더 작은 하위 집합 또는 파티션으로 나누어 여러 노드에 분산시키는 것&lt;/b&gt;을 말합니다. &lt;br /&gt;이를 통해 데이터의 &lt;b&gt;병렬 처리가 가능&lt;/b&gt;해져 자원을 효율적으로 활용하고 성능을 향상시킬 수 있습니다. &lt;br /&gt;&lt;br /&gt;또한 파티셔닝은 &lt;b&gt;데이터를 노드 전체에 고르게 분산&lt;/b&gt;시켜 &lt;b&gt;부하 분산&lt;/b&gt;을 용이하게 하고, 핫스팟 발생을 방지하며 시스템 확장성을 개선합니다. &lt;br /&gt;&lt;br /&gt;더 나아가 데이터 파티셔닝은 노드 장애가 전체 시스템에 미치는 영향을 최소화하여 내결함성을 강화합니다. ?? how??&lt;br /&gt;&lt;br /&gt;일반적인 파티셔닝 전략으로는 특정 값 범위에 따라 데이터를 분할하는 &lt;b&gt;범위 파티셔닝&lt;/b&gt;, 해시 값에 따라 데이터를 분산하는 &lt;b&gt;해시 파티셔닝&lt;/b&gt;, 그리고 고유 식별자 또는 키에 따라 데이터를 분할하는 &lt;b&gt;키 파티셔닝&lt;/b&gt;이 있습니다.&lt;/span&gt;&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;데이터&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: 100%;&quot;&gt;&lt;br /&gt;최신성을 보장하려면 기준이 되는 날짜값 혹은 incremental value 가 있어야 할 것 같아. 이를테면 updated_date 를 기준으로 최신성을 판단하되, updated_date 가 동일하면 데이터가 생성될 때 받는 유니크한 incremental value 를 기준으로 최신성을 판단하면 좋을 것 같아. hudi 의 upsert 기능을 이용하면 편하겠지만, 사용할 수 없는 경우에는 직접 PK가 동일한 데이터끼리 updated_date+incremental value 를 통해 비교해서 가장 최신 데이터만 남기는 쪽으로 진행해야 할 것 같아.&lt;br /&gt;여기서 일관성을 보장한다는 말은 integrity 를 말 하는 거겠지? integrity 를 보장하려면 hash 값, checksum 등을 만들어 비교해본다던가, 해당 컬럼값이 정상 범위인지 (not null 혹은 음수 체크 혹은 2301년 등의 이상한 미래값 등) 확인해본다던가, 소스DB 의 값과 비교해본다던가 할 것 같아.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;⚠️ 보완하면 좋은 점&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;최신성과 일관성을 조금 섞어서 설명하고 있음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;ldquo;일관성 = integrity&amp;rdquo;만으로는 약간 좁음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;**운영 관점(재처리, 지연 데이터, 실패 복구)**가 빠져 있음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;ldquo;왜 그렇게 하는지&amp;rdquo;에 대한 이유를 조금 더 말하면 좋음&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt; 면접관이 의도한 개념 정리 &amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;최신성 (Freshness) : &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;ldquo;가장 최신 상태의 데이터를 제공하고 있는가?&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;핵심 질문:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;- 최신 기준이 무엇인가?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;- &lt;b&gt;늦게 도착한 데이터&lt;/b&gt;는 어떻게 처리하는가?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- &lt;b&gt;중복 실행&lt;/b&gt;해도 결과가 동일한가? (idempotency)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;- &lt;b&gt;실패 시 재처리 가능&lt;/b&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;&amp;nbsp; (재처리 시 중복이나 과거 데이터 overwrite는 안전한가)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;일관성 (Consistency) : &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;ldquo;데이터가 신뢰 가능한 상태인가?&amp;rdquo;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;'일관성' 에 포함되는 의미들&lt;br /&gt;- Schema consistency : 타입,&amp;nbsp;컬럼&amp;nbsp;구조&lt;br /&gt;- Record-level consistency : PK&amp;nbsp;유일성,&amp;nbsp;최신&amp;nbsp;row&lt;br /&gt;- Cross-table consistency : fact&amp;ndash;dimension&amp;nbsp;관계&lt;br /&gt;- Source-to-target consistency : 원본과 동일한 의미 (흔히 말하는 정합성)&lt;br /&gt;- Temporal consistency : 시간&amp;nbsp;기준&amp;nbsp;정합성&lt;br /&gt;&lt;br /&gt;integrity는 그중 일부일 뿐 (내가 볼 땐 4번 빼고 다 일관성임...)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&amp;lt; 추가하면 좋은 포인트들 &amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;late-arriving data 처리 : 늦게온 데이터가 갖는 PK 데이터의 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;updated_date + incremental value&lt;span&gt; 가 최신이라면 덮어쓸것이고, 아니라면 무시될것임. late-arriving data 처리는 이미 완성되었지만, '언급'은 하는 게 좋겠음&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;event_time vs processing_time 구분&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span&gt;event_time 과 processing_time 구분해주면 좋음&lt;br /&gt;event_time 을 기준으로 생성 순서를 알 수 있고,&lt;br /&gt;재처리 할 때도 도움이 되고&lt;br /&gt;event_time 으로만 집계 가능한 값, 이를테면 DAU(하루에 활동한 사용자 수) 집계에 도움이 됨&lt;br /&gt;대신 late-arriving data 처리 등 추가 단계가 필요해서 &quot;이제 한 번 사용해볼까?&quot; 할 때는 processing_time 보다 느림(latency 가 있음)&lt;br /&gt;(정확도를 위해 latency 를 희생함)&lt;br /&gt;&lt;br /&gt;그럼 processing_time 은 언제 쓸까?&lt;br /&gt;정확성은 높지 않지만, 빠른 집계 결과가 필요할때 사용함&lt;br /&gt;(latency 를 위해 정확도를 희생함)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Hudi 못 쓸 때의 대안&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;ROW_NUMBER() OVER (&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;PARTITION BY pk&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;ORDER BY updated_date DESC, seq DESC&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;) = 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;이걸 &quot;&lt;b&gt;deterministic deduplication&lt;/b&gt;&quot; 이라고 표현함&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&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%; height: 38px;&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: 100%; height: 19px;&quot;&gt;state-level idempotency 란? event-level idempotency 란?&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 19px;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;lt; State-level Idempotency &amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;같은 데이터를 여러 번 처리&lt;/b&gt;하더라도 &lt;b&gt;최종 상태(state)가 변하지 않도록 보장&lt;/b&gt;하는 것&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;여러번 처리란, 재처리, 중복된 데이터 처리, 재시도 등을 의미함&lt;br /&gt;&lt;/span&gt;배치 처리가 실패해서 재처리하거나, &lt;br /&gt;백필하거나,&lt;br /&gt;CDC 에서 중복 데이터가 들어왔거나....등등&lt;br /&gt;결과적으론 다 같은 말 같지만... 아무튼 &lt;b&gt;재처리 진행 후에도 테이블 상태는 동일&lt;/b&gt;해야 함&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;사용자 프로필 정보가 담긴 테이블을 만든다거나&lt;br /&gt;계좌 잔액 정보가 담긴 테이블을 만든다거나&lt;br /&gt;demension 테이블을 만드는 등&lt;br /&gt;여러번 실행한 후에도 정보가 바뀌지 말아야 하는 테이블에서 사용됨&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;State-level Idempotency 는 주로 UPSERT / MERGE 기반 파이프라인으로 완성됨&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;예를 들어, user_id = 1 의 이름 변경 이벤트가 여러 번 들어옴&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;(user_id=1, name=Alice, updated_at=2024-01-01)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;아래 쿼리를 통해 통합 진행&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;ROW_NUMBER() OVER (&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;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;PARTITION BY pk&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;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;ORDER BY updated_date DESC, seq DESC&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;) = 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;MERGE INTO users&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;USING updates&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;ON users.user_id = updates.user_id &amp;nbsp; -- 동일한 PK 기준&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;WHEN MATCHED AND updates.updated_at &amp;gt; users.updated_at &amp;nbsp; --최신 레코드만 남김&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;THEN UPDATE SET ...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;여기서 merge into 는,&lt;br /&gt;'두 테이블을 비교해서 조건에 따라 insert, update, delete 를 수행'하는 명령어.&lt;br /&gt;&lt;b&gt;merge into = upsert 문법&lt;/b&gt;이라고 보면 됨&lt;br /&gt;MySQL 에서 지원하지 않고, SparkSQL 에서는 지원함&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;MERGE INTO [target_table] &amp;nbsp;: 타겟 테이블&lt;br /&gt;USING [source_table] : 소스 테이블&lt;br /&gt;ON : 매칭 기준&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SparkSQL 의 쿼리 예시&lt;br /&gt;&lt;br /&gt;MERGE&amp;nbsp;INTO&amp;nbsp;users&amp;nbsp;t&lt;br /&gt;USING&amp;nbsp;updates&amp;nbsp;s&lt;br /&gt;ON&amp;nbsp;t.user_id&amp;nbsp;=&amp;nbsp;s.user_id&lt;br /&gt;WHEN&amp;nbsp;MATCHED&amp;nbsp;THEN&amp;nbsp;UPDATE&amp;nbsp;SET&amp;nbsp;*&lt;br /&gt;WHEN&amp;nbsp;NOT&amp;nbsp;MATCHED&amp;nbsp;THEN&amp;nbsp;INSERT&amp;nbsp;*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL 의 쿼리 예시&lt;br /&gt;&lt;br /&gt;INSERT&amp;nbsp;INTO&amp;nbsp;users&amp;nbsp;(...)&lt;br /&gt;VALUES&amp;nbsp;(...)&lt;br /&gt;ON&amp;nbsp;DUPLICATE&amp;nbsp;KEY&amp;nbsp;UPDATE&lt;br /&gt;name&amp;nbsp;=&amp;nbsp;VALUES(name),&lt;br /&gt;updated_at&amp;nbsp;=&amp;nbsp;VALUES(updated_at);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;lt; Event-level Idempotency &amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;b&gt;같은 이벤트&lt;/b&gt;(event)가 &lt;b&gt;여러 번 처리&lt;/b&gt;되더라도, &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;b&gt;그 이벤트의 효과가 한 번만 반영&lt;/b&gt;되도록 보장하는 것&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;여기서 핵심은:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;- event 단위&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;- side effect 방지&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;Append-only event log 에서 사용하거나,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;스트리밍 / CDC / 로그 기반 파이프라인 에서 사용함&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;매출 집계해야하거나, 클릭수를 확인해야하는 상황에서 사용함&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;클릭수 집계해야하는데 재처리, 중복전송 등에 의해 &lt;b&gt;동일한 이벤트를 여러번 처리하면&lt;/b&gt;&lt;br /&gt;&lt;b&gt; 클릭수가 늘어나면 잘못된 집곗값을 볼 수 있음&lt;/b&gt;&lt;br /&gt;따라서 event-level idempotency 가 필요한 것&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;event_id를 immutable PK로 사용&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;event log에서 dedup 을 반드시 진행&lt;/b&gt;해야 함&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;아래와 같은 쿼리를 사용하여 구현 가능함&lt;br /&gt;&lt;br /&gt;WITH temp AS (&lt;br /&gt;&amp;nbsp; *,&lt;br /&gt;&amp;nbsp; SELECT ROW_NUMBER() OVER (PARTITION BY event_id ORDER BY ingestion_time) as rn&lt;br /&gt;&amp;nbsp; FROM events &lt;br /&gt;)&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;SELECT *&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;FROM temp&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;WHERE rn = 1;&lt;br /&gt;&lt;br /&gt;여기서 ingestion_time 으로 정렬한 이유는,&lt;br /&gt;같은 event_id 를 가지면 논리적으로 동일하 내용을 갖기 때문에&lt;br /&gt;굳이 event_time 을 사용할 필요가 없어서(=late-arriving data 를 구분 할 필요가 없어서)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;&lt;br /&gt;그래서 둘이 무슨 차이냐?&lt;br /&gt;&lt;br /&gt;event-level idempotency 에서 다루는 데이터는 '이벤트 데이터'임&lt;br /&gt;이벤트 데이터는 그 자체로 의미가 있음&lt;br /&gt;클릭수+1 이벤트, 매출+100 이벤트 등&lt;br /&gt;&lt;b&gt;이 이벤트 데이터는 테이블에 들어가기 전에 deduplication 되어야 함&lt;/b&gt;&lt;br /&gt;테이블에 중복 적용되는 순간 이슈가 됨&lt;br /&gt;&lt;br /&gt;state-level idempotency 는 테이블 기준으로 멱등성을 제공함&lt;br /&gt;테이블에 들어오는 로그들이 재처리되거나 중복 처리되어도&lt;br /&gt;테이블 자체의 상태는 그대로여야 함&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;간단한 예로, event-level idempotency 는 보장되지 않지만 state-level idempotency 는 보장되는 경우를 생각해보자&lt;br /&gt;동일한 eventId 를 갖는 매출+100 이벤트를 중복 발생하면&lt;br /&gt;이게 테이블에서+100을 올리는 처리가 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;두 번 &lt;/span&gt;될 것임&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;실제 아키텍처는 아래와 같음&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;Event Log (append-only, event-level idempotency)&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;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;darr;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;State Table (upsert, state-level idempotency)&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;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;darr;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;DS / BA / API&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;안전한 이벤트 처리를 위해 &lt;b&gt;이벤트 deduplication 이 필수&lt;/b&gt;임&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&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: 50%;&quot;&gt;event-based 모델이란? state-based 모델이란?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt; event-based 모델 &amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;생성되는 모든 이벤트를 append-only 로 table 에 추가하는 모델.&lt;br /&gt;예를 들어, 수집하여 필터링한 이벤트들을 s3 에 그대로 차곡차곡 쌓는 것임&lt;br /&gt;그리고 절대 건들지 않아야 함(=쌓은 데이터가 업데이트 되면 안 됨. immutable)&lt;br /&gt;&lt;br /&gt;event-based 모델 데이터를 통해 히스토리가 정확하게 보존되기 때문에&lt;br /&gt;신뢰 가능한 과거의 발자취를 기록하는 용도(로깅)로 사용되거나&lt;br /&gt;혹은 이 기록들을 기반으로 재처리 진행하는 데 사용됨&lt;br /&gt;혹은 감사(audit)용이나, 데이터 출처 보존 및 데이터 이해를 위해 사용됨&lt;br /&gt;&lt;br /&gt;이건 마치 data lake 에 데이터를 쌓아두는 것과 비슷하군&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;br /&gt;&lt;br /&gt;&amp;lt; state-based 모델 &amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;히스토리 유지 없이, 오로지 현재 상태만 table 에 저장하는 모델&amp;nbsp;&lt;br /&gt;새로운 데이터가 올 때마다 기존 데이터를 덮어쓰고 새로운 값을 유지함&lt;br /&gt;&lt;br /&gt;저장 비용이 적음&lt;br /&gt;&lt;b&gt;쿼리가 단순하고 쿼리 성능이 좋음&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&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;br /&gt;그래서 이 둘은 각각 왜 언제 쓰이느냐?&lt;br /&gt;&lt;br /&gt;event-based 모델은 source of truth 로 사용되고&lt;br /&gt;state-based 모델은 serving layer 로 사용됨&lt;br /&gt;&lt;br /&gt;간단하게, data lake, data lakehouse 가 사용하는 모델들이라고 보면 됨&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;실제 파이프라인은 아래와 같은 구조를 갖음&lt;br /&gt;&lt;br /&gt;[Source&amp;nbsp;DB&amp;nbsp;/&amp;nbsp;App]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr;&lt;br /&gt;[Event-based &lt;b&gt;Data Lake&lt;/b&gt;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr;&lt;br /&gt;[State-based&amp;nbsp;&lt;b&gt;Lakehouse&lt;/b&gt;]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;larr;&amp;nbsp;MERGE&amp;nbsp;/&amp;nbsp;UPSERT&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr;&lt;br /&gt;[BI&amp;nbsp;/&amp;nbsp;DS&amp;nbsp;/&amp;nbsp;API]&lt;br /&gt;&lt;br /&gt;&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;데이터&amp;nbsp;파이프라인에서&amp;nbsp;오류가&amp;nbsp;아닌&amp;nbsp;이상치를&amp;nbsp;어떻게&amp;nbsp;감지&amp;nbsp;&amp;amp;&amp;nbsp;대응하는가?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;여기서 말하는 '오류'는 파이프라인의 job 실패, mismatch 혹은 명백히 잘못된 데이터가 들어오는 경우(null PK 처럼)를 말함&lt;br /&gt;&lt;b&gt;'이상치'는 파이프라인의 정상 동작에 의해 생성&lt;/b&gt;되었지만,&lt;b&gt; 기존 데이터의 분포, 패턴, 규모가 기대와 다른 경우&lt;/b&gt;를 말 함&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;예를 들어보자&lt;br /&gt;&lt;br /&gt;- 데이터 볼륨 이상 : Volume Anomaly&lt;br /&gt;평소에 100개 들어온 데이터가 오늘 갑자기 1만개 들어옴&lt;br /&gt;&lt;br /&gt;- 값 분포 이상 : Distribution Anomaly&lt;br /&gt;평균 30원 하던 물건이 갑자기 3000원이 됨&lt;br /&gt;&lt;br /&gt;- 특정 값 이상&lt;br /&gt;country=&quot;Kor&quot; 로 답하는 비율이 30% 에서 99%가 됨&lt;br /&gt;&lt;br /&gt;- 시간 관련 이상&lt;br /&gt;event_time 이 미래시간임&lt;br /&gt;&lt;br /&gt;- fact-dimension 테이블 간 관계가 깨진 경우&lt;br /&gt;즉, fact table 에 존재하는 FK 가 dimension table 에 없는 경우&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ref.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;a href=&quot;https://www.hipeople.io/interview-questions/data-engineer-interview-questions&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.hipeople.io/interview-questions/data-engineer-interview-questions&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;a href=&quot;https://www.geeksforgeeks.org/data-engineering/data-engineer-interview-questions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.geeksforgeeks.org/data-engineering/data-engineer-interview-questions/&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;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/737</guid>
      <comments>https://eyeballs.tistory.com/737#entry737comment</comments>
      <pubDate>Fri, 16 Jan 2026 06:11:17 +0900</pubDate>
    </item>
    <item>
      <title>[Airflow] interview questions</title>
      <link>https://eyeballs.tistory.com/734</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;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 38px;&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: 100%; height: 19px;&quot;&gt;What&amp;nbsp;is&amp;nbsp;Apache&amp;nbsp;Airflow?&amp;nbsp;How&amp;nbsp;is&amp;nbsp;it&amp;nbsp;most&amp;nbsp;commonly&amp;nbsp;used?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 19px;&quot;&gt;&lt;br /&gt;에어플로우는 &lt;b&gt;Python 을 사용&lt;/b&gt;하여 정해진 시간/조건에 원하는 작업을 실행하도록 만들어주는 &lt;b&gt;ETL 오케스트레이션 도구&lt;/b&gt;임&lt;br /&gt;에어플로우를 통해 어떤 작업이 언제 실행되는지 설정하여 &lt;b&gt;데이터 파이프라인을 정의 할 수 있고&lt;/b&gt;&lt;br /&gt;작업의 경과를 WebUI 로 모니터링 할 수 있어서&lt;br /&gt;주기적으로 실행되어야 하는 작업들을 자동화하고 편하게 관리할 수 있음&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Airflow&amp;nbsp;is&amp;nbsp;an&amp;nbsp;ETL&amp;nbsp;orchestration&amp;nbsp;tool&amp;nbsp;that&amp;nbsp;uses&amp;nbsp;Python.&amp;nbsp;It&amp;nbsp;triggers&amp;nbsp;jobs&amp;nbsp;at&amp;nbsp;specific&amp;nbsp;points&amp;nbsp;in&amp;nbsp;time.&lt;br /&gt;We can monitor the process of the task via the WebUI.&lt;br /&gt;&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 a DAG and DagRun?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;DAG 란 작업과 그 작업들 간의 관계를 나타내는 그래프임&lt;br /&gt;&lt;b&gt;명확한 시작점과 끝점&lt;/b&gt;이 있으며, 작업들 사이에 &quot;&lt;b&gt;순환&quot;이 없음&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;airflow 에서&lt;span&gt; DAG 란 &lt;/span&gt;&lt;/span&gt;비순환 그래프를 이루는 &lt;b&gt;데이터 파이프라인으로 이해&lt;/b&gt;할 수 있음&lt;br /&gt;DAG 내에 여러 operators 를 설정하고 트리거하여 작업을 실행함&lt;br /&gt;&lt;b&gt;스케줄에 따라 무엇을 어떻게 실행할지 정의한 설계도&lt;/b&gt;&lt;br /&gt;DAG 자체는 실행되지 않음. 그냥 스크립트임&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DagRun 은 DAG 를 실제로 실행한 단위&lt;br /&gt;(DagRun represents one execution of DAG)&lt;/b&gt;&lt;br /&gt;DAG 가 여러번 실행되면 여러 DagRun 이 생성됨&lt;br /&gt;각 DagRun 은 하나의 logical_date 를 갖음&lt;br /&gt;&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&amp;nbsp;are&amp;nbsp;the&amp;nbsp;three&amp;nbsp;parameters&amp;nbsp;needed&amp;nbsp;to&amp;nbsp;define&amp;nbsp;a&amp;nbsp;DAG?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;DAG 를 정의하기 위해 필요한 세 가지는 start_date, dag_id, 그리고 schedule&lt;br /&gt;&lt;br /&gt;&lt;span&gt;ID : &lt;b&gt;DAG를 고유하게 식별하는 아이디&lt;/b&gt;이며 일반적으로 짧은 문자열로 설정함&lt;br /&gt;start_date : &lt;b&gt;DAG가 트리거되는 첫 번째 간격&lt;/b&gt;의 날짜 및 시간&lt;/span&gt;&lt;span&gt;&lt;br /&gt;schedule : &lt;b&gt;DAG가 실행될 빈도&lt;/b&gt;. 매주, 매일, 매시간 또는 사용자 지정 값으로 설정. cron 표현식이나 @daily 등으로 설정 가능&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ID is a unique value used to&lt;b&gt; identify&lt;/b&gt; DagRun. It &lt;b&gt;is&lt;/b&gt; typically &lt;b&gt;composed of&lt;/b&gt; a short string.&lt;br /&gt;start_date&amp;nbsp;is&amp;nbsp;the&amp;nbsp;date&amp;nbsp;and&amp;nbsp;time&amp;nbsp;of&amp;nbsp;&lt;b&gt;the&amp;nbsp;first&amp;nbsp;interval&lt;/b&gt;&amp;nbsp;when&amp;nbsp;the&amp;nbsp;DAG&amp;nbsp;is&amp;nbsp;triggered.&lt;br /&gt;schedule refers to &lt;b&gt;the frequency at&lt;/b&gt; which the DAG will run.&lt;br /&gt;&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 an Airflow task and operator?&lt;br /&gt;Whats the difference between them?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;&lt;b&gt;operator&lt;/b&gt; 는 &lt;b&gt;DAG 에서 작업을 정의하는 템플릿&lt;/b&gt;임&lt;br /&gt;각 operator 마다 하나의 고유 작업을 설정할 수 있음&lt;br /&gt;이를 테면, PythonOperator 는 python 코드를 실행하고&lt;br /&gt;SparkSubmitOperator 는 spark 에 job 을 제출할 수 있음&lt;br /&gt;&lt;br /&gt;Operator 가 작업을 정의한 템플릿이라면,&lt;br /&gt;&lt;b&gt;task 는 Operator 를 인스턴스화한 실행 단위&lt;/b&gt;임 (execution unit)&lt;br /&gt;task_a = PythonOperator(...) 여기서 task_a 가 바로 task 임 (아직 실행된 거 아님)&lt;br /&gt;마치 OOP 언어의 object 와 instance 의 관계같음&lt;br /&gt;&lt;br /&gt;task instance 는 task 가 실행되면 생기는 실행 단위&lt;br /&gt;예를 들어, 어떤 DAG 안에 3개의 Operator 가 존재하고 각각 task_a, task_b, task_c 를 설정했다고 하자&lt;br /&gt;Scheduler 가 해당 DAG 를 실행하면 세 개의 task 들이 저마다 Task Instance 를 만듦&lt;br /&gt;task instance 에는 메타데이터가 포함되어있음&lt;br /&gt;(언제 실행되었고, task_id 는 무엇이고, logical_date 는 몇이고 누가 실행했고 어떻게 실행되었고... 등)&lt;br /&gt;해당 정보는 Metastore 에 저장되며 WebUI 에서 task 상태 확인 가능&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A&amp;nbsp;task&amp;nbsp;instance&amp;nbsp;is&amp;nbsp;&lt;b&gt;an&amp;nbsp;execution&amp;nbsp;unit&lt;/b&gt;&amp;nbsp;that&amp;nbsp;is&amp;nbsp;created&amp;nbsp;when&amp;nbsp;a&amp;nbsp;task&amp;nbsp;is&amp;nbsp;executed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;from&amp;nbsp;airflow&amp;nbsp;import&amp;nbsp;DAG&lt;br /&gt;from&amp;nbsp;airflow.operators.python&amp;nbsp;import&amp;nbsp;PythonOperator&lt;br /&gt;from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime&lt;br /&gt;&lt;br /&gt;def&amp;nbsp;hello():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;hello&quot;)&lt;br /&gt;&lt;br /&gt;with&amp;nbsp;DAG(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dag_id=&quot;example_dag&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start_date=datetime(2024,&amp;nbsp;1,&amp;nbsp;1),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;schedule_interval=&quot;@daily&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catchup=True&lt;br /&gt;)&amp;nbsp;as&amp;nbsp;dag:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t1&amp;nbsp;=&amp;nbsp;PythonOperator(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;task_id=&quot;print_hello&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;python_callable=hello&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;위와 같은 DAG 가 존재하고 이를 실행한다고 하자&lt;br /&gt;&lt;br /&gt;Operator : 무슨 작업을 할 지 정의한 템플릿. 위 예제에서는 PythonOperator&lt;br /&gt;task : Operator 의 인스턴스. 위 예제의 t1. 아직 실행된 거 아님&lt;br /&gt;&lt;br /&gt;25년 6월 25일에 실행하면&lt;br /&gt;&lt;br /&gt;DagRun : DAG 를 특정 시점(logical_date)에 실행한 기록. DAG 실행 1회를 의미함&lt;br /&gt;DagRun 은 dag_id, logical_date(2025.06.24) 등을 갖음&lt;br /&gt;&lt;br /&gt;task instance : task(위 예제의 t1)를 실행한 인스턴스. Operator 가 아닌 DAG 도 아닌 task 를 실행한 것임&lt;br /&gt;이렇게 생성된 task instance 를 &amp;nbsp;executor 가 worker 에게 전달하고&lt;br /&gt;worker 들이 task instance 를 실행하게 됨&lt;br /&gt;그리고 worker 가 실행한 결과는 task instance logic 에 의해 DB 에 저장됨&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&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&amp;nbsp;are&amp;nbsp;the&amp;nbsp;core&amp;nbsp;components&amp;nbsp;of&amp;nbsp;Airflow&amp;rsquo;s&amp;nbsp;architecture?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;Scheduler : 사용자가 정의한 DAG 를 주기마다 파싱, 분석한 'DAG 상태' 및 'DAG 메타데이터'를 metastore 에 넣음 &lt;br /&gt;(DAG 파일 자체는 .py 파일 그대로 존재함. metastore 에 저장되는 게 아님)&lt;br /&gt;트리거 될 DAG 들을 확인하고 실행 가능하겠다 싶으면 실행하여 DagRun, task_instance 를 만든 후 Executor 에게 넘겨줌&lt;br /&gt;&lt;br /&gt;Executor : &lt;b&gt;Scheduler 가 작업을 실행하기 위한 전략&lt;/b&gt;&lt;br /&gt;Scheduler 로부터 받은 실행 가능한 task_instance 들을 queue 에 넣고, worker 에 나눠져서 실행될 수 있도록 함&lt;br /&gt;Local Executor, Celery Executor 등 어떤 방식으로 작업을 실행할지 결정함&lt;br /&gt;&lt;br /&gt;WebServer : 사용자가 Airflow 와 소통하는 창구&lt;br /&gt;설정된 값, DAG, task 의 상태를 모니터링 할 수 있고, 수동으로 DAG 를 trigger 할 수 있음&lt;br /&gt;&lt;br /&gt;Metastore : airflow 의 DAG 및 task 상태 정보를 저장하는 저장소. &lt;br /&gt;&lt;b&gt;모든 컴포넌트가 DB 를 통해 &lt;b&gt;상태 정보를 &lt;/b&gt;공유하기 때문에, single source of truth&lt;/b&gt; 라고 불림&lt;br /&gt;&lt;br /&gt;worker 들은 queue 로부터 task instance 를 가져가서 실행함&lt;br /&gt;내부 task instance login 에 의해, 실행한 task instance 의 상태나 결과가 metastore 에 기록됨&lt;br /&gt;그래서 사용자가 WebUI 를 통해 확인 가능&lt;br /&gt;(&lt;b&gt;스케줄러가 worker 들의 결과 받아서 DB 에 저장하는 거 아님&lt;/b&gt;)&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&amp;nbsp;are&amp;nbsp;Task&amp;nbsp;Groups?&amp;nbsp;How&amp;nbsp;are&amp;nbsp;they&amp;nbsp;used&amp;nbsp;within&amp;nbsp;DAGs?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;task group 은 tasks 를 논리적으로 함께 묶어주는 역할을 함&lt;br /&gt;사용자 입장에서 task 를 보기 편하게 구분할 수 있도록 도와줌&lt;br /&gt;성격별로, 역할별로 task 를 그룹지어두면 이해하거나 설명할 때 편함&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&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;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;Given&amp;nbsp;a&amp;nbsp;&lt;i&gt;data_interval_start&lt;/i&gt;&amp;nbsp;and&amp;nbsp;&lt;i&gt;data_interval_end&lt;/i&gt;,&amp;nbsp;when&amp;nbsp;is&amp;nbsp;a&amp;nbsp;DAG&amp;nbsp;executed?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;data_interval_start 는 DAG 에 설정된 실행 주기(interval) 의 시작점이고&lt;br /&gt;data_interval_end 는 DAG 에 설정된 실행 주기(interval) 의 끝점임&lt;br /&gt;예를 들어, 매일 새벽 2시에 트리거되도록 스케줄링 된 DAG 의 interval 은 하루이며&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;2025년 6월 25일 새벽 2시에 트리거되었을 때&lt;br /&gt;&lt;/span&gt;data_interval_start 는 25년 6월 24일 오전 2시,&lt;br /&gt;data_interval_end 는 25년 6월 25일 오전 2시&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&amp;nbsp;is&amp;nbsp;the&amp;nbsp;catchup&amp;nbsp;parameter,&amp;nbsp;and&amp;nbsp;how&amp;nbsp;does&amp;nbsp;it&amp;nbsp;impact&amp;nbsp;the&amp;nbsp;execution&amp;nbsp;of&amp;nbsp;an&amp;nbsp;Airflow&amp;nbsp;DAG?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;catchup 파라미터를 true 로 설정하면, start_date 부터 logical_date 까지 scheduling 에 맞춰 실행됨(DagRun 생성)&lt;br /&gt;만약 catchup 이 false 라면, DAG 를 active 했을 때 과거에 실행되지 않았던 날짜들은 무시하고, active 한 이후로만 트리거됨&lt;br /&gt;&lt;br /&gt;&lt;b&gt;마지막으로 실행한 날짜부터 오늘까지&lt;/b&gt;가&lt;b&gt; 아님. start_date 부터 오늘까지&lt;/b&gt;임&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;The catchup parameter controls whether Airflow creates DAG runs &lt;b&gt;for past scheduled intervals that were missed&lt;/b&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;If catchup=True, when a DAG is enabled, the scheduler will create DagRuns for all past execution dates starting from the start_date up to the current date, based on the DAG&amp;rsquo;s schedule.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;If catchup=False, the scheduler &lt;b&gt;skips all past intervals&lt;/b&gt; and only creates a DagRun &lt;b&gt;for the next upcoming schedule&lt;/b&gt;, meaning historical runs are not backfilled automatically.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;This parameter is commonly set to False for streaming pipelines or non-idempotent jobs, and set to True when historical data processing is required.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&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%; height: 38px;&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: 100%; height: 19px;&quot;&gt;What&amp;nbsp;are&amp;nbsp;XComs,&amp;nbsp;and&amp;nbsp;how&amp;nbsp;are&amp;nbsp;they&amp;nbsp;typically&amp;nbsp;used?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 19px;&quot;&gt;&lt;br /&gt;&lt;b&gt;xcom&lt;/b&gt; 은 같은 DAG 내의 &lt;b&gt;여러 tasks 간에 소량의 데이터를 공유&lt;/b&gt;하기 위한 기능&lt;br /&gt;PythonOperator, BashOperator, Sensor... 등 &lt;b&gt;다양한 operator 들을 통해 데이터를 공유&lt;/b&gt;할 수 있음&lt;br /&gt;&lt;br /&gt;xcom 데이터는 key-value 형태로 metastore &amp;nbsp;에 저장됨&lt;br /&gt;webui 에서 저장 가능&lt;br /&gt;&lt;br /&gt;xcom 은 기본적으로 json-serializeable 한 값만 저장하는 것이 권장됨&lt;br /&gt;대량의 데이터를 공유 할 때는 외부 storage 를 사용&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&amp;nbsp;is&amp;nbsp;idempotency?&amp;nbsp;&lt;br /&gt;Why&amp;nbsp;is&amp;nbsp;this&amp;nbsp;important&amp;nbsp;to&amp;nbsp;keep&amp;nbsp;in&amp;nbsp;mind&amp;nbsp;when&amp;nbsp;building&amp;nbsp;Airflow&amp;nbsp;DAGs?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;멱등성이란, 여러번 실행해도 동일한 결과를 만드는 것을 말 함&lt;br /&gt;airflow 에서 DAG 는 멱등성을 갖춰 작성되어야 함&lt;br /&gt;airflow 작업이 실패하여 재실행 하거나, 두 번 이상 실행 될 수 있기 때문&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;catchup&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;backfill &amp;nbsp;등으로 과거 날짜 DagRun 을 다시 실행하게 되는 경우에도&lt;br /&gt;동일한 결과를 출력해야 하기 때문에 멱등성을 중요함&amp;nbsp;&lt;br /&gt;멱등성이 지켜지지 않으면 중복데이터 발생 가능&lt;br /&gt;&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;After&amp;nbsp;writing&amp;nbsp;a&amp;nbsp;DAG,&amp;nbsp;how&amp;nbsp;can&amp;nbsp;you&amp;nbsp;test&amp;nbsp;that&amp;nbsp;DAG?&amp;nbsp;Walk&amp;nbsp;through&amp;nbsp;the&amp;nbsp;process&amp;nbsp;from&amp;nbsp;start&amp;nbsp;to&amp;nbsp;finish.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;- pytest, unittest 등으로 PythonOperator 로직 테스트&lt;br /&gt;- 각 task 가 정상 동작하는지 CLI 로 검사 : &lt;b&gt;airflow tasks test&lt;/b&gt; my_dag my_task_id 2025-06-25&lt;br /&gt;&amp;nbsp; scheduler, executor 없이 로컬에서 task 만 실행 가능함&lt;br /&gt;- dag 가 정상 동작하는지 CLI 로 검사 : &lt;b&gt;airflow dags test&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;my_dag 2025-06-25&lt;/span&gt;&lt;br /&gt;&amp;nbsp; dag 전체를 순서대로 실행 가능함&lt;br /&gt;- test 환경의 airflow 에서 dag 를 실행해 봄&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;airflow tasks test CLI 로 테스트하면&lt;br /&gt;scheduler, executor, worker 등이 관여하지 않음&lt;br /&gt;의존성 상관 없이, 해당 task 하나만 로컬에서 &lt;b&gt;(실제로) 실행&lt;/b&gt;해서 로직 이상 여부를 확인&lt;br /&gt;&lt;br /&gt;airflow dags test CLI 로 테스트하면&lt;br /&gt;scheduler, executor, worker 등이 관여하지 않음&lt;br /&gt;dag 전체 구조 올바른지, task 의존성이 올바른지 확인&lt;br /&gt;&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%; height: 57px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 38px;&quot;&gt;To&amp;nbsp;manage&amp;nbsp;credentials&amp;nbsp;for&amp;nbsp;connecting&amp;nbsp;to&amp;nbsp;tools&amp;nbsp;such&amp;nbsp;as&amp;nbsp;databases,&amp;nbsp;APIs,&amp;nbsp;and&amp;nbsp;SFTP&amp;nbsp;sites,&amp;nbsp;&lt;br /&gt;what&amp;nbsp;functionality&amp;nbsp;does&amp;nbsp;Airflow&amp;nbsp;provide?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 19px;&quot;&gt;&lt;br /&gt;'connections' 란, 외부 시스템에 접근하기 위한 접속 정보를 관리하는 기능&lt;br /&gt;DB, APIs, S3, RestAPI, SFTP, Kafka 등&lt;br /&gt;&lt;br /&gt;connections 에 접속 정보를 넣어두면, DAG 코드 안에서 password 등을 직접 넣지 않아도 됨&lt;br /&gt;&lt;br /&gt;WebUI 를 통해 connections 관리 가능하며&lt;br /&gt;connections 에 저장된 접속 정보는 metastore 에 저장됨&lt;br /&gt;&lt;br /&gt;conn_id : 컨넥션 이름&lt;br /&gt;conn_type : mysql, sftp, http 등&lt;br /&gt;host : 서버 주소&lt;br /&gt;schema : DB name, path 등&lt;br /&gt;login : username&lt;br /&gt;passowrd : password&lt;br /&gt;port : port&lt;br /&gt;extra : json 형태의 추가 설정&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;connections 에 저장된 정보를 사용 할 때는, &lt;br /&gt;아래처럼 &lt;b&gt;Hook 을 사용하여 conn_id 와 연결&lt;/b&gt;해주면 끝!&lt;br /&gt;&lt;br /&gt;from&amp;nbsp;airflow.providers.sftp.hooks.sftp&amp;nbsp;import&amp;nbsp;SFTPHook&lt;br /&gt;from&amp;nbsp;airflow.operators.python&amp;nbsp;import&amp;nbsp;PythonOperator&lt;br /&gt;&lt;br /&gt;def&amp;nbsp;download_file():&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hook&amp;nbsp;=&amp;nbsp;SFTPHook(ftp_conn_id=&quot;my_sftp_conn&quot;)&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hook.retrieve_file(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;remote_full_path=&quot;/remote/data.csv&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;local_full_path=&quot;/tmp/data.csv&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&lt;br /&gt;task&amp;nbsp;=&amp;nbsp;PythonOperator(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;task_id=&quot;download_from_sftp&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;python_callable=download_file&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다양한 Hook 이 있음&lt;br /&gt;SFTPHook, MySqlHook, S3Hook....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;추가로, connections 는 환경별로 다르게 관리 가능함&lt;br /&gt;이를테면, dev, stage, prod 별로 다르게 설정 가능!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;Airflow 에는 'Variables' 라는 기능도 있음&lt;br /&gt;&lt;br /&gt;DAG, task 에서 참조할 수 있는 '전역 설정 값(key-value)' 저장소임&lt;br /&gt;문자열, 숫자, json 등 저장 가능함.&lt;br /&gt;Key-value 형태로 저장&lt;br /&gt;&lt;br /&gt;connections 처럼 variables 도 WebUI 에서 설정하며,&lt;br /&gt;환경별(dev, stage, prod)로 다르게 관리 가능함&lt;br /&gt;&lt;br /&gt;주로 S3 버킷이름, 임계값(threshold), 파일 경로 등 고정적인 정보 저장용이며&lt;br /&gt;비밀번호나 key 등의 민감한 저장을 위한 용도로 사용하지 않음&lt;br /&gt;&lt;br /&gt;아래처럼 variable 을 불러와서 사용&lt;br /&gt;&lt;br /&gt;from&amp;nbsp;airflow.models&amp;nbsp;import&amp;nbsp;Variable&lt;br /&gt;&lt;br /&gt;&lt;b&gt;bucket&amp;nbsp;=&amp;nbsp;Variable.get(&quot;data_bucket&quot;)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;def&amp;nbsp;process():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;Reading&amp;nbsp;data&amp;nbsp;from&amp;nbsp;{bucket}&quot;)&lt;br /&gt;&lt;br /&gt;PythonOperator(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;task_id=&quot;process_data&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;python_callable=process&lt;br /&gt;)&lt;br /&gt;&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;Your&amp;nbsp;team&amp;nbsp;is&amp;nbsp;currently&amp;nbsp;supporting&amp;nbsp;a&amp;nbsp;legacy&amp;nbsp;data&amp;nbsp;pipeline&amp;nbsp;that&amp;nbsp;leverages&amp;nbsp;homegrown&amp;nbsp;tooling.&amp;nbsp;&lt;br /&gt;You&amp;rsquo;re&amp;nbsp;tasked&amp;nbsp;with&amp;nbsp;migrating&amp;nbsp;this&amp;nbsp;pipeline&amp;nbsp;to&amp;nbsp;Airflow.&amp;nbsp;How&amp;nbsp;would&amp;nbsp;you&amp;nbsp;approach&amp;nbsp;this?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;- legacy data pipeline 은 블랙박스같은 느낌이 있기 때문에 조심해서 migration 해야 함. migration 하다가 로직이 달라질 수 있기 때문&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;- homegrown tooling 에 대한 코드, 문서, 기획서, 참고자료 등이 있는지 찾아봄&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;- source 와 target 을 구체적으로 정리&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;- 해당 파이프라인이 다른 외부 서비스를 사용하는지도 체크&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;- 내부 코드를 하나하나 검토하여 어떤 로직으로 이루어졌는지 확인하고 airflow 에서 구현 진행&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;- 모듈 별로 migration 진행&lt;br /&gt;&lt;span&gt;&lt;span&gt;- source, target 과 연결시 필요한 인증 정보 등을 새로 만들어서 연결&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;- migration 진행중에 airflow 에서 제공하는 더 나은 기능(retry, alarm 등)이 있다면 추가&lt;br /&gt;&lt;span&gt;&lt;span&gt;- migration 진행 과정을 문서로 정확하게 남겨서 추후 이슈 발생시 참고할 수 있도록 함&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;- 실제 두 파이프라인의 결과를 비교 테스트해봄. 한 달 정도 실제 데이터 기반으로 테스트해보고 , 잘 migration 되었다면 legacy 를 없애는 방향으로 진행&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;shadow run 이란?&lt;br /&gt;feature flag, dual write 란?&lt;br /&gt;&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;Outside&amp;nbsp;of&amp;nbsp;traditional&amp;nbsp;Data&amp;nbsp;Engineering&amp;nbsp;workflows,&amp;nbsp;&lt;br /&gt;what&amp;nbsp;are&amp;nbsp;other&amp;nbsp;ways&amp;nbsp;that&amp;nbsp;Apache&amp;nbsp;Airflow&amp;nbsp;is&amp;nbsp;being&amp;nbsp;used&amp;nbsp;by&amp;nbsp;data&amp;nbsp;teams?&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;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&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;&lt;a href=&quot;https://www.datacamp.com/blog/top-airflow-interview-questions&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.datacamp.com/blog/top-airflow-interview-questions&lt;/a&gt;&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/734</guid>
      <comments>https://eyeballs.tistory.com/734#entry734comment</comments>
      <pubDate>Sun, 14 Dec 2025 04:22:59 +0900</pubDate>
    </item>
  </channel>
</rss>