<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>junkdrawer.codes</title>
        <link>https://velog.io/</link>
        <description>끄적</description>
        <lastBuildDate>Wed, 04 Mar 2026 09:34:05 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>junkdrawer.codes</title>
            <url>https://velog.velcdn.com/images/2joon_kim/profile/9a6c6bd6-dae4-42e9-aee7-105f2b0cc0fe/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. junkdrawer.codes. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/2joon_kim" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[빅데이터 분석기사 글 모음]]></title>
            <link>https://velog.io/@2joon_kim/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D%EA%B8%B0%EC%82%AC-%EA%B8%80-%EB%AA%A8%EC%9D%8C</link>
            <guid>https://velog.io/@2joon_kim/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D%EA%B8%B0%EC%82%AC-%EA%B8%80-%EB%AA%A8%EC%9D%8C</guid>
            <pubDate>Wed, 04 Mar 2026 09:34:05 GMT</pubDate>
            <description><![CDATA[<h1 id="빅데이터분석기사-필기-암기노트">빅데이터분석기사 필기 암기노트</h1>
<blockquote>
<p>모르는 전제로 처음부터 설명. 읽으면서 머릿속에 넣기.</p>
</blockquote>
<hr>
<h1 id="1과목-빅데이터-분석-기획">1과목: 빅데이터 분석 기획</h1>
<h2 id="1-1-빅데이터의-이해">1-1. 빅데이터의 이해</h2>
<h3 id="dikw-피라미드-매회-출제">DIKW 피라미드 (매회 출제)</h3>
<p>아래에서 위로 올라갈수록 가치가 높아짐:</p>
<ul>
<li><strong>Data (데이터)</strong>: 가공 안 된 날것의 사실. 예) &quot;35℃&quot;</li>
<li><strong>Information (정보)</strong>: 데이터를 가공해서 의미를 부여한 것. 예) &quot;오늘 서울 기온 35℃&quot;</li>
<li><strong>Knowledge (지식)</strong>: 정보를 분석해서 패턴/규칙을 발견한 것. 예) &quot;8월 서울은 보통 30℃ 이상이다&quot;</li>
<li><strong>Wisdom (지혜)</strong>: 지식을 바탕으로 미래를 예측하고 의사결정하는 것. 예) &quot;8월에는 냉방 수요가 급증하니 에어컨 재고를 늘려야 한다&quot;</li>
</ul>
<blockquote>
<p><strong>시험 포인트</strong>: &quot;객관적 사실 → 가공된 의미 → 패턴/규칙 → 의사결정&quot; 순서</p>
</blockquote>
<h3 id="빅데이터의-특성-3v-→-5v-→-7v">빅데이터의 특성 (3V → 5V → 7V)</h3>
<ul>
<li><strong>Volume (규모)</strong>: 데이터의 양이 엄청나게 많다</li>
<li><strong>Velocity (속도)</strong>: 데이터가 실시간으로 빠르게 생성된다</li>
<li><strong>Variety (다양성)</strong>: 텍스트, 이미지, 로그 등 다양한 형태</li>
<li><strong>Veracity (정확성)</strong>: 데이터의 품질/신뢰성</li>
<li><strong>Value (가치)</strong>: 데이터에서 실제 비즈니스 가치를 뽑아낼 수 있는가</li>
<li><strong>Visualization (시각화), Variability (가변성)</strong> 까지 확장되기도 함</li>
</ul>
<blockquote>
<p><strong>시험 포인트</strong>: 3V(Volume, Velocity, Variety)가 기본. 나머지는 확장 개념.</p>
</blockquote>
<h3 id="데이터의-유형">데이터의 유형</h3>
<ul>
<li><strong>정형 데이터</strong>: RDB에 저장되는 형태. 행과 열이 있음. (엑셀, DB 테이블)</li>
<li><strong>반정형 데이터</strong>: 고정 스키마는 없지만 구조는 있음. (JSON, XML, HTML, 로그)</li>
<li><strong>비정형 데이터</strong>: 구조가 없음. (이미지, 동영상, 텍스트, SNS 글)</li>
</ul>
<blockquote>
<p><strong>시험 포인트</strong>: JSON/XML이 &quot;반정형&quot;이라는 것 자주 출제</p>
</blockquote>
<h3 id="데이터베이스-유형">데이터베이스 유형</h3>
<ul>
<li><strong>RDBMS</strong>: 관계형 DB. 행/열 구조, SQL 사용 (MySQL, PostgreSQL, Oracle)</li>
<li><strong>NoSQL</strong>: Not Only SQL. 비정형/반정형 데이터 저장에 적합<ul>
<li><strong>Key-Value</strong>: Redis, DynamoDB (단순 키-값 쌍)</li>
<li><strong>Document</strong>: MongoDB (JSON 형태 문서 저장)</li>
<li><strong>Column-Family</strong>: HBase, Cassandra (열 기반 저장)</li>
<li><strong>Graph</strong>: Neo4j (노드-관계 구조, SNS 친구관계 분석 등)</li>
</ul>
</li>
</ul>
<h3 id="빅데이터-기술">빅데이터 기술</h3>
<ul>
<li><strong>Hadoop</strong>: 대용량 데이터 분산 저장/처리 프레임워크<ul>
<li><strong>HDFS</strong>: 분산 파일 시스템 (데이터 저장)</li>
<li><strong>MapReduce</strong>: 분산 처리 (Map=분할처리, Reduce=합산)</li>
<li><strong>YARN</strong>: 리소스 관리</li>
</ul>
</li>
<li><strong>Spark</strong>: Hadoop보다 빠름. 메모리 기반 처리(In-Memory). 실시간 처리 가능</li>
<li><strong>Kafka</strong>: 실시간 스트리밍 데이터 처리 플랫폼</li>
<li><strong>Hive</strong>: Hadoop 위에서 SQL처럼 쿼리 날릴 수 있게 해주는 도구</li>
</ul>
<hr>
<h2 id="1-2-데이터-분석-방법론-매회-23문제">1-2. 데이터 분석 방법론 (매회 2~3문제)</h2>
<h3 id="kdd-knowledge-discovery-in-databases">KDD (Knowledge Discovery in Databases)</h3>
<p>데이터에서 지식을 발견하는 과정. <strong>5단계</strong>:</p>
<ol>
<li><strong>Selection (선택)</strong>: 분석 대상 데이터 선택</li>
<li><strong>Preprocessing (전처리)</strong>: 노이즈/결측치 제거</li>
<li><strong>Transformation (변환)</strong>: 분석 가능한 형태로 변환</li>
<li><strong>Data Mining (데이터 마이닝)</strong>: 패턴/규칙 발견</li>
<li><strong>Interpretation (해석)</strong>: 결과 해석 및 평가</li>
</ol>
<blockquote>
<p><strong>암기법</strong>: &quot;선전변마해&quot; (선택-전처리-변환-마이닝-해석)</p>
</blockquote>
<h3 id="crisp-dm-cross-industry-standard-process-for-data-mining">CRISP-DM (Cross Industry Standard Process for Data Mining)</h3>
<p>산업 표준 데이터 마이닝 프로세스. <strong>6단계</strong>:</p>
<ol>
<li><strong>Business Understanding (업무 이해)</strong>: 비즈니스 목표 파악</li>
<li><strong>Data Understanding (데이터 이해)</strong>: 데이터 수집/탐색</li>
<li><strong>Data Preparation (데이터 준비)</strong>: 전처리, 변환</li>
<li><strong>Modeling (모델링)</strong>: 모델 구축</li>
<li><strong>Evaluation (평가)</strong>: 모델 성능 평가</li>
<li><strong>Deployment (배포)</strong>: 실제 업무에 적용</li>
</ol>
<blockquote>
<p><strong>암기법</strong>: &quot;업데준 모평배&quot; (업무이해-데이터이해-준비-모델링-평가-배포)
<strong>시험 포인트</strong>: 각 단계 간 피드백이 가능한 <strong>반복적/순환적 구조</strong>라는 점</p>
</blockquote>
<h3 id="semma-sas에서-만든-방법론">SEMMA (SAS에서 만든 방법론)</h3>
<ol>
<li><strong>Sample (표본추출)</strong></li>
<li><strong>Explore (탐색)</strong></li>
<li><strong>Modify (수정)</strong></li>
<li><strong>Model (모델링)</strong></li>
<li><strong>Assess (평가)</strong></li>
</ol>
<blockquote>
<p><strong>암기법</strong>: 그냥 &quot;SEMMA&quot; 자체가 암기법
<strong>시험 포인트</strong>: KDD vs CRISP-DM vs SEMMA 비교 문제 자주 나옴</p>
</blockquote>
<h3 id="3개-방법론-비교">3개 방법론 비교</h3>
<table>
<thead>
<tr>
<th>구분</th>
<th>KDD</th>
<th>CRISP-DM</th>
<th>SEMMA</th>
</tr>
</thead>
<tbody><tr>
<td>만든 곳</td>
<td>학계</td>
<td>유럽 컨소시엄</td>
<td>SAS</td>
</tr>
<tr>
<td>단계 수</td>
<td>5</td>
<td>6</td>
<td>5</td>
</tr>
<tr>
<td>특징</td>
<td>학술적</td>
<td>산업 표준, 순환적</td>
<td>SAS 도구 중심</td>
</tr>
<tr>
<td>시작점</td>
<td>데이터 선택</td>
<td>업무 이해</td>
<td>표본 추출</td>
</tr>
</tbody></table>
<hr>
<h2 id="1-3-분석-과제-도출">1-3. 분석 과제 도출</h2>
<h3 id="하향식-접근법-top-down">하향식 접근법 (Top-Down)</h3>
<ul>
<li>문제가 이미 정의되어 있고, 해결책을 찾아가는 방식</li>
<li>&quot;매출이 떨어지고 있다&quot; → 원인 분석</li>
<li><strong>Problem → Solution</strong> 방향</li>
</ul>
<h3 id="상향식-접근법-bottom-up">상향식 접근법 (Bottom-Up)</h3>
<ul>
<li>데이터를 먼저 보고, 거기서 인사이트를 발견하는 방식</li>
<li>데이터 탐색 → &quot;어? 이런 패턴이 있네?&quot; → 과제 도출</li>
<li><strong>Data → Insight</strong> 방향</li>
</ul>
<h3 id="분석-과제-발굴-도구">분석 과제 발굴 도구</h3>
<ul>
<li><strong>BSC (Balanced Scorecard)</strong>: 재무/고객/내부프로세스/학습성장 4개 관점으로 성과를 측정하는 경영도구</li>
<li><strong>CSF (Critical Success Factor)</strong>: 핵심 성공 요인. 사업 성공에 꼭 필요한 요소</li>
<li><strong>KPI (Key Performance Indicator)</strong>: 핵심 성과 지표. 목표 달성 정도를 수치로 측정</li>
<li>관계: <strong>BSC의 전략목표 → CSF 도출 → KPI로 측정</strong></li>
</ul>
<h3 id="분석-과제-우선순위-평가-매트릭스">분석 과제 우선순위 평가 매트릭스</h3>
<p>2x2 매트릭스로 과제를 분류:</p>
<ul>
<li>X축: <strong>시급성</strong> (높음/낮음)</li>
<li>Y축: <strong>전략적 중요도</strong> (높음/낮음)</li>
<li>전략적 중요도 높고 + 시급성 높으면 → <strong>바로 착수</strong></li>
</ul>
<hr>
<h2 id="1-4-분석-마스터플랜">1-4. 분석 마스터플랜</h2>
<h3 id="분석-거버넌스">분석 거버넌스</h3>
<p>분석을 체계적으로 관리하기 위한 조직/프로세스/시스템의 체계</p>
<ul>
<li><strong>분석 준비도</strong>: 조직이 분석을 수행할 준비가 되었는가 평가</li>
<li><strong>분석 성숙도 모델</strong>: 도입 → 활용 → 확산 → 최적화 단계</li>
</ul>
<h3 id="분석-조직-유형">분석 조직 유형</h3>
<ul>
<li><strong>집중형</strong>: 전사 분석 조직이 한 곳에 모여있음. 전문성↑ 현업이해↓</li>
<li><strong>분산형</strong>: 각 사업부에 분석 인력 배치. 현업이해↑ 전문성↓</li>
<li><strong>혼합형</strong>: 집중형 + 분산형 장점 결합. CoE(Center of Excellence) 형태</li>
</ul>
<hr>
<h2 id="1-5-개인정보보호--데이터-관련-법률-매회-12문제">1-5. 개인정보보호 / 데이터 관련 법률 (매회 1~2문제)</h2>
<h3 id="개인정보의-종류">개인정보의 종류</h3>
<ul>
<li><strong>개인정보</strong>: 살아있는 개인을 식별할 수 있는 정보 (이름, 주민번호 등)</li>
<li><strong>가명정보</strong>: 추가 정보 없이는 개인을 식별할 수 없도록 처리한 정보 (통계/연구에 활용 가능)</li>
<li><strong>익명정보</strong>: 더 이상 개인을 식별할 수 없는 정보 (개인정보보호법 적용 안 됨)</li>
</ul>
<h3 id="비식별-처리-기법">비식별 처리 기법</h3>
<ul>
<li><strong>가명처리</strong>: 이름을 &quot;홍OO&quot;으로 바꾸는 것</li>
<li><strong>총계처리</strong>: 개별 값 대신 합계/평균으로 제공</li>
<li><strong>데이터 삭제</strong>: 식별 가능한 값 자체를 제거</li>
<li><strong>데이터 범주화</strong>: &quot;25세&quot; → &quot;20대&quot;로 범주화</li>
<li><strong>데이터 마스킹</strong>: &quot;010-1234-5678&quot; → &quot;010-****-5678&quot;</li>
</ul>
<h3 id="데이터-3법">데이터 3법</h3>
<ol>
<li><strong>개인정보보호법</strong>: 개인정보 수집/이용/제공 규정 (일반법)</li>
<li><strong>정보통신망법</strong>: 온라인에서의 개인정보보호 (특별법)</li>
<li><strong>신용정보법</strong>: 금융/신용 관련 개인정보 (특별법)</li>
</ol>
<blockquote>
<p><strong>시험 포인트</strong>: 가명정보는 &quot;통계/연구/공익적 기록보존&quot; 목적으로만 사용 가능. 동의 없이 사용 가능하지만 제3자 제공 시 별도 동의 필요.</p>
</blockquote>
<hr>
<h1 id="2과목-빅데이터-탐색">2과목: 빅데이터 탐색</h1>
<h2 id="2-1-데이터-전처리">2-1. 데이터 전처리</h2>
<h3 id="결측치missing-value-처리">결측치(Missing Value) 처리</h3>
<p>결측치 = 값이 비어있는 데이터 (NaN, NULL)</p>
<p>처리 방법:</p>
<ul>
<li><strong>삭제</strong>: 결측치가 있는 행/열 제거 (데이터가 충분할 때)</li>
<li><strong>평균 대체</strong>: 해당 변수의 평균값으로 채움</li>
<li><strong>중앙값 대체</strong>: 이상치에 덜 민감 (평균보다 안전)</li>
<li><strong>최빈값 대체</strong>: 범주형 데이터에 적합</li>
<li><strong>보간법</strong>: 앞뒤 값을 이용해 추정 (시계열에 적합)</li>
<li><strong>예측 모델</strong>: 회귀분석 등으로 결측치를 예측해서 채움</li>
</ul>
<h3 id="이상치outlier-처리">이상치(Outlier) 처리</h3>
<p>이상치 = 다른 데이터와 동떨어진 극단값</p>
<p>탐지 방법:</p>
<ul>
<li><strong>IQR 방법</strong>: Q1 - 1.5×IQR 미만 또는 Q3 + 1.5×IQR 초과인 값<ul>
<li>Q1 = 25% 지점, Q3 = 75% 지점</li>
<li>IQR = Q3 - Q1 (사분위 범위)</li>
</ul>
</li>
<li><strong>Z-score</strong>: 평균에서 표준편차 몇 배 떨어졌는지. 보통 |Z| &gt; 3이면 이상치<ul>
<li>Z = (X - 평균) / 표준편차</li>
</ul>
</li>
<li><strong>박스플롯</strong>: 시각적으로 이상치 확인</li>
</ul>
<p>처리 방법:</p>
<ul>
<li>삭제, 대체(평균/중앙값), 변환(로그변환), 별도 분석</li>
</ul>
<h3 id="데이터-변환">데이터 변환</h3>
<ul>
<li><strong>정규화 (Min-Max Normalization)</strong>: 값을 0~1 사이로 변환<ul>
<li>X_norm = (X - min) / (max - min)</li>
</ul>
</li>
<li><strong>표준화 (Standardization, Z-score)</strong>: 평균=0, 표준편차=1로 변환<ul>
<li>X_std = (X - 평균) / 표준편차</li>
</ul>
</li>
<li><strong>로그 변환</strong>: 오른쪽으로 치우친(right-skewed) 데이터를 정규분포에 가깝게 만듦</li>
<li><strong>원-핫 인코딩</strong>: 범주형 변수를 0/1 이진 변수로 변환 (예: 색상 → 빨강=1,0,0 / 파랑=0,1,0)</li>
<li><strong>레이블 인코딩</strong>: 범주형 변수를 숫자로 변환 (예: 빨강=0, 파랑=1, 녹색=2)</li>
</ul>
<blockquote>
<p><strong>시험 포인트</strong>: 정규화 vs 표준화 차이. 정규화는 범위 고정(0~1), 표준화는 분포 변환.</p>
</blockquote>
<hr>
<h2 id="2-2-기초-통계">2-2. 기초 통계</h2>
<h3 id="중심-경향-측도-데이터의-대표값">중심 경향 측도 (데이터의 대표값)</h3>
<ul>
<li><strong>평균 (Mean)</strong>: 모든 값의 합 / 개수. 이상치에 민감</li>
<li><strong>중앙값 (Median)</strong>: 정렬했을 때 가운데 값. 이상치에 강건</li>
<li><strong>최빈값 (Mode)</strong>: 가장 많이 나타나는 값. 범주형에 유용</li>
</ul>
<h3 id="산포도-데이터가-얼마나-퍼져있는가">산포도 (데이터가 얼마나 퍼져있는가)</h3>
<ul>
<li><strong>분산 (Variance)</strong>: 각 값이 평균에서 얼마나 떨어졌는지의 제곱 평균</li>
<li><strong>표준편차 (Standard Deviation)</strong>: 분산의 제곱근. 원래 단위와 같아서 해석이 쉬움</li>
<li><strong>범위 (Range)</strong>: 최대값 - 최소값</li>
<li><strong>사분위 범위 (IQR)</strong>: Q3 - Q1</li>
</ul>
<h3 id="분포의-형태">분포의 형태</h3>
<ul>
<li><strong>왜도 (Skewness)</strong>: 분포가 얼마나 비대칭인가<ul>
<li>왜도 = 0 → 대칭 (정규분포)</li>
<li>왜도 &gt; 0 → 오른쪽 꼬리가 긴 분포 (양의 왜도) → 평균 &gt; 중앙값</li>
<li>왜도 &lt; 0 → 왼쪽 꼬리가 긴 분포 (음의 왜도) → 평균 &lt; 중앙값</li>
</ul>
</li>
<li><strong>첨도 (Kurtosis)</strong>: 분포가 얼마나 뾰족한가<ul>
<li>첨도 = 3 → 정규분포 (기준)</li>
<li>첨도 &gt; 3 → 뾰족 (급첨, Leptokurtic)</li>
<li>첨도 &lt; 3 → 완만 (완첨, Platykurtic)</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>시험 포인트</strong>: &quot;양의 왜도 → 오른쪽 꼬리 → 평균 &gt; 중앙값&quot; 무조건 암기</p>
</blockquote>
<h3 id="상관분석">상관분석</h3>
<ul>
<li><strong>피어슨 상관계수 (r)</strong>: -1 ~ +1 사이. 두 변수의 <strong>선형</strong> 관계 강도<ul>
<li>r = +1: 완벽한 양의 상관 (하나 올라가면 다른 것도 올라감)</li>
<li>r = 0: 선형 관계 없음</li>
<li>r = -1: 완벽한 음의 상관</li>
<li>|r| &gt; 0.7 이면 강한 상관</li>
</ul>
</li>
<li><strong>스피어만 상관계수</strong>: 순위(rank) 기반. 비선형에도 사용 가능</li>
<li><strong>주의</strong>: 상관관계 ≠ 인과관계! (아이스크림 판매량↑ ↔ 익사사고↑ → 인과 아님, 여름이라는 혼동변수)</li>
</ul>
<hr>
<h2 id="2-3-확률분포-매회-34문제-핵심">2-3. 확률분포 (매회 3~4문제, 핵심)</h2>
<h3 id="이산형-확률분포-셀-수-있는-값">이산형 확률분포 (셀 수 있는 값)</h3>
<p><strong>이항분포 (Binomial)</strong></p>
<ul>
<li>n번 시행, 성공확률 p, 성공 횟수의 분포</li>
<li>예) 동전 10번 던져서 앞면 나오는 횟수</li>
<li>평균 = np, 분산 = np(1-p)</li>
</ul>
<p><strong>포아송분포 (Poisson)</strong></p>
<ul>
<li>일정 시간/공간에서 사건이 발생하는 <strong>횟수</strong>의 분포</li>
<li>예) 1시간 동안 콜센터에 걸려오는 전화 수</li>
<li>평균 = λ, 분산 = λ (평균과 분산이 같음!)</li>
</ul>
<p><strong>베르누이분포</strong></p>
<ul>
<li>이항분포에서 n=1인 경우. 성공/실패 딱 1번.</li>
</ul>
<p><strong>기하분포</strong></p>
<ul>
<li>처음 성공할 때까지 시행하는 횟수의 분포</li>
</ul>
<h3 id="연속형-확률분포-아무-값이나-가능">연속형 확률분포 (아무 값이나 가능)</h3>
<p><strong>정규분포 (Normal, Gaussian)</strong></p>
<ul>
<li>가장 중요! 종 모양, 좌우 대칭</li>
<li>평균(μ)과 표준편차(σ)로 결정됨</li>
<li>68-95-99.7 규칙: μ±1σ에 68%, μ±2σ에 95%, μ±3σ에 99.7%</li>
<li><strong>표준정규분포</strong>: μ=0, σ=1로 변환한 정규분포</li>
</ul>
<p><strong>t-분포 (Student&#39;s t)</strong></p>
<ul>
<li>정규분포와 비슷하지만 표본이 작을 때 사용 (보통 n &lt; 30)</li>
<li>자유도가 커지면 정규분포에 가까워짐</li>
<li>정규분포보다 꼬리가 두꺼움 (극단값 가능성 높음)</li>
</ul>
<p><strong>카이제곱분포 (χ²)</strong></p>
<ul>
<li>표준정규분포를 따르는 변수들의 제곱합</li>
<li><strong>적합도 검정</strong>: 관측값이 기대값과 맞는지</li>
<li><strong>독립성 검정</strong>: 두 범주형 변수가 독립인지</li>
<li>항상 양수, 오른쪽으로 치우침</li>
</ul>
<p><strong>F-분포</strong></p>
<ul>
<li>두 카이제곱분포의 비율</li>
<li><strong>분산분석(ANOVA)</strong>에서 사용</li>
<li>두 집단의 분산이 같은지 비교</li>
</ul>
<blockquote>
<p><strong>초중요 암기</strong>:</p>
<ul>
<li>포아송: 평균 = 분산 = λ</li>
<li>정규분포: 68-95-99.7</li>
<li>t분포: 소표본, 자유도↑ → 정규분포</li>
<li>카이제곱: 적합도/독립성 검정</li>
<li>F분포: 분산분석(ANOVA)</li>
</ul>
</blockquote>
<hr>
<h2 id="2-4-표본추출-방법">2-4. 표본추출 방법</h2>
<h3 id="확률적-표본추출">확률적 표본추출</h3>
<ul>
<li><strong>단순무작위추출</strong>: 모든 원소가 동일 확률로 선택. 가장 기본</li>
<li><strong>체계적 추출 (계통추출)</strong>: 첫 번째를 랜덤 선택 후, k번째마다 추출 (예: 3번째, 13번째, 23번째...)</li>
<li><strong>층화추출</strong>: 모집단을 동질적인 그룹(층)으로 나눈 뒤, 각 층에서 추출 (예: 남/여 나눠서 각각 추출)</li>
<li><strong>군집추출 (집락추출)</strong>: 모집단을 이질적인 그룹(군집)으로 나눈 뒤, 일부 군집을 통째로 선택</li>
</ul>
<blockquote>
<p><strong>시험 포인트</strong>: 층화 vs 군집 차이</p>
<ul>
<li><strong>층화</strong>: 층 내부 동질, 층 간 이질 → 모든 층에서 추출</li>
<li><strong>군집</strong>: 군집 내부 이질, 군집 간 동질 → 일부 군집만 선택</li>
</ul>
</blockquote>
<h3 id="비확률적-표본추출">비확률적 표본추출</h3>
<ul>
<li><strong>편의추출</strong>: 접근 쉬운 대상 선택 (길거리 설문)</li>
<li><strong>판단추출</strong>: 전문가 판단으로 선택</li>
<li><strong>할당추출</strong>: 모집단 비율에 맞게 할당 (남:여 = 6:4 → 60명:40명)</li>
<li><strong>눈덩이추출</strong>: 한 응답자가 다른 응답자를 소개 (희귀집단 조사에 유용)</li>
</ul>
<hr>
<h2 id="2-5-가설검정-기초">2-5. 가설검정 기초</h2>
<h3 id="가설의-종류">가설의 종류</h3>
<ul>
<li><strong>귀무가설 (H₀)</strong>: &quot;차이가 없다&quot;, &quot;효과가 없다&quot; (현재 상태 유지)</li>
<li><strong>대립가설 (H₁)</strong>: &quot;차이가 있다&quot;, &quot;효과가 있다&quot; (연구자가 증명하고 싶은 것)</li>
</ul>
<h3 id="오류의-종류">오류의 종류</h3>
<ul>
<li><strong>1종 오류 (α, Type I)</strong>: 귀무가설이 참인데 기각함 → &quot;없는 효과를 있다고 판단&quot;</li>
<li><strong>2종 오류 (β, Type II)</strong>: 귀무가설이 거짓인데 채택함 → &quot;있는 효과를 없다고 판단&quot;</li>
<li><strong>검정력 (Power)</strong>: 1 - β. 실제 효과가 있을 때 이를 발견할 확률</li>
</ul>
<blockquote>
<p><strong>암기법</strong>:</p>
<ul>
<li>1종 오류 = <strong>무고한 사람을 유죄 판결</strong> (False Positive)</li>
<li>2종 오류 = <strong>범인을 무죄 판결</strong> (False Negative)</li>
</ul>
</blockquote>
<h3 id="p-value-유의확률">p-value (유의확률)</h3>
<ul>
<li>귀무가설이 참이라는 가정 하에, 관측된 결과(또는 더 극단적인 결과)가 나올 확률</li>
<li><strong>p-value &lt; α (유의수준, 보통 0.05)</strong> → 귀무가설 기각 → 통계적으로 유의미</li>
<li><strong>p-value ≥ α</strong> → 귀무가설 채택 (기각하지 못함)</li>
</ul>
<h3 id="주요-검정-방법">주요 검정 방법</h3>
<table>
<thead>
<tr>
<th>검정</th>
<th>용도</th>
<th>예시</th>
</tr>
</thead>
<tbody><tr>
<td>t-검정</td>
<td>두 집단의 <strong>평균</strong> 비교</td>
<td>A반 vs B반 성적 차이</td>
</tr>
<tr>
<td>ANOVA (F-검정)</td>
<td>3개 이상 집단의 <strong>평균</strong> 비교</td>
<td>A,B,C반 성적 차이</td>
</tr>
<tr>
<td>카이제곱 검정</td>
<td><strong>범주형</strong> 변수 간 독립성/적합도</td>
<td>성별과 구매 여부 관계</td>
</tr>
<tr>
<td>상관분석</td>
<td>두 <strong>연속형</strong> 변수의 관계 강도</td>
<td>키와 몸무게 관계</td>
</tr>
</tbody></table>
<hr>
<h2 id="2-6-데이터-시각화">2-6. 데이터 시각화</h2>
<h3 id="시각화-유형">시각화 유형</h3>
<ul>
<li><strong>히스토그램</strong>: 연속형 변수의 분포. 막대가 붙어있음</li>
<li><strong>막대그래프 (Bar Chart)</strong>: 범주형 변수의 빈도/크기. 막대가 떨어져있음</li>
<li><strong>박스플롯 (Box Plot)</strong>: Q1, 중앙값, Q3, 이상치를 한눈에. 분포 비교에 좋음</li>
<li><strong>산점도 (Scatter Plot)</strong>: 두 연속형 변수의 관계. 상관관계 시각화</li>
<li><strong>히트맵 (Heatmap)</strong>: 행렬 형태로 값의 크기를 색상으로 표현. 상관행렬에 자주 사용</li>
<li><strong>파이차트</strong>: 전체 대비 비율. (사실 잘 안 씀, 막대가 더 정확)</li>
<li><strong>라인차트</strong>: 시계열 데이터의 추이</li>
</ul>
<blockquote>
<p><strong>시험 포인트</strong>: 히스토그램 vs 막대그래프 차이 (연속형 vs 범주형, 붙어있음 vs 떨어져있음)</p>
</blockquote>
<hr>
<h1 id="3과목-빅데이터-모델링">3과목: 빅데이터 모델링</h1>
<h2 id="3-1-분석-모형의-분류">3-1. 분석 모형의 분류</h2>
<h3 id="지도학습-supervised-learning">지도학습 (Supervised Learning)</h3>
<ul>
<li>정답(레이블)이 있는 데이터로 학습</li>
<li><strong>분류 (Classification)</strong>: 범주형 예측 (스팸/정상, 합격/불합격)</li>
<li><strong>회귀 (Regression)</strong>: 연속형 예측 (집값, 매출액)</li>
</ul>
<h3 id="비지도학습-unsupervised-learning">비지도학습 (Unsupervised Learning)</h3>
<ul>
<li>정답 없이 데이터의 패턴/구조를 발견</li>
<li><strong>군집분석 (Clustering)</strong>: 비슷한 데이터끼리 그룹화</li>
<li><strong>차원축소</strong>: 변수 수를 줄이면서 정보는 최대한 보존 (PCA)</li>
<li><strong>연관규칙</strong>: 함께 구매되는 상품 패턴 발견 (장바구니 분석)</li>
</ul>
<h3 id="강화학습-reinforcement-learning">강화학습 (Reinforcement Learning)</h3>
<ul>
<li>환경과 상호작용하며 보상을 최대화하는 행동을 학습</li>
<li>예) 알파고, 로봇 제어</li>
</ul>
<hr>
<h2 id="3-2-회귀분석">3-2. 회귀분석</h2>
<h3 id="선형회귀-linear-regression">선형회귀 (Linear Regression)</h3>
<ul>
<li>Y = β₀ + β₁X₁ + β₂X₂ + ... + ε</li>
<li>연속형 타깃 변수를 예측</li>
<li><strong>단순선형회귀</strong>: 독립변수 1개</li>
<li><strong>다중선형회귀</strong>: 독립변수 2개 이상</li>
</ul>
<h3 id="회귀분석-주요-개념">회귀분석 주요 개념</h3>
<ul>
<li><strong>R² (결정계수)</strong>: 모델이 데이터를 얼마나 잘 설명하는지 (0~1, 1에 가까울수록 좋음)</li>
<li><strong>수정된 R² (Adjusted R²)</strong>: 변수 수 증가에 따른 R² 부풀림을 보정</li>
<li><strong>잔차 (Residual)</strong>: 실제값 - 예측값</li>
<li><strong>다중공선성</strong>: 독립변수들끼리 높은 상관관계가 있는 문제<ul>
<li><strong>VIF (분산팽창인수)</strong>: 10 이상이면 다중공선성 의심</li>
<li>해결법: 변수 제거, PCA, 릿지/라쏘 회귀</li>
</ul>
</li>
</ul>
<h3 id="로지스틱-회귀-logistic-regression">로지스틱 회귀 (Logistic Regression)</h3>
<ul>
<li>분류 문제에 사용 (이름에 회귀가 들어가지만 분류 모델!)</li>
<li>결과를 0~1 사이의 확률로 출력 (시그모이드 함수 사용)</li>
<li>이진 분류: 확률 &gt; 0.5 → 1, 아니면 → 0</li>
</ul>
<blockquote>
<p><strong>시험 포인트</strong>: 선형회귀 = 연속형 예측 (회귀), 로지스틱회귀 = 범주형 예측 (분류)</p>
</blockquote>
<hr>
<h2 id="3-3-분류-알고리즘-가장-많이-출제">3-3. 분류 알고리즘 (가장 많이 출제)</h2>
<h3 id="의사결정나무-decision-tree">의사결정나무 (Decision Tree)</h3>
<ul>
<li>트리 형태로 조건을 분기하면서 분류/예측</li>
<li>장점: 해석이 쉬움, 시각화 가능, 전처리 적게 필요</li>
<li>단점: 과적합 위험, 불안정 (데이터 조금 바뀌면 트리 크게 변함)</li>
<li><strong>분할 기준</strong>:<ul>
<li>분류: <strong>지니 지수 (Gini Index)</strong>, <strong>엔트로피 (Entropy/Information Gain)</strong></li>
<li>회귀: <strong>분산 감소</strong></li>
</ul>
</li>
<li><strong>가지치기 (Pruning)</strong>: 과적합 방지를 위해 트리를 잘라냄</li>
</ul>
<h3 id="랜덤포레스트-random-forest">랜덤포레스트 (Random Forest)</h3>
<ul>
<li>여러 개의 의사결정나무를 만들어서 다수결로 결정 (배깅 앙상블)</li>
<li><strong>Bagging + 변수 랜덤 선택</strong></li>
<li>장점: 과적합에 강함, 성능 좋음, 변수 중요도 파악 가능</li>
<li>단점: 해석 어려움 (블랙박스)</li>
</ul>
<h3 id="svm-support-vector-machine">SVM (Support Vector Machine)</h3>
<ul>
<li>두 클래스를 가장 잘 구분하는 초평면(결정경계)을 찾음</li>
<li><strong>서포트 벡터</strong>: 결정경계에 가장 가까운 데이터 포인트</li>
<li><strong>마진</strong>: 서포트벡터와 결정경계 사이의 거리. 마진을 최대화</li>
<li><strong>커널 트릭</strong>: 비선형 데이터를 고차원으로 변환해서 선형 분리<ul>
<li>선형, 다항식, RBF(가우시안), 시그모이드 커널</li>
</ul>
</li>
<li>장점: 고차원에서 성능 좋음</li>
<li>단점: 대용량 데이터에 느림, 해석 어려움</li>
</ul>
<h3 id="knn-k-nearest-neighbors">KNN (K-Nearest Neighbors)</h3>
<ul>
<li>새 데이터와 가장 가까운 K개 이웃의 다수결로 분류</li>
<li>K가 작으면: 과적합 위험, 노이즈에 민감</li>
<li>K가 크면: 과소적합, 결정 경계가 단순해짐</li>
<li><strong>거리 척도</strong>: 유클리디안, 맨해튼, 민코프스키</li>
<li>장점: 단순, 학습 불필요 (게으른 학습, Lazy Learning)</li>
<li>단점: 계산량 많음, 고차원에서 성능 저하 (차원의 저주)</li>
</ul>
<h3 id="나이브-베이즈-naive-bayes">나이브 베이즈 (Naive Bayes)</h3>
<ul>
<li>베이즈 정리 기반. 모든 특성(변수)이 서로 <strong>독립</strong>이라고 가정</li>
<li>P(클래스|특성) ∝ P(특성|클래스) × P(클래스)</li>
<li>장점: 빠름, 적은 데이터에도 잘 작동, 텍스트 분류에 강함 (스팸필터)</li>
<li>단점: 독립 가정이 현실에서 잘 안 맞음</li>
</ul>
<h3 id="xgboost--lightgbm--catboost">XGBoost / LightGBM / CatBoost</h3>
<ul>
<li>부스팅 계열 앙상블 모델. 약한 모델을 순차적으로 결합</li>
<li><strong>XGBoost</strong>: 가장 널리 사용. 정규화 포함, 병렬처리 가능</li>
<li><strong>LightGBM</strong>: 더 빠름. 대용량에 적합. Leaf-wise 분할</li>
<li><strong>CatBoost</strong>: 범주형 변수 자동 처리</li>
</ul>
<hr>
<h2 id="3-4-앙상블-ensemble-방법">3-4. 앙상블 (Ensemble) 방법</h2>
<h3 id="배깅-bagging-bootstrap-aggregating">배깅 (Bagging, Bootstrap Aggregating)</h3>
<ul>
<li>데이터를 <strong>복원추출</strong>해서 여러 모델을 만들고 결합</li>
<li>분류: 다수결, 회귀: 평균</li>
<li><strong>분산 감소</strong> 효과</li>
<li>대표: <strong>랜덤포레스트</strong></li>
</ul>
<h3 id="부스팅-boosting">부스팅 (Boosting)</h3>
<ul>
<li>이전 모델이 틀린 데이터에 <strong>가중치</strong>를 줘서 다음 모델이 집중 학습</li>
<li><strong>순차적</strong>으로 모델을 만듦</li>
<li><strong>편향 감소</strong> 효과</li>
<li>대표: AdaBoost, GBM, <strong>XGBoost</strong>, LightGBM</li>
</ul>
<h3 id="스태킹-stacking">스태킹 (Stacking)</h3>
<ul>
<li>여러 모델의 예측 결과를 <strong>새로운 모델의 입력</strong>으로 사용</li>
<li>1단계: 여러 기본 모델로 예측 → 2단계: 메타 모델이 최종 예측</li>
</ul>
<blockquote>
<p><strong>초중요 비교</strong>:</p>
<ul>
<li>배깅: 병렬, 분산↓, 랜덤포레스트</li>
<li>부스팅: 순차, 편향↓, XGBoost</li>
</ul>
</blockquote>
<hr>
<h2 id="3-5-비지도학습">3-5. 비지도학습</h2>
<h3 id="k-means-군집분석">K-Means 군집분석</h3>
<ul>
<li>K개의 중심점을 기준으로 가장 가까운 데이터를 묶음</li>
<li>과정: 중심점 초기화 → 할당 → 중심점 업데이트 → 반복</li>
<li>K를 미리 정해야 함 (엘보우 방법으로 최적 K 결정)</li>
<li>장점: 간단, 빠름</li>
<li>단점: K를 정해야 함, 구형 군집만 잘 찾음, 이상치에 민감</li>
</ul>
<h3 id="dbscan">DBSCAN</h3>
<ul>
<li>밀도 기반 군집분석. K를 정할 필요 없음</li>
<li><strong>eps</strong>: 이웃 반경, <strong>min_samples</strong>: 최소 점 개수</li>
<li>장점: 비구형 군집 발견 가능, 이상치 자동 탐지, K 불필요</li>
<li>단점: 밀도가 다양한 데이터에 약함</li>
</ul>
<h3 id="계층적-군집분석">계층적 군집분석</h3>
<ul>
<li><strong>병합형 (Agglomerative)</strong>: 개별 데이터에서 시작 → 점점 합침 (Bottom-Up)</li>
<li><strong>분할형 (Divisive)</strong>: 전체에서 시작 → 점점 나눔 (Top-Down)</li>
<li><strong>덴드로그램</strong>: 군집 병합 과정을 트리로 시각화</li>
<li>적절한 높이에서 잘라서 군집 수 결정</li>
</ul>
<h3 id="pca-주성분분석-principal-component-analysis">PCA (주성분분석, Principal Component Analysis)</h3>
<ul>
<li>차원축소 기법. 고차원 데이터를 저차원으로 변환</li>
<li>분산이 가장 큰 방향으로 새로운 축(주성분)을 만듦</li>
<li>첫 번째 주성분이 가장 많은 분산을 설명</li>
<li>장점: 다중공선성 해결, 시각화, 노이즈 제거</li>
<li>단점: 해석이 어려움 (원래 변수의 의미가 사라짐)</li>
</ul>
<h3 id="연관규칙-분석-장바구니-분석">연관규칙 분석 (장바구니 분석)</h3>
<ul>
<li>&quot;A를 사면 B도 산다&quot; 규칙 발견</li>
<li><strong>지지도 (Support)</strong>: 전체 거래 중 A와 B가 동시에 포함된 비율</li>
<li><strong>신뢰도 (Confidence)</strong>: A를 산 사람 중 B도 산 비율</li>
<li><strong>향상도 (Lift)</strong>: 신뢰도 / B의 지지도<ul>
<li>Lift &gt; 1: 양의 연관 (함께 사는 경향)</li>
<li>Lift = 1: 독립 (관계 없음)</li>
<li>Lift &lt; 1: 음의 연관 (같이 안 사는 경향)</li>
</ul>
</li>
<li><strong>Apriori 알고리즘</strong>: 최소 지지도를 만족하는 빈발 항목 집합을 찾음</li>
</ul>
<blockquote>
<p><strong>시험 포인트</strong>: 지지도/신뢰도/향상도 계산 문제 자주 출제!</p>
</blockquote>
<hr>
<h2 id="3-6-딥러닝-기초-개념만">3-6. 딥러닝 기초 (개념만)</h2>
<h3 id="인공신경망-ann">인공신경망 (ANN)</h3>
<ul>
<li>입력층 → 은닉층 → 출력층</li>
<li>각 노드는 가중치(weight)와 편향(bias)을 가짐</li>
<li>활성화 함수를 통과해서 출력</li>
</ul>
<h3 id="활성화-함수">활성화 함수</h3>
<ul>
<li><strong>시그모이드</strong>: 0~1 출력. 이진분류 출력층에 사용. 기울기 소실 문제</li>
<li><strong>ReLU</strong>: max(0, x). 은닉층에 가장 많이 사용. 기울기 소실 해결</li>
<li><strong>Softmax</strong>: 다중 클래스 분류의 출력층. 각 클래스 확률합 = 1</li>
<li><strong>tanh</strong>: -1~1 출력. 시그모이드보다 기울기 소실 적음</li>
</ul>
<h3 id="cnn-convolutional-neural-network">CNN (Convolutional Neural Network)</h3>
<ul>
<li>이미지 처리에 특화</li>
<li>합성곱층 → 풀링층 → 완전연결층</li>
<li>필터(커널)가 이미지 위를 슬라이딩하면서 특징 추출</li>
</ul>
<h3 id="rnn-recurrent-neural-network">RNN (Recurrent Neural Network)</h3>
<ul>
<li>시계열/텍스트 등 순차 데이터 처리</li>
<li>이전 상태의 출력이 다음 상태의 입력으로 들어감</li>
<li>장기 의존성 문제 → <strong>LSTM</strong>, <strong>GRU</strong>로 해결</li>
</ul>
<h3 id="과적합-방지-기법">과적합 방지 기법</h3>
<ul>
<li><strong>드롭아웃 (Dropout)</strong>: 학습 시 일부 노드를 랜덤으로 꺼둠</li>
<li><strong>조기종료 (Early Stopping)</strong>: 검증 손실이 더 이상 줄지 않으면 학습 중단</li>
<li><strong>정규화 (Regularization)</strong>: L1(Lasso), L2(Ridge)<ul>
<li>L1: 일부 가중치를 0으로 → 변수 선택 효과</li>
<li>L2: 가중치를 작게 → 과적합 방지</li>
</ul>
</li>
<li><strong>데이터 증강 (Data Augmentation)</strong>: 학습 데이터를 변형해서 늘림 (이미지 회전/반전 등)</li>
<li><strong>교차검증 (Cross Validation)</strong>: 데이터를 k개로 나눠서 k번 학습/평가</li>
</ul>
<h3 id="경사하강법-gradient-descent">경사하강법 (Gradient Descent)</h3>
<ul>
<li>손실함수를 최소화하는 방향으로 가중치를 조금씩 업데이트</li>
<li><strong>학습률 (Learning Rate)</strong>: 한 번에 얼마나 이동할지<ul>
<li>너무 크면: 발산 (최적점을 지나침)</li>
<li>너무 작으면: 학습이 너무 느림</li>
</ul>
</li>
<li>종류:<ul>
<li><strong>배치 경사하강법</strong>: 전체 데이터로 한번에 업데이트</li>
<li><strong>확률적 경사하강법 (SGD)</strong>: 데이터 1개씩 업데이트</li>
<li><strong>미니배치 경사하강법</strong>: 작은 묶음(배치)씩 업데이트 (가장 일반적)</li>
</ul>
</li>
</ul>
<h3 id="편향-분산-트레이드오프">편향-분산 트레이드오프</h3>
<ul>
<li><strong>편향 (Bias)</strong>: 모델이 너무 단순해서 패턴을 못 잡음 → 과소적합</li>
<li><strong>분산 (Variance)</strong>: 모델이 너무 복잡해서 노이즈까지 학습 → 과적합</li>
<li>둘 다 낮추긴 어렵고, 적절한 균형점을 찾아야 함</li>
</ul>
<hr>
<h1 id="4과목-빅데이터-결과-해석">4과목: 빅데이터 결과 해석</h1>
<h2 id="4-1-모델-평가-지표">4-1. 모델 평가 지표</h2>
<h3 id="분류-모델-평가">분류 모델 평가</h3>
<p><strong>혼동행렬 (Confusion Matrix)</strong>:
|  | 예측 Positive | 예측 Negative |
|--|--------------|--------------|
| 실제 Positive | TP (참긍정) | FN (거짓부정) |
| 실제 Negative | FP (거짓긍정) | TN (참부정) |</p>
<ul>
<li><strong>정확도 (Accuracy)</strong>: (TP+TN) / 전체. 전체 중 맞춘 비율</li>
<li><strong>정밀도 (Precision)</strong>: TP / (TP+FP). Positive 예측 중 실제 Positive 비율. &quot;예측의 정확성&quot;</li>
<li><strong>재현율 (Recall, Sensitivity, TPR)</strong>: TP / (TP+FN). 실제 Positive 중 맞춘 비율. &quot;놓치지 않는 능력&quot;</li>
<li><strong>F1 Score</strong>: 2 × (정밀도 × 재현율) / (정밀도 + 재현율). 정밀도와 재현율의 조화평균</li>
<li><strong>특이도 (Specificity)</strong>: TN / (TN+FP). 실제 Negative 중 맞춘 비율</li>
</ul>
<blockquote>
<p><strong>언제 뭘 중시?</strong></p>
<ul>
<li>스팸 필터: <strong>정밀도</strong> 중요 (정상 메일을 스팸으로 잘못 분류하면 안 됨)</li>
<li>암 진단: <strong>재현율</strong> 중요 (암 환자를 놓치면 안 됨)</li>
</ul>
</blockquote>
<h3 id="roc-커브--auc">ROC 커브 / AUC</h3>
<ul>
<li><strong>ROC 커브</strong>: X축=FPR(1-특이도), Y축=TPR(재현율)</li>
<li><strong>AUC</strong>: ROC 곡선 아래 면적. 0.5~1 사이<ul>
<li>AUC = 1.0: 완벽한 분류</li>
<li>AUC = 0.5: 랜덤 분류 (쓸모없음)</li>
<li>AUC &gt; 0.8이면 괜찮은 모델</li>
</ul>
</li>
</ul>
<h3 id="회귀-모델-평가">회귀 모델 평가</h3>
<ul>
<li><strong>MAE (Mean Absolute Error)</strong>: 절대 오차의 평균. 이상치에 덜 민감</li>
<li><strong>MSE (Mean Squared Error)</strong>: 오차 제곱의 평균. 큰 오차에 페널티</li>
<li><strong>RMSE (Root MSE)</strong>: MSE의 제곱근. 원래 단위와 같아서 해석 쉬움</li>
<li><strong>MAPE</strong>: 평균 절대 백분율 오차. 퍼센트로 해석 가능</li>
<li><strong>R² (결정계수)</strong>: 1에 가까울수록 좋음</li>
</ul>
<hr>
<h2 id="4-2-모델-검증개선">4-2. 모델 검증/개선</h2>
<h3 id="교차검증-cross-validation">교차검증 (Cross Validation)</h3>
<ul>
<li><strong>K-Fold CV</strong>: 데이터를 K개로 나누고, 1개를 검증용, 나머지를 학습용. K번 반복</li>
<li><strong>Stratified K-Fold</strong>: 각 폴드에서 클래스 비율을 유지 (불균형 데이터에 적합)</li>
<li><strong>LOOCV (Leave-One-Out)</strong>: K = 데이터 개수. 1개만 검증용. 정확하지만 매우 느림</li>
<li><strong>Hold-out</strong>: 단순히 학습/검증/테스트로 나눔 (보통 7:1.5:1.5 또는 8:1:1)</li>
</ul>
<h3 id="하이퍼파라미터-튜닝">하이퍼파라미터 튜닝</h3>
<ul>
<li><strong>Grid Search</strong>: 가능한 모든 조합을 시도. 정확하지만 느림</li>
<li><strong>Random Search</strong>: 랜덤으로 조합 선택. 효율적</li>
<li><strong>Bayesian Optimization</strong>: 이전 결과를 바탕으로 다음 탐색점 결정. 가장 효율적</li>
</ul>
<h3 id="피처-엔지니어링">피처 엔지니어링</h3>
<ul>
<li><strong>피처 선택 (Feature Selection)</strong>: 중요한 변수만 선택<ul>
<li>Filter: 통계적 기법 (상관계수, 카이제곱 등)</li>
<li>Wrapper: 변수 조합을 반복 시도 (전진선택, 후진제거, 단계적)</li>
<li>Embedded: 모델 학습 과정에서 자동 선택 (Lasso, 랜덤포레스트 변수중요도)</li>
</ul>
</li>
<li><strong>피처 추출 (Feature Extraction)</strong>: 기존 변수를 변환해서 새 변수 생성 (PCA)</li>
</ul>
<hr>
<h2 id="4-3-분석-결과-시각화보고">4-3. 분석 결과 시각화/보고</h2>
<h3 id="시각화-원칙">시각화 원칙</h3>
<ul>
<li>에드워드 터프티: &quot;데이터 잉크 비율&quot; 최대화 (불필요한 장식 최소화)</li>
<li>적절한 차트 유형 선택이 중요</li>
<li>왜곡 금지: 축 조작, 3D 효과로 인한 착시 등</li>
</ul>
<h3 id="분석-보고서-구성">분석 보고서 구성</h3>
<ol>
<li>분석 개요 (목적, 배경)</li>
<li>분석 방법 (데이터, 모델, 도구)</li>
<li>분석 결과 (핵심 발견)</li>
<li>결론 및 제언 (비즈니스 시사점)</li>
</ol>
<h3 id="리프트-차트--이익-도표">리프트 차트 / 이익 도표</h3>
<ul>
<li>모델의 예측 결과를 확률 높은 순으로 정렬</li>
<li>상위 몇 %를 타겟팅했을 때 얼마나 효과적인지 평가</li>
<li><strong>리프트 = 모델 반응률 / 전체 반응률</strong></li>
<li>리프트 &gt; 1이면 모델이 랜덤보다 나음</li>
</ul>
<hr>
<h1 id="자주-출제되는-비교-정리">자주 출제되는 비교 정리</h1>
<h2 id="분류-vs-회귀">분류 vs 회귀</h2>
<table>
<thead>
<tr>
<th>구분</th>
<th>분류</th>
<th>회귀</th>
</tr>
</thead>
<tbody><tr>
<td>타깃</td>
<td>범주형 (이산)</td>
<td>연속형</td>
</tr>
<tr>
<td>예시</td>
<td>스팸/정상, 합격/불합격</td>
<td>집값, 매출, 온도</td>
</tr>
<tr>
<td>평가지표</td>
<td>정확도, F1, AUC</td>
<td>RMSE, MAE, R²</td>
</tr>
</tbody></table>
<h2 id="과적합-vs-과소적합">과적합 vs 과소적합</h2>
<table>
<thead>
<tr>
<th>구분</th>
<th>과적합 (Overfitting)</th>
<th>과소적합 (Underfitting)</th>
</tr>
</thead>
<tbody><tr>
<td>원인</td>
<td>모델이 너무 복잡</td>
<td>모델이 너무 단순</td>
</tr>
<tr>
<td>학습 성능</td>
<td>높음</td>
<td>낮음</td>
</tr>
<tr>
<td>테스트 성능</td>
<td>낮음</td>
<td>낮음</td>
</tr>
<tr>
<td>해결</td>
<td>정규화, 드롭아웃, 데이터 추가</td>
<td>모델 복잡도 증가, 피처 추가</td>
</tr>
</tbody></table>
<h2 id="배깅-vs-부스팅">배깅 vs 부스팅</h2>
<table>
<thead>
<tr>
<th>구분</th>
<th>배깅</th>
<th>부스팅</th>
</tr>
</thead>
<tbody><tr>
<td>학습</td>
<td>병렬 (독립적)</td>
<td>순차 (의존적)</td>
</tr>
<tr>
<td>줄이는 것</td>
<td>분산</td>
<td>편향</td>
</tr>
<tr>
<td>과적합</td>
<td>상대적으로 안전</td>
<td>과적합 가능</td>
</tr>
<tr>
<td>대표</td>
<td>랜덤포레스트</td>
<td>XGBoost, AdaBoost</td>
</tr>
</tbody></table>
<h2 id="l1-vs-l2-정규화">L1 vs L2 정규화</h2>
<table>
<thead>
<tr>
<th>구분</th>
<th>L1 (Lasso)</th>
<th>L2 (Ridge)</th>
</tr>
</thead>
<tbody><tr>
<td>페널티</td>
<td>가중치 절대값 합</td>
<td>가중치 제곱 합</td>
</tr>
<tr>
<td>효과</td>
<td>일부 가중치를 0으로 (변수 선택)</td>
<td>가중치를 작게 (축소)</td>
</tr>
<tr>
<td>용도</td>
<td>불필요한 변수 제거</td>
<td>다중공선성 해결</td>
</tr>
</tbody></table>
<hr>
<h1 id="기출-빈출-키워드-모음">기출 빈출 키워드 모음</h1>
<blockquote>
<p>아래 용어들은 기출에서 반복적으로 나오는 것들. 뜻만 기억해두면 됨.</p>
</blockquote>
<ul>
<li><strong>ETL</strong>: Extract(추출), Transform(변환), Load(적재). 데이터 이관 프로세스</li>
<li><strong>EDA (탐색적 데이터 분석)</strong>: 데이터를 시각화/요약하면서 특성 파악</li>
<li><strong>데이터 레이크</strong>: 원본 데이터를 그대로 저장하는 대규모 저장소</li>
<li><strong>데이터 웨어하우스</strong>: 분석용으로 정제/변환된 데이터 저장소</li>
<li><strong>데이터 마트</strong>: 특정 부서/주제용 소규모 웨어하우스</li>
<li><strong>OLAP</strong>: 다차원 데이터 분석 (드릴다운, 롤업, 슬라이싱, 다이싱)</li>
<li><strong>OLTP</strong>: 실시간 트랜잭션 처리 (일반 서비스 DB)</li>
<li><strong>데이터 거버넌스</strong>: 데이터 관리 정책/프로세스/조직 체계</li>
<li><strong>메타데이터</strong>: 데이터에 대한 데이터 (테이블 스키마, 데이터 사전 등)</li>
<li><strong>데이터 리니지</strong>: 데이터의 출처와 변환 이력 추적</li>
<li><strong>A/B 테스트</strong>: 두 버전을 비교하는 실험 (통제군 vs 실험군)</li>
<li><strong>특성 공학 (Feature Engineering)</strong>: 원본 데이터에서 모델에 유용한 변수를 만들어내는 과정</li>
<li><strong>차원의 저주</strong>: 차원(변수)이 너무 많으면 데이터가 희박해져서 성능이 떨어지는 현상</li>
<li><strong>불균형 데이터</strong>: 클래스 비율이 극단적 (예: 사기거래 0.1%). 오버샘플링(SMOTE)/언더샘플링으로 해결</li>
<li><strong>SMOTE</strong>: 소수 클래스의 합성 데이터를 생성하는 오버샘플링 기법</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[UV말고 uv에 대해 알아보기]]></title>
            <link>https://velog.io/@2joon_kim/UV%EB%A7%90%EA%B3%A0-uv%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@2joon_kim/UV%EB%A7%90%EA%B3%A0-uv%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Tue, 05 Aug 2025 14:11:00 GMT</pubDate>
            <description><![CDATA[<p>어느덧 시간이 이렇게..
조교활동을 하며 이것 저것 글을 굉장히 많이 적었었다
이제는 내 벨로그에도 슬슬 옮겨 담아야겠다...</p>
<p>요 근래 이것저것 글을 엄청나게 정리했지만 따로
정리활동을 하질 않았는데 이제는 정말 정리하기 시작해야지..
이전 uv를 사용하며 빠른 속도와 간단한 명령어로 싹 다 갈아엎어지고 있단 소식을 듣고
부랴 부랴 수강생분들을 위해 글을 작성해 놓았었다.
나중에 보기 위해 글을 적어 본다</p>
<hr>
<h2 id="❗️우선-uv에-대해서">❗️우선 uv에 대해서</h2>
<p>먼저 uv 는 <strong>astral</strong> 이라는 기업에서 만든 
파이썬 패키지 및 프로젝트 관리 도구이다
Rust라는 언어를 기반으로 만들어진 도구로서 python의 장점과 
Rust의 장점들을 합쳐 만든 도구라고 생각하면 된다</p>
<h3 id="uv가-왜-빠르냐"><strong>uv가 왜 빠르냐?</strong></h3>
<p>수강생을 위한 글로 쉽게 예를 들어 썼기 때문에
지금 정리를 하는 와중에도 참 정리를 잘 했구나 생각하며 글을 쓴다.</p>
<p>uv는 ‘BMW’고  pip은 ‘삼천리 자전거’라고 생각하시면 편할 거 같다
당연히 차가 자전거보다 빠르다;</p>
<p>너무 ez한 비유라 확 안 와닿으시겠지만 아래에 설명을 보면 이해가 쉽다</p>
<p>❗️<strong>우선 uv는 Rust로 만들어져서 굉장히 빠르다</strong></p>
<ul>
<li>Rust는 <strong>기계어 수준으로 번역</strong>돼서 바로 실행이 된다
python은 인터프리터 언어이기 때문에 하나 하나 해석이되며 실행이 된다</li>
<li>그렇기에 pip은 Python으로 짜여서 <strong>하나하나 해석하면서</strong> 실행한다.
→ 그럼 당연히 <strong>기계어로 바로 달리는 Rust라는 언어가 훨씬 빠르다</strong></li>
</ul>
<p>❗️<strong>여러 작업을 한꺼번에 진행한다</strong></p>
<ul>
<li>우리가 원래 사용하던 pip는 “하나 다운받고 하나 설치하고…” 순서대로 진행된다</li>
<li>반면에 uv는 “모두 동시에 다운받고 동시에 설치를 진행..”하기에 속도 자체가 달라진다
→ pip는 한 사람이 차례차례 일 쳐낼 때 <strong>uv는 사람 10명이 동시에 일을 쳐내는 느낌.</strong></li>
</ul>
<p>❗️<strong>쓸데없는 짓을 하지 않는다 = 체크하는 부분이 없다</strong> </p>
<ul>
<li>pip는 설치하면서 종속성 체크 여러 번 하고 캐시도 만들며 다양한 체크를 한다.
(우리가 vscode를 쓰며 흔히 봤던 <code>__pycache__</code> 처럼)</li>
<li>하지만 uv는 이걸 <strong>엄청 똑똑하게 미리 정리</strong>해서 최소한만 진행한다
→ 그래서 체크 / 캐시 생성 이런 부분들이 없으니 훨씬 빠르다</li>
</ul>
<h2 id="✅-3줄-요약"><strong>✅ 3줄 요약</strong></h2>
<ul>
<li><strong>Rust</strong>로 만들어서 더 빠르게 움직인다</li>
<li><strong>여러 개를 한꺼번에 처리하기에 빠르다</strong></li>
<li><strong>덜 복잡하게 일</strong>하니까 빠른 거다</li>
</ul>
<hr>
<h2 id="❗️장점">❗️장점?</h2>
<p>장점으로는 여러가지가 있겠지만 우리가 직접적으로 느껴볼 수 있는 장점 중 하나는
<strong>패키지 설치가 엄청나게 빠르다</strong>는 거다 
직접 사용해보았기에 패키지 및 라이브러리 설치시 
거의 1초도 안걸리고 완료되는 터미널 창을 항상 목격한다
실제로 astral의 uv의 introduce 부분을 가보면 각 도구들간의 속도비교를 해놓은 표가 있다</p>
<p><img src="https://velog.velcdn.com/images/2joon_kim/post/e3d58e1a-6587-4c69-804f-a6a6604ed5c1/image.png" alt=""></p>
<p>poetry를 사용할 때도 그렇게 불편함을 느끼지 못했는데 0.06초만에 설치가 된다는 점
당연히 우리나라사람들은 빠르면 장땡이기에 안 쓸 이유가 없다</p>
<p>⭐️ 이건 여담인데 uv 출시 이후 1년 동안 약 50k의 깃허브 스타를 받았다고 한다. (작성일 기준 63k)
== 인스타 좋아요 및 저장수가 거의 50k에 육박했다 ㅇㅇ</p>
<p>이제 이 uv에 대해서 어느정도 개념이 잡혔다
또한 uv 공홈에서는 uv가진 장점들에 대해 자세하게 다뤄놓았다
아래는 그 장점들만 나열한 부분이다</p>
<pre><code class="language-markdown">🛠 uv의 핵심 기능 요약 (한글 번역)

    •    🚀 pip, pip-tools, pipx, poetry, pyenv, twine, virtualenv 등을 모두 대체하는 통합 도구
    •    ⚡️ pip보다 10~100배 더 빠름
    •    📁 범용 락파일을 사용하는 완전한 프로젝트 관리 기능 제공
    •    🌟 스크립트 실행 지원, 의존성도 코드에 직접 적을 수 있음
    •    🐍 Python 버전 설치 및 관리 가능 (pyenv처럼!)
    •    🔧 Python 패키지로 배포된 도구들도 설치 및 실행 가능
    •    🔄 pip과 호환되는 인터페이스, 익숙한 CLI + 빠른 속도
    •    🧩 Cargo 스타일의 워크스페이스(Rust처럼 여러 프로젝트 관리) 지원
    •    💾 전역 캐시(global cache) 로 디스크 공간 절약 + 의존성 중복 제거
    •    ⬇️ Rust나 Python 없이도 설치 가능, curl이나 pip로 설치 지원
    •    🖥 macOS, Linux, Windows 모두 지원</code></pre>
<p>그대로 번역만 하여 사용하여 가지고 왔다
더 관심이 간다면 공식 홈페이지에 가서 살펴보도록 하자</p>
<hr>
<h2 id="끝으로">끝으로</h2>
<p>이처럼 uv를 직접 활용해봤다면
개발 환경을 효율적으로 관리하는 데 큰 도움이 될 것이다</p>
<p>특히 현재 내가 주력으로 사용하고 있는 Python 언어는
데이터 분석과 머신러닝 분야에서 광범위하게 활용되는 언어이다
그만큼 다양한 패키지와 복잡한 의존성 관리를 요구하게 되는데 
이런 상황에서 <strong>uv는 단순한 패키지 설치 도구를 넘어선 강력한 관리 도구</strong>로 주목받고 있다</p>
<p>최근에는 많은 개발자들이 <strong>pip 대신 uv를 채택</strong>하고 있으며 
특히 reproducible(재현 가능한) 환경 구축이 중요한 
<strong>데이터 사이언스 및 머신러닝 프로젝트</strong>에서 유용하게 사용된다고 한다</p>
<p>따라서 앞으로 머신러닝, 딥러닝, AI 개발 등 더 전문적인 Python 생태계로 나아가고자 한다면 
uv에 대한 기본적인 이해와 활용법을 익혀두는 것이 도움이 되기에 글을 적는다</p>
<p><a href="https://astral.sh/">uv 제작사 공식 홈페이지</a>
<a href="https://docs.astral.sh/uv/">uv 공식 문서</a>
<a href="https://github.com/astral-sh/uv">uv 공식 Github</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[맥북에서 윈도우11 부팅 USB만들기]]></title>
            <link>https://velog.io/@2joon_kim/%EB%A7%A5%EB%B6%81%EC%97%90%EC%84%9C-%EC%9C%88%EB%8F%84%EC%9A%B011-%EB%B6%80%ED%8C%85-USB%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@2joon_kim/%EB%A7%A5%EB%B6%81%EC%97%90%EC%84%9C-%EC%9C%88%EB%8F%84%EC%9A%B011-%EB%B6%80%ED%8C%85-USB%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Wed, 26 Feb 2025 16:02:20 GMT</pubDate>
            <description><![CDATA[<p><del>정말 쉬웠다</del>
과거에는 USB 포맷팅이 Fat32 로 한정적으로 되어있었기 때문에
윈도우 부팅시스템에 존재하는 install.wim파일을
한번에 usb안에 담을 수 없었는데</p>
<p>요즘은? USB에다가 exFAT으로 포맷팅이 가능하기 때문에 
그냥 복사붙여넣기만 하면 끗이다 ^^
어려운 사람이 있을 거 같아 남겨놓는다</p>
<hr>
<p><strong>라고 생각했으나 천만의 말씀 콩떡의 말씀 전혀 아니었네 ^^</strong>
macOS에서 Windows 설치 USB를 만들 때 
Windows 부팅을 지원하는 포맷은 FAT32뿐이다..</p>
<p>나는 그것도 모르고 멍청하게 exFAT로 만들어서 
헤헤헤 거리고 있었으니 이 얼마나 어리석은가
아래 내용을 확인하자..</p>
<h3 id="❗️-exfat-포맷팅이-윈도우에서-안-되는-이유">❗️ exFAT 포맷팅이 윈도우에서 안 되는 이유</h3>
<ol>
<li><p>Windows 부팅 로더(bootloader)가 exFAT을 지원하지 않음
• Windows 설치 과정에서 부팅 가능한 드라이브는 FAT32 또는 NTFS만 가능
• 하지만 macOS에서는 NTFS에 쓰기 불가능 그래서 NTFS도 못 씀</p>
</li>
<li><p>UEFI 부팅에서는 FAT32가 기본 포맷임
• BIOS/UEFI 펌웨어는 기본적으로 FAT32를 요구함
• exFAT은 부팅 디스크로 사용할 수 없음</p>
</li>
</ol>
<p>더욱 더 불편한 사실은 FAT32는 단일 파일 크기 제한(4GB)이 있어서
4GB 이상은 들어가지 않아 문제가 생긴다..
Windows 10/11 ISO의 <strong>install.wim 파일</strong>(이 놈이 문제) 요게 4GB를 
초과하는 파일이기 때문에 문제가 생긴다..</p>
<p>포맷팅에 대해 좀 자세하게 알고 넘어가자
역시 알면 더 도움이 된다..</p>
<hr>
<h3 id="❗️부팅-디스크-만들기-youtube">❗️부팅 디스크 만들기 Youtube</h3>
<p>그래서 부랴부랴 검색하고 이것저것 찾아본 결과
한 위인분께서 우리에게 방법을 알려주셨다</p>
<p><a href="https://youtu.be/qtDSnKHeKRM?si=OjHB_ABo7aRB4tGM"><img src="https://img.youtube.com/vi/qtDSnKHeKRM/0.jpg" alt=""></a>
<em>출처: <a href="https://www.youtube.com/@BIGMANIT">BIGMAN:IT</a></em></p>
<p>정말 정말 감사합니다... 제 시간을 아껴주셨어요..
2025년도 축복받으세용 👍🏻👍🏻👍🏻</p>
<hr>
<p>유튜브를 보고 따라만 하면 부팅디스크가 생긴다!!!
하지만 바쁜 미래의 내가 또 
맥북에서 부팅디스크를 만들일이 생길까봐
간단하게 요약하여 정리해놓는다</p>
<p>준비물 : 아무 USB (최소 5GB 이상)
순서는 아래와 같다</p>
<h3 id="❗️부팅-디스크-만들기-요약">❗️부팅 디스크 만들기 요약</h3>
<ol>
<li><p><a href="https://www.microsoft.com/ko-kr/software-download/windows11">Windows 11 ISO 다운로드</a></p>
</li>
<li><p>USB 포맷 진행 (FAT32로 진행하기 위해 현재 <strong>2025.02.26</strong> 기준 MS-DOS(FAT32)로 포맷팅)
⚠️ 디스크 유틸리티 들어가보면 포맷하기 나옴
⚠️ MS-DOS로 설정하고 포맷을 진행할 것</p>
</li>
</ol>
<ol start="3">
<li><p>다운로드 완료 시 <code>brew</code>로 <code>Wimlib</code> 설치</p>
<pre><code class="language-bash">brew install wimlib</code></pre>
</li>
<li><p>다운받은 ISO마운트하여 안에 내용물 확인하기
정상적으로 다운로드가 되었는지 확인!!!!</p>
</li>
<li><p>포맷 진행한 USB에 install.wim을 제외한 파일 복사</p>
<pre><code class="language-BASH">rsync -av [원본 파일 위치 = ISO내용물 경로] [사본 저장 위치 = USB] --exclude install.wim</code></pre>
</li>
<li><p>4GB 이상 install.wim 파일 분할하여 USB에 삽입</p>
<pre><code class="language-bash">wimlib-imagex  split  [wim 경로와 파일 이름]  [swm 파일 저장 위치와 파일 이름]  [분할 용량 MB]</code></pre>
</li>
</ol>
<hr>
<p>완벽하게 구동이 끝나고 나면 설치디스크 설정 완료이다
어제 부랴부랴 노트북을 받고 부팅디스크로 윈도우를 설치했는데
문제없이 잘 부팅되었고 FreeDOS환경에서 문제가 하나도 없었다!</p>
<p>이렇게 또 하나 배워간다..
USB 포맷팅은 생소했는데 나중에 견문이나 넓힐 겸 한번
탐구해보도록 하겠다 끗구해보도록 하겠다 끗</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로세스간의 통신 feat.아내노트북진짜 ㅡㅡ]]></title>
            <link>https://velog.io/@2joon_kim/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%84%EC%9D%98-%ED%86%B5%EC%8B%A0-feat.%EC%95%84%EB%82%B4%EB%85%B8%ED%8A%B8%EB%B6%81%EC%A7%84%EC%A7%9C-%E3%85%A1%E3%85%A1</link>
            <guid>https://velog.io/@2joon_kim/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%84%EC%9D%98-%ED%86%B5%EC%8B%A0-feat.%EC%95%84%EB%82%B4%EB%85%B8%ED%8A%B8%EB%B6%81%EC%A7%84%EC%A7%9C-%E3%85%A1%E3%85%A1</guid>
            <pubDate>Tue, 25 Feb 2025 02:42:09 GMT</pubDate>
            <description><![CDATA[<p>프로세스간의 통신이다..
이제 곧 끝이 보인다
아 너무 배고프다..
나 왜 다이어트하고 있지..
다이어트 안하고 치킨먹고싶다..
아 그리고 노트북 너무 비싸다..
진짜 이거 세계의 음모가 틀림없다..<del>(nvida의 독주를 멈춰주세요 트람푸님)</del>
오늘은 꼭 사야지..</p>
<hr>
<h3 id="📌-메모리의-이해">📌 메모리의 이해</h3>
<p>메모리(RAM)는 CPU가 직접 접근해서 작업할 수 있는 임시 저장공간이다
컴퓨터를 켜놓은 동안만 데이터가 보존되는 휘발성 저장장치라고 생각하면 된다
내가 어떤 프로그램을 구동하거나 실행할 때 메모리를 통해 
임시 저장되고 실행되어 돌아간다고 생각하면 편하다</p>
<p>✅ 유식하게 짚고 넘어가자
CPU와 직접 통신하는 가장 빠른 저장장치
컴퓨터가 켜져 있는 동안만 데이터 유지
프로그램이 실행되려면 반드시 메모리에 로드되어야 함
용량이 클수록 동시에 더 많은 프로그램 실행 가능</p>
<p>메모리는 컴퓨터의 임시&#39;작업대&#39;
여러가지 필요한 도구와 재료를 올려놓고 작업하는 공간</p>
<p>✅ 쉬운 예를 들어 설명함</p>
<ol>
<li>책장(HDD/SSD)에서 필요한 책들을 꺼내 책상(RAM)에 올려놓고</li>
<li>책상 위에 있는 책들만 바로 읽고 활용해버림</li>
<li>책상이 작으면(메모리 부족) 책 몇개 던져버리고 하나씩이라도 꺼내서 공부해야함</li>
<li>공부가 끝나면 책상을 치움(컴퓨터 종료 시 메모리 초기화)</li>
</ol>
<p>✅ 실제 크롬 브라우저를 예</p>
<ol>
<li>크롬 아이콘 클릭 → 크롬 프로그램이 SSD에서 메모리로 로드됨</li>
<li>여러 탭 열기 → 각 웹페이지도 메모리에 로드됨</li>
<li>메모리가 부족하면 → 크롬이 버벅거리거나 다른 프로그램이 느려짐</li>
</ol>
<p>이래서 메모리는 많으면 많을수록 좋다는 소리가 여기서 나오는거다
<strong>&#39;다다익램&#39;</strong> 이라고 메모리가 많으면 여러개의 프로그램을 다양하게 켜놔도
컴퓨터가 다 저장할 수 있기 때문에!!!</p>
<hr>
<h3 id="📌-가상-메모리-관리">📌 가상 메모리 관리</h3>
<p>물리적 메모리(RAM)보다 더 큰 메모리 공간이 필요할 때 사용하는 기술이다
하드디스크나 SSD의 일부를 메모리처럼 사용하는 방식
예를 들어 게임이나 3D렌더링 이런 고사양 작업들을 할때는 메모리만으로는
당연히 부족하다 예를 들어서 쉽게 설명하자면
대형 스크린을 설치해야되는데 책상(메모리)에 스크린 부속품들을 깔아놓고 조립하기에는
너무 공간적 제약도 있고 이것저것 부품들을 조립하는데 시간이 오래걸리니까
책상보다 더 큰 공간(SSD/HHD)에서도 사용할 수 있게끔 도와주는게 가상메모리라고 생각하면 된다</p>
<hr>
<p>✅ 작동 원리
물리적 메모리와 하드디스크의 일부<strong>(페이징 파일/스왑 공간)</strong>를 합쳐서 사용
<strong>당장 안 쓰는 데이터는 디스크로 임시 이동(스왑 아웃)</strong> = 요거 기억
<strong>필요할 때 다시 물리적 메모리로 가져옴(스왑 인)</strong> = 요것도 기억</p>
<p>✅ 장단점에 대해 알아보자
👍🏻 장점</p>
<ol>
<li>RAM보다 더 많은 프로그램 실행 가능</li>
<li>메모리 부족 상황에서도 시스템 안정성 유지</li>
</ol>
<p>👎🏻 단점</p>
<ol>
<li>디스크 접근은 RAM보다 훨씬 느림</li>
<li>과도한 스왑은 성능 저하의 원인</li>
</ol>
<hr>
<p>❗️ 가상메모리를 실제 컴퓨터에서 구동되는 예를 들어 설명해봄
예를 들어 4GB RAM(메모리)을 가진 컴퓨터에서 작업 진행
(오우 너무 낮게잡았나;; <del>4GB메모리면 컴터 갖다버릴듯;</del>)</p>
<p>여튼 진짜 쉽게 생각해서
포토샵(3GB), 크롬(2GB), 워드(1GB)를 동시에 실행 → 총 6GB 필요</p>
<p>가상 메모리가 없으면? = 모든 프로그램을 동시에 실행 불가능</p>
<p>가상 메모리가 있으면?
➡️ 현재 사용 중인 프로그램(포토샵)은 RAM에 유지
➡️ 백그라운드 프로그램(워드)은 디스크로 임시 이동
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↪️ 이때 하드디스크 성능에 따라 잔렉 발생 (왜냐? 디스크로 컴터가 멱살잡고 디스크로 던져야되니까)
➡️ 워드를 클릭하면 다시 RAM으로 로드되고 대신 다른 프로그램이 디스크로 이동
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;↪️ 요때도 성능에 따라 잔렉 발생 (왜냐? 애가 디스크에 던져져있으면 다시 멱살잡고 꺼내와야되니까)</p>
<hr>
<p>이게 바로 우리의 과거 쓰렉 컴터들이 렉이 걸리는지에 대한 이유다 
특히 나는 극공감이 가능한건 어렸을 때 그렇게 좋지 않은 하드디스크가 달린 컴퓨터를 쓸 때
&quot;아니 왜 도대체 프로그램을 전환할 때 가끔 렉이 걸리는지 이해가안가네;;&quot; 할때가 굉장히 많았다
그래서 이것 또한 성능이 좋은 HHD/SSD를 쓴다면 전혀 문제가 되질 않는다 ^^</p>
<p>아 그리고 <strong>요즘은 HHD보단 SSD를 더 많이 사용</strong>하는 추세이다
물론 사용하는 서비스나 기업인지 개인인지에 따라 다르겠지만
개인 컴퓨터의 경우 <strong>SSD가 훨씬 성능</strong>면에서 뛰어나다</p>
<hr>
<p>정말 간략하게 짧게 정리하고 넘어가겠다
일단 큰 둘의 큰 차이점은 아래와 같다
아 근데 차이점이 너무 많은데 하나하나 설명하기는 양이 너무많고
큰 차이점들만 적어두겠다</p>
<p><strong>작동방식</strong>
HDD: 물리적인 디스크(플래터)가 회전하며 기계적으로 데이터를 읽고 씀
SSD: 반도체 메모리 칩을 사용해 전기적으로 데이터를 저장 (움직이는 부품 없음)</p>
<p><strong>속도</strong>
HDD: 상대적으로 느림 (디스크 회전 속도에 의존, 보통 5400<del>7200 RPM)
SSD: 매우 빠름 (HDD보다 5</del>10배 빠른 읽기/쓰기 속도)</p>
<p>일단 작동방식에서부터 물리적으로 돌리는거랑 현대문물의 빛과도 같은 반도체를 이용해서 왔다갔다 하는건
속도에서 정말 차이가 크다 하지만 SSD보다 더 많은 양을 저장할 수 있는건 당연 HHD이다
(아직까지 현대 기술력으로 정말 용량이 어마무시한 HHD를 따라가기엔 SSD의 발열과 기술적 제약 + money problem ^^ 으로 인해 한계가 있다고 한다)
= <del>근데 사실 거의 다 따라잡음; 요즘에 SSD가격 내리고 있음 쏴리질ㄹ러</del></p>
<p>그 래 서
노트북이나 경량급 데스크탑을 만들때는 SSD가 필수로 들어가며
속도가 중요하지 않은 서비스 (클라우드 / 서버 등등) 이런곳에서는 아직도 HHD를 사용하고 있다
관련 예시는 조금 더 나중에 다양하게 정리해봐야겠다</p>
<hr>
<h3 id="📌-페이지-교체">📌 페이지 교체</h3>
<p>그냥 단순 페이지 교체하는거 아냐? 할 수 있는데 컴퓨터에서는 다르다
가상 메모리에서 <strong>어떤 페이지를 메모리에 유지</strong>하고
<strong>어떤 페이지를 디스크로 내보낼지 결정</strong>하는 알고리즘이다</p>
<p>이것도 메모리 관련 얘기라 메모리에 적을까 하다가 요건 
알고리즘이 들어가서 따로 정리하기로 했다
요건 그냥 이렇게 알고리즘이 있다 정도로 정리하기로 했다</p>
<p><strong>❗️ 주요 페이지 교체 알고리즘</strong></p>
<p><strong>1. FIFO (First In First Out)</strong>
가장 오래된 페이지부터 교체
구현이 간단하지만 효율적이지 않음
<strong>= 이거 안씁니다 과거의 영광이라 생각합시다</strong></p>
<p><strong>2. LRU (Least Recently Used)</strong>
가장 오랫동안 사용되지 않은 페이지 교체
자주 사용하는 페이지는 메모리에 유지됨
<strong>= 현대 OS에서 많이 사용되고 이것만!!! 지금도 쓰는 알고리즘이라고 함</strong></p>
<p><strong>3. LFU (Least Frequently Used)</strong>
사용 빈도가 가장 낮은 페이지 교체
과거 인기 페이지가 오래 남는 문제 있음
<strong>= 이건 위쪽의 LRU와 혼합해서 쓴다고 함 그래도 자주 쓰는 인기 페이지가 계속 남는 바람에
이거 또한 요즘엔 혼합 or 사용을 안하는 알고리즘이다</strong></p>
<hr>
<p>❗️ 페이지 교체 예제
👍🏻 가장 보편적으로 사용되는 LRU 알고리즘
여러분의 책상(RAM)에는 책 3권만 올려놓을 수 있다고 가정하자</p>
<p>처음에 수학, 영어, 과학 책을 올려둠
수학 책을 봄 → 최근 사용 시간 갱신</p>
<p>이제 국어 책 읽을 타이밍임 고럼 아래와 같이 행동을 함
➡️ 책상에 공간이 없으므로 하나를 치워야 함
(LRU 알고리즘 = 가장 오랫동안 보지 않은 책을 치움)
➡️ 영어나 과학 중 더 오래전에 본 책을 치우고 국어 책을 올림</p>
<p>❗️ 이제 실제 게임으로 들어가보자
➡️ 게임 실행 중 → 게임 데이터가 RAM에 로드됨
➡️ 공략볼라고 잠시 브라우저로 전환 → 브라우저 데이터가 RAM에 로드됨
➡️ RAM이 부족하면 → LRU에 따라 현재 안 쓰는 게임의 일부 데이터가 디스크로 이동(잔렉발생)
➡️ 다시 게임으로 돌아가면 → 디스크에 있던 데이터가 다시 RAM으로 로드됨(잔렉+로딩 발생)</p>
<p>물론 요즘의 컴퓨터는 거의 그럴일이 없다 왜냐?
지금 공부하는 이 모든것들이 동작이 이렇게 된다 라는것만 알면 되고
현재 나와있는 PC들은 성능이 너무 좋기때문에 우리가 잔렉을 경험할일이 거의 없다(구석기 컴퓨터제외)</p>
<p>그래서 8GB RAM과 16GB RAM의 차이가 느껴지는 이유다 
디스크로의 스왑이 줄어들수록 시스템이 더 빠르게 동작하니까</p>
<h4 id="그래서-결론은-뭐다-다다익램">그래서 결론은 뭐다? &#39;다다익램&#39;</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[운영체제의 원리 feat.노트북 구매로 인한 자연공부]]></title>
            <link>https://velog.io/@2joon_kim/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%9D%98-%EC%9B%90%EB%A6%AC-feat.%EB%85%B8%ED%8A%B8%EB%B6%81-%EA%B5%AC%EB%A7%A4%EB%A1%9C-%EC%9D%B8%ED%95%9C-%EC%9E%90%EC%97%B0%EA%B3%B5%EB%B6%80</link>
            <guid>https://velog.io/@2joon_kim/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%9D%98-%EC%9B%90%EB%A6%AC-feat.%EB%85%B8%ED%8A%B8%EB%B6%81-%EA%B5%AC%EB%A7%A4%EB%A1%9C-%EC%9D%B8%ED%95%9C-%EC%9E%90%EC%97%B0%EA%B3%B5%EB%B6%80</guid>
            <pubDate>Mon, 24 Feb 2025 13:55:38 GMT</pubDate>
            <description><![CDATA[<p>운영체제에 대해 학습하고 있다
어떻게 아다리가 딱딱 맞아 떨어져서
노트북을 구매하기 위해 최신 운영체제 정보부터 시작하며
컴퓨터 성능에 대해 밤낮으로 탐구하고 있었는데
학습기간이 딱 맞아 떨어졌다</p>
<p>그래서 진짜..거짓없이 최신 운영체제의 정보는
진짜 용산에서 판매하시는 분들과 견줄 수 있을만큼
견고하다고 자부할 수 있다..
<del>(이게 돈이 걸리니까 아 강제로 밤낮으로 노트북탐구를 진짜 미친듯이 하다보니까 미쳐버릴ㄹ거같음 하)</del>
진짜 <strong>노트북 드럽게 비싸다</strong>
조금만 원하는 사양 넣어두면 +100만원은 기본이다 ^^
여튼 이제 조만간 원하는 노트북은 구매를 할 것 같다 물론 내 피같은 돈을 빼가면서 ^^
당분간 점심을 굶게생겼다.. 하</p>
<hr>
<h3 id="📌-운영체제란">📌 운영체제란?</h3>
<p>일단 운영체제부터 짚고 넘어가자 
쉽게 설명하자면 운영체제란 컴퓨터라는 기계 안에
우리가 어떤 작업(게임, 문서 인터넷서핑 등)을 실행하기 위해
기본적으로 그 작업들을 할 수 있게 도와주는 역할을 하고 있는 것을 운영체제라고 말한다
어딘가에 말할 수 있게끔 정리를 해보자면</p>
<p><strong>CPU, 메모리, 하드디스크 등 컴퓨터의 물리적 자원을 효율적으로 관리할 수 있고
사용자와 컴퓨터간의 상호작용을 도와주는 환경을 제공해주는 것을 운영체제라고 할 수 있다</strong></p>
<hr>
<h3 id="📌-컴퓨터-하드웨어-구조">📌 컴퓨터 하드웨어 구조</h3>
<p>사실 요즘 하드웨어의 정보는 진짜 빠삭하다 ^^ 그놈의 노트북 때문에 진짜 하
기본적으로 나눠보자면 *<em>CPU, 메모리(RAM), 저장장치(hdd/ssd), 메인보드, 전원공급장치(psu) *</em>
정도로 볼 수 있다 (그래픽카드는 넣지 않았다 = 할말이 너무 많아짐)</p>
<p><strong>CPU</strong> 
제어장치와 연산장치로 구성되어 있으며 컴퓨터의 뇌라고 보면된다
이게 좋으면 좋을 수록 연산이 잘되니 당연히 다양한 작업시 막힘없이 진행할 수 있다
중요한 내용만 간략하게 간추리고 넘어가자</p>
<p>CPU는 코어와 스레드로 이루어져 있는데</p>
<p>코어(Core): 실제 작업을 처리하는 CPU의 핵심 연산부품이고</p>
<p>스레드(Thread): 하나의 코어가 동시에 처리할 수 있는 작업 단위이다
(요즘은 CPU도 좋아져서 1코어당 2개의 스레드를 처리할 수 있다고 생각하면 된다)</p>
<p>클럭속도(Clock Speed): CPU의 처리 속도를 나타내며 GHz 단위로 표시된다 
(예를 들어 3.5GHz는 1초에 35억 번의 연산이 가능하다는 의미)</p>
<p><strong>메모리(RAM)</strong>
임시 저장공간으로 작동하는 시스템이며 메모리가 높으면 높을수록
우리가 다양한 작업들을 소화할 수 있게 도와준다
램은 듀얼채널로도 구성이 가능한데 = 2개꼽을 수 있음
(이건 좀 심화과정의 하드웨어 기술이니 그냥 알아만두자 많으니까 더 많이 작업을 할 수 있다 정도?)</p>
<p><strong>저장장치(hdd/ssd)</strong>
메모리와는 다르게 임시 저장공간이 아닌 컴퓨터 안에 영구적으로 저장할 수 있는 장치를 뜻한다
당연히 hdd와 ssd의 용량이 높으면 높을수록 저장할 수 있는 용량이 많다!
(요즘엔 hdd보다는 ssd를 더 많이 사용하는데 ssd의 이점은 따로 정리하려고 한다!)</p>
<p><strong>메인보드</strong>
모든 하드웨어 부품을 연결하는 기판이다 각 부품 간의 데이터 전송을 담당하고 있으며
메인보드의 사양이 높으면 높을수록 위에서 설명한 부품들을 더 많이 더 좋은사양으로 탑재가 가능하다</p>
<p><strong>전원공급장치(psu)</strong>
각 부품에 필요한 전력을 공급하고 외부 전원을 컴퓨터에 맞는 전압으로 변환하는 장치이다
전원공급장치는 또 GPU의 성능에도 영향을 미치는데 나중에 좀 더 디테일한 컴퓨터 글을 작성할때
적도록 하겠다!</p>
<p>기본적인 장치들은 이렇게 구성이 되어 있으며 최신 기종에 따라
네트워크어댑터 / GPU / 쿨러() 등 다양한 하드웨어가 들어가며
각각의 하드웨어마다 가격은 천차만별이다
<del>특히 그놈의 GPU는 코인때문에 진짜 가격이 ㅡㅡ 🤬 하</del></p>
<p>아무튼 이 모든 부품들은 버스(Bus)라는 데이터 통로를 통해 서로 연결되어 있어서 정보를 주고받을 수 있다 
이러한 기본 구조를 <strong>폰 노이만 구조</strong>라고 부르며
현대 대부분의 컴퓨터가 이 구조를 따르고 있다 (그냥 컴퓨터가 폰 노이만 구조를 통해 이루어진다라고 생각하자)</p>
<hr>
<h3 id="📌-cpu">📌 CPU</h3>
<p>디테일하게 CPU에 대해 작성해보자면 (와 근데 나 이거 어캐외움 내 자신 칭찬함 100% 내 지식이다 이거)</p>
<p><strong>❗️ CPU (Central Processing Unit)</strong>
CPU는 컴퓨터의 두뇌 역할을 하는 핵심 부품 </p>
<p>다음과 같은 주요 요소들로 구성된다
<strong>제어장치 / 연산장치 / 레지스터</strong></p>
<p><strong>❗️ 성능 결정 요소</strong>
✅ 코어(Core) 실제 연산을 처리하는 물리적 처리장치
4코어는 4개, 8코어는 8개의 작업을 동시 처리 가능
코어가 많을수록 멀티태스킹 성능이 향상</p>
<p>✅ 스레드(Thread): 하나의 코어가 처리할 수 있는 작업 단위
하이퍼스레딩 기술로 1코어가 2개의 스레드 처리 가능
(예: 6코어 12스레드는 12개의 작업 동시 처리 가능)</p>
<p>✅ 클럭속도: CPU의 처리 속도 (GHz 단위)
3.5GHz = 1초에 35억 번의 연산 가능
높을수록 단순 연산 속도가 빨라짐 = 프로그램 구동면에서 탁월하게 빨라진다
(요즘엔 부스트클럭이라고 해서 프로그램이나 브랜드에서 만든 자체 툴로 부스팅이 가능해서 최대전력으로도 부스팅이 가능하다 물론 이거 맨날하면 컴터 녹는다고 생각하면 된다)</p>
<hr>
<p><strong>❗️ 캐시 메모리</strong>
L1, L2, L3 캐시로 구성
RAM보다 빠른 CPU 전용 고속 메모리
용량이 클수록 자주 사용하는 데이터 처리가 빨라짐</p>
<p><strong>CPU의 이러한 요소들이 좋을수록 전반적인 컴퓨터 성능이 향상되며 
특히 고사양 게임, 영상 편집, 3D 렌더링 같은 복잡한 작업에서 차이가 크게 나타난다고 보면 된다</strong>
그래서 최신 CPU를 보면 멀티코어 쿼드코어 어쩌구가 이런데에서 나온다고 보면 된다</p>
<hr>
<p>자 이제 대망의 CPU 스케쥴링이다
이건 용어가 조금 어렵다 걍 외워버리도록 하자(용어가 생소하기 땜시 근데 개념은 쉬움)</p>
<p><strong>❗️ CPU 스케쥴링</strong>
CPU가 여러 프로세스를 어떤 순서로 실행할지 결정하는 방식이다
다양한 프로세스들이 효율적으로 처리될 수 있도록 관리하는 시스템이라고 볼 수 있다
스케쥴링 방식이 4개정도가 있지만 현재에는 <strong>우선순위/라운드로빈</strong> 방식으로만 주로 사용하고 있다</p>
<p>➡️ 스케쥴링 방식</p>
<ol>
<li>FCFS (First Come First Served)
먼저 온 순서대로 처리
은행 번호표처럼 순서대로 처리하는 방식
줄 서가지고 일일히 다 기다리고 처리하는 방식이라고 생각하면 된다</li>
</ol>
<p><strong>(그런데 요즘은 FCFS방식을 쓰지 않는다 아니 쓰고싶어도 못쓴다; 왜냐 CPU성능이 워낙 좋아져서
구석기 시대 컴퓨터가 아닌 이상 하나하나 처리할 필요가 없어졌다 그냥 과거의 영광으로만 알아두자)</strong></p>
<ol start="2">
<li>SJF (Shortest Job First)
실행 시간이 짧은 작업 먼저 처리
간단한 메모장 작업을 복잡한 게임보다 먼저 처리
빨리 끝나는 일 먼저 처리하고 싶은 마음</li>
</ol>
<p><strong>(이것도 위와 같은 이유로 CPU성능이 좋아져서 SFJ도 쓸 일이 없다.. 과거의영광2)</strong></p>
<ol start="3">
<li>우선순위 스케줄링
중요도에 따라 처리 순서 결정
시스템 작업이 일반 프로그램보다 우선
&quot;저 똥이 마려워서 그런데..&quot; 가 통하는 시스템</li>
</ol>
<p><strong>이건 아직도 적용되는 스케줄링인데 사실 기본 os 프로세스 라던지 
중요한 시스템, 프로그램 프로세스는 항상 먼저가 되어야 하니까
당연하게도 우선순위에 따라 스케줄링이 나뉜다
그런데 요즘의 우선순위 스케쥴링은 훨씬 더 정교하고 사람이 우선순위를 나눌 수가 있다</strong></p>
<ol start="4">
<li>Round Robin
모든 프로세스에 동일한 시간 할당
시간 다 쓰면 다음 차례로 넘어감
놀이기구 타는 시간처럼 공평하게 나누기</li>
</ol>
<p><strong>현대에서도 쓰이는 스케쥴링 방식이지만 역시나 더 섬세하고 정교하게 변했다
예전에는 정말 공평하게만 나눠서 더 많이 시간을 잡아먹는 프로세스가 버벅이는 문제가 생겼다면
이제는 시스템에서 쓰이는 프로세스의 상황에 따라 유연하게 대처하며 스케쥴링을 진행한다</strong></p>
<p>쉽게 말해서 여러 어디서 세일해가지고 난리가 났는데 &quot;제가 먼저요!&quot;, &quot;저 급해요!&quot; 하고 있을 때
CPU가 &quot;아 저 아줌마부터 여기까지 이렇게 순서대로 할게요~&quot; 하면서 
사람들을 차례차례 이용할 수 있게 만들어주는 과정이라고 생각하면 된다</p>
<hr>
<h3 id="📌-프로그램-실행-과정">📌 프로그램 실행 과정</h3>
<p>이건 뭐 기본적인거라 그냥 하드웨어의 기능만 생각하면 다 알거라 생각하는데
순서대로 정리를 좀 해보겠다</p>
<ol>
<li>저장장치(HDD/SSD)에서 시작
실행하려는 프로그램이 저장장치에 저장되어 있음
사용자가 프로그램 실행 명령을 내림 = <strong>게임 더블클릭</strong>
👇</li>
<li>RAM으로 로딩
실행할 프로그램이 RAM(메모리)으로 복사됨
RAM은 빠른 접근이 가능한 임시 저장소
이것이 우리가 말하는 &quot;프로그램 로딩&quot; 과정 = <strong>게임 로딩과정</strong>
👇</li>
<li>CPU 처리
RAM에 올라온 프로그램 명령어를 CPU가 하나씩 처리
제어장치가 명령어를 해석하고 연산장치가 실제 계산 수행
처리 결과는 다시 RAM에 임시 저장 = <strong>게임이 로딩이 되어 시작화면 나타날때쯤</strong>
👇</li>
<li>결과 출력/저장
처리된 결과가 화면에 표시되거나
필요한 경우 저장장치에 영구 저장됨 = <strong>게임 실행하고 이것저것 하는중</strong></li>
</ol>
<p>이래서 RAM이 부족하면 프로그램이 버벅대고 = <strong>저는 이거 20kg들기도 힘든데여;;?</strong>
CPU가 느리면 실행이 늦어지는거다 = <strong>나는 하나만 계산할랭 ㅋㅎ</strong>
이래서 비싼 그놈의 하드웨어끼리 똘똘 뭉쳐서 프로그램이 실행되는 거라 생각하면 된다</p>
<hr>
<h3 id="📌-인터럽트">📌 인터럽트</h3>
<p>이건 사실 요즘 컴퓨터들은 인터럽트가 많지 않다 
예전 windows xp나 10전 모델들이나 나왔지
현재기준 맥os나 windows기준 현재 os들은 
자체적으로 모든 인터럽트를 키고 끌 수가 있기땜시.. 별로 볼 일이없다</p>
<p>그리고 하드웨어 오류가 났을 시 요즘엔 굉장히 세련되어서
OS자체적으로 인터럽트가 나는것은 막는다고 한다</p>
<p>예전 컴(windows xp 기준 파란화면도 인터럽트다 ^&amp;^ 늙은이 인증)
<img src="https://velog.velcdn.com/images/2joon_kim/post/9a447e4a-d508-4719-a787-922133fb350b/image.jpeg" alt="윈도우 블루스크린">
<em>인터럽트의 대표적인 예시 - Windows BSOD (Blue Screen of Death)</em>
(👆 와 진짜 추억이네 <del>아니 근데 밀레니엄 베이비들이 xp나 98을 알까..?</del>)</p>
<p>❗️ 인터럽트를 정의하자면
CPU가 프로그램을 실행하고 있을 때 예기치 않은 상황이나 우선순위가 높은 작업이 발생하여 처리가 필요할 경우 
현재 실행 중인 작업을 중단하고 발생된 상황을 먼저 처리하는 것을 말한다
(그런데 요즘에는 거의 OS적인 부분에서 인터럽트가 없음)</p>
<p><strong>걍 쉽게 이해하자면 게임하고 있는데 갑자기
Windows 업데이트 팝업이 뜨는 것도 일종의 인터럽트라고 볼 수 있다 정도로만 생각하자</strong></p>
<p>현재 기준 하드웨어 업데이트나 기본적인 컴퓨터의 
업데이트들은 다~ 편리하게 딱딱 지들이 알아서 한다</p>
<hr>
<h3 id="📌-프로세스">📌 프로세스</h3>
<p>프로세스는 그냥 내가 켜놓은 프로그램이다
윈도우 기준 <code>ctrl+alt+delete</code> 국민 오류 해결 단축키를 통해 프로그램을 강제로 제어할 수 있는데
이때 프로세스라는 탭에 들어가보면 내가 켜놓은 프로그램들이 쫘라락 나열되어있다
걍 1프로세스 = 1프로그램 ez</p>
<p>❗️ 프로세스 특징 (이건 외워두자)
독립된 메모리 공간 할당
운영체제로부터 자원을 할당받음
다른 프로세스와 격리되어 실행
각각 고유한 프로세스 ID(PID) 보유</p>
<p>그래서 프로세스 생성부터 종료까지 쭉 나열해 보자면
아래와 같은 프로세싱을 거치며 이루어진다</p>
<p><strong>1. 생성(New)</strong>
프로세스가 처음 만들어진 상태
예: 프로그램 아이콘을 더블클릭한 직후
👇
<strong>2. 준비(Ready)</strong>
CPU를 사용할 수 있게 대기하는 상태
실행될 순서를 기다리는 중
👇
<strong>3. 실행(Running)</strong>
CPU가 실제로 프로세스를 실행하는 상태
현재 작업이 처리되는 중
👇
<strong>4. 대기(Waiting/Blocked)</strong>
입출력 작업 등으로 CPU를 사용할 수 없는 상태
예: 파일 저장 중 혹은 게임할때 걍 켜놓고 있을 때 등
👇
<strong>5. 종료(Terminated)</strong>
프로세스 실행이 완료된 상태
메모리와 자원이 반환됨</p>
<hr>
<h3 id="📌-컨텍스트-스위칭">📌 컨텍스트 스위칭</h3>
<p>말이 좀 어렵지 <code>alt+tab</code>이다
맥에서는 우리의 스테이징 매니저가 있겠쥐?</p>
<p>유식하게 면접용으로 적어보자면
<strong>컨텍스트 스위칭은 현재 실행 중인 프로세스의 상태를 저장하고 
다음 실행할 프로세스의 상태를 불러오는 작업이라고 생각하면 된다</strong></p>
<p>사실 예라고 해봤자
어렸을 때 몰래 게임하고 있는데 갑자기 엄마가 들어왔다
그러면 빛보다 빠른 속도로<code>alt+tab</code> 눌러 공부환경으로 전환하는 과정인데
부모님 등장: 0.001초 만에 전환 완료</p>
<h4 id="그럼-나는-6살때부터-컨텍스트-스위칭-마스터였던-거다"><strong>그럼 나는 6살때부터 컨텍스트 스위칭 마스터였던 거다;</strong></h4>
<hr>
<p>기본 컴퓨터 운영체제 관련 내용은 아마 게임을 좋아하거나 컴퓨터를 좋아하는 사람이라면
정말 쉽게 공부가 가능한 분야일거라 생각한다
특히..아 진짜 노트북 때문에 자동적으로 공부된것만 생각하면
하... 그리고 결국 노트북을 정하긴 정했으나 아직 구매까지 이어지지 않았음으로
쬐에에끔만 더 알아보고 노트북을 구매해야겠다.. 끗</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FastApi를 더 알아보Ja]]></title>
            <link>https://velog.io/@2joon_kim/FastApi%EB%A5%BC-%EB%8D%94-%EC%95%8C%EC%95%84%EB%B3%B4Ja</link>
            <guid>https://velog.io/@2joon_kim/FastApi%EB%A5%BC-%EB%8D%94-%EC%95%8C%EC%95%84%EB%B3%B4Ja</guid>
            <pubDate>Tue, 18 Feb 2025 08:19:44 GMT</pubDate>
            <description><![CDATA[<p>요즘 그래도 슬슬 다시 재미가 붙어서 다행이다
할게 너무나도 많아서 잠깐 뇌가 망가져 있었는데
주말동안 푸욱쉬고 나니까 다시 일하라고 뇌에서 명령을 내리는 것 같다
아무튼 요즘은 <code>FastApi</code>에 미쳐 살고 있는중이다</p>
<p>내가 가장 배우고싶었던 웹프레임워크이기도 했고
가장 좋은점은 난이도가 타 웹프레임워크에 비해 쉽다는 점이다 ^.^
<del>아 근데 뭔가 이해가 더 빠르게 가는건 Django인거 같은데..</del>
아무튼 오늘도 예쁘게 정리를 시작해본다</p>
<p>지금까지 배운건 막힘없이 뇌 속에 넣었기 때문에
아주 기초적인 부분들은 따로 이제 정리를 안하려고 한다
<del>(물론 나중에 또 복습한답시고 이것저것 적을게 뻔하다)</del></p>
<div align="center">
  <img src="https://velog.velcdn.com/images/2joon_kim/post/a9b44c91-0c0d-44a5-9dfb-04b605fc3ae3/image.jpg" alt="image">
</div>

<hr>
<h3 id="📌-fastapi---background-task">📌 FastApi - Background Task?</h3>
<p>FastApi에서의 Background Task란 무엇인지 정의부터 내리고 가자
<strong>Background Task는 HTTP 응답을 반환한 후에 실행되는 작업을 의미한다</strong></p>
<p>예를 들어 내가 이메일을 보내고 싶어서 이것저것 타이핑한 후
이메일 보내기를 누른다면? 우리는 바로 전송되는 걸 확인할 수 있다
이메일을 보냈다면? 우리가 이메일이 전달 될 때 까지 기다릴 필요가 있느냐?
아니다 우리는 이메일을 성공적으로 전달이 되었다는 창만 보고나서는 
다른 작업들을 진행할 수 있다!</p>
<p>다만 컴퓨터는 Background Task를 통해 이것저것 복잡한 여러가지 과정들을 거치고
내가 보내고싶은 사람에게 메일을 안전하게 전송한다!</p>
<p>이 과정속에서 Background Task를 통해 우리는 특정 작업을 위해
대기를 하는 번거로움을 줄여줄 수 있다!!</p>
<hr>
<p><strong>정적으로 정리를 해보자면🔥</strong>
HTTP 요청에 대한 응답은 즉시 클라이언트에게 반환
Background Task는 응답이 전송된 후 비동기적으로 실행
클라이언트는 응답을 기다리지 않고도 다음 작업을 진행 가능</p>
<p><strong>이제 주의사항도 알아보자❗️</strong>
Background Task는 응답이 전송된 후에만 실행
너무 긴 작업은 Celery나 다른 작업 큐 시스템을 고려 필요
서버가 재시작되면 실행 중이던 Background Task는 손실 가능성 존재</p>
<hr>
<p>아래 코드 예시를 보고 내용을 좀 더 디테일하게 다듬어보자
오늘 학습한 따끈따끈한 예제이다</p>
<pre><code class="language-python">@app.post(&quot;/upload-file/&quot;)
async def upload_file(file: UploadFile = File(...), background_tasks: BackgroundTasks = BackgroundTasks(), db: Session = Depends(get_db)):
    file_content = await file.read()  # 파일을 미리 읽어서 백그라운드 작업으로 전달
    background_tasks.add_task(save_file, file.filename, file_content)
    background_tasks.add_task(log_file_upload, file.filename, db)
    return {&quot;message&quot;: &quot;파일 업로드 중...&quot;}</code></pre>
<p><strong>💡 실제 동작</strong>
file.read(): 업로드된 파일의 내용을 읽는다
background_tasks.add_task(): 두 가지 작업을 백그라운드에서 실행한다</p>
<p>데이터베이스에 로그 기록하고
사용자에게는 즉시 &quot;파일 업로드 중...&quot; 메시지를 보여준다</p>
<p><strong>💡 동작 순서</strong>
사용자가 파일 업로드 ➡️
파일 내용 읽기 ➡️
백그라운드 작업 예약 ➡️
사용자에게 응답 전송 ➡️
백그라운드에서 파일 저장 및 로그 기록 ✅</p>
<p>이렇게 하면 대용량 파일을 업로드해도 서버가 멈추지 않고 
사용자도 오래 기다리지 않아도 되는 장점이 있다</p>
<p>그래서 포스트맨으로 쏴보면 아래와 같이 나오는걸 볼 수 있다 ^&gt;^</p>
<table>
  <tr>
    <td><img src="https://velog.velcdn.com/images/2joon_kim/post/b7bcf059-a155-4333-ac3b-e23d2a6029a3/image.png" width="400" /></td>
    <td><img src="https://velog.velcdn.com/images/2joon_kim/post/f2606fa2-8682-449f-b839-110fb850ed20/image.png" width="400" /></td>
  </tr>
</table>

<hr>
<h3 id="📌-fastapi---websocket">📌 FastApi - WebSocket?</h3>
<p>오늘 학습한 내용중에서 가장 재미있었다
왠지 모르게 와 이거 하면서 내가 뭔가 어이없게 뿌듯하면서 신기했는데
사실 실시간으로 테스트할 수 있다는게 너무 갑자기 흥미가 생겨서
미친듯이 재밌게 알아본 것 같다</p>
<p><strong>WebSocket이란</strong> 쉽게 얘기해서 실시간 통화라고 생각하면 편하다</p>
<p>일반적인 HTTP 통신은 마치 편지를 주고받는 것과 똑같다고 치면
➡️ 클라이언트가 요청(편지)을 보낸다
➡️ 서버가 응답(답장)을 보낸다
➡️ 쓸말 없으면 통신을 종료해버림
⬆️ 새로운 정보가 필요하면 다시 요청을 보내야 된다 (위로 반복)</p>
<p>반면 WebSocket은 실시간 통화인데
➡️ 한 번 연결이 되면 양방향으로 실시간 대화가 가능
➡️ 서버도 클라이언트에게 먼저 메시지를 보내는 것이 가능
➡️ 연결이 끊어질 때까지 계속 통신 유지</p>
<p>아주 좋은 예를 들고 와서 개념 자체는 이해가 쉬울 것 같다</p>
<hr>
<p><strong>다시 정적으로도 정리를 해보자면🔥</strong>
WebSocket은 실시간으로 지속적인 양방향 통신이 필요한 경우에 사용되는 프로토콜❗️</p>
<hr>
<p>아래의 예시코드를 보고 더 디테일하게 다듬자
이것도 오늘 학습한 따끈따끈한 코드이다</p>
<pre><code class="language-python">class ConnectionManager:
    &quot;&quot;&quot; WebSocket 연결 관리 &quot;&quot;&quot;
    def __init__(self):
        self.active_connections: List[WebSocket] = []

    async def connect(self, websocket: WebSocket):
        &quot;&quot;&quot; 클라이언트가 WebSocket 연결을 요청하면 리스트에 추가 &quot;&quot;&quot;
        await websocket.accept()
        self.active_connections.append(websocket)

    def disconnect(self, websocket: WebSocket):
        &quot;&quot;&quot; 클라이언트 연결 종료 시 리스트에서 제거 &quot;&quot;&quot;
        self.active_connections.remove(websocket)

    async def broadcast(self, message: str):
        &quot;&quot;&quot; 모든 연결된 클라이언트에게 메시지 전송 &quot;&quot;&quot;
        for connection in self.active_connections:
            await connection.send_text(message)

manager = ConnectionManager()

@app.websocket(&quot;/ws&quot;)
async def websocket_endpoint(websocket: WebSocket):
    &quot;&quot;&quot; 클라이언트가 /ws 경로로 WebSocket 연결 요청 &quot;&quot;&quot;
    await manager.connect(websocket)
    try:
        print(f&quot;접속된 인원: {len(manager.active_connections)}&quot;)
        while True:
            data = await websocket.receive_text()  # 클라이언트에서 데이터 수신
            await manager.broadcast(f&quot;📢 새로운 알림: {data}&quot;)  # 모든 연결된 클라이언트에 전송
            print(f&quot;클라이언트로부터 받은 메시지: {data}&quot;)
    except WebSocketDisconnect:
        manager.disconnect(websocket)
        print(&quot;클라이언트가 연결을 종료했습니다.&quot;)</code></pre>
<p><strong>💡 실제 동작</strong>
➡️ 새로운 클라이언트 연결 수락 = 요건 로컬환경이니 내가 되겠다
➡️ 실시간 메시지 수신 및 브로드캐스트 = 실시간 메세지 수신/발신(포스트맨) 가능
✅ 연결 종료 처리 = 연결 종료</p>
<p><strong>💡 작동 방식</strong>
➡️ 클라이언트가 <code>/ws</code> 엔드포인트로 WebSocket 연결을 요청
➡️ 서버는 연결을 수락하고 <code>active_connections</code> 리스트에 추가
➡️ 무한 루프에서 클라이언트로부터 메시지 대기 = <code>data = await websocket.receive_text()</code>
➡️ 메시지를 받으면 &quot;📢 새로운 알림: [data]&quot; 형식으로 모든 연결된 클라이언트에게 브로드캐스트
➡️ 클라이언트가 연결을 종료 시 WebSocketDisconnect 예외가 발생하고 해당 연결을 리스트에서 제거!</p>
<table>
 <tr>
   <td style="padding: 10px;">
     <img src="https://velog.velcdn.com/images/2joon_kim/post/efad8576-1943-47d9-a254-edfba11bca1a/image.png" width="300"/>
   </td>
   <td style="padding: 10px;">
     <img src="https://velog.velcdn.com/images/2joon_kim/post/d3afe045-f189-4021-bff8-311863369489/image.png" width="300"/>
   </td>
   <td style="padding: 10px;">
     <img src="https://velog.velcdn.com/images/2joon_kim/post/4b4c483f-3dff-433c-a4ab-2663a5c20c0b/image.png" width="300"/>
   </td>
 </tr>
</table>

<p>고러면 이렇게 아주 예쁘게 출력되는걸 볼 수 있다
오늘의 FastApi 끗~</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FastApi 의 DB를 연결해보자]]></title>
            <link>https://velog.io/@2joon_kim/FastApi-%EC%9D%98-DB%EB%A5%BC-%EC%97%B0%EA%B2%B0%ED%95%B4%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@2joon_kim/FastApi-%EC%9D%98-DB%EB%A5%BC-%EC%97%B0%EA%B2%B0%ED%95%B4%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Mon, 17 Feb 2025 06:50:18 GMT</pubDate>
            <description><![CDATA[<p>진짜로..
일과 공부를 병행하는 대한민국의 모든 학생 + 직장인 여러분 존경합니다
특히 <del>나 같이</del> 새벽에 일하고 쪽잠자며 낮에 공부하시는 분들은 진짜
<code>지금_내_심정 = (&quot;존경&quot; * 10000000000) + &quot;합니다&quot;</code>
진짜 죽을거 같지만 혼자만의 약속이기에 나만의 교육이해를 위해 작성시작한다..</p>
<h3 id="📌-fastapi의-db연동">📌 FastApi의 DB연동</h3>
<p>FastApi와 DB를 연결하는 방법은 아주 다양하지만 그중에서도 나는
가장 대표적인 방법인 SQLAlchemy를 다뤄보려고 한다 (배우기도 이걸 배웠고;;)
일단 먼저 SQLAlchemy의 특징을 알아보자면 아래와 같다</p>
<ul>
<li>데이터베이스를 파이썬에서 쉽게 다룰 수 있게 해주는 도구라고 생각하면 된다</li>
<li>파이썬 클래스로 데이터베이스 테이블을 다루는 것처럼 사용할 수 있다</li>
<li>SQL 쿼리를 직접 쓰지 않아도 되기 때문에 코드가 깔끔해진다</li>
</ul>
<p>대표적인 특징들만 알아봤으나 사용하며 더 딥한 부분들이 많다
이틀째의 FastApi DB 연동 코드만 좀 적어보겠다
이 코드는 SQLite라는 데이터베이스를 사용하여 사용자를 추가하고 
그 사용자의 이름을 출력하는 간단한 코드이다</p>
<pre><code class="language-python"># 필요한 라이브러리 가져오기
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# SQLite 메모리 데이터베이스 연결
DATABASE_URL = &quot;sqlite:///:memory:&quot;  # 메모리에서 데이터베이스를 만든다
engine = create_engine(DATABASE_URL, echo=True)  # 데이터베이스 엔진 생성

Base = declarative_base()  # 데이터베이스 모델의 기본 클래스 생성
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)  # 세션 생성

# 사용자 모델 정의
class User(Base):
    __tablename__ = &quot;users&quot;  # 테이블 이름
    id = Column(Integer, primary_key=True)  # 사용자 ID
    name = Column(String, nullable=False)  # 사용자 이름

# 데이터베이스에 테이블 생성
Base.metadata.create_all(bind=engine)

# 세션 시작
session = SessionLocal()
new_user = User(name=&quot;John Doe&quot;)  # 새로운 사용자 생성
session.add(new_user)  # 사용자 추가
session.commit()  # 변경사항 저장

# 모든 사용자 조회
users = session.query(User).all()  # 모든 사용자 가져오기
for user in users:  # 각 사용자에 대해
    print(user.name)  # 사용자 이름 출력</code></pre>
<h3 id="📌-fastapi의-dependency-injection">📌 FastApi의 Dependency injection?</h3>
<p>FastApi의 강력한 기능 중 하나로 쉽게 나만의 방식으로 해석하자면 
&quot;필요한 것을 외부에서 넣어주는 방식&quot;이라고 생각하면 편할 것 같다
일단 Dependency injection의 대표적인 특징으로는</p>
<ul>
<li>데이터베이스 연결을 자동으로 관리해준다</li>
<li>코드 반복을 줄여준다</li>
<li>테스트하기 쉬워진다</li>
<li>데이터베이스 세션을 안전하게 닫아준다</li>
</ul>
<p>이 정도가 있을 것 같다
그래서 어떻게 쓰며 어떻게 관리를 하냐?
FastApi에서는 <code>Depends</code>를 사용하여 의존성 정의와 관리를 할 수 있다
주로 데이터베이스의 세션, 인증, 설정등에 많이 사용된다고 한다</p>
<h3 id="📌-dependency로-세션-관리">📌 Dependency로 세션 관리</h3>
<p>일단 먼저 나는 <code>session</code>에 대한 개념조차 정확하지 않았기에 짚고 넘어가기로 했다
데이터베이스와의 &quot;대화 창구&quot;라고 생각하면 될 거 같다</p>
<p>쉽게 예를 들어서 카페에서 주문할 때
카페 = 데이터베이스
주문창구 = 세션
주문하기 = 쿼리 실행
주문 완료 후 창구 닫기 = 세션 종료
이렇게 될 수 있을 것 같다.</p>
<p>세션 관리는 무조건 알고 있어야 하는데 <del>[ money가 들어가는 부분이기 때문 ;;;]</del>
아래의 문제점으로 인해 세션관리에도 꼭 신경쓰는 개발자가 되자👍🏻</p>
<p>자원 관리: 데이터베이스 연결은 비용이 많이 들어서 잘 관리해야 된다고 한다
안전성: 사용이 끝난 연결은 반드시 닫아야 한다 = 보안의 위험!!!
성능: 너무 많은 연결이 열려있으면 성능이 저하될 수 있다</p>
<p>아래 코드를 보고 Dependency를 알아보자</p>
<pre><code class="language-python"># ❌ 좋지 않은 방법
@app.get(&quot;/users&quot;)
def get_users():
    db = SessionLocal()  # 매번 직접 열고
    users = db.query(User).all()
    db.close()  # 매번 직접 닫고
    return users
# 이 예제는 Dependency를 사용하지 않은 코드이다
# 보면 나오듯이 모든 엔드포인트마다 db.close하여 매번 직접 닫고 호출을 하고 있다.

# ✅ 좋은 방법 (Dependency 사용)
# 이건 그냥 외우도록 하자 ^^
def get_db():
    db = SessionLocal()
    try:
        yield db  # 필요할 때 자동으로 열고
    finally:
        db.close()  # 자동으로 닫아줌</code></pre>
<p>나머지는 또 차후에 업데이트 하도록 하겠드..아</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Fast-api을 다뤄보Ja]]></title>
            <link>https://velog.io/@2joon_kim/Fast-api%EC%9D%84-%EB%8B%A4%EB%A4%84%EB%B3%B4Ja</link>
            <guid>https://velog.io/@2joon_kim/Fast-api%EC%9D%84-%EB%8B%A4%EB%A4%84%EB%B3%B4Ja</guid>
            <pubDate>Wed, 12 Feb 2025 09:18:21 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/2joon_kim/post/744b77e9-a374-4074-b701-e88c2f396d05/image.jpeg" alt=""></p>
<p>어제 오늘 새벽에 일을 했던 거 때문에 몽롱하다 말이 안된다
거의 실신직전이다 하지만 잠 따위가 나를 막을 순 없..zZ
여튼 정리를 시작하자</p>
<h3 id="fastapi란">FastApi란?</h3>
<p>드디어 내가 가장 배우고 싶었던 웹 프레임워크인 Fast-api를 배우기 시작했다
언제나 그렇듯이 시작은 항상 즐겁고 배움의 열정으로 가득하다 아무튼 시작해보자</p>
<p>FastAPI는 파이썬으로 API를 만들 때 사용하는 현대적인 웹 프레임워크이다
쉽고 빠르게 웹 API를 만들 수 있게 해주는 도구라고 생각하면 될 것 같다
Ex. Django / flask / javaspring(Java를 사용) 등</p>
<h3 id="📌-주요-특징">📌 주요 특징</h3>
<ul>
<li>이름처럼 정말 빠른 성능을 자랑한다고 한다.
(Node.js나 Go와 비슷한 수준의 속도를 보여준다고 한다 = <a href="https://wikidocs.net/175092">https://wikidocs.net/175092</a> )</li>
<li>특히 Django를 하고 와서 그런지 코드 작성이 더 수월하긴 하다</li>
<li>그리고 /docs 나 /redocs 처럼 api를 한눈으로 볼 수 있어 편하다.</li>
<li>오류를 잡기가 너무 편한 것 같다 아직 디테일한 작업을 시작하진 않았으나 너무 편하다!</li>
</ul>
<h3 id="📌중요하게-짚고-넘어갈-특징">📌중요하게 짚고 넘어갈 특징</h3>
<p><strong>비동기처리 (Asynchronous Processing)</strong>
비동기는 &quot;기다리지 않고 다른 일을 할 수 있게 해주는 처리 방식&quot;이다 
특히 웹에서 데이터를 가져오거나 파일을 읽고 쓸 때 많이 사용된다고 한다
이것에 관한 예시를 좀 찾아보니</p>
<ul>
<li>Netflix의 스트리밍 서비스</li>
<li>카카오톡같은 메신저 서비스 등</li>
</ul>
<p>여러개의 작업들을 한번에 처리할 수 있는 처리방법을 비동기 처리라고 생각하면 될 것 같다
아주 이해하기 쉽게 코드로도 정리해놔야겠댜</p>
<pre><code class="language-python">요건 동기처리과정
# 모든 작업이 순차적으로 진행됨
print(&quot;커피 주문&quot;)
make_coffee()    # 커피 만드는 3분 동안 멈춤
print(&quot;음악 재생&quot;)  # 커피 다 만들어진 후에야 실행
print(&quot;청소 시작&quot;)  # 그 다음에야 실행

플라스크의 비동기처리과정
async def cafe_tasks():
    # 모든 작업이 동시에 시작됨
    coffee_task = asyncio.create_task(make_coffee())    # 커피 만들기 시작
    music_task = asyncio.create_task(play_music())      # 동시에 음악 재생
    cleaning_task = asyncio.create_task(start_cleaning()) # 동시에 청소 시작

    # 각 작업이 완료되는대로 결과를 받음
    await coffee_task
    await music_task
    await cleaning_task</code></pre>
<p><strong>데이터 검증 및 직렬화</strong>
FastApi는 아래처럼 쉽게 Pydantic으로 데이터 검증과 직렬화가 가능하다
우리가 class에 coffeeOrder을 만들어 뒀다면?
아래 메뉴와 사이즈 수량 얼음유무 등 다양한 데이터를 미리 정하고 시작한다
그럼 FastApi는 알아서 데이터를 검증하고 본인이 맞는 데이터인지 확인하여 가져온다!
(역시 현대적이고 친절해 ㅠ)</p>
<pre><code class="language-python">from pydantic import BaseModel

class CoffeeOrder(BaseModel):
    menu: str       # 메뉴는 반드시 문자열
    size: str       # 사이즈도 문자열
    quantity: int   # 수량은 반드시 숫자
    ice: bool       # ICE 여부는 true/false만

# FastAPI가 자동으로 검증
@app.post(&quot;/order&quot;)
def create_order(order: CoffeeOrder):
    # quantity에 &quot;두잔&quot; 이라고 문자가 들어오면 자동으로 에러!
    # size에 없는 사이즈가 들어와도 에러!
    return order</code></pre>
<p>그리고 직렬화는 우리가 받은 이 주문정보를
아래처럼 알아서 Json형식으로 변환해서 지가 가져온다</p>
<pre><code class="language-python"># 파이썬 객체(주문 정보)를 JSON으로 변환
order = CoffeeOrder(
    menu=&quot;아메리카노&quot;,
    size=&quot;Grande&quot;,
    quantity=2,
    ice=True
)
👇
# 자동으로 JSON으로 변환됨
{
    &quot;menu&quot;: &quot;아메리카노&quot;,
    &quot;size&quot;: &quot;Grande&quot;,
    &quot;quantity&quot;: 2,
    &quot;ice&quot;: true
}</code></pre>
<p>객체나 데이터 구조를 일련의 바이트나 문자열로 변환하는 과정 쉽게 말해 
&quot;프로그램에서 사용하는 데이터를 저장하거나 전송할 수 있는 형태로 바꾸는 것&quot;이라고 생각하자
쉬운 예 </p>
<ul>
<li>책의 내용을 PDF로 변환하는 것</li>
<li>편지를 이메일 형식으로 바꾸는 것</li>
</ul>
<h3 id="📌-fastapi의-기본-사용법">📌 FastApi의 기본 사용법</h3>
<p><strong>경로 매개변수(path parameters)</strong>
FastApi에서는 경로지정이 아주 쉽게 되어있다 (아주 쉽다👍🏻)
기본 라우팅을 지정하고 다양한 매개변수를(CRUD) 만들어 사용하면 된다</p>
<pre><code class="language-python"># GET 요청
@app.get(&quot;/hello&quot;)
def hello():
    return {&quot;message&quot;: &quot;안녕하세요!&quot;}

# POST 요청
@app.post(&quot;/items&quot;)
def create_item():
    return {&quot;message&quot;: &quot;아이템 생성됨&quot;}
#여기까지는 너무 쉬우니 패스하자

#이렇게 여러 매개변수를 이용해 사용할 수 도 있다.
@app.get(&quot;/users/{user_id}/items/{item_id}&quot;)
def get_user_item(user_id: int, item_id: int):
    return {&quot;user_id&quot;: user_id, &quot;item_id&quot;: item_id}</code></pre>
<p>써놓고 보니까 HTTP 메서드(@app.get, @app.post 등)가 아주아주 직관적이다👍🏻
그리고 경로 매개변수가 함수 매개변수와 자연스럽게 연결되는걸 볼 수 있다
또 편한 건 타입 힌트(int)로 자동 데이터 검증이 된다는게 아주 좋은 거 같다</p>
<p><strong>쿼리 매개변수(Query Parameters)</strong>
또한 쿼리 매개변수가 있는데 아주 쉽다 이거 또한
걍 URL뒤에 ?가 붙는다고 생각하자
아래와 같은 예시가 존재할 때</p>
<pre><code class="language-python">@app.get(&quot;/search&quot;)
def search_items(
    q: str,              # 검색어 (필수)
    category: str = None, # 카테고리 (선택)
    min_price: float = 0, # 최소가격 (기본값 0)
    max_price: float = float(&#39;inf&#39;)  # 최대가격 (기본값 무한)
):
    return {
        &quot;search&quot;: q,
        &quot;category&quot;: category,
        &quot;price_range&quot;: {&quot;min&quot;: min_price, &quot;max&quot;: max_price}
    }</code></pre>
<p><code>search?q=신발</code>
<code>search?q=신발&amp;category=스포츠</code>
<code>search?q=신발&amp;min_price=50000&amp;max_price=100000</code>
요런식으로 호출하여 우리는 쿼리 매개변수를 호출할 수 있다 정리하자면
쿼리 매개변수: <code>search?q=신발&amp;category=스포츠</code> (URL 끝에 ? 후 추가)
= <code>?</code> 로 쿼리 시작
= <code>&amp;</code> 로 여러 매개변수 구분</p>
<h3 id="📌-pydantic-사용법">📌 Pydantic 사용법</h3>
<p>아래의 예시를 보며 다시 복기하자
뭐 별 다를 건 없다 그냥 pydantic라이브러리를 불러와주고
아래처럼 클래스 객체를 만들어 타입을 정하고 시작하면 알아서 검증해준다!
💡 pydantic의 BaseModel은 한마디로 이터 검증과 설정을 위한 기본 모델 클래스이다.
💡 (쉽게 설명하면 &quot;데이터의 형태를 정의하는 설계도&quot; 라고 생각하면 된다)</p>
<pre><code class="language-python">from pydantic import BaseModel

# BaseModel을 상속받아 User 데이터 모델 정의 예시
class User(BaseModel):
    name: str
    age: int
    email: str
    is_active: bool = True  # 기본값 설정 가능</code></pre>
<p><strong>🔥🔥🔥🔥 Validator 사용법!!!!</strong>
FastApi에서 사용 가능한 내가 무조건 사용해야 하는 데이터 검증 모듈이다
사용법도 간단하고 코드의 에러방지를 위해 무조건 사용하자!!!!
특정 필드의 데이터를 검사하고 싶을 때 사용하며 여러 필드도 한번에 검사할 수 있다.</p>
<p>⚠️ 주의할 점</p>
<ul>
<li><p>반드시 @classmethod와 함께 사용해야 한다.</p>
</li>
<li><p>데코레이터 순서가 중요하다 (@field_validator 다음에 @classmethod)</p>
<pre><code class="language-python">class Product(BaseModel):
  price1: int
  price2: int
  price3: int

  # price1, price2, price3 모두 한번에 검사
  @field_validator(&#39;price1&#39;, &#39;price2&#39;, &#39;price3&#39;)
  @classmethod
  def check_price(cls, value):
      if value &lt; 0:
          raise ValueError(&#39;가격은 음수가 될 수 없습니다!&#39;)
      return value</code></pre>
<p>이렇게 사용하면 데이터가 들어올 때 자동으로 검사해주니 코드가 훨씬 안전해진다!</p>
</li>
</ul>
<h3 id="📌-swagger-ui--redoc">📌 Swagger UI / ReDoc</h3>
<p>요건 이미지가 있기에 따른 자세하게 설명되어 있는 공식문서를 참조하겠다.
Swagger UI URL : <a href="https://fastapi.tiangolo.com/ko/how-to/configure-swagger-ui/">https://fastapi.tiangolo.com/ko/how-to/configure-swagger-ui/</a>
ReDoc URL : <a href="https://redocly.github.io/redoc/">https://redocly.github.io/redoc/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[디버깅에 대해서]]></title>
            <link>https://velog.io/@2joon_kim/%EB%94%94%EB%B2%84%EA%B9%85%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C</link>
            <guid>https://velog.io/@2joon_kim/%EB%94%94%EB%B2%84%EA%B9%85%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C</guid>
            <pubDate>Tue, 11 Feb 2025 16:54:42 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/2joon_kim/post/45ce5615-0f8a-44d2-8e54-b3eae4c8c32d/image.png" alt="">
오늘은 디버깅에 대해서 한번 적어보려고 한다
사실 지금 강의를 열심히 들으면서도 기초가 너무 부족하다는 생각이 들어
부족한 기초지식들을 벨로그에 적으면서 보완해보려고 한다.</p>
<p>일단 가장 중요한 디버깅(debuging)을 단 한번도 하지 않고
중요성을 몰랐기에.. 아니 사실 중요성은 알았으나 굳이 왜 해? 라는 생각에
단 한번도 디버깅을 한적이 없다 ^?*</p>
<p>항상 AI를 활용해서 오류 고치기에 급급했고 (코드복붙;) 단순한 오류도
몇시간씩 소요하며 오류를 해결했다..</p>
<p>그런데 맨토링시간에 멘토님과 함께 교육에 관한 피드백을 받을 때
엄청나게 부족한 나를 느끼며
가장 와 닿았던 말 중에 하나는 AI를 활용하는 내가 어느날 갑자기
AI가 준 코드 복붙하며 잘 지내고 있는데 아래와 같은 상황이 나타났다고 가정해보자</p>
<p>만약 AI가 잘못된 코드를 전달한다면? 
AI가 한번 뻑이 나 버리면? = 나도 같이 뻑이나는 사람</p>
<p>코드 한줄 한줄 적으며 내가 적은 코드가 다른 코드와는 
어떠한** 차별점 혹은 기발함을 통해 다른 개발자가 생각하지 못한 코드들로 
나만의 API를 개발 할 수 있는 개발자가 되어야 경쟁력**이 있지 않을까?
라는 생각을 하며 기본적인 부분들을 조금씩 보완해보려고 한다</p>
<p>아무튼 지금 이 글은 디버깅에 대해 조금 자세하게 적어보려고 한다.
일단 내가 쓰고 있는 IDE는 vscode와 pycharm 두개를 쓰고 있다.
<strong>아 참 IDE란?(Integrated Development Environment) 통합 개발 환경이다.
한마디로 내가 쓰는 코드 프로그램 말하는거</strong></p>
<p>사실 vscode로 코딩을 시작해서 그런지 아직 pycharm보다는 vscode가 핏한 느낌이다.
anyway 두개의 IDE 모두 디버깅을 하는 법이 엄청 쉬운데
각각의 IDE 모두 중단점만 찍어주면 된다.
<img src="https://velog.velcdn.com/images/2joon_kim/post/53899acb-0170-4749-b03f-d7817789aaf4/image.png" style="display: inline-block; width: 45%"> <img src="https://velog.velcdn.com/images/2joon_kim/post/593e5e8a-3454-4c24-87f0-9f44a25de99b/image.png" style="display: inline-block; width: 45%">
왼쪽이 vscode의 중단점이고 오른쪽이 pycharm의 중단점이다.
모두 내가 원하는 코드에 중단점을 찍고 디버깅을 클릭해주면 된다!
예를 들어서 설명을 해보겠다
아래에 코드의 예시를 보고 확인해보자</p>
<pre><code class="language-python">def test_muscle(pound):
    if pound &gt;= 500:
        return print(&quot;너는 언더아머의 자격이 된다.&quot;)
    else:
        print(&quot;언더어마를 당장 벗으셈&quot;)
pound = int
pound = &quot;모름&quot;
muscle_test = test_muscle(pound)

print(muscle_test)</code></pre>
<p>여기서 오류가 날 부분은 pound라는 변수가 될 수 있겠다.
나는 test_muscle이라는 함수를 만들어두고
pound에는 강제로 &quot;모름&quot;이라는 값을 넣어주었다.
그럼 여기서 나타날 수 있는 오류는 TypeError가 날 수 있는데
<img src="https://velog.velcdn.com/images/2joon_kim/post/8901d5c3-dba0-46cb-9eb9-de12d8552539/image.png" alt="">
우리가 예상했던 대로 TypeError가 나타난 것을 볼 수 있다.
나는 변수를 넣어준 곳에 중단점을 찍었고 step into를 통해 하나씩 코드를 분석해본 결과
저런 에러가 뜬다고 알려주었다.</p>
<p>💡 디버깅 명령어는 짚고가자
watch = 창에서 변수 모니터링
call stack = 실행 흐름 파악
breakpoints = 목록 관리
variables = 창에서 현재 범위의 모든 변수 확인</p>
<p>💡 우리가 가장 많이 사용하게 될 디버깅에 대해?</p>
<pre><code class="language-python">def calculate_grade(score):
    if score &gt;= 90:          # 여기 중단점 설정
        grade = &#39;A&#39;
    elif score &gt;= 80:
        grade = &#39;B&#39;
    elif score &gt;= 70:
        grade = &#39;C&#39;
    else:
        grade = &#39;D&#39;
    return grade            # 여기 중단점 설정

scores = [85, 92, 78, 95]
for score in scores:
    result = calculate_grade(score)
    print(f&quot;점수 {score}: {result}등급&quot;)</code></pre>
<p>나는 글로만 보는 디버깅은 도저히 이해할 수 없어 간단한 예제를 작성해서 디버깅을
익히는게 가장 좋다고 생각했다.
중단점을 직접 찍어보고 코드가 어떤순서로 이동하는지 확인을 하면
디버깅에 대해 조금 더 빠르게 이해할 수 있을 것 같다.</p>
<p>우리가 자주 사용하게 될 상황에 대해 마지막으로 정리해보자면</p>
<ol>
<li>API 응답 데이터 확인할 때</li>
<li>데이터베이스 쿼리 결과 확인할 때</li>
<li>사용자 입력 처리 과정 추적할 때</li>
<li>성능 문제 발생 지점 찾을 때 
등등 자주 디버깅을 사용해서 코드의 문제점을 쉽게 찾아내보자!!</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[REST API란?]]></title>
            <link>https://velog.io/@2joon_kim/REST-API%EB%9E%80</link>
            <guid>https://velog.io/@2joon_kim/REST-API%EB%9E%80</guid>
            <pubDate>Sat, 08 Feb 2025 08:00:05 GMT</pubDate>
            <description><![CDATA[<p>Flask를 공부중이다
넘므너므 이해하기 버겁지만 나름 열심히
머리속에 집어 넣으려 노력하고 있다</p>
<p><img src="https://velog.velcdn.com/images/2joon_kim/post/791dddcc-1ba7-48d2-aead-f14d6720f2c0/image.webp" alt=""></p>
<p>요즘에 벨로그에 글을 쓸 때 예전에 회사에서 &#39;.&#39;을 붙이던
버릇때문에 코드쓸때 계속 &#39;.&#39;를 붙여서 힘들었는데
요즘엔 &#39;.&#39; 은 커녕 한글을 쓸 때도 코드쓰듯이 작성하려고
하고 있다 좋은거겠지..? 그래야지 암</p>
<h4>아무튼 REST API에 대해 알아보자</h4>
REST API란? 서버와 앱(클라이언트)간의 정보를 주고받는 규칙! 이라고 생각하면 된다. 그냥 정말 쉽게 예를 들어 내가 스마트폰에서 웹사이트를 사용할 때 웹사이트의 정보를 서버에서 받아오는 방식이 REST API라고 생각하면 된다.

<h4>REST API의 구성요소</h4>
CRUD = 크루드만 기억하자<br>
HTTP프로토콜 메서드를 사용하고 있다.<br>
그리고 json형식으로 대부분 전달하고 있다고 한다!!

<p>Create = POST
Read = GET
Update = PUT
Delete = DELETE</p>
<p>완전 예전글인데 업로드를 못해 지금 업로드를 하넹..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Django 를 deep하게 feat.- 284°C(체감)]]></title>
            <link>https://velog.io/@2joon_kim/Django-%EB%A5%BC-deep%ED%95%98%EA%B2%8C-feat.-284C%EC%B2%B4%EA%B0%90</link>
            <guid>https://velog.io/@2joon_kim/Django-%EB%A5%BC-deep%ED%95%98%EA%B2%8C-feat.-284C%EC%B2%B4%EA%B0%90</guid>
            <pubDate>Thu, 06 Feb 2025 04:37:16 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/2joon_kim/post/dbd7d60b-883c-4f4b-a116-c730c024abf1/image.jpg" alt="">
오늘도 정리를 하자..
정리하자..
정리..
정.
<del>아휴 하기싷ㅇ..</del></p>
<p>여튼 Django 좀 더 딥하게 다뤄보라고 과제를 내주셨다
열심히 적으며 복습해보자
Django가 점점 익숙해져가..진 않지만 일단 열심히 공부하자
아직 제대로 시작도 안했기에 오늘도 정진한다..⭐️</p>
<h2 id="1-django-form">1. Django Form</h2>
<p>Django에서의 Form은 우리가 사용하는 여러가지의 사이트 중 말 그대로 Form이다.
Form이 뭐냐? = <del>구글링하셈;</del> 그냥 웹사이트에서 자주 보는 입력창을 말한다
예를 들자면 <strong>회원가입</strong> / <strong>로그인</strong> / 또 뭐 있냐.. <strong>게시판 글 작성</strong> 등 이 있다.
대충 입력해서 쓸 수 있는 양식? 정도라 생각하면 편하다</p>
<ul>
<li>Form 생성하는 법 (model 없이)<pre><code class="language-python">from django import forms #말 그대로 장고의 forms를 쓸거기 때문에 장고의 form 클래스를 가져온다
</code></pre>
</li>
</ul>
<p>class 하기싫어form(forms.Form): #나는 하기싫어 form을 만들었고 form 안에 들어갈 내용들을 적었다.
    성격 = forms.CharField(max_length=100) #문자만 가능 최대 100자
    3대몇 = forms.IntegerField() #숫자만 가능 
    헬스장주소 = forms.CharField(max_length=100) #문자만 가능 최대 100자</p>
<h1 id="내가-만든-하기싫어-form-에는-성격과-3대몇치는지-그리고-헬스장-주소를-입력하라고-되어-있다">내가 만든 하기싫어 form 에는 성격과 3대몇치는지 그리고 헬스장 주소를 입력하라고 되어 있다.</h1>
<h1 id="forms들어갈-내용의-입력값이-입력값의-범위">forms.들어갈 내용의 입력값(이 입력값의 범위)</h1>
<h1 id="요렇게-간단하게-생각하면-된다">요렇게 간단하게 생각하면 된다</h1>
<pre><code>- Form 생성하는 법 (model 사용)
```python
# 근데 만약 폼을 만들기 전 폼의 모델이 존재한다면 걍 모델을 갖다 써도 무방하다
# 훨씬 더 간단해진다
from django.forms import ModelForm #나는 모델폼을 갖다쓸꺼야
from .models import 삼대측정 # 모델에 있는 회원정보를 쓸거야
# 당연하겠지만 일단 우겨넣고 시작하는거다 그래야 얘는 알아먹는다.

class 삼대측정Form(ModelForm): #모델폼안에 있는거 써야징!
    class Meta: #얘가 이 모델 담당자다 = 한마디로 대빵
        model = 삼대측정
        fields = [&#39;성격&#39;, &#39;3대몇&#39;, &#39;헬스장주소&#39;] #모델 안에 있는 내용 중 어떤거 써 먹을지?
        fields = &#39;__all__&#39;  # 이렇게 하면 모델 안에 있는 내용들도 싹다 가져올수 있다.

         # 추가로 이것도 할 수 있는데
         # exclude = [&#39;필라테스&#39;] #예를 들어서 내가 지금 3대 측정하는곳에 
         # 필라테스 하는 사람이 오면 안되니까 &#39;필라테스&#39; 만 빼고 다 가져올 수 있다.
         # 그리고 fields / exclude 는 하나만 사용 가능하니 작성할때 나처럼 멍청한짓은 하지말자 </code></pre><ul>
<li>widgets</li>
</ul>
<p>위젯은 말 그대로 내가 위에 생성한 폼의 입력값을 이쁘게 꾸민다고 생각하면 된다.
아래 예를 들어서 설명해보자면</p>
<pre><code class="language-python">
class 삼대측정Form(forms.Form):
    성격 = forms.CharField(
        widget=forms.TextInput(
            attrs={&#39;class&#39;: &#39;my-input&#39;, &#39;placeholder&#39;: &#39;자네는 헬스인재인가? 성격을 서술하라&#39;}
        )
    )

# 대충 요렇게 작성했을 때 my-input은 CSS 클래스 이름이다 그냥 외우자 = 스타일 꾸밀 때 씀 ㅇㅇ
# placeholder또한 해석 그대로 공간 어캐감쌀거냐? 얘한테 알려줘야지~ 라고 생각하면 편하다
# ㄴ 우리가 아이디 입력할때 희미하게 알려주는 공간 이라고 생각하자</code></pre>
<ul>
<li>CreationForm</li>
</ul>
<p>CreationForm은 그냥 생성 전용 폼이라고 생각하면 편하다
위에 modelForm안에서 파생된 폼이라고 하는데 그냥 생성하여 쓰는거랑 똑같다고 보면 된다.</p>
<pre><code class="language-python">
# 그냥 일반적인 ModelForm의 예시
class 운동일지Form(forms.ModelForm):
    class Meta:
        model = 운동일지
        fields = &#39;__all__&#39;
    # 이 폼은 그냥 운동일지안에 있는 내용들을 다 갖다 쓸 수 있음

# CreationForm의 예시
class 운동일지생성Form(forms.ModelForm):  # Creation = 생성
    class Meta:
        model = 운동일지
        fields = [&#39;운동이름&#39;, &#39;세트수&#39;]
    # 이 폼은 오직 운동일지 안에서도 이름이랑 세트수만 셀때 쓴다고 보면 됨 왜냐?
    # 필드안에 내가 생성하고 싶은 내용들을 명확하게 적어놨기 때문에 그럼 
    # 물론 여기서 우리가 수정과 삭제 또한 추가한다면 가능하다 = 요건 views에서 구현을 해야겠지만
</code></pre>
<ul>
<li>AuthentiactionForm</li>
</ul>
<p>Django는 친절하게 폼도 만들어놨다 근데 만들거면 좀 더 친절하게 만들지 겁나어렵네 ㅡㅡ 여튼
AuthenticationForm은 &#39;로그인 전용&#39; 폼이다 
걍 쉽게 말해서 로그인 할 때 쓰는 폼이라고 생각하면 편하다 뭐 그거말고 설명이 없다 이건..</p>
<pre><code class="language-python">from django.contrib.auth.forms import AuthenticationForm  
from django.contrib.auth import login

# django.contrib.auth.forms 요기서 AuthenticationForm 가져오고
# django.contrib.auth 요기서는 login을 가져왔다.
# 간략하게 설명하자면 첫번째 라이브러리는 걍 로그인 회원가입폼이 들어있는 장고 라이브러리다
# 두번째는 .forms만 빠졌고 인증관련 라이브러리라고 생각하자

# 요 아래 패턴은 django 공식문서에서 쓰이는 공식 로그인view 패턴이다
# 공식문서를 생활화 하자 ^&amp;^ yeah
# 아래는 로그인 기준 그냥 이해하기 쉽게 헬스장에 들어가는 과정을 예로 든 것이다.

def 헬스장_들어가기(request):
    if request.method == &#39;POST&#39;: # POST요청을 받고 폼이 제출이 뙇 됐다
    # 그럼 AuthenticationForm얘는 request를 꼭 받은상태로 들어가야된다
    # 아니면 출입불가 request = 헬스장 회원번호

        form = AuthenticationForm(request, request.POST) 
        # Django가 헬스장 인포여서 알아서 username/password을 봄
        # 검증된 헬창들 정보를 가져옴

        if form.is_valid():  # 아 이건 밑에서 설명할라햇는데.. 걍 맞는지 확인작업
            login(request, form.get_user())
            # form.get_user()는 AuthenticationForm에만 있는 특별한 메서드라고 한다. = 헬스장에 있는 사람인지 진위 확인중

            return redirect(&#39;나가임마&#39;) #만약 아니라면 나가라고 욕을 하는 상황
    else:
        form = AuthenticationForm()  # 헬스장 들어오실? 가입하셈 ㅇㅇ
    return render(request, &#39;헬스장.html&#39;, {&#39;form&#39;: form})
    # 그럼 우리는 회원가입 폼을 주는거다 그제서야
</code></pre>
<ul>
<li>is_valid()</li>
</ul>
<p>위에서 설명이 간략하게 되어 있지만 진위여부 확인 즉 이게 맞는 데이터값인지 보는거다
내가 3대가 몇인지 물어봤더니 <code>엙으앍욽넱르ㅔㅇㄱ</code> 이렇게 적으면 안되니까 ^^</p>
<pre><code class="language-python"># 예를 들어 헬스장 가입폼이 이렇다면

class 헬스장가입Form(forms.Form):
    이름 = forms.CharField(max_length=10)  # 꼭 채워야 하고, 10자 이하
    3대 = forms.IntegerField()           # 꼭 채워야 하고, 숫자만
    이메일 = forms.EmailField()           # 꼭 채워야 하고, 이메일 형식만

# is_valid()는 위에 나와 있는 내용 중 그런것들을 본다.
# 너 이름 썼냐? 10자 넘지 않는지
# 너 3대 썼지? 진짜 숫자맞지?
# 이메일도 쓴거 맞지? 안쓴거 아니지? 골뱅이는 붙여야 이메일이지 임마 이런느낌</code></pre>
<h2 id="2-django-orm">2. Django ORM</h2>
<p>ORM(Object-Relational Mapping)은 쉽게 말해서 
파이썬 코드로 데이터베이스를 다룰 수 있게 해주는 도구다
flask에서도 ORM을 썼었는데 여기서도 Python과 친한 우리는
데이터를 Python으로 다룰 수 있게 도와준다 👍🏻
쉽게 얘기해서 SQL문을 쓸때에는 계속 손아프게 대소문자 구별해가며 써야되는데<strong>(맥os 짜증;)</strong>
<code>SELECT * FROM 어쩌구 이거 찾아라</code>를
<code>어쩌구.objects.filter(요런요런 값 찾아줭)</code>을 할수가 있다.</p>
<ul>
<li>Django ORM 의 특징</li>
</ul>
<p>일단 장고는 model 기반이다 우리가 기가막히게 작성한 models.py를 바탕으로
python코드로 데이터를 다룰 수 있게 된다.
인터넷에서 퍼온 official 특징들을 일단 먼저 보자면</p>
<pre><code class="language-html">SQL을 몰라도 데이터베이스 조작 가능 = 맞음
파이썬 문법으로 데이터베이스 조작 = 맞음
자동으로 SQL로 변환해줌 = 맞음
SQLite, PostgreSQL, MySQL 등 어떤 DB를 써도 같은 코드 사용 가능 = 맞음</code></pre>
<p>내가 생각하는 실제 경험에서 우러러나오는 특징으로는
두가지가 가장 크게 와닿았던 것 같다.</p>
<pre><code class="language-html">1. SQL문 몰라도 된다 = ORM 방식 호출만 쓰면 댐 (물론 SQL문을 알고있어야 이해가 빠름)
2. 보기 좀 쉬움

예를 들어서
# SQL 버전
&quot;INSERT INTO 헬스장회원 (이름, 나이) VALUES (&#39;근육맨&#39;, 25);&quot;

# Django ORM 버전
헬스장회원.objects.create(이름=&#39;근육맨&#39;, 나이=25)
장고 버전이 훨씬 보기 쉬운거 같다 ^^</code></pre>
<ul>
<li>Django ORM 의 기본적인 사용방법</li>
</ul>
<p>장고 ORM의 기본적인 사용법은 너무 예시가 많아 그냥 코드로 대체하겠다.
사용법이 직접 치는거 말고 뭐가 더 필요할까 😎</p>
<pre><code class="language-python"># 그냥 지금부터 하나의 헬스장이라 생각하면 편하다
# 나는 언제나 그랬듯이 내가 편한대로 예를 드는게 좋기 때문에 또 헬스장으로 예를 들겠다.

# objects
모든_회원 = 헬스장회원.objects.all() 
# objects는 매니저의 개념이다 얘가 다 불러와서 문제를 해결한다.
# 그래서 밑의 명령어를 보면 
# 헬스장회원.objects.어떻게찾을건데(조건) 이렇게 되어있다. 참고하자

# filter
성인_회원 = 헬스장회원.objects.filter(나이__gte=20) 
#필터는 말 그대로 필터! 저건 회원들 중 20살만!

# get
회원 = 헬스장회원.objects.get(id=1)
# 근데 get은 unique한 고유값이 아니고 결과가 없거나 여러개일때 에러가 난다고 한다.
# 이미 존재하는게 확실하고 중요한 정보를 찾을 때 쓰도록 하자

# order_by
회원목록 = 헬스장회원.objects.order_by(&#39;나이&#39;, &#39;-가입일&#39;)  
# 나이 오름차순, 가입일 내림차순 / -요게 붙으면 내림차순으로 보여준다

# create
새회원 = 헬스장회원.objects.create(
    이름=&#39;김근육&#39;,
    나이=25
)
#뭐 이건 설명이 필요할까.. create다.. 크리에이트 만들다라는 뜻이다 ^^^

# delete
회원 = 헬스장회원.objects.get(id=1)
회원.delete()
#이것도 뭐..삭제임.. 어려울게 없어서..

# update
# 업데이트는 방법이 두가지일거 같은데 특정아이디를 알거나 이름을 알면 그걸 조회 후 변경
# 특정 나이대 혹은 특정 정보를 가진 사람들을 한꺼번에 변경할 때
회원 = 헬스장회원.objects.get(id=1)
회원.나이 = 26
회원.save()
get_object_or_404
# 👆 요건 쉽다
# 👇 요게 어렵지
헬스장회원.objects.filter(나이__lt=20).update(회원등급=&#39;뉴비헬창&#39;)
# 예를 들어서 나이 20살인 애들은 모두 뉴비헬창으로 바꾸고싶을 때
# 필터를 통해 나이가 20살인 애들을 추려서 update를 사용해 회원등급을 뉴비헬창으로 바꾼다.

# get_object_or_404
# 이건 뭐 페이지 내에서 보여주는 에러형식으로 404에러 많이 봤잖아요 우리 다 ^^
# 게임 좋아하면 한번씩 보지 않나....
from django.shortcuts import get_object_or_404
# 일단 shortcuts에서 get_object_or_404을 넣고
회원 = get_object_or_404(헬스장회원, id=회원_id)
# 요렇게 해주면 내가 적은 멘트와 함께 404가 출력된다 뭐 이건 걍 오류 출력이라
# 없는값 입력 안하면 된다 = 꼭 하지말라면 하는 한국인들이 많다.</code></pre>
<p>이렇게 보면 참 쉬운거 같지만 이게 다 합쳐지고 이것저것 조건들이 붙기 시작하면서
머리가 터진다. 진짜임
이제 슬슬 Auth까지 나오는데 여기서부터 또 터짐</p>
<h3 id="지금-내가-그럼">지금 내가 그럼</h3>
<h2 id="3-django-auth">3. Django Auth</h2>
<p>Auth.. 인증이다.. 인증관련 모델은 <code>accounts</code>가 나온다..
여기서 부터 조금씩 복잡해지기 시작한다..
(아니 사실 복잡한게 아니라 기능이 많아지면서 점점 늘어나니까 짜증나는거 뿐이다..)
사실 개념은 너무 쉽다.
Django에서는 보통 회원 관리할 때 <code>accounts</code>라는 이름의 앱을 만든다고 한다.
(다른 이름을 써도 되긴 한데.. Django의 관례라고 한다. 뭐 기업에 따라 다른 이름도 쓰겠지?)</p>
<ul>
<li>Custom UserModel</li>
</ul>
<p>일단 <code>Custom UserModel</code>부터 보자면 Django에서 제공하는 모델이 아니라
Custom 우리가 직접 만드는 <code>UserModel</code> 이라 생각하면 쉽다.
걍 말 그대로 = 장고꺼 안쓰고 내가 만들래 아오 🔫</p>
<pre><code class="language-python"># AbstractUser
from django.contrib.auth.models import AbstractUser
# 장고의 순 기능 여기에 걍 넣기만 하면 된다 :)
class User(AbstractUser):
    근육량 = models.IntegerField()
    기초대사량 = models.IntegerField()
# 이런식으로 User에 (AbstractUser) 요렇게 넣어주고
# 장고의 기본 User 모델을 거의 그대로 가져다 쓰는 방식이다
# username, password, email 등이 이미 다 들어있음
# 여기에 내가 원하는 필드만 걍 추가하면 됨
# 제일 쉬움;;</code></pre>
<pre><code class="language-python"># AbstractBaseUser
from django.contrib.auth.models import AbstractBaseUser
# 아까와 동일하게 auth.models에서 AbstractBaseUser를 넣어준다.
class User(AbstractBaseUser):
    email = models.EmailField(unique=True)
    이름 = models.CharField(max_length=50)
    가입일 = models.DateTimeField(auto_now_add=True)
# 이게 그냥 완전 백지상태에서 시작하는 방식
# 기본 필드가 password 빼고는 아무것도 없음
# 모든 걸 직접 다 만들어야 함 = 난 못함
# 어렵지만 자유도가 높음 = 이것도 그러네</code></pre>
<p>이제 여기에 붙어야 할 도구들을 알아보자
이렇게 만들었다면 여기에 또 부가적으로 붙여야 하는 도구들이 참 많다.</p>
<pre><code class="language-python"># PermissionsMixin
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
# AbstractBaseUser이거 쓸 때 권한 관련하여 같이 쓴다고 함
class User(AbstractBaseUser, PermissionsMixin): #옆에 같이써줌
    email = models.EmailField(unique=True)
# 요런식으로 관리자 권한을 부여하거나 다 같이 관리할 수 있게끔 만들어줌
# 얘 AbstractUser는 이미 얘를 포함하고 있어서 안써도 되는데
# 얘 AbstractBaseUser는 진짜 기본적인것만 있어서 관리자 권한도 추가해줘야 관리가 가능함
# 그래서 어렵다고 한거다 %%^^^^^^^ 


# BaseUserManager
from django.contrib.auth.models import BaseUserManager
# 이렇게 넣어주고
class MyMuscleManger(BaseUserManager):
# 하고 아래 기본적인 내용을 받고싶을 때
# 기본내용은 - create_user / create_superuser 요거 두개뿐이다;;
# BaseUserManager 요놈을 써서 진행한다.
# 이거 또한!!!! AbstractBaseUser만 해당 ㅡㅡ
# AbstractUser는 이미 이 기능이 있음


# UserManager
from django.contrib.auth.models import UserManager
# 이렇게 넣으면 되고
# 예시로 또 작성해 보자면
class CustomMuscleManager(UserManager):
    def muscle_user(self, email, password=None, muscle_mass):
        return super().create_user(email, password=password)
# 위와 같이 편하게 작성을 할 수가 있다.
# BaseUserManager얘 보다 더 좋고 많은 기능을 가지고 있으며
# 애초에 AbstractUser쓸 때 따라온다.
# 보통 따로 건드릴 일은 없음</code></pre>
<ul>
<li>Authenticate() / Login() / Logout() / login_required 데코레이터 함수<pre><code class="language-python"># Authenticate() = 검증하는거다
user = authenticate(username=&quot;근육맨&quot;, password=&quot;1234&quot;)
# 얘는 그냥 인증담당이다 헬스장 들어오는지 보는 역할이다. 
# 아디랑 비번이 맞는지 틀린건지 아닌지 검증한다.
# 예를 들어 헬스장 회원권 찍는지 안찍는지 검사하는 역할
</code></pre>
</li>
</ul>
<h1 id="login--걍-로그인">Login() = 걍 로그인..</h1>
<p>login(request, user)</p>
<h1 id="위에-authenticate-검증을-거친-user를-세션에-넣어주는-것">위에 Authenticate() 검증을 거친 user를 세션에 넣어주는 것</h1>
<h1 id="이것도-딱히-로그인은-다-알기에">이것도 딱히.. 로그인은 다 알기에..</h1>
<h1 id="logout--걍-로그아웃">Logout() = 걍 로그아웃..</h1>
<p>logout(request)</p>
<h1 id="뭐-딱히-설명할-게-없다">뭐 딱히 설명할 게 없다..</h1>
<h1 id="login_required--이제-이건-로그인을-해서-헬스장-출결하게끔-만드는-역할">@login_required = 이제 이건 로그인을 해서 헬스장 출결하게끔 만드는 역할</h1>
<p>@login_required # 👈🏻 진짜 이제 로그인 도장? 뭐라해야되나 페이스 아이디같은 역할이다
def 운동기구_예약(request):
   return render(request, &#39;예약.html&#39;)</p>
<h1 id="그니까-운동기구-예약을-할라면-로그인이-되야-할-수-있으니-login_required-설정해준다">그니까 운동기구 예약을 할라면 로그인이 되야 할 수 있으니 @login_required 설정해준다</h1>
<h1 id="이게-없으면-비회원도-url-타고들어와서-운동예약해버리면-답이없으니">이게 없으면 비회원도 url 타고들어와서 운동예약해버리면 답이없으니</h1>
<h1 id="로그인-안하고-들어오면-바로-차단해야지">로그인 안하고 들어오면? 바로 차단해야지</h1>
<pre><code>![](https://velog.velcdn.com/images/2joon_kim/post/89863e25-fac9-4a20-830b-15275def259b/image.jpeg)
거의다 끝났다. 이제 진짜 얼마 안남았다.
오늘거 진짜 쓸 거 많다. 그래도 아는 내용이 많아서 참 다행이다..
~~ㅠ 아오하기싫ㅇㅇㅎ~~
잠깐 쉬어가는 시간..
빨리 쓰고 다른거 해야지..

## 4. CBV(Class Base View)

어제 한번 설명했지만 FBV를 할때 짧게 한번 적어놨었다.
둘의 차이라고 한다면 함수를 쓰냐 클래스를 쓰냐 그 차이이다.
그래도 좀 더 깊게 들어가서 정의를 내리자면 이건 그냥 개념은 알고 있으나
쉽게 설명하자면 
FBV = 간단 + 처음부터 짜봐야 몇줄 안되는 코드 easy~
CBV = 반복작업 + 여러가지 기능들 있음 + 복잡하여 코드를 재사용해야할 때 easy~

아래 내용정리를 통해 다시한번 외워버리자 걍
(Claude가 열일해서 알려준다 정확하다 아주 i love Claude)
```bash
💡 FBV는 간단하고 직관적이에요 (초보자한테 좋음)
💡 CBV는 코드 재사용이 쉽고 깔끔해요 (복잡한 기능 만들 때 좋음)
어떤 걸 써야 할까요?

📌 FBV 쓰기 좋을 때
간단한 로직
특별한 처리가 많이 필요할 때
CBV 커스텀하는 것보다 처음부터 짜는게 더 쉬울 때

📌 CBV 쓰기 좋을 때
CRUD 같은 반복적인 작업
비슷한 기능을 여러 곳에서 쓸 때
많은 기능이 이미 구현되어 있는 걸 쓸 때

그리고 FBV / CBV의 큰 차이점 중 하나는
FBV: 그냥 &quot;야 일로와봐&quot; 하면 오는데
CBV: &quot;야 일로와봐&quot; 하면 안 되고 &quot;야 일로와봐.as_view()&quot; 해야 옴
= .as_view()라는 메서드로 함수로 변환해야 애가 온다</code></pre><ul>
<li>View / Generic Views<h4 id="view">view</h4>
<pre><code class="language-python"># 이건 적을게 하도 많아 그냥 코드로 정리하는게 나을 거 같아
# 또 베스트 예시인 헬스장으로 예를 들겠다.
# FBV와 기능구현은 비슷하나 CBV를 이용하여 기능을 구현하려고한다.
# Ai chego god claude ⭐️⭐️⭐️
</code></pre>
</li>
</ul>
<h1 id="view-1">view</h1>
<p>from django.views import View</p>
<p>class 헬스장입장(View):
    def get(self, request):
        # GET 요청 = 회원이 그냥 헬스장 둘러볼라고 할때 와 동일
        return render(request, &#39;입장.html&#39;)</p>
<pre><code>def post(self, request):
    # POST 요청 = 이제 일일권 끊어야겠다 싶어서 얼마에요? 하고 들어오려는거
    회원번호 = request.POST.get(&#39;회원번호&#39;)
    # ... 입장 처리 로직 ...
    return redirect(&#39;입장완료&#39;)</code></pre><pre><code>#### Generic Views
```python
# 자 이제 헬스장에 입장했으니 각각의 특수한 환경에 접근을 해야되지 않겠음?
# PT 등록도 있을테고 뭐 회원권 수정도 해야하고 뭣도하고 뭣도하고 등등
# 비유 기가막히다 캬
# 그래서 아래에 정리를 하나하나 해보자면

# CreateView = 새 회원 등록 카운터
class 신규회원(CreateView):
   model = 헬스장회원
   fields = [&#39;이름&#39;, &#39;PT횟수&#39;]

# UpdateView = PT 횟수 수정 카운터
class PT수정(UpdateView):
   model = 헬스장회원
   fields = [&#39;PT횟수&#39;]

# ListView = 회원 명단 보는 모니터
class 회원목록(ListView):
   model = 헬스장회원

# DetailView = 회원 상세정보 창구
class 회원상세(DetailView):
   model = 헬스장회원

# DeleteView = 회원 탈퇴 창구
class 회원탈퇴(DeleteView):
   model = 헬스장회원

# TemplateView = 공지사항 게시판
class 공지사항(TemplateView):
   template_name = &#39;공지.html&#39;

# FormView = 운동일지 작성대
class 운동일지(FormView):
   form_class = 운동일지폼</code></pre><p><strong>CreateView: 새로운 데이터 생성(회원가입)
UpdateView: 기존 데이터 수정
ListView: 목록 보여주기
DetailView: 상세 정보 보여주기
DeleteView: 데이터 삭제
TemplateView: 단순 페이지 표시
FormView: 폼 처리</strong>
정도로 이해하면 가장 쉽게 이해할 수 있을 거 같다.</p>
<p>✨!!!!!!!!라스트 정리!!!!!!!!✨
이렇게 <strong>View</strong>는 기본 입구고
<strong>Generic Views</strong>는 각각 전문적인 일을 하는 카운터.</p>
<ul>
<li>request</li>
</ul>
<p>헬스장 예로 계속 들고 있는데 오늘은 헬스장을 선택하길 잘한거 같다. 겁나쉽게 비유가되네;;
여튼 계속 써보자면 request는 말 그대로 요청이다 = 회원이 헬스장에 뭔가를 요청하는 것</p>
<pre><code class="language-python"># 어김없이 등장하는 헬스장 모습
# user 가져오기 = 지금 요청한 회원이 누구야?
현재회원 = request.user  # 지금 로그인한 회원 정보

# data 가져오기 = 회원이 뭘 달라고 했어?
작성내용 = request.POST.get(&#39;내용&#39;)  # 회원이 폼에 쓴 내용
첨부파일 = request.FILES.get(&#39;운동법&#39;)  # 회원이 올린 운동법

# URL 파라미터 (Path Parameter) = 회원번호로 찾기
path(&#39;회원/&lt;int:id&gt;/&#39;, ...)  # 예: /회원/123/ 
# 123번 회원 찾아줘!

# 쿼리 파라미터 (Query Parameter) = 검색어로 찾기
검색어 = request.GET.get(&#39;search&#39;)  # 예: /회원search=김이준
# = 김이준씨 나오세요.</code></pre>
<ul>
<li>response</li>
</ul>
<p>이것조차 비유가 아주 쉽다. response도 말 그대로 응답 = 헬스장이 회원한테 답해주는 것
아니 물어봤으면 답을 해줘야 되잖아요</p>
<pre><code class="language-python"># HttpResponseRedirect = 다른 페이지로 안내
return redirect(&#39;메인페이지&#39;)  # 회원님 덤벨은 저쪽이요.

# HttpResponse = 직접 응답
return HttpResponse(&#39;성공!&#39;)  # 회원님 잘하셨어요. 두개만 더해볼게요.

# status code = 처리 결과
200 = 회원님 잘 하셨어요
404 = 회원님 물만 먹어도 살찌는건 없어요.
500 = 헬스장 문 닫았나? 아 오늘 쉬는날이네..
# 이건 진짜 그냥 주관적인 해석이 들어간 예고
# 아래를 보자
200 = 요청 성공
404 = 요청한 리소스 못 찾음
500 = 서버에서 처리 중 에러가 발생


# response data = 응답 데이터
return JsonResponse({
   &#39;message&#39;: &#39;어서오세요 돼지고갱님&#39;,
   &#39;pt_횟수&#39;: 100
})  # 들어갔을 때 나오는 회원 정보</code></pre>
<h2 id="5-django-mail">5. Django Mail</h2>
<p>말 그대로 장고에서 메일을 보낼 수 있는 서비스이다
나는 이거 라이브 강의를 들으며 딱 한번 써 봤는데..
사실 이걸 어디서 이용해야 할 진 모르겠다
무슨 이메일 보내는 대형 서비스가 아니고서야 내가 메일 서비스를 사용할 일 이 있을까..?
(아직 몰라서 혹시라도 누군가 읽는다면 어디서 쓰는지 좀..)</p>
<p>📌 검색해보니 어떤 서비스에서 보안이나 중요사항같은거 전달할 때 많이 쓴다고함
📌 뉴스레터도 이걸 통해서 서비스하게 된다면 사용하면 편리할 거 같다</p>
<p>추가 의견 받음!!!!!!!!!!</p>
<ul>
<li>django.core.mail.send_mail<pre><code class="language-python">from django.core.mail import send_mail
</code></pre>
</li>
</ul>
<p>send_mail(
    &#39;ㅎㅇ 헬창들아&#39;,  # 이메일 제목
    &#39;니네 3대 500미만 나시입으면 죽는다;&#39;,  # 이메일 내용
    &#39;hellchang_master@example.com&#39;,  # 보내는 사람 이메일
    [&#39;newbie_hellchang@example.com&#39;],  # 받는 사람 이메일 = 많으면 리스트로 넣으셈
)</p>
<pre><code>- django.core.signing
```python
from django.core import signing

# 데이터 서명하기
value = signing.dumps({&quot;user&quot;: &quot;헬창&quot;})

# 서명된 데이터 확인하기
original = signing.loads(value)  # {&#39;user&#39;: &#39;헬창&#39;} 이렇게 나와요
- django.core.signing.TimestampSigner

# 이 부분은 나도 정확하지 않아서 찾아봤는데
# 비밀번호나 아이디 재설정 링크를 보내준다거나 / 결제관련 메일을 보낸다거나 등
# 보안에 민감한 사항들을 보낼 때 사용한다고 한다.
# 데이터가 변조되지 않았음을 증명해주고 누가 데이터를 수정하면 바로 알 수 있다고 한다.
# 사용해본적이 없어서 모르게씀 ㅠ</code></pre><p>일단 두번째 장고 정리 끗!
정리하고 나니 이해가 좀 빠르긴 하다
다음번엔 디버깅을 좀 더 확실하게 잡고 가야겠다.
특히 보안 + 디버깅은 좀 더 신경써서 작성을 해두도록 해야겠다.</p>
<h1 id="끗">끗</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[Django 문법 정리편]]></title>
            <link>https://velog.io/@2joon_kim/Django-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC%ED%8E%B8</link>
            <guid>https://velog.io/@2joon_kim/Django-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC%ED%8E%B8</guid>
            <pubDate>Mon, 03 Feb 2025 11:45:40 GMT</pubDate>
            <description><![CDATA[<p>오랜만에 벨로그 글을 적는다
오늘은 쉬어가는 타임이라고 문법 정리를 해보라고 한다
장고로 개인 프로젝트 하나를 만들어보니까 훨씬 이해하기는 쉬웠던 것 같다.</p>
<h4 id="는-개뿔-왜캐-알아야-할게-많아">는 개뿔 왜캐 알아야 할게 많아</h4>
<p>일단 정리부터 해야겠다.</p>
<h2 id="1-django-프로젝트-세팅">1. Django 프로젝트 세팅</h2>
<ul>
<li>poetry를 설치하고 시작해야한다. 물론 설치 안해도 되지만 편하다 :)
<del>언제 requirements.txt로 관리를 하고 있음.. 안그래도 바쁜데</del>
특히 requirements.txt를 수동으로 관리할 필요 없이 
pyproject.toml에서 자동으로 관리를 해준다
패키지끼리의 버전 충돌을 자동으로 해결해주니 안 쓸 이유가 없다.<pre><code class="language-bash"># 설치방법!!!!!!!
# 윈도우는 안해봄;
# macOS/Linux에서는
pip install poetry
</code></pre>
</li>
</ul>
<h1 id="windows에서는">Windows에서는</h1>
<p>curl -sSL <a href="https://install.python-poetry.org">https://install.python-poetry.org</a> | python3 -</p>
<p>근데 검색해보니 
윈도우에서 쓰는 명령어랑 공용으로 쓴다고 한다.
pip install 이게 현재는 권장되는 방법이 아니라고 함 </p>
<pre><code>- 가상환경 구축하는 방법 (with Poetry)
```bash
poetry shell ```간단하다:)```

#사실 poetry 가상환경 설정이 가능하지만
#나는 pyenv-virtualenv를 써서 관리했다.
#그냥 1project = 1가상환경 
#poetry는 프로젝트 패키지 의존성을 위하여 공동작업시 동일한 환경선상에서 출발하기 편하다
#물론 검색해보니 pyenv로는 python버전 관리를 위해 같이 사용한다고 한다
#다 알기때문에 pass</code></pre><ul>
<li>Django 설치 및 프로젝트 구성, 앱 세팅하는 방법<pre><code class="language-bash"># Poetry로 Django 설치
poetry add django
</code></pre>
</li>
</ul>
<h1 id="프로젝트-생성">프로젝트 생성</h1>
<p>django-admin 프로젝트이름 config .
#config 도 사실 아무렇게나 바꿔도 되지만 설정파일인 만큼 걍 정적으로 가자
#보통 다들 정적으로 쓴다고함 ㅇㅇ</p>
<h1 id="개발-서버-실행">개발 서버 실행</h1>
<p>python manage.py runserver</p>
<h1 id="로켓보이면-성공한거임">로켓보이면 성공한거임</h1>
<h1 id="예뷁이라는-앱을-만들시">예:&#39;뷁&#39;이라는 앱을 만들시</h1>
<p>python manage.py startapp 뷁</p>
<p>INSTALLED_APPS = [
    &#39;django.contrib.admin&#39;,
    &#39;django.contrib.auth&#39;,
    &#39;django.contrib.contenttypes&#39;,
    &#39;django.contrib.sessions&#39;,
    &#39;django.contrib.messages&#39;,
    &#39;django.contrib.staticfiles&#39;,
    &#39;뷁&#39;,  # 뷁을 만들었으니 여따 추가한다.
    # config/settings.py에 있음
    # 그럼 기본 세팅은 끗
]</p>
<pre><code>- templates 경로 지정하기
```bash
mkdir templates
# 프로젝트 루트에다가 templates라고 만들어버린다

#다시 settings.py로 돌아와 아래 내용을 찾는다
import os  # 파일 맨 위에 추가 = 요건 import를 꼭 해놔야 장고가 찾는다

TEMPLATES = [
    {
        &#39;BACKEND&#39;: &#39;django.template.backends.django.DjangoTemplates&#39;,
        &#39;DIRS&#39;: [os.path.join(BASE_DIR, &#39;templates&#39;)], #혹은
        &#39;DIRS&#39;: [BASE_DIR / &#39;templates&#39;], #둘중에 하나 ㄱ
        &#39;APP_DIRS&#39;: True,
        ...
    },
    # pathlib이라고 장고 3.1이후부터 이용한다고 한다 근데 찾아보니 옛버전도 있어서 가져옴
    #밑에 뭐가 더 있긴 한데 저기서 DIRS라고 하는 경로를 수정해서 templates를 찾게 만든다
    #이거 안하면 얘가 못찾음 = 실제로 다른경로에 냅둘 시 저거 설정해줘야 얘가 찾음
]</code></pre><ul>
<li>static 경로 지정하기<pre><code class="language-bash"># templates랑 똑같다
mkdir static #폴더만들고
</code></pre>
</li>
</ul>
<h1 id="다시-settingspy로-돌아와-아래-내용을-찾는다">다시 settings.py로 돌아와 아래 내용을 찾는다</h1>
<h1 id="settingspy-파일-맨-아래에-있을거임">settings.py 파일 맨 아래에 있을거임</h1>
<p>STATIC_URL = &#39;/static/&#39;
STATIC_ROOT = os.path.join(BASE_DIR, &#39;staticfiles&#39;)
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, &#39;static&#39;),
]
#혹은 요건 pathlib 쓴 최신버전 기준임 위랑 아래랑 같음 ㅇㅇ
STATIC_ROOT = BASE_DIR / &#39;staticfiles&#39;
STATICFILES_DIRS = [
    BASE_DIR / &#39;static&#39;,
]</p>
<p>#media도 마찬가지라 걍 적겠다</p>
<h1 id="media-파일-설정-ㅇㅇ-ospathjoin써도-되고-아래-pathlib써도되고-무방">Media 파일 설정 ㅇㅇ os.path.join써도 되고 아래 Pathlib써도되고 무방</h1>
<h1 id="장고-버전보고-결정하자">장고 버전보고 결정하자</h1>
<p>MEDIA_URL = &#39;media/&#39;
MEDIA_ROOT = BASE_DIR / &#39;media&#39;</p>
<pre><code>## 2. Database Model

- 데이터베이스 모델 정의하기
걍 쉽게 말해 우리가 이제 위에서 정의한 내용을 가지고 뭘 만들었을 때
우리가 저장하고 싶은 데이터를 정의하기 위해 쓴다.
아래에 기가막힌 예가 있다
요론식으로 얘한테 정의를 내려주면 장고가 알아서 만들어준다

&lt;div align=&quot;center&quot;&gt;

  | 항목 | 입력값 | 길이 제한 | 결과 |
|:---:|:---:|:---:|:---:|
| ID | 뷁 | 1글자 | 정상 작동 ✅ |
| ID | 뷁뷁 | 1글자 초과 | 프로그램 폭발 💥 |
| 비밀번호 | pw | 2글자 | 정상 작동 ✅ |
| 비밀번호 | pwd | 2글자 초과 | 도시 폭발 💣 |
&lt;/div&gt;

- 각 필드별 특징 정리하기
```bash
# 각 필드라고 했을 때 겁나 많긴 한데 자주쓰는것들만 좀 적어보겠다
# 그리고 그때그때 검색해보면 뭐가 계속 나온다 ;;

# 짧은 문자열 (예: 제목, 이름)
title = models.CharField(max_length=200)

# 긴 문자열 (예: 게시글 내용)
content = models.TextField()

# 이메일
email = models.EmailField()

# URL
website = models.URLField()

# 날짜만
birthday = models.DateField()

# 시간만
meeting_time = models.TimeField()

# 날짜+시간
created_at = models.DateTimeField(auto_now_add=True)  # 생성 시 자동 저장
updated_at = models.DateTimeField(auto_now=True)      # 수정 시 자동 갱신

# 뭐 사실 쓰기 나름이기 때문에 진짜 많다
# 이건 내가 쓰고싶은 내용 검색해서 쓰자</code></pre><ul>
<li>Migration에 대해서 정리하기
migration은 그냥 다 필요없이 git commit/push를 생각하자
이거 말고 딱히 좋은 예가 안 떠오른다.<pre><code class="language-bash"># 1. 모델을 변경한 후 마이그레이션 파일 생성
python manage.py makemigrations
</code></pre>
</li>
</ul>
<h1 id="2-마이그레이션을-데이터베이스에-적용">2. 마이그레이션을 데이터베이스에 적용</h1>
<p>python manage.py migrate</p>
<h1 id="데이터베이스-초기화-주의-모든-데이터가-삭제됨">데이터베이스 초기화 (주의: 모든 데이터가 삭제됨)</h1>
<p>python manage.py migrate app_name zero</p>
<h1 id="git쓴-사람들은-이해가-빠름">git쓴 사람들은 이해가 빠름</h1>
<h1 id="마지막에-쓴-내용은-꼭-필수로-알아두자-내가-이거때문에-좀-고생좀-했다-">마지막에 쓴 내용은 꼭 필수로 알아두자 내가 이거때문에 좀 고생좀 했다 ^^</h1>
<pre><code>
## 3. Jinja

- Jinja 문법 정리하기
걍 html에서 파이썬언어로 알아먹을 수 있도록 만든 템플릿 언어다
우리는 파이썬이랑 친하기 때문에 html내에서도 파이썬으로 소통이 가능하다
근데 ~~걍 직접 해봐야 이해가 빠르다 jinja는~~
```html
어떻게 쓰는지?

{{ }} 변수를 출력할 때 씀. 
예를 들어 {{ name }}이라고 쓰면 파이썬에서 보낸 name 변수값이 여기에 나타남

{% %}  if문이나 for문 같은 제어문을 쓸 때 사용. 
예를 들어 {% if user %}처럼 조건문을 쓸 수 있음

{# #}  주석을 달 때 사용. 이건 실제 웹페이지에서는 안 보임</code></pre><ul>
<li><p>block 사용법 / extends 사용법
extends는 &#39;기본 틀&#39;을 가져오는거 (약간 PPT껍데기 가져오는거랑 비슷하다고 보면된다)
block은 그 가져온 틀에서 &#39;이 부분만 바꿀거야~&#39; 하고 지정해놓는 것</p>
<pre><code>&lt;!-- 요런 기본 틀이 있다고 가정해보자 --&gt;
&lt;!-- 기본껍데기 이름 = ggupdaegi.html --&gt;
&lt;html&gt;
&lt;body&gt;
  {% block content %}
  {% endblock %}
&lt;/body&gt;
&lt;/html&gt;</code></pre><pre><code class="language-html">&lt;!-- 지금 나는 위에있는 껍데기를 가져온거다 --&gt;
&lt;!-- extends를 통해서^^ --&gt;
&lt;!-- block를 통해 나는 이 부분만 바꿔야징 하고 하기싫다고 적어놨다 --&gt;
{% extends &#39;ggupdaegi.html&#39; %}
{% block content %}
  아오 하기싫어
{% endblock %}</code></pre>
<h2 id="4-fbvfunction-base-view">4. FBV(Function Base View)</h2>
</li>
<li><p>FBV란?
FBV(function based views)의 약자로 걍 장고에서 view함수를 작성하는 방법은 크게 두가지가 있는데 그중 하나이다.
쉽고 간단한 로직을 쓰는데 사용한다.
더더더더 쉽게 풀어보자면 view 말그대로 보여줘야 되는데 어떻게 보여줄거냐?
함수를 사용해서 이것저것 쓰면 보여진다고 생각하면 된다
<del>걍 이것도 직접 해봐야 쉽다..</del></p>
<pre><code class="language-python"># 요건 FBV 를 이용한 view 방식
def ddong(request): #ddong이라는 함수를 만들고
  return render(request, &#39;weckweck.html&#39;) #render를 이용해 weckweck.html을 보여준다.
</code></pre>
</li>
</ul>
<h1 id="안-나왔는데-걍-cbv도-쓰겠다">안 나왔는데.. 걍 CBV도 쓰겠다</h1>
<h1 id="장고에서-제공하는-templateview라는-미리-만들어진-클래스를-가져올거다">장고에서 제공하는 TemplateView라는 미리 만들어진 클래스를 가져올거다</h1>
<h1 id="cbv는-이미-있는-클래스를-가져온다">CBV는 이미 있는 클래스를 가져온다</h1>
<p>from django.views.generic import TemplateView</p>
<h1 id="ddong라는-클래스를-만들어서-templateview의-기능을-쓴다-라고-해주는거다">ddong라는 클래스를 만들어서 TemplateView의 기능을 쓴다 라고 해주는거다</h1>
<h1 id="위와-흡사하지만-차이가-있다면-defclass-차이이다">위와 흡사하지만 차이가 있다면 def/class 차이이다</h1>
<p>class ddong(TemplateView):
    template_name = &#39;weckweck.html&#39;</p>
<pre><code>- render / redirect
```python
# render부터 이건 걍 야 &#39;이 html 보여줘라&#39; 하는거랑 똑같다.
  def profile(request):
    name = &quot;하기싫다맨&quot;
    return render(request, &#39;game2joa.html&#39;, {&#39;name&#39;: name})
    # game2joa.html을 보여주는데 &#39;하기싫다맨&#39; 이라는 변수도 같이 넘겨라 ㅇㅋ?

# redirect는 어디서 들어본 용어일텐데 그냥 url 이동시키는거다 예를들어
  def ddong_out(request):
    # ddong이 out할때...
    return redirect(&#39;toilet&#39;)  # toilet이라는 url로 이동!

  # 어우 근데 다 똥으로 설명하니까 좀 드럽긴하네</code></pre><h2 id="5-urls">5. Urls</h2>
<p>  자 마지막이다 조금만 더 힘내서 작성하고 운동가야겠다.</p>
<ul>
<li>URL 엔드포인트란?
걍 쉽게 말해서 URL은 웹사이트의 주소를 지정하는 방법이다.
우리가 흔히보는 <a href="http://www.naver.com">www.naver.com</a> 에서 blog나 어디 웹툰들어가면 마지막이
<a href="http://www.naver.com/blog">www.naver.com/blog</a> 혹은 <a href="http://www.naver.com/webtoon">www.naver.com/webtoon</a> 이렇게 돼 있을건데
저게 엔드포인트이다
✨ 참고로 아무것도 없는건 그냥 root(루트) URL이라고 부름</li>
<li>urlspatterns<pre><code class="language-python"># 아마 걍 설정파일/urls.py들어가면 저런것도 없겠지만 path 어쩌구 되있을텐데
# 좀 깊게 알아보자면
# config/urls.py (메인 urls.py)
from django.urls import path, include
</code></pre>
</li>
</ul>
<p>urlpatterns = [
    path(&#39;itsme/&#39;, admin.site.urls),
    # 나는  url에서 엔드포인트가 itsme로 가게된다면 admin(관리자)가 열리게끔 설정해둔거고</p>
<pre><code>path(&#39;&#39;, views.toliet, name=&#39;toliet&#39;),
# 아무것도 없는(&#39;&#39;) root url로 갈시 toliet을 보여줘라 적어놓은거고

path(&#39;ddong/&#39;, include(&#39;ddong.urls&#39;)),
# ddong/으로 시작하는 주소는 전부 ddong/urls.py 여기서 찾아라 ㅡㅡ 하는거고
# 쉽게 예를 들어 ddong/make/, ddong/eat/ 이런 주소들은
# ddong/urls.py 파일에서 처리하겠다는 뜻!</code></pre><p>]</p>
<pre><code>- URL Include 개념 및 방법
```python
# 위에 것과 연결하여 그럼 아마 ddong/urls.py는 아래와 같이 추가를 했을것이다.
# 왜냐? url include를 통해 ddong로 시작하는건 모두 ddong에서 찾아라 라고 했기 때문
# 그게 바로 url include이다.

urlpatterns = [
    path(&#39;make/&#39;, views.make_ddong),# 엔드포인트 = ddong/make/
    path(&#39;eat/&#39;, views.eat_ddong),# 엔드포인트 = ddong/eat/
]
# 어우 이해는 빨리되는데 속이 좀 안좋네</code></pre><ul>
<li>path / include
위에서 다 설명을 했지만 다시 한번 쉽게 설명하자면
path는 &quot;이 주소로 오면 이 함수를 실행해!&quot;라고 알려주는 거고
그래서 그냥 처음에 달려있는 path는 이 함수 실행해서 보여주셈! 이 되겠다.</li>
</ul>
<p>include는 &quot;이 주소로 시작하면 저기에 가가지고 urls.py 파일을 보셈&quot;라고 알려주는 거다.
ddong예시 참조</p>
<h2 id="django-요약정리-끗">Django 요약정리 끗!</h2>
<p><strong>이거보다 쉽게 설명하신분 추첝해주세여 👍🏻</strong></p>
<div align="center">
<img src="https://velog.velcdn.com/images/2joon_kim/post/cb831130-6be6-4ef8-823e-cda695d0fe08/image.png" width="400">
</div>



]]></description>
        </item>
        <item>
            <title><![CDATA[Class 개념]]></title>
            <link>https://velog.io/@2joon_kim/Class-%EA%B0%9C%EB%85%90</link>
            <guid>https://velog.io/@2joon_kim/Class-%EA%B0%9C%EB%85%90</guid>
            <pubDate>Sun, 05 Jan 2025 12:05:06 GMT</pubDate>
            <description><![CDATA[<p>상속의 개념 class
기본에 충실해야지 정의를 하나도 못내리고 있다!!!!!
역시 더 노력해야 하는데도 불구하고 정의를 못내리는 경지에 이르렀다.
기초에 좀 빠삭해지자.</p>
<p align="center"><img src= https://velog.velcdn.com/images/2joon_kim/post/91163931-3309-4928-8029-3bbe6c503cc4/image.png width:500px>

<p>자식은 부모를 참조한다
부모는 자식이 몇개인지, 어디에 있는지 모른다.
자식이 부모를 참조하기 때문에 
보통 상속 다이어그램에서는 자식이 부모를 향하도록 화살표를 그린다</p>
<p>상속은 ‘클래스와 클래스끼리 하는것’
상속관계가 맺어지면 한쪽은 부모, 한쪽은 자식이 됩니다
상속은 ‘물려주는 것’
클래스는 멤버변수와 메소드를 가지고 있습니다
클래스는 상태(멤버변수)와 행동(메소드)를 가지고 있습니다
상속은 멤버변수와 메소드를 지니고 </p>
<p>객체지향은 사람을 위해 존재한다
사람은 개념화에서 받아들인다</p>
<h2>abstract vs concrete</h2>

<p>abstract = 추상적인것은 구현이 안되어있는 것</p>
<p>모든 라이브러리 변수 타입을 알아오기
모듈 함수 등 메소드 타입 등 타입에 익숙해지는 공부</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 겅부's]]></title>
            <link>https://velog.io/@2joon_kim/Python-%EA%B2%85%EB%B6%80s</link>
            <guid>https://velog.io/@2joon_kim/Python-%EA%B2%85%EB%B6%80s</guid>
            <pubDate>Mon, 30 Dec 2024 09:02:19 GMT</pubDate>
            <description><![CDATA[<p align="center"><img src = "https://velog.velcdn.com/images/2joon_kim/post/7ac349d1-7446-4027-938a-22fa70cbb3c3/image.png" width = 400px>

<p>오늘 문제를 풀면서 긴가민가 했던걸 공부하며 다시 새롭게 알아버린 함수가 있다.
sort 메서드인데 개념정리를 하자면 이렇다. <del>feat.gpt</del>
아래와 같이 예시를 들어 
number에 다양한 숫자가 있고 sorted 함수를 통해 정리하면 원본을 유지하며 정렬하여 반환한다.</p>
<H3>sort() 메서드와 sorted() 함수의 차이</H3>
sort(): 리스트의 메서드로, 원본 리스트를 직접 수정

<p>sorted(): Python의 내장 함수로, 어떤 이터러블도 받아 정렬된 새로운 리스트를 반환. 
원본 데이터는 변경 X</p>
<pre><code class="language-python">numbers = [3, 1, 4, 1, 5, 9, 2]
sorted_numbers = sorted(numbers)
print(sorted_numbers)  # 출력: [1, 1, 2, 3, 4, 5, 9]
print(numbers)  # 출력: [3, 1, 4, 1, 5, 9, 2] (원본은 변경되지 않음)</code></pre>
<H3>math 모듈</H3>
Python에서 math 모듈은 수학적인 함수와 상수들을 제공하는
표준 라이브러리<br> 제곱근 문제를 푸는데 사용했다..

<pre><code class="language-python">import math

# 원의 넓이 계산
radius = 5
area = math.pi * math.pow(radius, 2)
print(area)  # 원의 넓이 출력

# 로그 계산
log_value = math.log(10, 10)
print(log_value)  # 밑이 10인 로그 10의 값 출력

# 제곱근 계산
sqrt_value = math.sqrt(16)
print(sqrt_value)  # 16의 제곱근 출력</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Javascript를 더 deep 하게]]></title>
            <link>https://velog.io/@2joon_kim/Javascript%EB%A5%BC-%EB%8D%94-deep-%ED%95%98%EA%B2%8C</link>
            <guid>https://velog.io/@2joon_kim/Javascript%EB%A5%BC-%EB%8D%94-deep-%ED%95%98%EA%B2%8C</guid>
            <pubDate>Mon, 30 Dec 2024 08:55:47 GMT</pubDate>
            <description><![CDATA[<p align="center"><img src="https://velog.velcdn.com/images/2joon_kim/post/96be8193-5f83-4778-b4aa-f0350e6097b8/image.jpg" width = 400px></p>

<p>슬슬 과부하가 오기 시작한다
여러 강의를 연속으로 들으니 앞서 배웠던 내용들도
뒤죽박죽이 되어가지만 네츄럴 말랑 brain을 단단하게
만들기 위해서 이악물고 강의를 들어본다</p>
<p>DOM 메소드 속성의 명령어를 알아보Java
상황에 따라 내 문서에따라 호출법을 사용하자</p>
<pre><code class="language-javascript">document.querySelector(값) /* 불러오거라 */
document.querySelectorAll(값) /* 다 불러라 */
document.getElementsByClassName(값) /* 클래스네임으로 불러라 */
document.getElementsById(값) /* 아이디로 불러와라 */</code></pre>
<h3 id="비교연산">비교연산</h3>
<p>크냐 작냐! 같냐 다르냐! 주어진 두 항을 비교할 수 있는
비교 연산자를 제공한다</p>
<p>boolean형 데이터를 사용해 반환을 한다
참 or 거짓
파이썬과 다른점이 있다면
&quot;===&quot; 완전히 같다 가 있다.
예를 들어 확인해보자</p>
<pre><code class="language-javascript">console.log(&#39;1&#39; == 1) // true
console.log(&#39;1&#39; === 1) // false

자로형과 데이터값이 모두 일치해야만 같다고 판단한다.
완전 엄격한(strict)비교라고 할 수 있겠다.</code></pre>
<h3 id="조건문">조건문</h3>
<p>내가 가장 좋아하는 if문이 붙는 조건문이다
파이썬과 너무 흡사하기 때문에 쉽게 이해가 가능했다.
<del>(아 오늘 코테 좀 풀고 자야겠다)</del></p>
<pre><code class="language-javascript">if(조건){
//조건이 true일 때 실행할 코드
}else{
  //조건이 false일 때 실행할 코드
  //if와 무조건 같이 써야한다.
}else if(조건){
 //조건이 하나가 아닌 다른 조건이 추가될 때 사용한다.
 //개수 제한은 없다. elif와 같은 느낌!
}</code></pre>
<h3 id="반복문">반복문</h3>
<p>당연히 for문과 while문이고
이것도한 파이썬과 흡사하여 이해가 쉬웠다.</p>
<pre><code class="language-javascript">for(초기식; 조건식; 반복식){}
// 초기식 : 반복조건의 초기화 작업
// 조건식 : 반복조건의 마무리 조건
// 반복식 : 반복이 끝날때마다 실행 될 작업

while(조건){/*조건이 true인 동안에 반복 수행할 코드*/}
//while문은 조건이 참일 경우 계속~ 루프한다
조건안의 변수의 변화를 시켜주는것이 좋다
- 그래야 끝이 나니까!</code></pre>
<h3 id="dom-create">DOM create!</h3>
<p>지정된 이름의 html요소를 만들어서 반환이 가능하다
하지만 자바스크립트에서 만들어져 있는요소를 화면에
표시하는 작업을 추가로 해주어야 한다!!</p>
<p>그래서 appendChild가 들어간다!</p>
<pre><code class="language-javascript">document.createElement(&#39;div&#39;)
document.createElement(&#39;p&#39;)
document.createElement(&#39;a&#39;)

target.appendChild(자식으로_추가할_요소)
여기서 target은 &#39;div&#39; &#39;p&#39; &#39;a&#39;가 되겠다</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Javascript 정의]]></title>
            <link>https://velog.io/@2joon_kim/Javascript-%EC%A0%95%EC%9D%98</link>
            <guid>https://velog.io/@2joon_kim/Javascript-%EC%A0%95%EC%9D%98</guid>
            <pubDate>Thu, 26 Dec 2024 04:43:44 GMT</pubDate>
            <description><![CDATA[<p>자바스크립트이다 
언어를 배우는 것은 아주우 재밌다.
HTML을 배우면서 마크업랭기지와 아주 친해졌기 때문에
벨로그 작성이 한결 수월해졌다 ^.*</p>
<img src="https://velog.velcdn.com/images/2joon_kim/post/6a9caa94-ac05-4b6a-af1e-39625b24be82/image.png" width = 400 px>

<p>말로만 들었었지 어떻게 작동을 하는지
html에서 어떤 구성을 가지고 있는지 
이번 교육을 통해 알게 되었다.</p>
<p>Javascript는 HTML내에서 css와 같이 적용가능하다.
css는 stlye을 정의하는 문서라면
Javascript는 문서 내 기능이나 
사용자와의 상호작용을 정의하는 문서이다.</p>
<p>Javascript는 프로그래밍 언어로서, 소프트웨어적 대상에게
명령을 내리는 역할을 수행한다.</p>
<h5>소프트웨어적 대상이란?<br>
웹 브라우저, 웹 요소, 웹 스타일 등을 의미
</h5>

<p>명령을 내리고싶은 대상에게 자바스크립트 명령을 전달하면
다음 절자대로 작업이 이루어 진다.</p>
<h2> 입력 => 처리 => 출력 </h2>

<p>입력 : 객체에게 작업 수행 명령 전달
처리 : 객체가 주어진 작업 수행
출력 : 객체가 작업수행결과 사용자 반환</p>
<p>** <em>보통 Javascript는 html문서 body 아래쪽에 작성한다.*</em></p>
<p>자바스크립트에는 다양한 객체 이름이 미리 정의되어 있어
사용자는 어떻게 사용하는지만 알고 있으면 사용이 가능하다!</p>
<p>명령의 두가지 유형
사용 예시</p>
<pre><code class="language-javascript">객체.데이터
객체.기능()

window.alert(&#39;조심하세요&#39;);
window.alert(&#39;줄을 나눌때는 ;으로!&#39;);

/*조심하세요! 라는 문구를 알리는 창을 표시한다 */
/*줄을 나눌때는 ;으로 나눈다 */
/**/ = 스크립트 주석</code></pre>
<p>콘솔(console)은 브라우저 디버깅 콘솔 접근 가능</p>
<pre><code class="language-javascript">window.console; 
console 
/* 위 두개는 동일하게 접근 가능 */

console.log(typeof 사용자가 원하는 값)
/* typeof = 원하는 값의 자료형이 뭘까용? */

/* 사용자는 자바스크립트 문법으로 표현될 수 있는 데이터를
넣어 명령 전달 가능!*/

/* 맥 기준 opntion + command * I 를 하면 
볼 수 있는 개발자도구에서도 확인이 가능하다. */</code></pre>
<p>숫자는 정수와 실수로 구분</p>
<ul>
<li>산술 연산 더하기, 빼기 등 수를 이용한 계산법 표현 가능</li>
<li>여러개의 계산법이 있을 때 당연하게 곱하기 나누기가 먼저</li>
</ul>
<p>정말 중요한 개념 변수!
쉽게 정의를 내리자면 &#39;데이터에 붙이는 이름표!&#39;
제약사항으로는</p>
<ol>
<li>변수명에는 오직 문자와 숫자, 그리고 기호 $ 와 _만이 포함가능</li>
<li>변수명의 첫번재 글자로 숫자가 올수 없다!</li>
<li>이미 다른뜻을 가진 단어(키워드)로는 사용 불가!</li>
</ol>
<p>변수는 대입 연산자 사용
ex) a = b / a *= b 등~</p>
<pre><code class="language-javascript">let 변수이름 = 데이터; //변수 선언
변수이름 = 데이터; // 변수 초기화

//아래와 같이 사용 가능
let 변수이름 = 데이터1
변수이름 = 데이터2
변수이름 = 데이터3

/* 변수가 생성되고 나면 변수(변수이름)을 대신 사용 가능하다 */</code></pre>
<p>변수가 존재하니 당연히 상수도 존재
상수란 수식에서 &#39;변하지 않는 값&#39;을 뜻함</p>
<pre><code class="language-javascript">const 상수이름 = 데이터;
// 상수는 선언과 동시에 초기화 필요 위와같이!
/* 네이밍 컨벤션은 변수와 동일! */</code></pre>
<p>문자열도 다른 언어와 동일하게 사용가능
string!
문자열을 다양하게 사용 가능한데
예시로 대표적인건 prompt(값)</p>
<p>템플릿 리터럴
반환값이 존재하는 자바스크립트 코드
즉 표현식을 내장 할 수 있는 문자열 표현법
백틱(`)으로 가두고 ${} 플레이스 홀더를 이용
= 파이썬의 f-stiring 표현법과 유사하다!</p>
<pre><code class="language-javascript">const data1 = &quot;데이터&quot;
const str1 = `문자열 중간에 ${dat1} 삽입하기₩
console.log(str1)
// 출력값
문자열 중간에 데이터 삽입하기</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML / CSS의 기본구조]]></title>
            <link>https://velog.io/@2joon_kim/HTML-CSS%EC%9D%98-%EA%B8%B0%EB%B3%B8%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@2joon_kim/HTML-CSS%EC%9D%98-%EA%B8%B0%EB%B3%B8%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Tue, 24 Dec 2024 08:12:44 GMT</pubDate>
            <description><![CDATA[<p>눈에 보이는 것 or 안 보이는 것
<img src="https://velog.velcdn.com/images/2joon_kim/post/ce5ea345-c5f4-48cd-b054-bdc5620fb925/image.png " width="80%" ></p>
<p>쉽게 말해서 그렇지만 클라이언트를 가지고 나눈다
클라이언트는 서버를 통해 요청하고
백엔드는 데이터베이스를 통해 상호작용하여 전달한다</p>
<p>백엔드 개발자는 HTML과 CSS를 <strong>&#39;잘&#39;</strong> 해야 할까?
= 풀스택으로 개발중에 있다면 숙지가 필요한 부분이라고 생각한다.</p>
<h3>결론은 알아두면 도움된다!</h3>

<h5><s>너무 당연한 얘기지만..</s></h5>

<h2>HTML이란?</h2>

<p>HTML (hyper text markup language)이다
HTML 문서는 계층구조를 이루고 있다.
웹 페이지의 구조를 나타내는 마크업 언어!</p>
<p>파이썬은 인터프리터 언어 = 프로그래밍 언어</p>
<pre><code class="language-html">id = 문서 전체에서 고유한 하나의 요소
class = 여러개의 요소를 지정 할 수 있음

사용법(호출)
id = #
class = .</code></pre>
<p>추가적으로 모든 요소를 외울 필요는 없다.
그때 그때 필요한 요소를 갖다 쓰자 feat.godGPT</p>
<p>HTML의 head 부분에 있어서는 조금 더 파악을 하는게 좋을 것 같다.
사실 지금 쓰고 있는 이 벨로그의 글 페이지 마저 마크업 언어를 사용하고 있기 때문에 어느정도 시스템이 비슷하여 요소의 세세한 내용은 다룰 필요가 없을 것 같다.</p>
<p>시맨틱한 HTML 문서를 만들어야 잘 만든 코드이다.
HTML5에서 새롭게 추가된 의미론적 요소들이다.</p>
<p>아래와 같이 정의를 내려주면 협업을 진행하거나 완성된 페이지가 검색량도 늘고 여러모로 좋은 페이지가 된다.</p>
<p>실제로 그냥 코드만 봐도 제목이 어디있고 메인내용이 뭔지 등
한눈에 가독성이 좋은 코드를 볼 수 있다.</p>
<pre><code class="language-html">시맨틱한(Semantic) Tag를 이용한 작성 예시

&lt;article&gt;문구1&lt;/article&gt;
&lt;section&gt;문구2&lt;/section&gt;
&lt;aside&gt;문구3&lt;/asdie&gt;
&lt;footer&gt;문구4&lt;/footer&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 함수의 정리]]></title>
            <link>https://velog.io/@2joon_kim/%ED%95%A8%EC%88%98%EC%9D%98-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@2joon_kim/%ED%95%A8%EC%88%98%EC%9D%98-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Tue, 26 Nov 2024 01:22:13 GMT</pubDate>
            <description><![CDATA[<p>강의를 들으며 오늘 배운 내용에 대해 이해한 방식대로 정리하는 시간을
가져보려고 한다. 
어제 정리한 내용이지만 거기에 덧붙여서 정리를 진행해보기로 했다.</p>
<p>먼저 함수와 내장함수에 대해 어제 정리를 했었다.
오늘은 함수에 대해 조금 더 자세하게 정리를 해보려고 한다.</p>
<ol>
<li>함수의 기본 구조에 대해 설명해보기</li>
<li>함수 호출은 무엇을 의미하고 어떻게 할 수 있는가?</li>
<li>매개변수란 무엇인가?</li>
<li>식별자자는 무엇이고 사용하는 이유는 무엇인가?</li>
<li>식별자는 함수 안에서 어떻게 사용되는가?</li>
</ol>
<h3 id="함수의-기본-구조에-대해-설명해보기">함수의 기본 구조에 대해 설명해보기</h3>
<h4 id="함수의-기본-구조">함수의 기본 구조</h4>
<p>먼저 코드블럭과 함께 정리를 해보려고 한다.</p>
<pre><code>```python

def 함수이름(매개변수1, 매개변수2, ...):

# 함수 내에서 실행될 코드
# 다양한 코드로 함수가 수행할 수 있는 작업을 도와준다.

return 반환값 #우리가 출력하고자 하는 값

```</code></pre><p>def: 함수를 정의하는 키워드
함수이름: 함수를 호출할 때 사용하는 이름
매개변수: 함수에 전달하는 값을 받는 변수 (선택 사항)
함수 내부 코드: 함수가 수행할 작업을 적는 부분
return: 함수의 결과를 반환(선택 사항)</p>
<p>파이썬에서 함수는 특정 작업을 수행하는 코드 블록이다. 
마치 레시피와 같이 정해진 순서대로 명령을 실행하여 특정 결과를 만들어낸다.
위 코드블록을 통해 간략하게 설명해 두었다.</p>
<h3 id="함수-호출은-무엇을-의미하고-어떻게-할-수-있는가">함수 호출은 무엇을 의미하고 어떻게 할 수 있는가?</h3>
<h4 id="함수-호출">함수 호출</h4>
<pre><code>```python

def 인사(이름): 
print(&quot;안녕하세요,&quot;, 이름, &quot;님!&quot;)

인사(&quot;홍길동&quot;)  # 함수 호출

```    </code></pre><p>위 코드블록을 통해 함수의 호출에 대해 짦막하게 적어 보았다.
위 코드를 실행시켜보면 우리가 &#39;인사&#39; 라고만 출력해줘도
자동적으로 안녕하세요 홍길동 님! 이라고 나온다.</p>
<h3 id="매개변수란-무엇일까">매개변수란 무엇일까?</h3>
<h4 id="매개변수란">매개변수란?</h4>
<p>매개변수는 함수가 작업을 수행할 때 필요한 데이터를 받아들이는 변수라고 생각하면 된다.
마치 레시피에서 재료가 필요하듯이 함수도 특정 작업을 하기 위해 필요한 값들을
받아야 할 때 이때 사용되는 것이 매개변수이다.</p>
<h3 id="식별자는-무엇일까">식별자는 무엇일까?</h3>
<h4 id="식별자란">식별자란?</h4>
<p>식별자는 프로그래밍에서 변수, 함수, 클래스 등과 같이 
프로그램 내의 요소들을 구별하기 위해 붙이는 요소들을 말한다. 
쉽게 말해, 사람에게 이름이 있듯이, 프로그램 안의 각 요소들에게 
붙여주는 이름이라고 생각하면 된다.</p>
<h3 id="식별자가-함수에서는-어떻게-사용될까">식별자가 함수에서는 어떻게 사용될까?</h3>
<h4 id="식별자-사용-방법">식별자 사용 방법?</h4>
<p>우리는 코딩을 할 때 많은 식별자를 사용해 함수로 사용하고 있다.
함수에서 식별자는 주로 함수 이름과 함수 내부의 변수 이름으로 사용된다.</p>
<p>이처럼 그냥 지나칠 수 있는 내용을 다시 복습하며 글을 적어보았다.
그나저나 요즘 chat.gpt 말고 Gemini의 도움을 받아 코딩을 진행중인데
이미지도 곧잘 만들고 chat.gpt엔진으로 구글이 만들어서 그런지
거의 비슷하다.</p>
<p><img src="https://velog.velcdn.com/images/2joon_kim/post/ac67289b-b0cc-43b7-8f80-b1a7a0c7cbeb/image.png" alt="파이썬이 세계를 정복한다."></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 메소드 / 내장 함수/ 함수]]></title>
            <link>https://velog.io/@2joon_kim/%EB%A9%94%EC%86%8C%EB%93%9C-%EB%82%B4%EC%9E%A5-%ED%95%A8%EC%88%98-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@2joon_kim/%EB%A9%94%EC%86%8C%EB%93%9C-%EB%82%B4%EC%9E%A5-%ED%95%A8%EC%88%98-%ED%95%A8%EC%88%98</guid>
            <pubDate>Sun, 24 Nov 2024 16:59:49 GMT</pubDate>
            <description><![CDATA[<p>기본적인 강의가 끝나고 이것저것 적어보려고 다시 켜보았다.
공부를 할때 가장 중요한것은 아무래도 글을 적는 습관이 아닐까 한다.
기본적인 강의를 듣고 짧게나마 요약하여 글을 남겨보려고 한다.</p>
<p>우선 파이썬을 배우면서 가장 중요한 메소드/내장함수/함수의 정의에 대해 한번
적어보자면</p>
<h2 id="메소드">메소드</h2>
<h3 id="메소드란">메소드란?</h3>
<p>이것저것 찾아보며 내린 정의는 이렇다.
메소드는 특정 객체에 속해 있는 함수이다. 비유를 하자면
자동차에 속해 있는 &#39;시동 걸기&#39; 혹은 &#39;브레이크 밟기&#39;와 같은 기능이라고 
보면 된다. 즉 객체의 특정 작업을 수행하는 도구라고 할 수 있다.</p>
<h5 id="괜찮은-이미지가-있어-가져와-보았다">괜찮은 이미지가 있어 가져와 보았다.</h5>
<p><img src="https://velog.velcdn.com/images/2joon_kim/post/aa6e2e7e-a9aa-43ed-837f-5eb20c6497ac/image.png" alt="파이썬이란..?"></p>
<h2 id="내장함수">내장함수</h2>
<h3 id="내장함수란">내장함수란?</h3>
<p>내장 함수란 파이썬에서 기본적으로 제공되는, 즉 따로 모듈을 불러오지 않고도 
바로 사용할 수 있는 함수들을 의미한다.
자동차로 예를 들자면 엔진, 바퀴 등 우리가 시동을 걸고 밞기만 하면 자동차는 가듯이
프로그래밍 과정에서 자주 사용되는 다양한 기능들을 제공해주는 역할을 한다.</p>
<h2 id="함수">함수</h2>
<h3 id="함수란">함수란?</h3>
<p>위와 마찬가지이지만 함수를 다시 정리해보자면
함수는 크게 두 가지 종류로 나눌 수 있고 내장함수와 우리가 정의하여 만든 함수가 존재한다.
쉽게쉽게 자동차로 예를 들어 네비게이션이나 방향제 등 자동차 안에 기본적으로 들어 있지는 않지만 우리의 운전을 도와줄 아이템들을 추가하는 즉 프로그래머가 직접 만드는 함수들이 특정 작업을 수행하기 위해 필요한 코드를 모아서 만든것이다.</p>
<p>내장함수와 함수의 큰 차이점은 누가 만들었는가? 가 가장 쉽게 이해할 수 있는 원리인 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML 기초]]></title>
            <link>https://velog.io/@2joon_kim/HTML-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@2joon_kim/HTML-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Wed, 30 Oct 2024 04:17:00 GMT</pubDate>
            <description><![CDATA[<p>HTML(HyperText Markup Language)는 웹 페이지를 만들기 위한 기본적인 마크업 언어이다. </p>
<p>이 언어를 사용하여 문서의 구조와 콘텐츠를 정의할 수 있다.</p>
<pre><code class="language-html">코드 예제

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&gt;
    &lt;title&gt;HTML 이론학습&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;!-- 이곳에 작성하세요. --&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>이번 시간에는 기본적인 HTML 구조에 대해 공부했다.</p>
<p>HTML 문서는 크게 <code>&lt;head&gt;</code>와 <code>&lt;body&gt;</code>로 구분할 수 있는데</p>
<ol>
<li><code>&lt;head&gt;</code>는 웹 문서에 필요한 설정</li>
<li><code>&lt;body&gt;</code>는 실제로 사용자에게 보여지는 부분</li>
</ol>
<p>위쪽의 예제를 이용해 아래 내용으로 업데이트하여 오늘의 할일을 노출시켜보았다.
제목으로는 <code>&lt;h1&gt;</code>란에 <code>&lt;a href&gt;</code> 를 이용하여 오즈코딩스쿨 상세페이지로
랜딩페이지를 잡아주고 나머지 <code>&lt;p&gt;</code> 항목으로서 부분은 할일을 기록해두었다.</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&gt;
    &lt;title&gt;HTML 이론학습&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;&lt;a href=&quot;https://ozcodingschool.com/&quot;&gt;오늘의 할 일&lt;/a&gt;&lt;/h1&gt;
    &lt;p&gt;1. HTML 예습하기&lt;/p&gt;
    &lt;p&gt;2. MDN 사이트 접속하기&lt;/p&gt;
    &lt;p&gt;3. w3school 사이트 접속하기&lt;/p&gt;
    &lt;p&gt;4. 실습 도전하기&lt;/p&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3 id="결과-화면">결과 화면</h3>
<p align="center"><img src="https://velog.velcdn.com/images/2joon_kim/post/3c98bc8b-84d8-4e0a-9ea4-8a11e9fa7d80/image.png" width="60%" height="n%">


<p>그나저나 벨로그 이미지 관련 글도 한번 공부하면서 써봐야겠다.
  그냥 블로그 글 쓰는것처럼 에디터를 다루면 될 줄 알았는데
  이미지 업로드부터 사이즈 다듬는 것 까지 굉장히 어렵다 ^^..
<del>(코드 업로드 하는데만 10분걸린게 맞나..?)</del></p>
]]></description>
        </item>
    </channel>
</rss>