<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Alroha</title>
    <link>https://al-roha.tistory.com/</link>
    <description>천방지축 로하의 우당탕탕 개발일지</description>
    <language>ko</language>
    <pubDate>Mon, 13 Jul 2026 16:57:00 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>헤이로하</managingEditor>
    <image>
      <title>Alroha</title>
      <url>https://tistory1.daumcdn.net/tistory/6205048/attach/447fc848d8d8486ea8940ea5fcf0e6f6</url>
      <link>https://al-roha.tistory.com</link>
    </image>
    <item>
      <title>[Olist 이커머스 분석 #5] Tableau로 RFM 세그먼트 시각화하기</title>
      <link>https://al-roha.tistory.com/26</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;  이번 포스팅 목표&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL로 만든 RFM 마트를 Tableau에 연결하고, &lt;b&gt;계산된 필드&lt;/b&gt;로 R/F/M 점수를 직접 만들어 고객을 5개 세그먼트로 분류했습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; ️ &lt;b&gt;사용 도구&lt;/b&gt;: Tableau Public (무료)   &lt;b&gt;데이터&lt;/b&gt;: mart_rfm.csv&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  RFM 세그먼트란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;93,357명의 고객을 개별로 볼 수는 없습니다. RFM 점수로 그룹화해야 &lt;b&gt;&quot;어떤 고객에게 무슨 마케팅을 해야 하는가&quot;&lt;/b&gt; 에 답할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세그먼트 특징 마케팅 전략&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;VIP&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;최근&amp;middot;자주&amp;middot;많이 구매&lt;/td&gt;
&lt;td&gt;프리미엄 혜택, 충성도 프로그램&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;충성고객&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;자주 구매하지만 최근성 보통&lt;/td&gt;
&lt;td&gt;재구매 쿠폰, 신상품 알림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;이탈위험&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;과거엔 자주 샀지만 최근 없음&lt;/td&gt;
&lt;td&gt;윈백 캠페인, 할인 오퍼&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;신규고객&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;최근 첫 구매&lt;/td&gt;
&lt;td&gt;온보딩, 2차 구매 유도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;일반고객&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;나머지&lt;/td&gt;
&lt;td&gt;일반 프로모션&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚙️ STEP 1. 계산된 필드 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;경로&lt;/b&gt;: 데이터 패널 빈 곳 우클릭 &amp;rarr; 계산된 필드 만들기&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  상단 메뉴 &quot;분석&quot; 탭과 헷갈리지 마세요 &amp;mdash; 그건 추세선&amp;middot;참조선 추가하는 패널입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;R_Score (최신성)&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;IF [Recency] &amp;lt;= 100 THEN 3
ELSEIF [Recency] &amp;lt;= 300 THEN 2
ELSE 1
END
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Recency는 낮을수록 최근 구매 &amp;rarr; 낮은 값에 높은 점수(3점)&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m7fqi/dJMcaftH9Ae/KP9iBOcNmifuRJbwdJKlH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m7fqi/dJMcaftH9Ae/KP9iBOcNmifuRJbwdJKlH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m7fqi/dJMcaftH9Ae/KP9iBOcNmifuRJbwdJKlH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm7fqi%2FdJMcaftH9Ae%2FKP9iBOcNmifuRJbwdJKlH0%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;480&quot; height=&quot;280&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;F_Score (빈도)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- R_Score 와 같은 방법으로 생성합니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;IF [Frequency] &amp;gt;= 3 THEN 3
ELSEIF [Frequency] = 2 THEN 2
ELSE 1
END
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;M_Score (금액)&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;IF [Monetary] &amp;gt;= 500 THEN 3
ELSEIF [Monetary] &amp;gt;= 200 THEN 2
ELSE 1
END
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RFM_Segment (최종 분류)&lt;/h3&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;IF [R_Score] = 3 AND [F_Score] &amp;gt;= 2 AND [M_Score] &amp;gt;= 2 THEN 'VIP'
ELSEIF [R_Score] &amp;gt;= 2 AND [F_Score] &amp;gt;= 2 THEN '충성고객'
ELSEIF [R_Score] = 1 AND [F_Score] &amp;gt;= 2 THEN '이탈위험'
ELSEIF [R_Score] = 3 AND [F_Score] = 1 THEN '신규고객'
ELSE '일반고객'
END
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PSQDl/dJMcag7dcFh/KY6GxD2zMgT7mkRXl48eo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PSQDl/dJMcag7dcFh/KY6GxD2zMgT7mkRXl48eo0/img.png&quot; data-alt=&quot;최종 테이블&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PSQDl/dJMcag7dcFh/KY6GxD2zMgT7mkRXl48eo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPSQDl%2FdJMcag7dcFh%2FKY6GxD2zMgT7mkRXl48eo0%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;242&quot; height=&quot;321&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최종 테이블&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  시각화 1. 세그먼트별 고객 수 &amp;mdash; 막대 차트&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. RFM_Segment &amp;rarr; 열 선반
2. 카운트(Customer Unique Id) &amp;rarr; 행 선반
3. RFM_Segment &amp;rarr; 색상
4. 카운트 &amp;rarr; 레이블
5. 내림차순 정렬
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인사이트&lt;/b&gt;: 일반고객이 압도적 다수 &amp;mdash; VIP는 소수지만 매출 기여도가 핵심&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;1822&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tQ8kG/dJMb99UyUEK/o8lYoHm6uQojksWoaTkEE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tQ8kG/dJMb99UyUEK/o8lYoHm6uQojksWoaTkEE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tQ8kG/dJMb99UyUEK/o8lYoHm6uQojksWoaTkEE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtQ8kG%2FdJMb99UyUEK%2Fo8lYoHm6uQojksWoaTkEE0%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;283&quot; height=&quot;874&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;1822&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  시각화 2. 세그먼트별 평균 Monetary &amp;mdash; 막대 차트&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. RFM_Segment &amp;rarr; 열 선반
2. Monetary (평균) &amp;rarr; 행 선반
3. RFM_Segment &amp;rarr; 색상
4. 평균 Monetary &amp;rarr; 레이블
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인사이트 포인트&lt;/b&gt;: VIP 고객의 평균 구매액이 일반고객 대비 몇 배인지 확인 &lt;b&gt;(1.7배)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;1630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l2RrJ/dJMb99NKlcs/xE9UzhxxvJZ9V2RLFSBuE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l2RrJ/dJMb99NKlcs/xE9UzhxxvJZ9V2RLFSBuE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l2RrJ/dJMb99NKlcs/xE9UzhxxvJZ9V2RLFSBuE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl2RrJ%2FdJMb99NKlcs%2FxE9UzhxxvJZ9V2RLFSBuE0%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;361&quot; height=&quot;934&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;1630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  시각화 3. 세그먼트 비중 &amp;mdash; 트리맵&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. Show Me &amp;rarr; 트리맵 선택
2. RFM_Segment &amp;rarr; 색상
3. 카운트(Customer Unique Id) &amp;rarr; 크기
4. RFM_Segment + 카운트 &amp;rarr; 레이블
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트리맵은 &lt;b&gt;비중을 면적으로 표현&lt;/b&gt;해 대시보드에서 가장 임팩트 있는 차트입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2356&quot; data-origin-height=&quot;1598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zoVjL/dJMcafUPZsp/AAS4qptvaCMLgMdsbAumAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zoVjL/dJMcafUPZsp/AAS4qptvaCMLgMdsbAumAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zoVjL/dJMcafUPZsp/AAS4qptvaCMLgMdsbAumAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzoVjL%2FdJMcafUPZsp%2FAAS4qptvaCMLgMdsbAumAK%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;693&quot; height=&quot;470&quot; data-origin-width=&quot;2356&quot; data-origin-height=&quot;1598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  시행착오 &amp;amp; 트러블슈팅&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 실수 1. 계산된 필드 메뉴를 못 찾음&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황&lt;/b&gt;: 상단 &quot;분석&quot; 탭에서 계산된 필드를 찾으려 함 &lt;b&gt;문제&lt;/b&gt;: 상단 분석 탭은 추세선&amp;middot;참조선 추가 패널 &amp;mdash; 계산된 필드 없음 &lt;b&gt;해결&lt;/b&gt;: &lt;b&gt;데이터 패널 빈 곳 우클릭&lt;/b&gt; &amp;rarr; 계산된 필드 만들기&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 실수 2. 막대 차트가 크로스탭으로 나옴&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황&lt;/b&gt;: 열에 RFM_Segment, 행에 Customer Unique Id를 올렸더니 고객 ID가 행마다 펼쳐진 크로스탭 형태로 출력됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인&lt;/b&gt;: Customer Unique Id가 차원(개별 식별자)으로 인식되어 집계 안 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;행 선반의 Customer Unique Id 제거
&amp;rarr; 카운트(mart_rfm) 측정값을 행 선반에 올리기
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교훈: &lt;b&gt;집계(COUNT)&lt;/b&gt; 를 행에 올려야 세그먼트별 합산이 됩니다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  RFM 점수 기준 설정 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;분위수 기준&lt;/td&gt;
&lt;td&gt;상위 33% &amp;rarr; 3점, 중간 &amp;rarr; 2점, 하위 &amp;rarr; 1점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비즈니스 기준&lt;/td&gt;
&lt;td&gt;&quot;30일 내 구매 = 활성고객&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;수동 설정&lt;/td&gt;
&lt;td&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  회고&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;잘한 점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;계산된 필드 4개를 순서대로 쌓아 세그먼트를 만드는 로직 이해&lt;/li&gt;
&lt;li&gt;트리맵으로 세그먼트 비중을 면적으로 직관적으로 표현&lt;/li&gt;
&lt;li&gt;각 세그먼트에 비즈니스 의미(마케팅 전략)를 연결해서 해석&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;아쉬운 점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;계산된 필드 경로를 처음에 못 찾아 시간 소요&lt;/li&gt;
&lt;li&gt;크로스탭 vs 집계 차트의 차이를 처음엔 헷갈린 것 &amp;rarr; &lt;b&gt;차원 vs 측정값&lt;/b&gt; 개념을 항상 먼저 확인하는 습관 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[과제] 6강 실습 과제&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;세그먼트별 고객 수를 막대 차트로 만들고 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;가장 많은 세그먼트는? 일반 고객&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;VIP 고객의 평균 Monetary는 일반고객 대비 몇 배인가? &lt;b&gt;1.7배&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;트리맵에서 이탈위험 고객이 전체의 몇 %를 차지하는가? &lt;b&gt;0.2%&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  다음 포스팅&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Olist 이커머스 분석 #6] Tableau 대시보드 완성 &amp;mdash; KPI + RFM + 배송 한 화면에 담기&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 시리즈는 Kaggle의 Olist Brazilian E-Commerce 데이터셋을 활용한 포트폴리오 프로젝트입니다.&lt;/p&gt;</description>
      <category>Kaggle</category>
      <category>olist</category>
      <category>tableau</category>
      <category>데이터분석</category>
      <category>데이터분석포트폴리오</category>
      <category>데이터시각화</category>
      <category>포트폴리오</category>
      <author>헤이로하</author>
      <guid isPermaLink="true">https://al-roha.tistory.com/26</guid>
      <comments>https://al-roha.tistory.com/26#entry26comment</comments>
      <pubDate>Thu, 9 Jul 2026 15:41:39 +0900</pubDate>
    </item>
    <item>
      <title>[7월 1일] 내가 여름이 왔음을 느끼는 순간 </title>
      <link>https://al-roha.tistory.com/25</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이제 제법 날씨가 더워지고 있다.&lt;br /&gt;6월30일 어제까지만해도 작년 6월보단 많이 선선한 것 같다고 느꼈는데..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7월 한달동안 장마가 있을 것이라는 소식을 들은 후, 왜인지 모르게 더운 것 같고 습한 것 처럼 느껴진다.&lt;br /&gt;(그냥 내 기분이 꿀꿀한 탓인가..?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6월을 마무리하면서 생각해보면 시작은 거창했는데 그 끝은 엉망진창 흙탕물이 되어버린 기분이다.&lt;br /&gt;사람이 한계로 몰리다보니 다 던져버리고, 될대로 대란 마인드로만 가득차서 내 자신을 몇 주만에 망가뜨린 매 순간이었다.&lt;br /&gt;어제까지도 잡생각이 너무 많아서 며칠동안 불안하고 정신이 힘들었는데, 약 먹고 종일 잤더니 조금은 괜찮아진 느낌이다.&lt;br /&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;오늘은 &quot;내가 여름이 왔음을 느끼는 순간&quot;에 대해 적어보고자한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음...여름에 태어나서 그런지 어릴때는 더운걸 싫어했어도 청량한 초록빛의 여름을 좋아했다.&lt;br /&gt;내가 생각나는 여름의 이미지는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매미가 우는 초록빛 더운 호수공원에서 친구들과 분수대에서 흠뻑 젖으며 노는 것,&lt;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;941&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4MxR9/dJMcabLG37v/ocpwrsgcpPkhV7j0dnTnAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4MxR9/dJMcabLG37v/ocpwrsgcpPkhV7j0dnTnAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4MxR9/dJMcabLG37v/ocpwrsgcpPkhV7j0dnTnAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4MxR9%2FdJMcabLG37v%2FocpwrsgcpPkhV7j0dnTnAk%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;287&quot; height=&quot;510&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;941&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;_ (5).jpeg&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFyTEM/dJMcado3r6E/CCVGvKtKJX2TkwPge5MVg0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFyTEM/dJMcado3r6E/CCVGvKtKJX2TkwPge5MVg0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFyTEM/dJMcado3r6E/CCVGvKtKJX2TkwPge5MVg0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFyTEM%2FdJMcado3r6E%2FCCVGvKtKJX2TkwPge5MVg0%2Fimg.jpg&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;292&quot; height=&quot;285&quot; data-filename=&quot;_ (5).jpeg&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;718&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkUDqm/dJMcaf8ft5S/9OfjWH0jz8PINgTvKyuPXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkUDqm/dJMcaf8ft5S/9OfjWH0jz8PINgTvKyuPXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkUDqm/dJMcaf8ft5S/9OfjWH0jz8PINgTvKyuPXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkUDqm%2FdJMcaf8ft5S%2F9OfjWH0jz8PINgTvKyuPXk%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;289&quot; height=&quot;341&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;1014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSqslA/dJMcai4XpN4/HXTmkvDc9yz0VfE3T1AOJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSqslA/dJMcai4XpN4/HXTmkvDc9yz0VfE3T1AOJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSqslA/dJMcai4XpN4/HXTmkvDc9yz0VfE3T1AOJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSqslA%2FdJMcai4XpN4%2FHXTmkvDc9yz0VfE3T1AOJ1%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;306&quot; height=&quot;544&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;1014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점점 커가면서 물과 모래는 더러워지니까 만지기 싫어졌고, 땀흘리면 나는 체취가 싫어 에어컨 밑에서만 있게 되었다.&lt;br /&gt;그럼에도 불구하고 가끔은 땀흘리며 돌아다니면서 누군가와 여행하는걸 좋아하기도 한 것 같다.&lt;br /&gt;(지금 보면 그 누군가가 좋았던건지, 정말 그 상황과 여행의 풍경이 좋았던건지는 잘 모르겠다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 새로운 팀원의 환영, 그리고 이제 그만 두시는 팀원의 송별겸 같이 점심 식사를 했다.&lt;br /&gt;메뉴는 떡볶이-&amp;gt; 돈까스 -&amp;gt; 김치찌개에서 돌고돌아 타코로!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_1024.JPG&quot; data-origin-width=&quot;5712&quot; data-origin-height=&quot;4284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhfoQx/dJMcahLOydT/sbXYVG4IfEtoD9EihyabYk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhfoQx/dJMcahLOydT/sbXYVG4IfEtoD9EihyabYk/img.jpg&quot; data-alt=&quot;타코익스프레스 판교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhfoQx/dJMcahLOydT/sbXYVG4IfEtoD9EihyabYk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhfoQx%2FdJMcahLOydT%2FsbXYVG4IfEtoD9EihyabYk%2Fimg.jpg&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;432&quot; height=&quot;324&quot; data-filename=&quot;IMG_1024.JPG&quot; data-origin-width=&quot;5712&quot; data-origin-height=&quot;4284&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;길 한번 건너서 5분정도 거리에 있는 건너편 건물이었는데 그 짧은 와중에도 더웠다.&lt;br /&gt;가게가 협소해서 이미 인원이 찼기에 바람도 좀 불고 선선한 것 같아 밖에 펼쳐진 자리에서 오손도손 먹었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선풍기 바람이 너무 쎄서 내 자리에서 먹을땐 계속 머리를 돌려서 먹어야했다.&lt;br /&gt;안그러면 타코와 머리카락이 한몸이 되는 불상사를 겪을게 뻔했기 때문... ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매운소스를 챙겨서 듬뿍 뿌렸는데 (타바스코 스콜피온) 다들 엄청 맵다면서 경악..걱정..제지를 했다.&lt;br /&gt;그래도 매운거 잘 먹는 편이라 괜찮았는데, 다른 분들은 내가 먹는거 보고 재시도를 했다가 윗입술 불남 이슈를 겪으셨다.&lt;br /&gt;첫번째때는 괜찮아서 두번짼 진짜 쏟다시피 했는데, 맵긴 맵더라구요.. 티 안내려고 꾹 참음..&lt;br /&gt;그래서 밥 다 먹으니까 콧물 엄청나고, 땀도 나고 더웠다...&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_0581.JPG&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBl0r6/dJMcabdHcwe/pc0hMBL7Pk5okiAjUzgKl0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBl0r6/dJMcabdHcwe/pc0hMBL7Pk5okiAjUzgKl0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBl0r6/dJMcabdHcwe/pc0hMBL7Pk5okiAjUzgKl0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBl0r6%2FdJMcabdHcwe%2Fpc0hMBL7Pk5okiAjUzgKl0%2Fimg.jpg&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;461&quot; height=&quot;615&quot; data-filename=&quot;IMG_0581.JPG&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_9134.JPG&quot; data-origin-width=&quot;5712&quot; data-origin-height=&quot;4284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GyNni/dJMcaf1uZMc/uWwSTrnuFsB7YLj8BDdYw1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GyNni/dJMcaf1uZMc/uWwSTrnuFsB7YLj8BDdYw1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GyNni/dJMcaf1uZMc/uWwSTrnuFsB7YLj8BDdYw1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGyNni%2FdJMcaf1uZMc%2FuWwSTrnuFsB7YLj8BDdYw1%2Fimg.jpg&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;443&quot; height=&quot;332&quot; data-filename=&quot;IMG_9134.JPG&quot; data-origin-width=&quot;5712&quot; data-origin-height=&quot;4284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나와서 팀원들과 하늘을 보고 걷고, 해가 쨍쨍한 테라스에서 커피를 마시니까 올해 내 여름은 이렇게 시작되는건가 싶다.&lt;br /&gt;이런 소소한 일상에서도 앞으로도 쭉 작은 행복을 느끼면서 살고싶다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>일상/하루기록</category>
      <category>알로하</category>
      <category>여름</category>
      <category>오늘의로하</category>
      <category>인턴생활</category>
      <category>판교맛집</category>
      <category>판교생활</category>
      <category>판교타코익스프레스</category>
      <category>하루기록</category>
      <category>하루일기</category>
      <author>헤이로하</author>
      <guid isPermaLink="true">https://al-roha.tistory.com/25</guid>
      <comments>https://al-roha.tistory.com/25#entry25comment</comments>
      <pubDate>Wed, 8 Jul 2026 09:38:13 +0900</pubDate>
    </item>
    <item>
      <title>[Olist 이커머스 분석 #4] Tableau로 데이터 시각화하기</title>
      <link>https://al-roha.tistory.com/24</link>
      <description>&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  이번 포스팅 목표&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL로 만든 데이터마트 3개를 Tableau Public에 연결하고, &lt;b&gt;막대 차트 &amp;middot; 히스토그램 &amp;middot; 리뷰 분석 차트&lt;/b&gt; 3가지를 직접 만들어봤습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; ️ &lt;b&gt;사용 도구&lt;/b&gt;: Tableau Public (무료)   &lt;b&gt;데이터&lt;/b&gt;: mart_rfm.csv / mart_delivery.csv / mart_review.csv&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  STEP 0. MySQL &amp;rarr; CSV 추출&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tableau Public은 MySQL 직접 연결이 불가하므로 Workbench에서 CSV로 내보냅니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT * FROM mart_rfm;      -- mart_rfm.csv
SELECT * FROM mart_delivery; -- mart_delivery.csv
SELECT * FROM mart_review;   -- mart_review.csv
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Export 방법:&lt;/b&gt; Result Grid 우측 상단   아이콘 &amp;rarr; Export as CSV&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  STEP 1. Tableau 데이터 연결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주의&lt;/b&gt;: 3개 파일을 하나의 소스에 JOIN하면 안 됩니다. 분석 단위가 다르기 때문에 &lt;b&gt;각각 별도 데이터 소스&lt;/b&gt;로 연결해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;첫 번째: Connect &amp;rarr; Text file &amp;rarr; mart_rfm.csv
두 번째: 데이터 메뉴 &amp;rarr; 새 데이터 원본 &amp;rarr; mart_delivery.csv
세 번째: 데이터 메뉴 &amp;rarr; 새 데이터 원본 &amp;rarr; mart_review.csv
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결 후 워크시트 좌측 상단에서 3개 소스를 전환하며 사용합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  STEP 2. 핵심 개념 &amp;mdash; 차원 vs 측정값&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tableau에서 반드시 이해해야 할 개념 2가지:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 의미 색상 예시&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;차원 (Dimension)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;분류&amp;middot;그룹 기준&lt;/td&gt;
&lt;td&gt;  파란색&lt;/td&gt;
&lt;td&gt;Customer State, Review Sentiment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;측정값 (Measure)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;집계할 숫자&lt;/td&gt;
&lt;td&gt;  초록색&lt;/td&gt;
&lt;td&gt;Delay Days, Review Score, Monetary&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  차원은 &lt;b&gt;열/행&lt;/b&gt;에, 측정값은 **마크(색상&amp;middot;크기&amp;middot;레이블)**에 올린다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  시각화 1. 고객 주(State)별 주문 건수 &amp;mdash; 막대 차트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 데이터&lt;/b&gt;: mart_delivery&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;1. Customer State &amp;rarr; 열
2. Order Id (COUNT) &amp;rarr; 행
3. Is Delayed &amp;rarr; 색상
4. Show Me &amp;rarr; 수평 막대
5. 내림차순 정렬
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인사이트&lt;/b&gt;: SP(상파울루)가 압도적 1위 &amp;mdash; 브라질 전체 주문의 약 40% 집중&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;1302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8436o/dJMcafNVH26/sXlEFLVtXoPm37z9FDmjd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8436o/dJMcafNVH26/sXlEFLVtXoPm37z9FDmjd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8436o/dJMcafNVH26/sXlEFLVtXoPm37z9FDmjd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8436o%2FdJMcafNVH26%2FsXlEFLVtXoPm37z9FDmjd0%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;723&quot; height=&quot;608&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;1302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  시각화 2. 배송 소요일 분포 &amp;mdash; 히스토그램&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 데이터&lt;/b&gt;: mart_delivery&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Bin(구간) 만들기:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;데이터 패널 &amp;rarr; Actual Delivery Days 우클릭
&amp;rarr; 만들기 &amp;rarr; 구간차원
&amp;rarr; Bin Size: 3 입력
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  한국어 Tableau는 &quot;버킷&quot; 대신 &lt;b&gt;&quot;구간차원&quot;&lt;/b&gt; 으로 표시됩니다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. Actual Delivery Days (구간차원) &amp;rarr; 열
2. Order Id (COUNT) &amp;rarr; 행
3. Show Me &amp;rarr; 히스토그램
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인사이트&lt;/b&gt;: 10~20일 구간에 주문이 집중 &amp;mdash; 브라질 평균 배송 현실&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bATPmN/dJMcaaeKmUN/jHhP3ymFTHwN3jiqdmbRe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bATPmN/dJMcaaeKmUN/jHhP3ymFTHwN3jiqdmbRe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bATPmN/dJMcaaeKmUN/jHhP3ymFTHwN3jiqdmbRe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbATPmN%2FdJMcaaeKmUN%2FjHhP3ymFTHwN3jiqdmbRe0%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;710&quot; height=&quot;752&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;1618&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  시각화 3. 리뷰 점수별 평균 지연 일수 &amp;mdash; 막대 차트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 데이터&lt;/b&gt;: mart_review&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. Review Score &amp;rarr; 열
2. Review Score 우클릭 &amp;rarr; 불연속형으로 변환
3. Delay Days (평균) &amp;rarr; 행
4. 마크 패널 &amp;rarr; 막대로 변경
&lt;/code&gt;&lt;/pre&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;Review Score 평균 Delay Days&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1점&lt;/td&gt;
&lt;td&gt;-5일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2점&lt;/td&gt;
&lt;td&gt;-10일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3점&lt;/td&gt;
&lt;td&gt;-10일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4점&lt;/td&gt;
&lt;td&gt;-12일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5점&lt;/td&gt;
&lt;td&gt;-14일&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u3hyH/dJMcagMPCXM/KvK5gn4noChi3DNBd5GR3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u3hyH/dJMcagMPCXM/KvK5gn4noChi3DNBd5GR3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u3hyH/dJMcagMPCXM/KvK5gn4noChi3DNBd5GR3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu3hyH%2FdJMcagMPCXM%2FKvK5gn4noChi3DNBd5GR3K%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;713&quot; height=&quot;721&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1544&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인사이트 해석:&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Y축이 음수 = 예정일보다 &lt;b&gt;일찍&lt;/b&gt; 도착했다는 의미 5점 리뷰는 평균 14일 일찍 도착 &amp;rarr; &lt;b&gt;빠른 배송 = 높은 만족도&lt;/b&gt; 데이터로 증명&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 인사이트: 1점 리뷰도 평균 5일 일찍 도착했음에도 낮은 점수 &amp;rarr; 배송 외 요인(상품 불량, 설명과 다름 등)이 불만족 원인일 가능성 &amp;uarr;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  시행착오 &amp;amp; 트러블슈팅&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 실수 1. 3개 CSV를 하나의 소스에 JOIN&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황&lt;/b&gt;: mart_rfm에 mart_delivery, mart_review를 관계(Relationship)로 연결 시도 &lt;b&gt;문제&lt;/b&gt;: 공통 키가 없어 이 관계를 만들 일치하는 필드를 선택하십시오 경고 발생 &lt;b&gt;해결&lt;/b&gt;: 관계 제거 후 각 파일을 &lt;b&gt;새 데이터 원본&lt;/b&gt;으로 별도 연결&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교훈: 마트 3개는 분석 단위가 달라 JOIN 불가. 워크시트마다 소스를 전환해서 사용&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 실수 2. Bin Size 메뉴를 찾지 못함&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황&lt;/b&gt;: 열 선반의 필드 우클릭 &amp;rarr; 메뉴에서 Bin Size 없음 &lt;b&gt;해결&lt;/b&gt;: 열 선반이 아닌 &lt;b&gt;좌측 데이터 패널&lt;/b&gt;에서 우클릭 &amp;rarr; 만들기 &amp;rarr; 구간차원&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교훈: Tableau 설정은 **선반(위)**이 아닌 **데이터 패널(왼쪽)**에서 하는 것이 많다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚠️ 주의. 꺾은선 vs 막대 차트 선택&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황&lt;/b&gt;: Review Score vs Delay Days를 꺾은선으로 표현 &lt;b&gt;문제&lt;/b&gt;: Review Score가 연속형으로 인식되어 0점 구간까지 표시됨 &lt;b&gt;해결&lt;/b&gt;:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Review Score 우클릭 &amp;rarr; &lt;b&gt;불연속형으로 변환&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;마크 패널 &amp;rarr; &lt;b&gt;막대&lt;/b&gt;로 변경&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교훈: 점수&amp;middot;등급처럼 &lt;b&gt;카테고리 성격의 숫자&lt;/b&gt;는 불연속형으로 변환해야 올바른 차트가 나온다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  회고&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;잘한 점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3개 데이터 소스를 JOIN 없이 각각 연결하는 올바른 방법을 익힘&lt;/li&gt;
&lt;li&gt;음수 Delay Days의 의미를 정확히 해석 (일찍 도착 = 음수)&lt;/li&gt;
&lt;li&gt;차트에서 즉시 비즈니스 인사이트를 도출한 것&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;아쉬운 점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;차원/측정값 개념이 처음엔 헷갈려 잘못된 필드 배치로 차트가 의도와 다르게 나온 것&lt;/li&gt;
&lt;li&gt;한국어 UI라 버킷 대신 구간차원을 찾는 데 시간이 걸린 것&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배운 것&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;숫자보다 차트가 먼저 설득한다.&quot;&lt;/b&gt; 배송이 빠를수록 리뷰가 높다는 사실은 SQL에서도 볼 수 있었지만, Tableau 차트 하나로 누구든 5초 안에 이해할 수 있게 됐습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  다음 포스팅&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Olist 이커머스 분석 #5] Tableau LOD 계산식으로 RFM 세그먼트 대시보드 만들기&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 시리즈는 Kaggle의 Olist Brazilian E-Commerce 데이터셋을 활용한 포트폴리오 프로젝트입니다.&lt;/p&gt;</description>
      <category>olist</category>
      <category>sql</category>
      <category>데이터분석</category>
      <category>데이터분석포트폴리오</category>
      <category>시각화</category>
      <category>이커머스데이터분석</category>
      <category>태블로</category>
      <category>포트폴리오</category>
      <author>헤이로하</author>
      <guid isPermaLink="true">https://al-roha.tistory.com/24</guid>
      <comments>https://al-roha.tistory.com/24#entry24comment</comments>
      <pubDate>Thu, 25 Jun 2026 18:12:12 +0900</pubDate>
    </item>
    <item>
      <title>[Olist 이커머스 분석 #3] 분석용 데이터 마트 생성</title>
      <link>https://al-roha.tistory.com/23</link>
      <description>&lt;h1&gt;  데이터 마트 생성&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 5개 테이블을 JOIN하는 복잡한 쿼리를 짜는 건 비효율적이고 실수도 잦습니다. 이번 글에서는 RFM &amp;middot; 배송 &amp;middot; 리뷰 &lt;b&gt;데이터마트 3종&lt;/b&gt;을 설계하고 생성한 과정을 정리했습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; ️ &lt;b&gt;사용 도구&lt;/b&gt;: MySQL 8.x + MySQL Workbench   &lt;b&gt;데이터&lt;/b&gt;: Olist Brazilian E-Commerce (9개 테이블, 약 10만 주문)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ 데이터마트란?&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;분석 목적에 맞게 미리 가공해둔 전용 테이블&quot;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 원본 테이블 데이터마트&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구조&lt;/td&gt;
&lt;td&gt;정규화된 9개 테이블&lt;/td&gt;
&lt;td&gt;분석 단위로 평탄화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;사용&lt;/td&gt;
&lt;td&gt;매번 JOIN 필요&lt;/td&gt;
&lt;td&gt;SELECT만으로 바로 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;속도&lt;/td&gt;
&lt;td&gt;느림&lt;/td&gt;
&lt;td&gt;빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;관리&lt;/td&gt;
&lt;td&gt;자동&lt;/td&gt;
&lt;td&gt;수동 갱신&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마트 설계 원칙&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원칙 내용&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;분석 단위 명확히&lt;/td&gt;
&lt;td&gt;RFM은 &lt;b&gt;고객&lt;/b&gt; 단위, 배송&amp;middot;리뷰는 &lt;b&gt;주문&lt;/b&gt; 단위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;필터 조건 고정&lt;/td&gt;
&lt;td&gt;WHERE order_status = 'delivered' 로 분석 범위 일관성 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;파생 컬럼 미리 계산&lt;/td&gt;
&lt;td&gt;is_delayed, delay_days, review_sentiment 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;이름 규칙 통일&lt;/td&gt;
&lt;td&gt;mart_ 접두어로 원본 테이블과 구분&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  MART 1. RFM 마트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RFM&lt;/b&gt;은 이커머스 고객 분석의 기본 프레임워크입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지표 의미 해석&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;R&lt;/b&gt;ecency&lt;/td&gt;
&lt;td&gt;마지막 구매 후 경과일&lt;/td&gt;
&lt;td&gt;낮을수록 최근 구매&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;F&lt;/b&gt;requency&lt;/td&gt;
&lt;td&gt;총 구매 횟수&lt;/td&gt;
&lt;td&gt;높을수록 단골&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;M&lt;/b&gt;onetary&lt;/td&gt;
&lt;td&gt;총 결제 금액&lt;/td&gt;
&lt;td&gt;높을수록 VIP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE TABLE mart_rfm AS
SELECT
    c.customer_unique_id,
    DATEDIFF(
        (SELECT MAX(order_purchase_timestamp) FROM orders),
        MAX(o.order_purchase_timestamp)
    ) AS recency,
    COUNT(DISTINCT o.order_id)     AS frequency,
    ROUND(SUM(p.payment_value), 2) AS monetary
FROM customers c
JOIN orders o       ON c.customer_id = o.customer_id
JOIN order_payments p ON o.order_id = p.order_id
WHERE o.order_status = 'delivered'
GROUP BY c.customer_unique_id;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;적재 결과&lt;/b&gt;: 93,357행 ✅&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  MART 2. 배송 마트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배송 SLA 분석과 지역별 지연율 분석의 기반이 되는 마트입니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE TABLE mart_delivery AS
SELECT
    o.order_id,
    c.customer_unique_id,
    c.customer_state,
    s.seller_id,
    s.seller_state,
    o.order_purchase_timestamp,
    o.order_delivered_customer_date,
    o.order_estimated_delivery_date,
    DATEDIFF(
        o.order_delivered_customer_date,
        o.order_purchase_timestamp
    ) AS actual_delivery_days,
    DATEDIFF(
        o.order_estimated_delivery_date,
        o.order_purchase_timestamp
    ) AS estimated_delivery_days,
    CASE
        WHEN o.order_delivered_customer_date &amp;gt; o.order_estimated_delivery_date
        THEN 1 ELSE 0
    END AS is_delayed,
    DATEDIFF(
        o.order_delivered_customer_date,
        o.order_estimated_delivery_date
    ) AS delay_days
FROM orders o
JOIN customers c  ON o.customer_id = c.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN sellers s    ON oi.seller_id = s.seller_id
WHERE o.order_status = 'delivered'
  AND o.order_delivered_customer_date IS NOT NULL
  AND YEAR(o.order_delivered_customer_date) &amp;gt; 1
  AND YEAR(o.order_estimated_delivery_date) &amp;gt; 1;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;적재 결과&lt;/b&gt;: 110,189행 ✅&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  orders JOIN order_items 구조라 한 주문에 상품이 여러 개면 행이 늘어납니다. 배송 분석 시 COUNT(DISTINCT order_id)로 집계하면 됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⭐ MART 3. 리뷰 마트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리뷰 점수와 배송 지연의 관계를 분석하기 위한 마트입니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE TABLE mart_review AS
SELECT
    r.order_id,
    r.review_score,
    r.review_creation_date,
    o.order_purchase_timestamp,
    o.order_delivered_customer_date,
    o.order_estimated_delivery_date,
    c.customer_state,
    CASE
        WHEN o.order_delivered_customer_date &amp;gt; o.order_estimated_delivery_date
        THEN 1 ELSE 0
    END AS is_delayed,
    DATEDIFF(
        o.order_delivered_customer_date,
        o.order_estimated_delivery_date
    ) AS delay_days,
    CASE
        WHEN r.review_score &amp;gt;= 4 THEN 'Positive'
        WHEN r.review_score = 3  THEN 'Neutral'
        ELSE 'Negative'
    END AS review_sentiment
FROM order_reviews r
JOIN orders o    ON r.order_id = o.order_id
JOIN customers c ON o.customer_id = c.customer_id
WHERE o.order_status = 'delivered'
  AND o.order_delivered_customer_date IS NOT NULL
  AND YEAR(o.order_delivered_customer_date) &amp;gt; 1
  AND YEAR(o.order_estimated_delivery_date) &amp;gt; 1;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;적재 결과&lt;/b&gt;: 96,353행 ✅&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 마트 검증 쿼리&lt;/h2&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT 'mart_rfm'      AS mart, COUNT(*) AS row_cnt FROM mart_rfm
UNION ALL
SELECT 'mart_delivery' AS mart, COUNT(*) AS row_cnt FROM mart_delivery
UNION ALL
SELECT 'mart_review'   AS mart, COUNT(*) AS row_cnt FROM mart_review;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마트 행 수&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;mart_rfm&lt;/td&gt;
&lt;td&gt;93,357&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mart_delivery&lt;/td&gt;
&lt;td&gt;110,189&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mart_review&lt;/td&gt;
&lt;td&gt;96,353&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  시행착오 &amp;amp; 트러블슈팅&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 오류 1. Error Code 1292 &amp;mdash; 잘못된 DATETIME 값&lt;/h3&gt;
&lt;pre class=&quot;subunit&quot;&gt;&lt;code&gt;Error Code: 1292. Incorrect datetime value: '0000-00-00 00:00:00'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인&lt;/b&gt;: 일부 행에 '0000-00-00 00:00:00' 더미 날짜값이 존재 &lt;b&gt;첫 시도&lt;/b&gt;: != '0000-00-00 00:00:00' 조건 추가 &amp;rarr; Error 1525 발생&lt;/p&gt;
&lt;pre class=&quot;subunit&quot;&gt;&lt;code&gt;Error Code: 1525. Incorrect DATETIME value: '0000-00-00 00:00:00'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL strict mode에서 비교 자체를 거부하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결&lt;/b&gt;: YEAR() 함수로 우회&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;AND YEAR(o.order_delivered_customer_date) &amp;gt; 1
AND YEAR(o.order_estimated_delivery_date) &amp;gt; 1
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 오류 2. Error Code 1064 &amp;mdash; rows 예약어 충돌&lt;/h3&gt;
&lt;pre class=&quot;subunit&quot;&gt;&lt;code&gt;Error Code: 1064. You have an error in your SQL syntax
... right syntax to use near 'rows FROM mart_rfm'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인&lt;/b&gt;: rows가 MySQL 예약어라 컬럼 별칭으로 사용 불가 &lt;b&gt;해결&lt;/b&gt;: row_cnt로 변경&lt;/p&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;-- ❌ 에러
SELECT COUNT(*) AS rows FROM mart_rfm

-- ✅ 해결
SELECT COUNT(*) AS row_cnt FROM mart_rfm
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚠️ 과제 실수 &amp;mdash; 비율 계산 함정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황&lt;/b&gt;: 재구매 고객 비율을 구하는데 WHERE frequency &amp;gt;= 2 필터 후 비율 계산 &lt;b&gt;문제&lt;/b&gt;: 분모가 이미 재구매 고객만 남아 전부 100% 출력&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- ❌ 잘못된 쿼리 (분모 왜곡)
SELECT ...
FROM mart_rfm
WHERE frequency &amp;gt;= 2   -- 이미 필터링된 상태에서 비율 계산 &amp;rarr; 100%
GROUP BY frequency;

-- ✅ 올바른 쿼리 (전체 기준 비율)
SELECT
    COUNT(*) AS total_customers,
    SUM(CASE WHEN frequency &amp;gt;= 2 THEN 1 ELSE 0 END) AS repeat_customers,
    ROUND(SUM(CASE WHEN frequency &amp;gt;= 2 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 1) AS repeat_pct
FROM mart_rfm;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&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;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚠️ 과제 실수 &amp;mdash; ORDER BY 없는 LIMIT&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- ❌ 정렬 없는 LIMIT = 의미 없는 TOP N
SELECT seller_state, AVG(actual_delivery_days)
FROM mart_delivery
GROUP BY seller_state
LIMIT 5;

-- ✅ ORDER BY 후 LIMIT
SELECT seller_state, ROUND(AVG(actual_delivery_days), 1) AS avg_delivery
FROM mart_delivery
GROUP BY seller_state
ORDER BY avg_delivery DESC
LIMIT 5;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;교훈&lt;/b&gt;: LIMIT은 항상 ORDER BY와 함께 &amp;mdash; 순서 없는 TOP N은 랜덤&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  회고&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;잘한 점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마트 3종을 각각 다른 분석 단위(고객/주문)로 설계한 것&lt;/li&gt;
&lt;li&gt;오류 메시지를 읽고 YEAR() 우회 방식을 빠르게 적용한 것&lt;/li&gt;
&lt;li&gt;mart_ 접두어로 원본 테이블과 명확히 구분한 것&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;아쉬운 점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비율 계산 시 분모 왜곡 실수 반복 &amp;rarr; &lt;b&gt;&quot;분모가 무엇인가&quot;&lt;/b&gt; 를 먼저 생각하는 습관 필요&lt;/li&gt;
&lt;li&gt;ORDER BY 없는 LIMIT 사용 &amp;rarr; TOP N 쿼리엔 정렬 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배운 것&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;데이터마트는 분석가의 작업대다.&quot;&lt;/b&gt; 좋은 마트 하나가 이후 Tableau 대시보드, Python 분석, 발표자료까지 전부 연결된다. 설계에 30분 투자하면 분석에 드는 시간이 10배 줄어든다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#실습과제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;RFM&amp;nbsp;마트에서&amp;nbsp;재구매&amp;nbsp;고객(Frequency&amp;nbsp;&amp;gt;=&amp;nbsp;2)&amp;nbsp;비율은?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOmovK/dJMcad3whRy/OOtMGwKCaclPj5eHkK9250/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOmovK/dJMcad3whRy/OOtMGwKCaclPj5eHkK9250/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOmovK/dJMcad3whRy/OOtMGwKCaclPj5eHkK9250/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOmovK%2FdJMcad3whRy%2FOOtMGwKCaclPj5eHkK9250%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;542&quot; height=&quot;116&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;2.&amp;nbsp;배송&amp;nbsp;마트에서&amp;nbsp;지연율&amp;nbsp;가장&amp;nbsp;높은&amp;nbsp;고객&amp;nbsp;주(state)&amp;nbsp;TOP&amp;nbsp;3는?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Urp3h/dJMcah515eh/AD61sB5lXg9tELRwZ33pok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Urp3h/dJMcah515eh/AD61sB5lXg9tELRwZ33pok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Urp3h/dJMcah515eh/AD61sB5lXg9tELRwZ33pok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUrp3h%2FdJMcah515eh%2FAD61sB5lXg9tELRwZ33pok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;528&quot; height=&quot;132&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;3.&amp;nbsp;리뷰&amp;nbsp;마트에서&amp;nbsp;Negative&amp;nbsp;리뷰의&amp;nbsp;평균&amp;nbsp;지연&amp;nbsp;일수는?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lsslj/dJMcacQ5KAy/C6seo80NFuQFUejj1k6hL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lsslj/dJMcacQ5KAy/C6seo80NFuQFUejj1k6hL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lsslj/dJMcacQ5KAy/C6seo80NFuQFUejj1k6hL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flsslj%2FdJMcacQ5KAy%2FC6seo80NFuQFUejj1k6hL1%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;342&quot; height=&quot;106&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;4.&amp;nbsp;배송&amp;nbsp;마트에서&amp;nbsp;판매자&amp;nbsp;주(seller_state)별&amp;nbsp;평균&amp;nbsp;배송&amp;nbsp;소요일&amp;nbsp;TOP&amp;nbsp;5는?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;316&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D6XeK/dJMcacQ5Lkl/0NM0PT6FRbdHxZaUbzM161/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D6XeK/dJMcacQ5Lkl/0NM0PT6FRbdHxZaUbzM161/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D6XeK/dJMcacQ5Lkl/0NM0PT6FRbdHxZaUbzM161/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD6XeK%2FdJMcacQ5Lkl%2F0NM0PT6FRbdHxZaUbzM161%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;316&quot; height=&quot;226&quot; data-origin-width=&quot;316&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  다음 포스팅&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Olist 이커머스 분석 #4] Tableau로 RFM 대시보드 만들기&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 시리즈는 Kaggle의 Olist Brazilian E-Commerce 데이터셋을 활용한 포트폴리오 프로젝트입니다.&lt;/p&gt;</description>
      <category>IT/데이터분석</category>
      <category>olist</category>
      <category>sql</category>
      <category>데이터분석</category>
      <category>데이터분석포트폴리오</category>
      <category>이커머스데이터분석</category>
      <author>헤이로하</author>
      <guid isPermaLink="true">https://al-roha.tistory.com/23</guid>
      <comments>https://al-roha.tistory.com/23#entry23comment</comments>
      <pubDate>Thu, 25 Jun 2026 15:56:37 +0900</pubDate>
    </item>
    <item>
      <title>[Olist 이커머스 분석 #2] 데이터 EDA- 주문&amp;middot;매출&amp;middot;배송&amp;middot;리뷰 탐색</title>
      <link>https://al-roha.tistory.com/22</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;  이전 포스팅&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://al-roha.tistory.com/21&quot;&gt;2026.06.23 - [IT/데이터분석] - [Olist 이커머스 분석 #1] MySQL에 데이터 적재&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 Olist 9개 테이블의 구조를 파악하고, 주문&amp;middot;매출&amp;middot;배송&amp;middot;리뷰 4가지 축으로 데이터를 탐색한 과정을 정리했습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; ️ &lt;b&gt;사용 도구&lt;/b&gt;: MySQL 8.x + MySQL Workbench   &lt;b&gt;데이터&lt;/b&gt;: Olist Brazilian E-Commerce (9개 테이블, 약 10만 주문)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  ERD &amp;mdash; 테이블 연결 구조&lt;/h2&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;customers ─── orders ─── order_items ─── products
                │               └──────── sellers
                ├── order_payments
                └── order_reviews

geolocation &amp;larr; customers.zip / sellers.zip
category_translation &amp;larr; products.product_category_name
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 키 연결 테이블&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;order_id&lt;/td&gt;
&lt;td&gt;orders, order_items, order_payments, order_reviews&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;customer_id&lt;/td&gt;
&lt;td&gt;customers, orders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;product_id&lt;/td&gt;
&lt;td&gt;products, order_items&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;seller_id&lt;/td&gt;
&lt;td&gt;sellers, order_items&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;팁&lt;/b&gt;: 분석 전 ERD를 손으로 한 번 그려보면 JOIN 실수가 줄어듦&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  STEP 1. 주문 현황 파악&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전체 주문 수 &amp;amp; 데이터 기간&lt;/h3&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT
    COUNT(*) AS total_orders,
    MIN(order_purchase_timestamp) AS first_order,
    MAX(order_purchase_timestamp) AS last_order
FROM orders;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcdG43/dJMcadJaF31/cgnLWH85bAHwiFUYxh9ktK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcdG43/dJMcadJaF31/cgnLWH85bAHwiFUYxh9ktK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcdG43/dJMcadJaF31/cgnLWH85bAHwiFUYxh9ktK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcdG43%2FdJMcadJaF31%2FcgnLWH85bAHwiFUYxh9ktK%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;531&quot; height=&quot;133&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주문 상태별 분포&lt;/h3&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT
    order_status,
    COUNT(*) AS cnt,
    ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 1) AS pct
FROM orders
GROUP BY order_status
ORDER BY cnt DESC;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca83C5/dJMcabEEE3t/ZkQLgRtIYQvZ2aIDzDNZnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca83C5/dJMcabEEE3t/ZkQLgRtIYQvZ2aIDzDNZnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca83C5/dJMcabEEE3t/ZkQLgRtIYQvZ2aIDzDNZnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca83C5%2FdJMcabEEE3t%2FZkQLgRtIYQvZ2aIDzDNZnk%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;285&quot; height=&quot;250&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;월별 주문 추이&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT
    DATE_FORMAT(order_purchase_timestamp, '%Y-%m') AS order_month,
    COUNT(*) AS order_cnt
FROM orders
WHERE order_status != 'canceled'
GROUP BY order_month
ORDER BY order_month;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;발견&lt;/b&gt;: 2017년 하반기부터 주문이 급증하고, 2018년 초 피크를 찍는 성장 패턴 확인&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s2ls0/dJMcaiX1TIa/RZ2QOnuIKkgikKazggym71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s2ls0/dJMcaiX1TIa/RZ2QOnuIKkgikKazggym71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s2ls0/dJMcaiX1TIa/RZ2QOnuIKkgikKazggym71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs2ls0%2FdJMcaiX1TIa%2FRZ2QOnuIKkgikKazggym71%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;236&quot; height=&quot;370&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  STEP 2. 매출 파악&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전체 매출 &amp;amp; 평균 주문금액&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT
    ROUND(SUM(payment_value), 0)  AS total_revenue,
    ROUND(AVG(payment_value), 2)  AS avg_order_value,
    ROUND(MAX(payment_value), 2)  AS max_order_value
FROM order_payments
WHERE payment_type != 'not_defined';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cI2DQ7/dJMcadoTftq/tgfyTxizQ6jfmZaME8gu81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cI2DQ7/dJMcadoTftq/tgfyTxizQ6jfmZaME8gu81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cI2DQ7/dJMcadoTftq/tgfyTxizQ6jfmZaME8gu81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcI2DQ7%2FdJMcadoTftq%2FtgfyTxizQ6jfmZaME8gu81%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;576&quot; height=&quot;108&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;카테고리별 매출 TOP 10&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT
    COALESCE(t.product_category_name_english, p.product_category_name, 'Unknown') AS category,
    COUNT(DISTINCT oi.order_id)  AS order_cnt,
    ROUND(SUM(oi.price), 0)     AS revenue
FROM order_items oi
JOIN products p ON oi.product_id = p.product_id
LEFT JOIN category_translation t ON p.product_category_name = t.product_category_name
GROUP BY category
ORDER BY revenue DESC
LIMIT 10;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cL76pa/dJMcah51bF9/fh6kUKoqr85SXqKNKyOFJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cL76pa/dJMcah51bF9/fh6kUKoqr85SXqKNKyOFJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cL76pa/dJMcah51bF9/fh6kUKoqr85SXqKNKyOFJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcL76pa%2FdJMcah51bF9%2Ffh6kUKoqr85SXqKNKyOFJ0%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;396&quot; height=&quot;299&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결제수단별 비중&lt;/h3&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT
    payment_type,
    COUNT(*) AS cnt,
    ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 1) AS pct
FROM order_payments
GROUP BY payment_type
ORDER BY cnt DESC;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;발견&lt;/b&gt;: 신용카드(credit_card)가 압도적 1위, boleto(브라질 전통 지불방식)가 2위&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nUDEZ/dJMcagMOyO7/n6CcfHIjP1BOk185XRckwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nUDEZ/dJMcagMOyO7/n6CcfHIjP1BOk185XRckwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nUDEZ/dJMcagMOyO7/n6CcfHIjP1BOk185XRckwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnUDEZ%2FdJMcagMOyO7%2Fn6CcfHIjP1BOk185XRckwK%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;328&quot; height=&quot;185&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  STEP 3. 배송 소요일 분석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실제 배송일 vs 예상 배송일&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT
    ROUND(AVG(DATEDIFF(order_delivered_customer_date, order_purchase_timestamp)), 1) AS avg_actual_days,
    ROUND(AVG(DATEDIFF(order_estimated_delivery_date, order_purchase_timestamp)), 1) AS avg_estimated_days
FROM orders
WHERE order_delivered_customer_date IS NOT NULL;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x9yoM/dJMcaftwT20/FkJTtpqJcGKMuEXTxLtKG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x9yoM/dJMcaftwT20/FkJTtpqJcGKMuEXTxLtKG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x9yoM/dJMcaftwT20/FkJTtpqJcGKMuEXTxLtKG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx9yoM%2FdJMcaftwT20%2FFkJTtpqJcGKMuEXTxLtKG1%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;428&quot; height=&quot;98&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배송 소요일 구간별 분포&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT
    CASE
        WHEN DATEDIFF(order_delivered_customer_date, order_purchase_timestamp) &amp;lt;= 7  THEN '7일 이내'
        WHEN DATEDIFF(order_delivered_customer_date, order_purchase_timestamp) &amp;lt;= 14 THEN '8~14일'
        WHEN DATEDIFF(order_delivered_customer_date, order_purchase_timestamp) &amp;lt;= 21 THEN '15~21일'
        ELSE '22일 이상'
    END AS delivery_range,
    COUNT(*) AS cnt
FROM orders
WHERE order_delivered_customer_date IS NOT NULL
GROUP BY delivery_range
ORDER BY MIN(DATEDIFF(order_delivered_customer_date, order_purchase_timestamp));
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;발견&lt;/b&gt;: 브라질은 국토가 넓어 평균 배송이 12일 이상 &amp;mdash; 한국 익일배송과 전혀 다른 시장&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uRPst/dJMcaiqfS5J/ZhIhTJWTIiomjEKas2sZpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uRPst/dJMcaiqfS5J/ZhIhTJWTIiomjEKas2sZpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uRPst/dJMcaiqfS5J/ZhIhTJWTIiomjEKas2sZpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuRPst%2FdJMcaiqfS5J%2FZhIhTJWTIiomjEKas2sZpk%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;274&quot; height=&quot;186&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⭐ STEP 4. 리뷰 분석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;리뷰 점수 분포&lt;/h3&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT
    review_score,
    COUNT(*) AS cnt,
    ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 1) AS pct
FROM order_reviews
GROUP BY review_score
ORDER BY review_score;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ct4NYA/dJMcafAke6O/9X50RYaVPnA7bPVQ26gCm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ct4NYA/dJMcafAke6O/9X50RYaVPnA7bPVQ26gCm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ct4NYA/dJMcafAke6O/9X50RYaVPnA7bPVQ26gCm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fct4NYA%2FdJMcafAke6O%2F9X50RYaVPnA7bPVQ26gCm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;327&quot; height=&quot;201&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배송 지연 여부 vs 리뷰 점수&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT
    CASE
        WHEN order_delivered_customer_date &amp;gt; order_estimated_delivery_date THEN '지연'
        ELSE '정시/조기'
    END AS delivery_status,
    ROUND(AVG(r.review_score), 2) AS avg_review_score,
    COUNT(*) AS cnt
FROM orders o
JOIN order_reviews r ON o.order_id = r.order_id
WHERE o.order_delivered_customer_date IS NOT NULL
GROUP BY delivery_status;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;발견&lt;/b&gt;: 배송 지연 시 리뷰 점수가 유의미하게 낮아짐 &amp;rarr; 배송 SLA가 고객 만족의 핵심 지표&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kFhol/dJMcajbyjlT/pegKw0hlH87K332rzQc4xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kFhol/dJMcajbyjlT/pegKw0hlH87K332rzQc4xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kFhol/dJMcajbyjlT/pegKw0hlH87K332rzQc4xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkFhol%2FdJMcajbyjlT%2FpegKw0hlH87K332rzQc4xk%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;472&quot; height=&quot;132&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  STEP 5. 데이터 품질 체크&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분석 지표를 설계하기 전, 반드시 결측치&amp;middot;이상치를 확인해야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;orders 테이블 NULL 현황&lt;/h3&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT
    COUNT(*) AS total,
    SUM(CASE WHEN order_approved_at IS NULL THEN 1 ELSE 0 END)             AS null_approved,
    SUM(CASE WHEN order_delivered_carrier_date IS NULL THEN 1 ELSE 0 END)  AS null_carrier,
    SUM(CASE WHEN order_delivered_customer_date IS NULL THEN 1 ELSE 0 END) AS null_delivered
FROM orders;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;products 테이블 결측치 현황&lt;/h3&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT
    COUNT(*) AS total,
    SUM(CASE WHEN product_category_name IS NULL THEN 1 ELSE 0 END) AS null_category,
    SUM(CASE WHEN product_weight_g = 0 OR product_weight_g IS NULL THEN 1 ELSE 0 END) AS zero_weight
FROM products;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eEBZBm/dJMcaaZ3JD0/E0XXkikU0gWe8PUbDgM090/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eEBZBm/dJMcaaZ3JD0/E0XXkikU0gWe8PUbDgM090/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eEBZBm/dJMcaaZ3JD0/E0XXkikU0gWe8PUbDgM090/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeEBZBm%2FdJMcaaZ3JD0%2FE0XXkikU0gWe8PUbDgM090%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;568&quot; height=&quot;110&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이상치 탐지 &amp;mdash; 비정상 고액 주문&lt;/h3&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT
    order_id,
    payment_value
FROM order_payments
WHERE payment_value &amp;gt; 5000
ORDER BY payment_value DESC
LIMIT 10;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;발견&lt;/b&gt;: order_delivered_customer_date NULL은 배송 미완료 주문(정상). 반면 product_weight_g = 0은 실제 결측값으로 배송비 계산 시 제외 필요&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M8nLC/dJMcaftwUbY/TEgt58dp2Toie9oWjbvVLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M8nLC/dJMcaftwUbY/TEgt58dp2Toie9oWjbvVLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M8nLC/dJMcaftwUbY/TEgt58dp2Toie9oWjbvVLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM8nLC%2FdJMcaftwUbY%2FTEgt58dp2Toie9oWjbvVLk%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;414&quot; height=&quot;108&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  시행착오 &amp;amp; 트러블슈팅&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 오류. Unknown column 오타&lt;/h3&gt;
&lt;pre class=&quot;subunit&quot;&gt;&lt;code&gt;Error Code: 1054. Unknown column 'payment_vlaue' in 'field list'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인&lt;/b&gt;: payment_value를 payment_vlaue로 오타 &lt;b&gt;해결&lt;/b&gt;: 컬럼명 재확인 후 수정 &lt;b&gt;교훈&lt;/b&gt;: SQL은 오타에 관대하지 않습니다. 자동완성(Ctrl+Space)을 적극 활용하기!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  회고&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;잘한 점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ERD를 먼저 파악하고 쿼리를 작성하니 JOIN 방향을 헷갈리지 않았음&lt;/li&gt;
&lt;li&gt;NULL을 &quot;오류&quot;가 아니라 &quot;비즈니스 상태&quot;로 해석하는 시각이 생김 (미배송 = NULL은 정상)&lt;/li&gt;
&lt;li&gt;배송 지연과 리뷰 점수의 관계를 EDA 단계에서 미리 발견 &amp;rarr; 4강 데이터마트 설계 방향 결정에 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;아쉬운 점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컬럼명 오타로 Error 1054 발생 &amp;rarr; Workbench 자동완성 습관 필요&lt;/li&gt;
&lt;li&gt;OVER() 윈도우 함수가 처음에는 낯설었음 &amp;rarr; 비율 계산에 매우 유용하므로 반복 연습 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배운 것&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;NULL은 적이 아니다. NULL이 왜 생겼는지를 이해하는 것이 분석의 시작이다.&quot;&lt;/b&gt; order_delivered_customer_date가 NULL인 건 배송 중이거나 취소된 주문 &amp;mdash; 이걸 모르고 AVG 돌리면 배송 소요일이 왜곡됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #fdfdfc; color: #6e6c68; font-size: 1.62em; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;[과제]&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래 5개 질문에 직접 쿼리를 작성하고 숫자를 찾아보세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 주문이 많은 요일은? 월요일&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PlJwT/dJMcacwPJnJ/3RokAwCTL4x0mxutiuLXH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PlJwT/dJMcacwPJnJ/3RokAwCTL4x0mxutiuLXH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PlJwT/dJMcacwPJnJ/3RokAwCTL4x0mxutiuLXH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPlJwT%2FdJMcacwPJnJ%2F3RokAwCTL4x0mxutiuLXH0%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;381&quot; height=&quot;200&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;신용카드 할부 평균 개월 수는? 4개월&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRseob/dJMcag0eKfN/rYa37VzbTKb87aEuaHeNoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRseob/dJMcag0eKfN/rYa37VzbTKb87aEuaHeNoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRseob/dJMcag0eKfN/rYa37VzbTKb87aEuaHeNoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRseob%2FdJMcag0eKfN%2FrYa37VzbTKb87aEuaHeNoK%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;258&quot; height=&quot;94&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리뷰 점수 1점 주문 중 배송 지연 비율은? 68.9&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBxzXl/dJMcag62fof/4fiUDH3MpnbG3JM2tGOPU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBxzXl/dJMcag62fof/4fiUDH3MpnbG3JM2tGOPU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBxzXl/dJMcag62fof/4fiUDH3MpnbG3JM2tGOPU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBxzXl%2FdJMcag62fof%2F4fiUDH3MpnbG3JM2tGOPU0%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;374&quot; height=&quot;156&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;판매자 수가 가장 많은 주(state)는? SP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uRoeC/dJMcacjeKGm/QpKSihadXVyK2saZp8RO4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uRoeC/dJMcacjeKGm/QpKSihadXVyK2saZp8RO4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uRoeC/dJMcacjeKGm/QpKSihadXVyK2saZp8RO4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuRoeC%2FdJMcacjeKGm%2FQpKSihadXVyK2saZp8RO4k%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;224&quot; height=&quot;224&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #fdfdfc; color: #0a0a0a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;평균 상품 무게는 몇 g인가? 2276.3g&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m8P4D/dJMcaiRkECy/CGWd3qGDIlLfj55izmd2kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m8P4D/dJMcaiRkECy/CGWd3qGDIlLfj55izmd2kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m8P4D/dJMcaiRkECy/CGWd3qGDIlLfj55izmd2kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm8P4D%2FdJMcaiRkECy%2FCGWd3qGDIlLfj55izmd2kK%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;216&quot; height=&quot;98&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  다음 포스팅&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Olist 이커머스 분석 #3] SQL로 분석용 데이터마트 만들기 &amp;mdash; RFM &amp;middot; 배송 &amp;middot; 리뷰 마트 3종&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;본 시리즈는 Kaggle의 Olist Brazilian E-Commerce 데이터셋을 활용한 포트폴리오 프로젝트입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>IT/데이터분석</category>
      <author>헤이로하</author>
      <guid isPermaLink="true">https://al-roha.tistory.com/22</guid>
      <comments>https://al-roha.tistory.com/22#entry22comment</comments>
      <pubDate>Wed, 24 Jun 2026 16:58:52 +0900</pubDate>
    </item>
    <item>
      <title>[Olist 이커머스 분석 #1] MySQL에 데이터 적재</title>
      <link>https://al-roha.tistory.com/21</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;olist-data-analysis&quot; href=&quot;https://github.com/heyroha/olist-ecommerce-analysis&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/heyroha/olist-ecommerce-analysis&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1782199733359&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - heyroha/olist-ecommerce-analysis: Olist Brazilian E-Commerce (RFM,Delivery)&quot; data-og-description=&quot;Olist Brazilian E-Commerce (RFM,Delivery). Contribute to heyroha/olist-ecommerce-analysis development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/heyroha/olist-ecommerce-analysis&quot; data-og-url=&quot;https://github.com/heyroha/olist-ecommerce-analysis&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gs1ne/dJMb81f2r6M/nuAGRTtPYoJK88Z2lu3lRk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bjge4m/dJMb8QMlZE9/xkNYmTmCTnFHnrqttjgbxk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/heyroha/olist-ecommerce-analysis&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/heyroha/olist-ecommerce-analysis&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gs1ne/dJMb81f2r6M/nuAGRTtPYoJK88Z2lu3lRk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bjge4m/dJMb8QMlZE9/xkNYmTmCTnFHnrqttjgbxk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - heyroha/olist-ecommerce-analysis: Olist Brazilian E-Commerce (RFM,Delivery)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Olist Brazilian E-Commerce (RFM,Delivery). Contribute to heyroha/olist-ecommerce-analysis development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  프로젝트 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라질 최대 이커머스 플랫폼 &lt;b&gt;Olist&lt;/b&gt;의 실거래 데이터(약 10만 건)를 활용해 RFM 고객 분석, 배송 지연 분석, 지리 시각화까지 이어지는 데이터 분석 포트폴리오를 만들고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#1 &amp;mdash; &lt;b&gt;MySQL에 9개 테이블을 적재하는 과정&lt;/b&gt;과 그 과정에서 마주친 오류들을 정리했습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;데이터셋&lt;/b&gt;: &lt;a href=&quot;https://www.kaggle.com/datasets/olistbr/brazilian-ecommerce&quot;&gt;Kaggle - Brazilian E-Commerce Public Dataset by Olist&lt;/a&gt;  ️ &lt;b&gt;사용 도구&lt;/b&gt;: MySQL 8.0.47 + MySQL Workbench&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1988&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vUugI/dJMcahkDRXy/gqSxnkFSH45VIQoeGvdsv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vUugI/dJMcahkDRXy/gqSxnkFSH45VIQoeGvdsv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vUugI/dJMcahkDRXy/gqSxnkFSH45VIQoeGvdsv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvUugI%2FdJMcahkDRXy%2FgqSxnkFSH45VIQoeGvdsv1%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;1988&quot; height=&quot;408&quot; data-origin-width=&quot;1988&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  데이터셋 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 9개의 CSV 파일로 구성되어 있으며, 각 테이블은 아래와 같이 연결됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블명 내용 행 수&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;olist_customers_dataset&lt;/td&gt;
&lt;td&gt;고객 정보&lt;/td&gt;
&lt;td&gt;99,441&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;olist_geolocation_dataset&lt;/td&gt;
&lt;td&gt;위경도 정보&lt;/td&gt;
&lt;td&gt;1,000,163&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;olist_orders_dataset&lt;/td&gt;
&lt;td&gt;주문 정보&lt;/td&gt;
&lt;td&gt;99,441&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;olist_order_items_dataset&lt;/td&gt;
&lt;td&gt;주문 상품&lt;/td&gt;
&lt;td&gt;112,650&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;olist_order_payments_dataset&lt;/td&gt;
&lt;td&gt;결제 정보&lt;/td&gt;
&lt;td&gt;103,886&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;olist_order_reviews_dataset&lt;/td&gt;
&lt;td&gt;리뷰 정보&lt;/td&gt;
&lt;td&gt;99,224&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;olist_products_dataset&lt;/td&gt;
&lt;td&gt;상품 정보&lt;/td&gt;
&lt;td&gt;32,951&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;olist_sellers_dataset&lt;/td&gt;
&lt;td&gt;판매자 정보&lt;/td&gt;
&lt;td&gt;3,095&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;product_category_name_translation&lt;/td&gt;
&lt;td&gt;카테고리 번역&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ DB 및 테이블 생성&lt;/h2&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE DATABASE IF NOT EXISTS olist
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

USE olist;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글&amp;middot;포르투갈어 등 다국어 데이터가 포함되어 있어 utf8mb4로 설정했습니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE TABLE customers (
    customer_id VARCHAR(50) PRIMARY KEY,
    customer_unique_id VARCHAR(50),
    customer_zip_code_prefix VARCHAR(10),
    customer_city VARCHAR(100),
    customer_state VARCHAR(5)
);

CREATE TABLE geolocation (
    geolocation_zip_code_prefix VARCHAR(10),
    geolocation_lat DECIMAL(11,8),
    geolocation_lng DECIMAL(11,8),
    geolocation_city VARCHAR(100),
    geolocation_state VARCHAR(5)
);

CREATE TABLE orders (
    order_id VARCHAR(50) PRIMARY KEY,
    customer_id VARCHAR(50),
    order_status VARCHAR(20),
    order_purchase_timestamp DATETIME,
    order_approved_at DATETIME,
    order_delivered_carrier_date DATETIME,
    order_delivered_customer_date DATETIME,
    order_estimated_delivery_date DATETIME
);

CREATE TABLE order_items (
    order_id VARCHAR(50),
    order_item_id INT,
    product_id VARCHAR(50),
    seller_id VARCHAR(50),
    shipping_limit_date DATETIME,
    price DECIMAL(10,2),
    freight_value DECIMAL(10,2),
    PRIMARY KEY (order_id, order_item_id)
);

CREATE TABLE order_payments (
    order_id VARCHAR(50),
    payment_sequential INT,
    payment_type VARCHAR(30),
    payment_installments INT,
    payment_value DECIMAL(10,2)
);

CREATE TABLE order_reviews (
    review_id VARCHAR(50),
    order_id VARCHAR(50),
    review_score INT,
    review_comment_title VARCHAR(100),
    review_comment_message TEXT,
    review_creation_date DATETIME,
    review_answer_timestamp DATETIME
);

CREATE TABLE products (
    product_id VARCHAR(50) PRIMARY KEY,
    product_category_name VARCHAR(100),
    product_name_length INT,
    product_description_length INT,
    product_photos_qty INT,
    product_weight_g INT,
    product_length_cm INT,
    product_height_cm INT,
    product_width_cm INT
);

CREATE TABLE sellers (
    seller_id VARCHAR(50) PRIMARY KEY,
    seller_zip_code_prefix VARCHAR(10),
    seller_city VARCHAR(100),
    seller_state VARCHAR(5)
);

CREATE TABLE category_translation (
    product_category_name VARCHAR(100) PRIMARY KEY,
    product_category_name_english VARCHAR(100)
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  데이터 적재 방법 선택&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3SDyy/dJMcadCmHVf/IgLOQ3mdiBRvGw7gaj2U81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3SDyy/dJMcadCmHVf/IgLOQ3mdiBRvGw7gaj2U81/img.png&quot; data-alt=&quot;Table Data Import Wizard&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3SDyy/dJMcadCmHVf/IgLOQ3mdiBRvGw7gaj2U81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3SDyy%2FdJMcadCmHVf%2FIgLOQ3mdiBRvGw7gaj2U81%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;351&quot; height=&quot;255&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;496&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Table Data Import Wizard&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 Workbench의 &lt;b&gt;Table Data Import Wizard&lt;/b&gt;를 사용했으나 인코딩 오류가 발생했습니다. 이후 LOAD DATA LOCAL INFILE 방식으로 전환했습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;방법&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Import Wizard&lt;/td&gt;
&lt;td&gt;GUI, 간편&lt;/td&gt;
&lt;td&gt;BOM 인코딩 오류, 느림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;LOAD DATA LOCAL INFILE&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;빠름, 세밀한 제어 가능&lt;/td&gt;
&lt;td&gt;사전 설정 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚙️ LOAD DATA 사전 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LOAD DATA LOCAL INFILE을 사용하려면 두 가지 설정이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;① MySQL 서버 설정&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;SET GLOBAL local_infile = 1;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;② Workbench 연결 설정&lt;/b&gt; Connection &amp;gt; Advanced &amp;gt; Others 입력란에 아래 추가 후 &lt;b&gt;재접속&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;OPT_LOCAL_INFILE=1
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  적재 쿼리 (예시: orders 테이블)&lt;/h2&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;LOAD DATA LOCAL INFILE '/Users/username/Downloads/archive/olist_orders_dataset.csv'
INTO TABLE orders
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '&quot;'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(order_id, customer_id, order_status, order_purchase_timestamp, order_approved_at,
 order_delivered_carrier_date, order_delivered_customer_date, order_estimated_delivery_date);
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 최종 적재 검증&lt;/h2&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;SELECT 'customers' t, COUNT(*) c FROM customers
UNION ALL SELECT 'geolocation', COUNT(*) FROM geolocation
UNION ALL SELECT 'orders', COUNT(*) FROM orders
UNION ALL SELECT 'order_items', COUNT(*) FROM order_items
UNION ALL SELECT 'order_payments', COUNT(*) FROM order_payments
UNION ALL SELECT 'order_reviews', COUNT(*) FROM order_reviews
UNION ALL SELECT 'products', COUNT(*) FROM products
UNION ALL SELECT 'sellers', COUNT(*) FROM sellers
UNION ALL SELECT 'category_translation', COUNT(*) FROM category_translation;
&lt;/code&gt;&lt;/pre&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;lt;테이블 적재 행 수&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqZzMD/dJMcag61o78/K7Sv95CDQ19xCNAp8JGte0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqZzMD/dJMcag61o78/K7Sv95CDQ19xCNAp8JGte0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqZzMD/dJMcag61o78/K7Sv95CDQ19xCNAp8JGte0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqZzMD%2FdJMcag61o78%2FK7Sv95CDQ19xCNAp8JGte0%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;313&quot; height=&quot;299&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  시행착오 &amp;amp; 트러블슈팅&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 오류 1. Import Wizard BOM 인코딩 오류&lt;/h3&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;Unhandled exception: 'ascii' codec can't decode byte 0xef
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인&lt;/b&gt;: UTF-8 BOM 파일을 Import Wizard가 올바르게 처리하지 못함 &lt;b&gt;해결&lt;/b&gt;: Import Wizard 포기 &amp;rarr; LOAD DATA LOCAL INFILE로 전환&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 오류 2. Error Code 2068 &amp;mdash; LOCAL INFILE 거부&lt;/h3&gt;
&lt;pre class=&quot;subunit&quot;&gt;&lt;code&gt;Error Code: 2068. LOAD DATA LOCAL INFILE disabled
&lt;/code&gt;&lt;/pre&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;pre class=&quot;gams&quot;&gt;&lt;code&gt;SET GLOBAL local_infile = 1;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Workbench Advanced 설정에 OPT_LOCAL_INFILE=1 추가 후 재접속&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 오류 3. Error Code 2 &amp;mdash; 파일을 찾을 수 없음&lt;/h3&gt;
&lt;pre class=&quot;subunit&quot;&gt;&lt;code&gt;Error Code: 2. File not found
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인 1&lt;/b&gt;: 경로를 Windows 스타일(C:/Users/...)로 작성 &amp;rarr; Mac에서는 C: 없이 /Users/... &lt;b&gt;원인 2&lt;/b&gt;: 폴더명 오타 (/olist/ &amp;rarr; 실제 경로는 /Downloads/archive/) &lt;b&gt;해결&lt;/b&gt;: Mac 절대경로 형식으로 수정&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;/Users/username/Downloads/archive/파일명.csv
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 오류 4. 테이블명/컬럼명 혼동&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인&lt;/b&gt;: 쿼리를 복붙하다가 테이블명을 바꾸지 않아 geolocation 데이터가 category_translation에 들어감 &lt;b&gt;해결&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;TRUNCATE TABLE category_translation;
-- 올바른 쿼리로 재적재
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;교훈&lt;/b&gt;: 복붙 후 반드시 테이블명&amp;middot;컬럼 목록 검토&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚠️ 경고 1. Warning 1265 &amp;mdash; DECIMAL 자리수 초과 (geolocation)&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Warning 1265: Data truncated for column 'geolocation_lat'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인&lt;/b&gt;: CSV의 위경도가 소수점 8자리 이상인데 컬럼이 DECIMAL(10,6)으로 선언됨 &lt;b&gt;해결&lt;/b&gt;: 컬럼을 DECIMAL(11,8)로 수정 (0.11m 이하 오차 &amp;rarr; 분석에 무방) &lt;b&gt;적재 결과&lt;/b&gt;: Records: 1,000,163 / Skipped: 0 ✅&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚠️ 경고 2. Warning 4096 &amp;mdash; \r 구분자 (order_reviews)&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Warning 4096: Delimiter '\r' is deprecated
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인&lt;/b&gt;: Windows에서 생성된 CSV의 줄바꿈이 \r\n인데 MySQL 8.x가 \r 단독 사용 경고 &lt;b&gt;해결&lt;/b&gt;: 경고일 뿐, 에러 아님. Records: 99,224 / Skipped: 0 ✅&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚠️ 경고 3. Warning 1366 &amp;mdash; 빈 문자열 &amp;rarr; INT 변환 (products)&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Warning 1366: Incorrect integer value: '' for column 'product_photos_qty'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인&lt;/b&gt;: 일부 상품의 크기&amp;middot;수량 정보가 원본 CSV에 아예 없음 (실제 결측값) &lt;b&gt;해결&lt;/b&gt;: 경고일 뿐, 0으로 저장됨. Records: 32,951 / Skipped: 0 ✅ &lt;b&gt;참고&lt;/b&gt;: 3강 EDA에서 결측치 비율 확인 예정&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚠️ 경고 4. Warning 1265 &amp;mdash; 빈 DATETIME (orders)&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Warning 1265: Data truncated for column 'order_delivered_customer_date'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인&lt;/b&gt;: 배송 완료되지 않은 주문은 order_delivered_customer_date가 NULL &amp;mdash; 정상 데이터 &lt;b&gt;해결&lt;/b&gt;: 경고 무시. Records: 99,441 / Skipped: 0 ✅&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 오류 5. Error Code 1054 &amp;mdash; 컬럼명 불일치 (products)&lt;/h3&gt;
&lt;pre class=&quot;subunit&quot;&gt;&lt;code&gt;Error Code: 1054. Unknown column 'product_name_lenght' in 'field list'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인&lt;/b&gt;: CSV 헤더는 product_name_lenght(오타)인데, 테이블은 product_name_length(정확한 철자)로 생성됨 &lt;b&gt;해결&lt;/b&gt;: @변수로 CSV 컬럼을 받아서 SET으로 매핑&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;LOAD DATA LOCAL INFILE '...'
INTO TABLE products
...
(product_id, product_category_name, @product_name_lenght, @product_description_lenght, ...)
SET
  product_name_length = @product_name_lenght,
  product_description_length = @product_description_lenght;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  회고&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;잘한 점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오류를 만났을 때 Import Wizard에 집착하지 않고 LOAD DATA LOCAL INFILE로 빠르게 전환한 것&lt;/li&gt;
&lt;li&gt;각 오류 메시지를 정확히 읽고 Error Code별로 원인을 구분한 것&lt;/li&gt;
&lt;li&gt;적재 후 행 수 검증 쿼리로 모든 테이블을 확인한 것&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;아쉬운 점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복붙 실수로 geolocation 데이터를 category_translation에 넣은 것 &amp;rarr; &lt;b&gt;쿼리 실행 전 테이블명 한 번 더 확인&lt;/b&gt; 습관 필요&lt;/li&gt;
&lt;li&gt;경고와 오류를 처음에 구분하지 못해 당황했던 것 &amp;rarr; Records / Skipped 숫자를 먼저 보는 게 핵심&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배운 것&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;Warning은 읽고, Error는 고친다.&quot;&lt;/b&gt; Skipped: 0이면 데이터는 모두 들어간 것. 결측값&amp;middot;타입 불일치 경고는 3강 EDA에서 분석의 재료가 된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  다음 포스팅&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Olist 이커머스 분석 #2] SQL로 EDA &amp;mdash; 주문 추이, 카테고리 매출, 배송 소요일 분석&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 시리즈는 Kaggle의 Olist Brazilian E-Commerce 데이터셋을 활용한 포트폴리오 프로젝트입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/데이터분석</category>
      <category>Kaggle</category>
      <category>olist</category>
      <category>PYTHON</category>
      <category>sql</category>
      <category>데이터분석</category>
      <category>데이터분석포트폴리오</category>
      <category>이커머스데이터분석</category>
      <author>헤이로하</author>
      <guid isPermaLink="true">https://al-roha.tistory.com/21</guid>
      <comments>https://al-roha.tistory.com/21#entry21comment</comments>
      <pubDate>Tue, 23 Jun 2026 16:37:13 +0900</pubDate>
    </item>
    <item>
      <title>[스나이퍼팩토리] 카카오클라우드 - 클라우드 개발자 교육 9주차</title>
      <link>https://al-roha.tistory.com/20</link>
      <description>&lt;h1&gt;&lt;b&gt; ️ AWS - VPC 구축&lt;/b&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  AWS 글로벌 인프라&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 리전 &amp;gt; 가용영역 &amp;gt; 데이터센터 &amp;gt; 엣지 네트워크&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;리전(Region)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;물리적 위치(예: ap-northeast-2 서울)&lt;/td&gt;
&lt;td&gt;대부분 서비스는 리전 단위. DR은 &lt;b&gt;다중 리전&lt;/b&gt; 배치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;가용영역(AZ)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;리전 내 &lt;b&gt;분리된 데이터센터 묶음&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;최소 2개 이상(보통 3개). &lt;b&gt;다중 AZ&lt;/b&gt;로 고가용성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;엣지 로케이션&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;전세계 캐시 포인트&lt;/td&gt;
&lt;td&gt;CloudFront/Global Accelerator가 &lt;b&gt;지연 최소화&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅&amp;nbsp; 고가용성은 &lt;b&gt;다중 AZ&lt;/b&gt;, 재해복구는 &lt;b&gt;다중 리전&lt;/b&gt;!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ VPC 아키텍처&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VPC연결 플로우 &lt;br /&gt;-&amp;gt; 서브넷 설정(test-public-subnet 10.0.0.0/24(퍼블릭 서브넷 자동할당 ip 활성화), test-private-subnet 10.0.10.0/24) -&amp;gt; 인터넷 게이트웨이(test-igw) : testvpc1에 연결&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;VPC: 10.0.0.0/16
├─ Public Subnet:  10.0.0.0/24  (Auto-assign public IP: ✔)
│  ├─ Internet Gateway (IGW) 연결
│  └─ EC2: Pub-svr (Ubuntu 24.04, 10.0.0.100, Public IP 有)
│
└─ Private Subnet: 10.0.10.0/24
   ├─ NAT Gateway (Public Subnet에 위치, EIP 필요)
   └─ EC2: Pri-svr (Amazon Linux 2023, 10.0.0.200, Private IP Only)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  라우팅 테이블 설계(핵심)&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;test-public-rt&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;test-public-subnet&lt;/td&gt;
&lt;td&gt;0.0.0.0/0 &amp;rarr; IGW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;test-private-rt&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;test-private-subnet&lt;/td&gt;
&lt;td&gt;0.0.0.0/0 &amp;rarr; NAT Gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이유: 프라이빗 서브넷 인스턴스가 &lt;b&gt;아웃바운드 인터넷&lt;/b&gt;(패키지 설치/업데이트)을 하려면 &lt;b&gt;NAT GW&lt;/b&gt;를 경유해야 함. NAT는 &lt;b&gt;퍼블릭 서브넷&lt;/b&gt;에 있어야 하고 &lt;b&gt;EIP&lt;/b&gt;가 필요!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  보안 제어 (Security Group vs NACL)&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 110px;&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;height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;b&gt;SG&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;b&gt;NACL&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;적용 범위&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;인스턴스&lt;/b&gt; 단위&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;서브넷&lt;/b&gt; 단위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;상태 추적&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;Stateful&lt;/b&gt; (응답 자동 허용)&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Stateless (양방향 규칙 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;용도&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;일반적 트래픽 제어&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;서브넷 전체 정책/거부 리스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;권장&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;기본은 &lt;b&gt;SG&lt;/b&gt;로 설계, NACL은 특수정책&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실습 개요&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;public-sub-sg (Pub-svr용)&lt;/b&gt;&lt;br /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Pub-svr&lt;/li&gt;
&lt;li&gt;Os -&amp;gt; ubuntu 24.04&lt;/li&gt;
&lt;li&gt;인스턴스 타입: t2micro&lt;/li&gt;
&lt;li&gt;네트워크 편집 : testvpc1, test-public-subnet, 10.0.0.100&lt;/li&gt;
&lt;li&gt;보안 키페어 생성 pem 으로 설정, 보안그룹 생성: public&amp;mdash;sub-sg&lt;/li&gt;
&lt;li&gt;사용자 데이터(선택사항) : 도커 엔진 설치하는 스크립트 첨부 (설치 부분에 -y옵션 추가하기)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;test-pri-sg (Pri-svr용)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Os -&amp;gt; amazon linux2023&lt;/li&gt;
&lt;li&gt;&lt;span&gt;인스턴스&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;타입&lt;/span&gt;: t2micro&lt;/li&gt;
&lt;li&gt;&lt;span&gt;네트워크&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;편집&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: testvpc1, test-private-subnet, 10.0.0.200&lt;/li&gt;
&lt;li&gt;앞에&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;설정한&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;기존&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;키페어&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;선택&lt;/li&gt;
&lt;li&gt;&lt;span&gt;보안그룹&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;생성&lt;/span&gt;: test-pri-sg사용자&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;데이터(선택사항&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;) :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;도커&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;엔진&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;설치하는&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;스크립트&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;첨부(설치&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;부분에&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-y&lt;/span&gt;옵션&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;추가하기)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;EC2 -2 인스턴스 생성&lt;/li&gt;
&lt;li&gt;EC2 -1 인스턴스 생성&lt;/li&gt;
&lt;li&gt;퍼블릭 서브넷 설정&lt;span&gt;&amp;nbsp;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;test-public-subnet을 퍼블릭서브넷으로 만들기 위해) (test-public-rt 에 라우팅 0.0.0.0/0 test-igw 추가)&lt;/li&gt;
&lt;li&gt;라우팅 테이블 설정 (test-public-rt, test-private-rt) -&amp;gt; testvpc1에 연결&lt;/li&gt;
&lt;li&gt;VPC(testvpc1 10.0.0.0/16)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 프라이빗 인스턴스는 &lt;b&gt;직접 인터넷에서 접근 불가&lt;/b&gt;. 접속은 **Bastion(퍼블릭)**을 경유.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  EC2 생성 &amp;amp; 유저데이터(자동 도커 설치)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Pub-svr (Ubuntu 24.04)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;네트워크&lt;/b&gt;: testvpc1, test-public-subnet, 10.0.0.100&lt;/li&gt;
&lt;li&gt;&lt;b&gt;키페어&lt;/b&gt;: hj-keypair.pem&lt;/li&gt;
&lt;li&gt;&lt;b&gt;User Data (Ubuntu)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;#!/bin/bash
set -eux
apt-get update -y
apt-get install -y ca-certificates curl gnupg lsb-release
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  &quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&quot; \
  &amp;gt; /etc/apt/sources.list.d/docker.list
apt-get update -y
apt-get install -y docker-ce docker-ce-cli containerd.io
systemctl enable --now docker
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Pri-svr (Amazon Linux 2023)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;네트워크&lt;/b&gt;: testvpc1, test-private-subnet, 10.0.0.200&lt;/li&gt;
&lt;li&gt;&lt;b&gt;키페어&lt;/b&gt;: hj-keypair.pem&lt;/li&gt;
&lt;li&gt;&lt;b&gt;User Data (AL2023)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
set -eux
dnf update -y
dnf install -y docker
systemctl enable --now docker
usermod -aG docker ec2-user
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  SSH 접속&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 퍼블릭 서버 접속&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;chmod 400 hj-keypair.pem
ssh -i hj-keypair.pem ubuntu@&amp;lt;Public-IP-of-Pub-svr&amp;gt;
# 예시
ssh -i hj-keypair.pem ubuntu@43.203.182.36
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 프라이빗 서버 접속 &amp;mdash; &lt;b&gt;Bastion 사용&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Bastion Host&lt;/b&gt;란?&lt;br /&gt;외부에서 &lt;b&gt;직접 접근 불가&lt;/b&gt;한 프라이빗 리소스로 가는 &lt;b&gt;중간 관문&lt;/b&gt; 역할의 보안 강화용 퍼블릭 서버.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점: 외부 노출 최소화, 로깅/감사 용이, 중앙 통제&lt;br /&gt;&lt;br /&gt;실습에서는 &lt;b&gt;Pub-svr&lt;/b&gt;가 Bastion 역할 수행&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;점프 방식 ①&lt;/b&gt;: Bastion 접속 후 내부로 Hop&lt;/li&gt;
&lt;li&gt;# Step1: Bastion ssh -i hj-keypair.pem ubuntu@&amp;lt;Public-IP&amp;gt; # Step2: 내부 프라이빗로 ssh ec2-user@10.0.0.200&lt;/li&gt;
&lt;li&gt;&lt;b&gt;점프 방식 ②&lt;/b&gt;: 로컬에서 &lt;b&gt;-J&lt;/b&gt; 옵션으로 한 번에&lt;/li&gt;
&lt;li&gt;ssh -i hj-keypair.pem -J ubuntu@&amp;lt;Public-IP&amp;gt; ec2-user@10.0.0.200&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❗️&lt;b&gt;Permission denied&lt;/b&gt; 발생시 체크&lt;br /&gt;키파일 권한: chmod 400&lt;br /&gt;사용자: Ubuntu는 ubuntu, Amazon Linux는 ec2-user&lt;br /&gt;Pri-svr SG: &lt;b&gt;Inbound SSH from Bastion&lt;/b&gt; 허용 여부&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  문제 발생 요소&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &amp;ldquo;인스턴스 상태 검사 1/2에서 멈춤&amp;rdquo;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;오류&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;b&gt;Instance status check&lt;/b&gt; 실패: ping 연결이 되지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;조치&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Stop &amp;rarr; Start&lt;/b&gt;로 인스턴스 재부팅(연결됨)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Additional&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;NAT Gateway vs NAT Instance&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항목 NAT Gateway NAT Instance&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 74px;&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;height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;b&gt;NAT Gateway&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;b&gt;NAT Instance&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;관리&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;완전관리형(무중단/고성능)&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;직접 관리 필요(스케일링/HA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;설치 위치&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;퍼블릭 서브넷 + EIP&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;퍼블릭 서브넷(ENI/EIP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;권장&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;표준&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;특수 요구/커스텀 라우팅 시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;VPC peering vs Transit Gateway&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항목 피어링 TGW&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;VPC Peering&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Transit Gateway&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;토폴로지&lt;/td&gt;
&lt;td&gt;&lt;b&gt;메시&lt;/b&gt; (대수 늘면 복잡)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;허브&amp;amp;스포크&lt;/b&gt; (단순/중앙관리)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;라우팅&lt;/td&gt;
&lt;td&gt;VPC 간 정적 라우팅&lt;/td&gt;
&lt;td&gt;TGW 라우팅 도메인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;규모&lt;/td&gt;
&lt;td&gt;소규모 간단 연결&lt;/td&gt;
&lt;td&gt;&lt;b&gt;대규모/다수 VPC&lt;/b&gt; 권장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  커맨드 스니펫&lt;/h2&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;# 키 권한
chmod 400 hj-keypair.pem

# 퍼블릭 접속
ssh -i hj-keypair.pem ubuntu@

# 프라이빗 접속(점프)
ssh -i hj-keypair.pem -J ubuntu@ ec2-user@10.0.0.200

# 네트워크 확인(점프 이후)
ip addr; ip route; curl -I https://amazon.com
&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  과제&lt;/h2&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpe1dr/btsQWuh9l72/ar0gGNAjALjD6BAra9imV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpe1dr/btsQWuh9l72/ar0gGNAjALjD6BAra9imV1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;758&quot; data-filename=&quot;2025-09-30_2.45.42.png&quot; style=&quot;width: 48.2603%; margin-right: 10px;&quot; data-widthpercent=&quot;48.83&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpe1dr/btsQWuh9l72/ar0gGNAjALjD6BAra9imV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpe1dr%2FbtsQWuh9l72%2Far0gGNAjALjD6BAra9imV1%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;1394&quot; height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nkr6U/btsQVWTCewj/J7GPgxjKHieoN4hV9I0nY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nkr6U/btsQVWTCewj/J7GPgxjKHieoN4hV9I0nY0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1326&quot; data-origin-height=&quot;688&quot; data-filename=&quot;2025-09-30_2.45.52.png&quot; style=&quot;width: 50.5769%;&quot; data-widthpercent=&quot;51.17&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nkr6U/btsQVWTCewj/J7GPgxjKHieoN4hV9I0nY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnkr6U%2FbtsQVWTCewj%2FJ7GPgxjKHieoN4hV9I0nY0%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;1326&quot; height=&quot;688&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 2기(B-log) 리뷰로 작성 되었습니다.&lt;/p&gt;
&lt;/div&gt;</description>
      <category>IT/Kakao cloud 부트캠프</category>
      <category>AIaaS</category>
      <category>AIaaS마스터클래스2기</category>
      <category>개발자교육</category>
      <category>부트캠프</category>
      <category>스나이퍼팩토리</category>
      <category>카카오엔터프라이즈</category>
      <category>카카오클라우드</category>
      <category>클라우드개발자</category>
      <category>클라우드엔지니어</category>
      <category>한국생산성본부</category>
      <author>헤이로하</author>
      <guid isPermaLink="true">https://al-roha.tistory.com/20</guid>
      <comments>https://al-roha.tistory.com/20#entry20comment</comments>
      <pubDate>Tue, 30 Sep 2025 15:14:39 +0900</pubDate>
    </item>
    <item>
      <title>[스나이퍼팩토리] 카카오클라우드 - 클라우드 개발자 교육 8주차(클라우드 네트워크)</title>
      <link>https://al-roha.tistory.com/19</link>
      <description>&lt;h1&gt;  네트워크 기초&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.   네트워크&amp;nbsp;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;컴퓨터 네트워크&lt;/b&gt;: 두 대 이상의 컴퓨터나 장치들이 데이터를 교환하기 위해 연결된 시스템&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기능&lt;/b&gt;: 자원 공유, 통신, 정보 교환&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구성요소&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;호스트(Host)&lt;/b&gt;: 서버, 클라이언트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;네트워크 장비&lt;/b&gt;: 라우터, 스위치, 허브&lt;/li&gt;
&lt;li&gt;&lt;b&gt;매체&lt;/b&gt;: 이더넷 케이블, 광케이블, 무선 전파&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로토콜&lt;/b&gt;: TCP/IP&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  네트워크 유형&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;LAN&lt;/b&gt;: 학교, 회사 내부망&lt;/li&gt;
&lt;li&gt;&lt;b&gt;WAN&lt;/b&gt;: LAN들을 묶은 광역망 (인터넷)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PAN&lt;/b&gt;: 개인 영역 (블루투스, 테더링)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MAN&lt;/b&gt;: 도시권 네트워크&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.   OSI 7계층 &amp;amp; TCP/IP 모델&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;gt;&amp;gt; OSI 7계층&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r8pEN/btsQNIUU6pJ/WB7mFfw1Nij9aQhlFE4SS1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r8pEN/btsQNIUU6pJ/WB7mFfw1Nij9aQhlFE4SS1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r8pEN/btsQNIUU6pJ/WB7mFfw1Nij9aQhlFE4SS1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr8pEN%2FbtsQNIUU6pJ%2FWB7mFfw1Nij9aQhlFE4SS1%2Fimg.jpg&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;498&quot; height=&quot;415&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;position: absolute;&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&gt;&lt;b&gt;7 응용&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사용자 서비스 제공&lt;/td&gt;
&lt;td&gt;HTTP, FTP, DNS, SMTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;6 표현&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;데이터 변환/암호화&lt;/td&gt;
&lt;td&gt;JPEG, SSL, TLS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;5 세션&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;연결/세션 관리&lt;/td&gt;
&lt;td&gt;RPC, NetBIOS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;4 전송&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;신뢰성 있는 전송&lt;/td&gt;
&lt;td&gt;TCP, UDP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;3 네트워크&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;IP 기반 전달&lt;/td&gt;
&lt;td&gt;IP, ICMP, 라우터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;2 데이터 링크&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;MAC 기반 전달&lt;/td&gt;
&lt;td&gt;Ethernet, 스위치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;1 물리&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;전기적 신호 전송&lt;/td&gt;
&lt;td&gt;케이블, 허브&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;상위(7~5)&lt;/b&gt;: 사용자와 가까운 계층&lt;/li&gt;
&lt;li&gt;&lt;b&gt;중위(4~3)&lt;/b&gt;: 데이터 전송 제어&lt;/li&gt;
&lt;li&gt;&lt;b&gt;하위(2~1)&lt;/b&gt;: 하드웨어 기반 데이터 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;gt;&amp;gt; TCP/IP 4계층&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;응용 계층&lt;/td&gt;
&lt;td&gt;HTTP, FTP, DNS&lt;/td&gt;
&lt;td&gt;OSI 7,6,5 계층 포함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;전송 계층&lt;/td&gt;
&lt;td&gt;TCP, UDP&lt;/td&gt;
&lt;td&gt;신뢰성/속도 제어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;인터넷 계층&lt;/td&gt;
&lt;td&gt;IP, ICMP&lt;/td&gt;
&lt;td&gt;OSI 네트워크 계층&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;네트워크 접근 계층&lt;/td&gt;
&lt;td&gt;Ethernet, Wi-Fi&lt;/td&gt;
&lt;td&gt;OSI 2~1계층&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r8pEN/btsQNIUU6pJ/WB7mFfw1Nij9aQhlFE4SS1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r8pEN/btsQNIUU6pJ/WB7mFfw1Nij9aQhlFE4SS1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r8pEN/btsQNIUU6pJ/WB7mFfw1Nij9aQhlFE4SS1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr8pEN%2FbtsQNIUU6pJ%2FWB7mFfw1Nij9aQhlFE4SS1%2Fimg.jpg&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;434&quot; height=&quot;361&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;정리&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;OSI 모델&lt;/b&gt; &amp;rarr; 문제 분석/학습용 (이론적 구조)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;TCP/IP 모델&lt;/b&gt; &amp;rarr; 인터넷에서 실제 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.   IPv4 주소 체계&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;32비트 주소 체계&lt;/b&gt; (8비트씩 4부분 &amp;rarr; 10진수 점 표기법: 192.168.0.1)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구성&lt;/b&gt;: 네트워크 부분 + 호스트 부분&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;gt;&amp;gt; 클래스 기반 주소&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 주소 범위 네트워크/호스트 기본 서브넷 마스크 용도&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;0.0.0.0 ~ 127.255.255.255&lt;/td&gt;
&lt;td&gt;N:8 / H:24&lt;/td&gt;
&lt;td&gt;255.0.0.0&lt;/td&gt;
&lt;td&gt;대규모&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;128.0.0.0 ~ 191.255.255.255&lt;/td&gt;
&lt;td&gt;N:16 / H:16&lt;/td&gt;
&lt;td&gt;255.255.0.0&lt;/td&gt;
&lt;td&gt;중규모&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;192.0.0.0 ~ 223.255.255.255&lt;/td&gt;
&lt;td&gt;N:24 / H:8&lt;/td&gt;
&lt;td&gt;255.255.255.0&lt;/td&gt;
&lt;td&gt;소규모&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;224.0.0.0 ~ 239.255.255.255&lt;/td&gt;
&lt;td&gt;멀티캐스트&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;멀티캐스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;E&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;240.0.0.0 ~ 255.255.255.255&lt;/td&gt;
&lt;td&gt;실험용&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;연구용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;gt;&amp;gt; 주소 유형&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;유니캐스트&lt;/b&gt;: 단일 호스트 간 통신&lt;/li&gt;
&lt;li&gt;&lt;b&gt;브로드캐스트&lt;/b&gt;: 네트워크 전체 전송&lt;/li&gt;
&lt;li&gt;&lt;b&gt;멀티캐스트&lt;/b&gt;: 특정 그룹만 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;gt;&amp;gt; 공인 vs 사설 IP&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;공인 IP&lt;/td&gt;
&lt;td&gt;ISP 할당&lt;/td&gt;
&lt;td&gt;전 세계적으로 유일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;사설 IP&lt;/td&gt;
&lt;td&gt;A: 10.0.0.0/8B: 172.16.0.0 ~ 172.31.255.255C: 192.168.0.0/16&lt;/td&gt;
&lt;td&gt;내부망 전용, NAT 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.   서브네팅 &amp;amp; CIDR&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;서브네팅&lt;/b&gt;: 하나의 네트워크를 더 작은 단위로 분할&lt;br /&gt;&amp;rarr; IP 효율적 사용, 보안&amp;middot;관리성 향상&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CIDR(Classless Inter-Domain Routing)&lt;/b&gt;: 클래스 대신 프리픽스 기반 주소
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예) 192.168.1.0/24 &amp;rarr; 24비트는 네트워크, 나머지 8비트는 호스트&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5.   IPv4 한계 &amp;amp; IPv6 필요성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;IPv4 한계&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주소 고갈 (43억 개 한정)&lt;/li&gt;
&lt;li&gt;NAT 의존 증가&lt;/li&gt;
&lt;li&gt;보안 내장 부족&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;IPv6 특징&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;128비트 주소 (사실상 무한대)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;IPsec 보안 기본 내장&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동 설정&lt;/b&gt;, &lt;b&gt;QoS 지원&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. CISO 실습&lt;/h2&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2138&quot; data-origin-height=&quot;1268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LeLJo/btsQN598Eqk/mSFpXrGQTk4Tid2T3E1EO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LeLJo/btsQN598Eqk/mSFpXrGQTk4Tid2T3E1EO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LeLJo/btsQN598Eqk/mSFpXrGQTk4Tid2T3E1EO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLeLJo%2FbtsQN598Eqk%2FmSFpXrGQTk4Tid2T3E1EO1%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;2138&quot; height=&quot;1268&quot; data-origin-width=&quot;2138&quot; data-origin-height=&quot;1268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;7. 서브넷팅 문제풀이&lt;/h2&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baCA8I/btsQLd3eiSr/LZ8pvE8Zt45OauskHq51xk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baCA8I/btsQLd3eiSr/LZ8pvE8Zt45OauskHq51xk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baCA8I/btsQLd3eiSr/LZ8pvE8Zt45OauskHq51xk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaCA8I%2FbtsQLd3eiSr%2FLZ8pvE8Zt45OauskHq51xk%2Fimg.jpg&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;3024&quot; height=&quot;3024&quot; data-filename=&quot;1.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.jpg&quot; data-origin-width=&quot;4034&quot; data-origin-height=&quot;4034&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PY8Vm/btsQMZbLS7k/Cd8KN4WFKkSuTFNKrhdL20/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PY8Vm/btsQMZbLS7k/Cd8KN4WFKkSuTFNKrhdL20/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PY8Vm/btsQMZbLS7k/Cd8KN4WFKkSuTFNKrhdL20/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPY8Vm%2FbtsQMZbLS7k%2FCd8KN4WFKkSuTFNKrhdL20%2Fimg.jpg&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;4034&quot; height=&quot;4034&quot; data-filename=&quot;3.jpg&quot; data-origin-width=&quot;4034&quot; data-origin-height=&quot;4034&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.jpg&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpJPZ0/btsQOH83BCo/IdbdjsUrkQWPkbMvfQlmr0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpJPZ0/btsQOH83BCo/IdbdjsUrkQWPkbMvfQlmr0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpJPZ0/btsQOH83BCo/IdbdjsUrkQWPkbMvfQlmr0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpJPZ0%2FbtsQOH83BCo%2FIdbdjsUrkQWPkbMvfQlmr0%2Fimg.jpg&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;2936&quot; height=&quot;1304&quot; data-filename=&quot;5.jpg&quot; data-origin-width=&quot;2936&quot; data-origin-height=&quot;1304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 2기(B-log) 리뷰로 작성 되었습니다.&lt;/p&gt;
&lt;/div&gt;</description>
      <category>IT/Kakao cloud 부트캠프</category>
      <category>AIaaS</category>
      <category>AIaaS마스터클래스2기</category>
      <category>개발자교육</category>
      <category>부트캠프</category>
      <category>스나이퍼팩토리</category>
      <category>카카오엔터프라이즈</category>
      <category>카카오클라우드</category>
      <category>클라우드개발자</category>
      <category>클라우드엔지니어</category>
      <category>한국생산성본부</category>
      <author>헤이로하</author>
      <guid isPermaLink="true">https://al-roha.tistory.com/19</guid>
      <comments>https://al-roha.tistory.com/19#entry19comment</comments>
      <pubDate>Wed, 24 Sep 2025 16:00:28 +0900</pubDate>
    </item>
    <item>
      <title>[스나이퍼팩토리] 카카오클라우드 - 클라우드 개발자 교육 8주차(파일서비스- FTP/NFS/Samba 서비스)</title>
      <link>https://al-roha.tistory.com/18</link>
      <description>&lt;h1&gt; FTP&amp;nbsp;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;FTP&lt;/b&gt;: 파일 업로드/다운로드 전송을 위한 &lt;b&gt;TCP/IP 기반 표준 프로토콜&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;기본 포트:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;21번 (제어 채널, Control Channel)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;20번 (데이터 채널, Data Channel)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Active Mode&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트 &amp;rarr; 서버 &lt;b&gt;21번 포트&lt;/b&gt; 제어 채널 연결&lt;/li&gt;
&lt;li&gt;서버 &amp;rarr; 클라이언트 &lt;b&gt;20번 포트 &amp;rarr; 클라이언트 랜덤 포트&lt;/b&gt;로 데이터 연결&lt;/li&gt;
&lt;li&gt;  단점: 클라이언트가 방화벽/NAT 뒤에 있으면 서버가 연결 시도에 실패할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Passive Mode (권장)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트 &amp;rarr; 서버 &lt;b&gt;21번 포트&lt;/b&gt; 제어 채널 연결&lt;/li&gt;
&lt;li&gt;서버가 &lt;b&gt;데이터 전송용 포트&lt;/b&gt;를 열고, 포트 번호를 클라이언트에 전달&lt;/li&gt;
&lt;li&gt;클라이언트 &amp;rarr; 서버 해당 포트로 연결&lt;/li&gt;
&lt;li&gt;  장점: 클라이언트가 능동적으로 연결 &amp;rarr; 방화벽&amp;middot;NAT 환경에서도 안정적 동작&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Active vs Passive 모드&amp;nbsp;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Active mode&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Passive mode&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;제어 채널&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;클라이언트 &amp;rarr; 서버 (21번)&lt;/td&gt;
&lt;td&gt;클라이언트 &amp;rarr; 서버 (21번)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;데이터 채널&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;서버(20번) &amp;rarr; 클라이언트 랜덤 포트&lt;/td&gt;
&lt;td&gt;클라이언트 랜덤 포트 &amp;rarr; 서버가 지정한 포트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;연결 주체&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;데이터 연결은 &lt;b&gt;서버가 시작&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;데이터 연결은 &lt;b&gt;클라이언트가 시작&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;방화벽/NAT 환경&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;연결 문제 발생 가능 (차단될 수 있음)&lt;/td&gt;
&lt;td&gt;안정적으로 연결 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;실무 활용도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;제한적, 특수 환경에서 사용&lt;/td&gt;
&lt;td&gt;기본적으로 가장 많이 사용됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Rocky Linux에서의 FTP (vsftpd)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;vsftpd (Very Secure FTP Daemon)&lt;/b&gt;: Rocky Linux에서 기본 제공되는 FTP 서버&lt;/li&gt;
&lt;li&gt;특징: 가볍고 보안성이 뛰어나 실무 서버 환경에서 널리 사용됨&lt;/li&gt;
&lt;li&gt;설정 절차(주요 코드 스니펫):&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1758605505151&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 설치
[root@rocky1 ~]# sudo dnf install -y vsftpd

# 재시작
[root@rocky1 pub]# systemctl restart vsftpd
[root@rocky1 pub]# systemctl enable vsftpd&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1758605802344&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 기본 설정 파일 수정
[root@rocky1 pub]# vi /etc/vsftpd/vsftpd.conf

# 설정파일 내부

# Example config file /etc/vsftpd/vsftpd.conf
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
#
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
#
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=YES ---&amp;gt; 외부 접속 권한 허용 (NO인 경우 익명 사용자 금지)
#
# Uncomment this to allow local users to log in.
local_enable=YES --&amp;gt; 로컬 계정 허용
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES --&amp;gt; 업로드/삭제 허용
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022 --&amp;gt; 파일 권한 설정 허용
#
&quot;/etc/vsftpd/vsftpd.conf&quot; 131L, 5103B
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022
#
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
# When SELinux is enforcing check for SE bool allow_ftpd_anon_write, allow_ftpd_full_access
anon_upload_enable=YES --&amp;gt; 익명사용자의 업로드 허용
#
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
anon_mkdir_write_enable=YES --&amp;gt; 익명사용자의 디렉토리 쓰기 허용
#
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
dirmessage_enable=YES
#
# Activate logging of uploads/downloads.
xferlog_enable=YES
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES
#
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using &quot;root&quot; for uploaded files is not
# recommended!
#chown_uploads=YES
#chown_username=whoever
#
# You may override where the log file goes if you like. The default is shown
# below.
#xferlog_file=/var/log/xferlog
#
# You may change the default value for timing out an idle session.
idle_session_timeout=600
#
# You may change the default value for timing out a data connection.
#data_connection_timeout=120
#
# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
#nopriv_user=ftpsecure
#
# Enable this and the server will recognise asynchronous ABOR requests. Not
# recommended for security (the code is non-trivial). Not enabling it,
# however, may confuse older FTP clients.
#async_abor_enable=YES
#
# By default the server will pretend to allow ASCII mode but in fact ignore
# the request. Turn on the below options to have the server actually do ASCII
# mangling on files when in ASCII mode. The vsftpd.conf(5) man page explains
# the behaviour when these options are disabled.
# Beware that on some FTP servers, ASCII support allows a denial of service
# attack (DoS) via the command &quot;SIZE /big/file&quot; in ASCII mode. vsftpd
# predicted this attack and has always been safe, reporting the size of the
# raw file.
# ASCII mangling is a horrible feature of the protocol.
#ascii_upload_enable=YES
#ascii_download_enable=YES
#
# You may fully customise the login banner string:
#ftpd_banner=Welcome to blah FTP service.
#
# You may specify a file of disallowed anonymous e-mail addresses. Apparently
# useful for combatting certain DoS attacks.
#deny_email_enable=YES
# (default follows)
#banned_email_file=/etc/vsftpd/banned_emails
#
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
# (Warning! chroot'ing can be very dangerous. If using chroot, make sure that

.
.
.
.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파일 수정 후에는 꼭 시스템 재시작 해주어야 함.&lt;/p&gt;
&lt;pre id=&quot;code_1758605879396&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 외부접근을 위해 방화벽 멈추기
[root@rocky1 pub]# systemctl stop firewall&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버의 /var/ftp/pub 디렉토리에 연결하여 업로드된 file1 을 get으로 다운받음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SaHAd/btsQJY5ExOn/gdb8L2cMG3jBnnokxLSVzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SaHAd/btsQJY5ExOn/gdb8L2cMG3jBnnokxLSVzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SaHAd/btsQJY5ExOn/gdb8L2cMG3jBnnokxLSVzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSaHAd%2FbtsQJY5ExOn%2Fgdb8L2cMG3jBnnokxLSVzk%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;229&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버에서 pub 디렉토리에 upload 디렉토리를 만들어서 외부 익명의 사용자가 업로드 할 수 있도록 권한을 설정함.&lt;/p&gt;
&lt;pre id=&quot;code_1758606113759&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@rocky1 pub]# sudo mkdir -p /var/ftp/pub/upload
[root@rocky1 pub]# sudo chmod 777 /var/ftp/pub/upload&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- put으로 파일 업로드 완료&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh0YMd/btsQI7aQT0x/TZ1ZyFDDvybp3AIlA6BGh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh0YMd/btsQI7aQT0x/TZ1ZyFDDvybp3AIlA6BGh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh0YMd/btsQI7aQT0x/TZ1ZyFDDvybp3AIlA6BGh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh0YMd%2FbtsQI7aQT0x%2FTZ1ZyFDDvybp3AIlA6BGh0%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;454&quot; height=&quot;241&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Summary&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;FTP는 Active / Passive 두 모드가 있으며, NAT&amp;middot;방화벽 환경에서는 Passive 모드가 유리&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rocky Linux의 vsftpd&lt;/b&gt;는 보안성과 경량성이 뛰어나 FTP 서버 구축에 많이 활용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1 data-end=&quot;155&quot; data-start=&quot;144&quot;&gt;  NFS&amp;nbsp;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;517&quot; data-start=&quot;166&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;272&quot; data-start=&quot;166&quot;&gt;&lt;b&gt;NFS(Network File System)&lt;/b&gt;:&lt;br /&gt;네트워크를 통해 &lt;b&gt;다른 리눅스/유닉스 시스템의 디렉터리를 로컬 디렉터리처럼 마운트&lt;/b&gt;하여 사용할 수 있게 해주는 프로토콜&lt;/li&gt;
&lt;li data-end=&quot;300&quot; data-start=&quot;273&quot;&gt;&lt;b&gt;기본 포트&lt;/b&gt;: TCP/UDP 2049&lt;/li&gt;
&lt;li data-end=&quot;402&quot; data-start=&quot;301&quot;&gt;&lt;b&gt;운영 방식&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;402&quot; data-start=&quot;318&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;352&quot; data-start=&quot;318&quot;&gt;서버: 특정 디렉토리를 &lt;b&gt;공유(export)&lt;/b&gt; 설정&lt;/li&gt;
&lt;li data-end=&quot;402&quot; data-start=&quot;355&quot;&gt;클라이언트: 서버의 공유 디렉토리를 &lt;b&gt;마운트&lt;/b&gt;해서 로컬 파일시스템처럼 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;517&quot; data-start=&quot;403&quot;&gt;&lt;b&gt;주요 특징&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;517&quot; data-start=&quot;418&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;445&quot; data-start=&quot;418&quot;&gt;파일을 로컬처럼 직접 열고 읽고 쓰기 가능&lt;/li&gt;
&lt;li data-end=&quot;480&quot; data-start=&quot;448&quot;&gt;OS 레벨에서 처리되므로 응용 프로그램 수정 불필요&lt;/li&gt;
&lt;li data-end=&quot;517&quot; data-start=&quot;483&quot;&gt;UID/GID(사용자/그룹 ID)를 기반으로 권한 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;522&quot; data-start=&quot;519&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;541&quot; data-start=&quot;524&quot; data-ke-size=&quot;size26&quot;&gt;2) NFS 특징&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;971&quot; data-start=&quot;543&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;971&quot; data-start=&quot;571&quot;&gt;
&lt;tr data-end=&quot;623&quot; data-start=&quot;571&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;582&quot; data-start=&quot;571&quot;&gt;&lt;b&gt;프로토콜&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;623&quot; data-start=&quot;582&quot;&gt;RPC 기반 (Remote Procedure Call) 위에서 동작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;649&quot; data-start=&quot;624&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;633&quot; data-start=&quot;624&quot;&gt;&lt;b&gt;포트&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;649&quot; data-start=&quot;633&quot;&gt;TCP/UDP 2049&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;692&quot; data-start=&quot;650&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;659&quot; data-start=&quot;650&quot;&gt;&lt;b&gt;환경&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;692&quot; data-start=&quot;659&quot;&gt;주로 Linux &amp;harr; Linux/Unix 환경에서 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;739&quot; data-start=&quot;693&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;705&quot; data-start=&quot;693&quot;&gt;&lt;b&gt;사용 방식&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;739&quot; data-start=&quot;705&quot;&gt;서버 디렉토리를 export &amp;rarr; 클라이언트가 mount&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;816&quot; data-start=&quot;740&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;749&quot; data-start=&quot;740&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;816&quot; data-start=&quot;749&quot;&gt;- 서버 파일을 로컬처럼 사용 가능 &lt;br /&gt;- 경량 프로토콜, 빠른 성능 &lt;br /&gt;- 응용 프로그램 변경 불필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;906&quot; data-start=&quot;817&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;826&quot; data-start=&quot;817&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;906&quot; data-start=&quot;826&quot;&gt;- 네트워크/보안에 취약 (IP 기반 접근 제어) &lt;br /&gt;- 인증이 UID/GID 매핑 의존적 &lt;br /&gt;- WAN 환경에서는 성능 저하&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;971&quot; data-start=&quot;907&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;916&quot; data-start=&quot;907&quot;&gt;&lt;b&gt;버전&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;971&quot; data-start=&quot;916&quot;&gt;NFSv3 (가장 널리 사용) / NFSv4 (보안&amp;middot;성능 강화, Kerberos 인증 지원)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;524&quot; data-end=&quot;541&quot; data-ke-size=&quot;size26&quot;&gt;3) NFS 과제 수행&lt;/h2&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2_1.png&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhhcJV/btsQNbPZOO3/BDGQ1anigz3VMhnN2Txkxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhhcJV/btsQNbPZOO3/BDGQ1anigz3VMhnN2Txkxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhhcJV/btsQNbPZOO3/BDGQ1anigz3VMhnN2Txkxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhhcJV%2FbtsQNbPZOO3%2FBDGQ1anigz3VMhnN2Txkxk%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;1430&quot; height=&quot;404&quot; data-filename=&quot;2_1.png&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G59DJ/btsQKHC6uBw/7RqggPrj1yVhaQokUEGxX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G59DJ/btsQKHC6uBw/7RqggPrj1yVhaQokUEGxX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G59DJ/btsQKHC6uBw/7RqggPrj1yVhaQokUEGxX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG59DJ%2FbtsQKHC6uBw%2F7RqggPrj1yVhaQokUEGxX1%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;1052&quot; height=&quot;300&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;h1&gt;  Samba&amp;nbsp;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1) Samba 서비스 개요&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Samba&lt;/b&gt;: Linux/Unix 환경에서 &lt;b&gt;SMB/CIFS&lt;/b&gt; 프로토콜을 구현한 오픈소스 서버&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주요 기능&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Linux &amp;harr; Windows 간 &lt;b&gt;파일/프린터 공유&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;네트워크에서의 &lt;b&gt;호스트 이름 해석 지원(NetBIOS)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;학습 포인트&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Rocky Linux에서 Samba 설치 및 설정&lt;/li&gt;
&lt;li&gt;Windows/macOS에서 Samba 공유 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2) Samba 관련 포트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트 프로토콜 역할 비고&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;445&lt;/td&gt;
&lt;td&gt;TCP/UDP&lt;/td&gt;
&lt;td&gt;&lt;b&gt;SMB Direct Hosting&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;최신 SMB(2.0&amp;uarr;), Windows 기본&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;139&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;NetBIOS Session Service&lt;/td&gt;
&lt;td&gt;구형 SMB, 세션 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;137&lt;/td&gt;
&lt;td&gt;UDP&lt;/td&gt;
&lt;td&gt;NetBIOS Name Service&lt;/td&gt;
&lt;td&gt;이름 &amp;rarr; IP 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;138&lt;/td&gt;
&lt;td&gt;UDP&lt;/td&gt;
&lt;td&gt;NetBIOS Datagram&lt;/td&gt;
&lt;td&gt;브로드캐스트, 세션 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;현대 환경&lt;/b&gt;에서는 &lt;b&gt;TCP 445&lt;/b&gt;를 주로 사용. NetBIOS 기반은 하위 호환성용.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3) Samba 설치 (Rocky Linux)&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 패키지 설치
sudo dnf install -y samba samba-client samba-common

# 서비스 활성화
sudo systemctl enable --now smb nmb

# 상태 확인
systemctl status smb
systemctl status nmb
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;smb = 파일 공유, nmb = NetBIOS 이름 서비스&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4) Samba 서버 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. 공유 디렉터리 생성&lt;/h3&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;code&gt;sudo mkdir -p /srv/samba/share
sudo chown -R $USER:$USER /srv/samba/share
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. 설정 파일 편집&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/samba/smb.conf 맨 아래에 추가:&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;[samba_share]
   path = /srv/samba/share
   browsable = yes
   writable = yes
   guest ok = yes
   read only = no
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-3. Samba 계정 생성 (옵션)&lt;/h3&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;sudo smbpasswd -a &amp;lt;username&amp;gt;
sudo smbpasswd -e &amp;lt;username&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  Windows/macOS에서 접속 시 &lt;b&gt;Samba 계정&lt;/b&gt; 인증 필요 시 사용.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-4. 방화벽&amp;nbsp;&lt;/h3&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;sudo firewall-cmd --permanent --add-service=samba
sudo firewall-cmd --reload
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5) Samba 공유 접근&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-1. Windows에서&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;탐색기 &amp;rarr; \\&amp;lt;서버_IP&amp;gt;\samba_share&lt;/li&gt;
&lt;li&gt;사용자 계정 입력 (smbpasswd에서 설정한 계정)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-2. macOS에서&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Finder &amp;rarr; Command + K &amp;rarr; 서버 연결:&lt;/li&gt;
&lt;li&gt;smb://&amp;lt;서버_IP&amp;gt;/samba_share&lt;/li&gt;
&lt;li&gt;계정 입력 후 연결 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6) Samba vs NFS 간 비교&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Samba&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;NFS&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;주요 환경&lt;/td&gt;
&lt;td&gt;Windows &amp;harr; Linux&lt;/td&gt;
&lt;td&gt;Linux &amp;harr; Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;인증 방식&lt;/td&gt;
&lt;td&gt;계정 기반, 암호 인증&lt;/td&gt;
&lt;td&gt;UID/GID 매핑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;성능&lt;/td&gt;
&lt;td&gt;Windows 최적화&lt;/td&gt;
&lt;td&gt;Unix/Linux 환경 최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;포트&lt;/td&gt;
&lt;td&gt;445, 139, 137, 138&lt;/td&gt;
&lt;td&gt;2049&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;사용 사례&lt;/td&gt;
&lt;td&gt;이기종 환경 파일 공유&lt;/td&gt;
&lt;td&gt;Linux 서버 간 스토리지 공유&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;7) Samba 실습 과제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mac_server.png&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdU9kN/btsQKEzGDWD/SHpqqkRHRdhXkooZuPSpFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdU9kN/btsQKEzGDWD/SHpqqkRHRdhXkooZuPSpFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdU9kN/btsQKEzGDWD/SHpqqkRHRdhXkooZuPSpFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdU9kN%2FbtsQKEzGDWD%2FSHpqqkRHRdhXkooZuPSpFk%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;1550&quot; height=&quot;378&quot; data-filename=&quot;mac_server.png&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;smbclient.png&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF1E1j/btsQM8eDAmU/SO4nE7gGQ5Aksgq78YsNDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF1E1j/btsQM8eDAmU/SO4nE7gGQ5Aksgq78YsNDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF1E1j/btsQM8eDAmU/SO4nE7gGQ5Aksgq78YsNDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF1E1j%2FbtsQM8eDAmU%2FSO4nE7gGQ5Aksgq78YsNDK%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;1258&quot; height=&quot;288&quot; data-filename=&quot;smbclient.png&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 2기(B-log) 리뷰로 작성 되었습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;reaction-2&quot; data-tistory-react-app=&quot;Reaction&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>IT/Kakao cloud 부트캠프</category>
      <category>AIaaS</category>
      <category>AIaaS마스터클래스2기</category>
      <category>개발자교육</category>
      <category>부트캠프</category>
      <category>스나이퍼팩토리</category>
      <category>카카오엔터프라이즈</category>
      <category>카카오클라우드</category>
      <category>클라우드개발자</category>
      <category>클라우드엔지니어</category>
      <category>한국생산성본부</category>
      <author>헤이로하</author>
      <guid isPermaLink="true">https://al-roha.tistory.com/18</guid>
      <comments>https://al-roha.tistory.com/18#entry18comment</comments>
      <pubDate>Wed, 24 Sep 2025 09:47:21 +0900</pubDate>
    </item>
    <item>
      <title>[스나이퍼팩토리] 카카오클라우드 - 클라우드 개발자 교육 8주차(클라우드를 위한 리눅스 - DNS/Nginx)</title>
      <link>https://al-roha.tistory.com/17</link>
      <description>&lt;h1&gt;  리눅스&amp;middot;DNS&amp;middot;Nginx&amp;nbsp;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리눅스 기본 조작(파일/권한/사용자/패키지/네트워크)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DNS(BIND)&lt;/b&gt;: Caching/Authoritative 설정, Zone 파일 작성, 방화벽 연동, 테스트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Nginx&lt;/b&gt;: 리버스 프록시, 로드밸런싱(라운드로빈/가중치) 구성 및 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1) 리눅스 소개 &amp;amp; 환경&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1. CLI vs GUI&amp;nbsp;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 93px;&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;height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;b&gt;CLI&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;b&gt;GUI&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;특징&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;초기 낯설지만 규칙적&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;직관적, 쉬운 시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;속도/자동화&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;빠름&lt;/b&gt;, 스크립트로 자동화&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;수동 조작 위주&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;원격/서버&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;표준&lt;/b&gt; (SSH)&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;제한적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;반복 작업&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;매우 강함&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;상대적으로 약함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-2. 파일시스템&amp;middot;경로&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;/&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;루트(최상위)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;/home&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사용자 홈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;/etc&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;설정 파일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;/var&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;가변 데이터(로그 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;/usr/bin&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;일반 실행 파일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;/bin, /sbin&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;기본 실행 파일&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;절대 경로&lt;/b&gt;: /home/user/file&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상대 경로&lt;/b&gt;: ../file, ./script.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-3. 기본 실습&amp;nbsp;&lt;/h3&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;echo &quot;hello&quot;; date; cal
whoami; pwd; cd ~; mkdir -p test/dir; touch test/a.txt
ls -la
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2) 파일/디렉토리 기본&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 조작 명령어&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;디렉터리 생성/이동&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;mkdir, cd&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;mkdir -p proj/src &amp;amp;&amp;amp; cd proj&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;파일 생성/복사/이동&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;touch, cp, mv&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;touch a; cp a b; mv b dir/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;삭제&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;rm, rm -r&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;rm a; rm -r dir/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;리스트/상세&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;ls, ls -la&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;ls -la&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;권한&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;chmod&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;chmod 644 file&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. 내용 확인&amp;middot;편집&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;내용 보기&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;cat, more, less, head, tail&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;긴 문서는 less 추천&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;검색&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;grep, grep -n/-i/-v&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;정규표현식 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;편집&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;nano, vi(Vim)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;:wq 저장종료&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3) 사용자&amp;middot;그룹&amp;middot;권한&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. 계정/그룹/권한 요약&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;사용자 추가&amp;middot;비번&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;useradd, passwd&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;useradd bob &amp;amp;&amp;amp; passwd bob&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;그룹 추가&amp;middot;할당&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;groupadd, usermod -aG&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;groupadd dev; usermod -aG dev bob&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;소유권/권한&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;chown, chmod&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;chown bob:dev file; chmod 640 file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;sudo&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;/etc/sudoers&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;usermod -aG wheel bob (RHEL계열)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4) 패키지 &amp;amp; 서비스&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. 패키지 관리자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(해당 수업에서는 Rocky-dnf사용)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Debian/Ubuntu&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;APT&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;apt update &amp;amp;&amp;amp; apt install nginx -y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;RHEL/Rocky&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;DNF/YUM&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;dnf install nginx -y&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. 서비스 관리(systemd)&lt;/h3&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: 35.9302%;&quot;&gt;&lt;b&gt;시작/중지&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.9535%;&quot;&gt;systemctl start/stop &amp;lt;svc&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 35.9302%;&quot;&gt;&lt;b&gt;재시작/상태(파일 수정시 꼭 재시작 해줘야함)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.9535%;&quot;&gt;systemctl restart/status &amp;lt;svc&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 35.9302%;&quot;&gt;&lt;b&gt;부팅시 시작&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.9535%;&quot;&gt;systemctl enable &amp;lt;svc&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5) 네트워크 &amp;amp; 방화벽&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-1. 네트워크 확인&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;IP확인&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;ip addr, ip r&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;ip addr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;통신점검&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;ping, curl -I URL&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;ping 8.8.8.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;포트확인&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;ss -lntup&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;`ss -lntup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-2. 방화벽(Firewalld)&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;서비스 허용&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;firewall-cmd --permanent --add-service=dns&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;포트 허용&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;firewall-cmd --permanent --add-port=8081/tcp&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;적용&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;firewall-cmd --reload&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6) DNS(BIND) 실습&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-1. 개요&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;역할&lt;/b&gt;: FQDN ⇄ IP(정방향/역방향) 변환&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서버 데몬&lt;/b&gt;: named (패키지명 bind), 보안강화 bind-chroot&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로토콜/포트&lt;/b&gt;: UDP 53(질의), TCP 53(존 전송/대응)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-2. 설정 파일&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/etc/named.conf&lt;/td&gt;
&lt;td&gt;기본 옵션, listen/allow-query 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/etc/named.rfc1912.zones&lt;/td&gt;
&lt;td&gt;zone 선언(Master/Slave/Hint)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/var/named/&amp;lt;zone파일&amp;gt;&lt;/td&gt;
&lt;td&gt;실제 zone 레코드(A/NS/CNAME 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-3. 설치 &amp;amp; 사용(Rocky)&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;dnf install bind-chroot -y
systemctl enable --now named
# (chroot 사용 시)
# systemctl enable --now named-chroot
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-4. named.conf 옵션&lt;/h3&gt;
&lt;pre class=&quot;abnf&quot;&gt;&lt;code&gt;options {
    listen-on port 53 { 192.168.100.236; };
    allow-query { any; };
    recursion yes;            // 캐싱 DNS 시
};

include &quot;/etc/named.rfc1912.zones&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-5. Zone 선언(/etc/named.rfc1912.zones)&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;zone &quot;kyt.com&quot; IN {
    type master;
    file &quot;kyt.zone&quot;;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-6. Zone 파일(/var/named/kyt.zone)&amp;nbsp;&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$TTL 86400
@   IN SOA ns.kyt.com. admin.kyt.com. (
        20250518  ; serial
        1D        ; refresh
        1H        ; retry
        1W        ; expire
        1D )      ; minimum
    IN NS  ns
ns  IN A   192.168.100.236
www IN A   192.168.100.129
ftp IN A   192.168.100.129
www1 IN CNAME www.a.b.cloudai.com.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-7. 레코드 타입 요약&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;SOA&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;존 권한 시작&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;관리 메일&amp;middot;시리얼 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;NS&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;네임서버 지정&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;IN NS ns.kyt.com.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;A/AAAA&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;이름&amp;rarr;IP&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;www IN A 192.168.0.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;CNAME&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;별칭&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;www1 IN CNAME www.target.com.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;PTR&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;IP&amp;rarr;이름(역방향)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;10 IN PTR host.kyt.com.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-8. 방화벽 &amp;amp; 재시작&lt;/h3&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;firewall-cmd --permanent --add-service=dns
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --reload
systemctl restart named
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-9. 테스트&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;nslookup
&amp;gt; server 192.168.100.236
&amp;gt; www.kyt.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-10. Caching vs Authoritative&lt;/h3&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&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Caching DNS&amp;nbsp;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Authoritative DNS&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;관리 도메인&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;&lt;b&gt;있음(Zone 보유)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;응답 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;재귀 질의, 캐시 응답&lt;/td&gt;
&lt;td&gt;권한 있는 정답 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;용도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;속도/트래픽 절감&lt;/td&gt;
&lt;td&gt;서비스 도메인 운영&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-11. chroot&amp;nbsp;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;루트 경로 격리로 보안 강화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;경로&lt;/td&gt;
&lt;td&gt;/var/named/chroot/...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;유의&lt;/td&gt;
&lt;td&gt;일반 named와 병행하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7) Nginx 프록시 &amp;amp; 로드밸런서&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-1. 프록시 개념 비교&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;항목 포워드 프록시&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;리버스 프록시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;위치&lt;/td&gt;
&lt;td&gt;클라이언트 앞&lt;/td&gt;
&lt;td&gt;서버 앞&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;접근통제/캐시/익명성&lt;/td&gt;
&lt;td&gt;백엔드 분산, SSL 종료, 캐시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;클라이언트 인식&lt;/td&gt;
&lt;td&gt;프록시 인지함&lt;/td&gt;
&lt;td&gt;프록시 = 서버처럼 보임&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-2. 설치&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ubuntu&lt;/li&gt;
&lt;li&gt;apt update &amp;amp;&amp;amp; apt install nginx -y systemctl enable --now nginx&lt;/li&gt;
&lt;li&gt;Rocky&lt;/li&gt;
&lt;li&gt;dnf install epel-release -y dnf install nginx -y systemctl enable --now nginx&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-3. 리버스 프록시 (80 &amp;rarr; 8081 전달)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/nginx/conf.d/reverse_proxy.conf&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;server {
    listen 80;

    location / {
        proxy_pass http://localhost:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;백엔드 준비 &lt;/b&gt;(Apache):&lt;/li&gt;
&lt;li&gt;dnf install httpd -y sed -i 's/^Listen .*/Listen 8081/' /etc/httpd/conf/httpd.conf systemctl enable --now httpd firewall-cmd --permanent --add-port=8081/tcp &amp;amp;&amp;amp; firewall-cmd --reload&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-4. 로드밸런싱(라운드로빈/가중치)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/nginx/conf.d/load_balancer.conf&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;upstream backend {
    server rocky2_IP:8081 weight=3;   # 가중치(선택)
    server rocky3_IP:8082;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nginx.conf의 기본 server 블록을 &lt;b&gt;주석&lt;/b&gt;하고&lt;br /&gt;include /etc/nginx/conf.d/*.conf; 로 위 파일을 포함시킴.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-5. 테스트&lt;/h3&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;nginx -t &amp;amp;&amp;amp; systemctl reload nginx
curl -I http://프록시IP/
# 여러 번 호출하여 백엔드 응답 번갈아 나오는지 확인
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-6. 유용 헤더&amp;nbsp;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Host&lt;/td&gt;
&lt;td&gt;원 요청의 호스트 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X-Real-IP&lt;/td&gt;
&lt;td&gt;실제 클라이언트 IP 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X-Forwarded-For&lt;/td&gt;
&lt;td&gt;프록시 체인상의 IP 리스트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8) &lt;b&gt;명령어 모음&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8-1. 주요 명령어&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;파일/편집&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;ls, cd, mkdir, rm -r, cat/less/head/tail, grep, nano/vi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;권한/소유&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;chmod, chown, usermod -aG, passwd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;패키지&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;apt/dnf install/remove, dnf info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;서비스&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;systemctl start/enable/status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;네트워크&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;ip addr, ping, ss -lntup, curl -I&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;방화벽&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;firewall-cmd --add-service/--add-port --permanent, --reload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;DNS&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;dnf install bind-chroot, systemctl start named, nslookup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&amp;nbsp;Nginx&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;dnf/apt install nginx, nginx -t, systemctl reload nginx&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8-2. DNS 포트&amp;middot;프로토콜&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 39.5353%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50.028%;&quot;&gt;일반 질의&lt;/td&gt;
&lt;td style=&quot;width: 25.2146%;&quot;&gt;&lt;b&gt;UDP 53&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50.028%;&quot;&gt;권한 응답/대형응답/Zone 전송&lt;/td&gt;
&lt;td style=&quot;width: 25.2146%;&quot;&gt;&lt;b&gt;TCP 53&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8-3. 정방향 vs 역방향&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;정방향&lt;/td&gt;
&lt;td&gt;이름 &amp;rarr; IP&lt;/td&gt;
&lt;td&gt;www.kyt.com &amp;rarr; 192.168.100.129&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;역방향&lt;/td&gt;
&lt;td&gt;IP &amp;rarr; 이름&lt;/td&gt;
&lt;td&gt;129.100.168.192.in-addr.arpa &amp;rarr; www.kyt.com&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9) 문제해결(트러블슈팅) 체크&lt;/h2&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: 15.5814%;&quot;&gt;&lt;b&gt;DNS 응답 없음&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.0465%;&quot;&gt;서비스/방화벽/리스닝IP&lt;/td&gt;
&lt;td style=&quot;width: 63.1395%;&quot;&gt;systemctl status named; `ss -lntup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.5814%;&quot;&gt;&lt;b&gt;도메인만 특정 실패&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.0465%;&quot;&gt;zone 파일/시리얼/문법&lt;/td&gt;
&lt;td style=&quot;width: 63.1395%;&quot;&gt;named-checkconf; named-checkzone kyt.com /var/named/kyt.zone; 시리얼 증가 후 재시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.5814%;&quot;&gt;&lt;b&gt;chroot 혼동&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.0465%;&quot;&gt;경로 다름&lt;/td&gt;
&lt;td style=&quot;width: 63.1395%;&quot;&gt;설정&amp;middot;존 파일이 /var/named/chroot 하위인지 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.5814%;&quot;&gt;&lt;b&gt;Nginx 502/504&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.0465%;&quot;&gt;백엔드 다운/포트 차단&lt;/td&gt;
&lt;td style=&quot;width: 63.1395%;&quot;&gt;백엔드 systemctl status; curl http://127.0.0.1:8081; 방화벽 포트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.5814%;&quot;&gt;&lt;b&gt;헤더/원 IP 누락&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.0465%;&quot;&gt;헤더 미전달&lt;/td&gt;
&lt;td style=&quot;width: 63.1395%;&quot;&gt;proxy_set_header 확인, X-Forwarded-For 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.5814%;&quot;&gt;&lt;b&gt;설정 반영 안됨&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.0465%;&quot;&gt;테스트&amp;middot;리로드 누락&lt;/td&gt;
&lt;td style=&quot;width: 63.1395%;&quot;&gt;nginx -t &amp;amp;&amp;amp; systemctl reload nginx&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;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 2기(B-log) 리뷰로 작성 되었습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;reaction-2&quot; data-tistory-react-app=&quot;Reaction&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>IT/Kakao cloud 부트캠프</category>
      <category>AIaaS</category>
      <category>AIaaS마스터클래스2기</category>
      <category>개발자교육</category>
      <category>부트캠프</category>
      <category>스나이퍼팩토리</category>
      <category>카카오엔터프라이즈</category>
      <category>카카오클라우드</category>
      <category>클라우드개발자</category>
      <category>클라우드엔지니어</category>
      <category>한국생산성본부</category>
      <author>헤이로하</author>
      <guid isPermaLink="true">https://al-roha.tistory.com/17</guid>
      <comments>https://al-roha.tistory.com/17#entry17comment</comments>
      <pubDate>Wed, 24 Sep 2025 09:30:30 +0900</pubDate>
    </item>
  </channel>
</rss>