<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>rune_learning_coding.log</title>
        <link>https://velog.io/</link>
        <description>코딩 배우는 중</description>
        <lastBuildDate>Wed, 18 Dec 2024 08:46:55 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>rune_learning_coding.log</title>
            <url>https://images.velog.io/images/rune_kkk/profile/b0e26514-0d11-4c51-80c6-996f9b86970d/social.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. rune_learning_coding.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/rune_kkk" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[MLOPS 필기 1218]]></title>
            <link>https://velog.io/@rune_kkk/MLOPS-%ED%95%84%EA%B8%B0-1218</link>
            <guid>https://velog.io/@rune_kkk/MLOPS-%ED%95%84%EA%B8%B0-1218</guid>
            <pubDate>Wed, 18 Dec 2024 08:46:55 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>공개키 vs 개인키 
공개키는 메세지, 암호화 / 개인키는 해독된 암호 
공인인증서와 같은 원리이다
내가 공개키를 보내면, 남도 자기의 공개키를 나에게 보내준다. </p>
</li>
<li><p>숙제 중간 리뷰</p>
</li>
</ol>
<ul>
<li>남여는 ab 또는 남자열, 여자열을 만드는 것을 권장</li>
<li>나이대는 10, 20, 30으로 하면 xgboost 같은 트리는 괜찮지만 다른 뉴럴 같은 모델은 서수의 크기를 의미로 파악한다</li>
<li>나의 경우 공덕 이전에 내림 안내림 두가지 값을 추출하는 것으로 해보면 좋을 듯</li>
</ul>
<ol start="3">
<li>SSH 원격으로 접속하기</li>
</ol>
<p>secure shell = ssh = 일종의 프로토콜, 정해진 순서대로 소통하는것</p>
<p>shell 이란? 
운영체제 구성요소중에 커넬과 유저 사이에 있는 가장 기본적인 도우미 프로그램, cmd, 파일탐색기, finder...</p>
<p>서버에 접속한다란?
서버의 셀과 원격으로 상호작용하는 행위
원격으로 셀을 사용할 수 있는 프로그램이 있다&gt; 깔아야함
OpenSSH(cli), Remote Desktop(gui) 등... </p>
<p>로컬 shell에서 ssh로 시작하는 명령어를 넣으면 똿! 
나갈땐 exit</p>
<p>그 중에서 우리는 조교님의 컴퓨터에 떠있는 4개의 컨테이너(조교님 컴퓨터와 포트가 연결되어있는)를 할당받은 것</p>
<p>ssh는 암호화한 서버접속!원격 shell 프로그램을 암호화하는 것
네트워크랑 내가 보낸 데이터가 여기저기를 거쳐서 목적컴퓨터에게 도착하는건데 그 이동과정중에 내 데이터가 남들에게 보이지 않게 보안!</p>
<ol>
<li>공개키 개인키로 로그인</li>
<li>대칭키로 주고받는 데이터 보안 </li>
</ol>
<p>양자컴퓨팅의 주요 활용처가 이 공개키 암호화를 뚫는것 </p>
<p>참고)ssl : http를 암호화한 것 </p>
<ol start="4">
<li><p>우리의 new 서버 리뷰
gui 깔기!
서버르 같이 쓰다가 고장이 날 확율과 고장이 났을때 대처방법 </p>
</li>
<li><p>과제 구체적인 요구사항</p>
</li>
</ol>
<ul>
<li>각자의 깃허브 파서 깃레포지토리 만들기</li>
<li>포스트맨에서 hello 같은걸로 내가 만든 깃허브를 포스트맨으로 들어갈 수 있는지 확인하는 단계</li>
<li>조교님을 포스트맨 워크스페이스 팀에 초대해드리기</li>
<li>api spec: 내가 만들고자 하는 엔드포인트와 기대값을 명세로 적어두는 것 &gt;&gt; 이걸 가지고 조교님이 프론트를 만드실 계획 </li>
</ul>
<ol start="6">
<li>그다음 과제 s3에서 데이터 받아와서 하는 경우 연습</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[MLOPS 필기 12/11]]></title>
            <link>https://velog.io/@rune_kkk/MLOPS-%ED%95%84%EA%B8%B0-1211</link>
            <guid>https://velog.io/@rune_kkk/MLOPS-%ED%95%84%EA%B8%B0-1211</guid>
            <pubDate>Wed, 11 Dec 2024 08:29:40 GMT</pubDate>
            <description><![CDATA[<p>이쯤에서 알아두면 좋을 필수 상식</p>
<p>= 데이터가 이동될때 시간을 잡아먹는다. 그때의 주고 받는 속도를 표현한 그림, 단위, 계산방법
&quot;우리가 만든 구조가 데이터를 비효율적으로 주고받게 만들어서 시간이 오래걸리는 것일까?&quot; </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[MLOps 12/04 필기]]></title>
            <link>https://velog.io/@rune_kkk/MLOps-1204-%ED%95%84%EA%B8%B0</link>
            <guid>https://velog.io/@rune_kkk/MLOps-1204-%ED%95%84%EA%B8%B0</guid>
            <pubDate>Wed, 04 Dec 2024 10:03:29 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>지난주 카톡에 나온 문의 내용: 
 커스텀 image 만들기 + 볼륨 마운팅하면서 컨테이너 열기 </p>
<ul>
<li>dockerfile에 만들고자 하는 이미지의 레시피 적어두기. 참고로 확장자가 없이 dockerfile이라고 되어있어야함.   </li>
<li>docker build . -t [이름]<blockquote>
<blockquote>
<p>dockerfile 찾아서 만들어줘
이름 꼭 정해줘야함 </p>
</blockquote>
</blockquote>
</li>
<li>docker run -it --rm -v .:[컨테이너의 폴더] [이름]<blockquote>
<blockquote>
<p>지금 있는 위치의 파일을 컨테이너 폴더랑 연결짓기 </p>
</blockquote>
</blockquote>
</li>
</ul>
</li>
<li><p>ARCHITECTURE - CASE (1)
 &lt;중간궁금증 / 기억할 내용 적기&gt; </p>
<pre><code> - TRAINING이 점선인 이유; 항상 살이있을 필요가 없음!!!! 
 - 주기적으로 많은 양의 데이터를 트레이닝때 읽어야해서 읽기 복제본을 만든다.. 이것도 API 연결 
 - 분산 DATABASE?? WRITE는 DB에게 무거운 작업. 컴퓨터 여러대로 데이터를 WRTIE하게 하는 것이 필요하다! 더 찾아보기 돈 들여서 클라우드쓰는게 최적
 - 항상 쓰지 않는 (즉 당장 훈련용으로 쓰지 않는 데이터는) 파일로 추출해서 S3, 일종의 외장하드로 빼놓기 
 - 쿠버네티스는 컴포넌트들을 한몸처럼 조율시키는 역할?
 - CI/CD(얘도 별도의 컴퓨터? 시스템?)가 접근할 수 있는 또다른 컴퓨터를 만들어서 걔가 작업을 하도록 만든다. 주로 젠킨스라는 툴을 쓴다. 
 - 컴포넌트 3는 그냥 파일저장소에 가까움. 들어오면 네이밍 잘해서 저장잘하고, 필요할떄 잘 줄 수 있는, 그리고 백업 주기적으로 잘하는 정도. 여기에 더해 버전을 더 설명적으로 관리하고 싶으면 설명을 위한 API를 관리하는 컴포넌트 추가. 근데 이것도 주로 쓰는 툴이 있음. 
 - 모델 서빙 = 과제로 한 API 성격과 유사하다. PREDICTION을 제공받는 측 + PREDICT를 위해 받은 찐데이터를 또 저장하는 기능 
 - CONTAINER 오케스트레이션: 사용량이 늘어나면 그떄 컴퓨터를 늘리고 줄이고 할수도 있고... 컴퓨터 고장났을때 다른 컴퓨터가 해당 일을 대신해주는 등... 의 니즈가 있음 
 - STATELESS하게 만들기?: 서빙을 위한 컴포넌트에는 저장기능이 없어야한다. 껐다 켰다 될 수 있기 떄문에.. 저장ㅇ느 저장만을 위한 DB에게로..
 - 메세지큐: 여러 요청이 들어왔을 때 줄정리해서 하나씩 넘겨주는 역할. 서빙 컴포넌트와 DB컴포넌트 사이에서.. 
 - CICD는 일을 시키는 역할.. 얘도 과정과정의 LOG를 볼 수 있지만, ML WF 오케스트레이션이 전체 컴포넌트들의 LOG를 보게 해줄 수 있음 ML WF ORCH도 쿠버네티스로 연결, 쿠버네티스가 LOG보기에 좋음. (세이지 메이커라는 서비스와 비슷하다?)
 - FEATURE ENGINEERING은 결국 FEATURE 골라네는 일. ETL은 주로 
 - 전처리라는 말은 STATIC한 데이터를 교정하는일이고, FEATURE ENGINEERING은 실시간 데이터를 주물러야하는 가장 통계적인 지식이 필요한 예술의 일. </code></pre></li>
</ol>
<hr>
<p>alpine: 엄청엄청 가벼운 운영체제</p>
<p>DB는 DELETE가 가장 힘이 소요가 많이 된다... 그래서 안한다! VALID/INVALID로 나눌뿐 </p>
<p>로깅이 꼭 처음부터 갖춰야하는 필수는 아니다?  </p>
<hr>
<p><strong>숙제</strong>
1)우리가 실제로 만들고자 하는 서비스에 대해서 ARCH 만들어오기
    핵심은 REQUIREMENTS를 적는 것! 이유찾기!! 
2) 1)의 컴포넌트들을 지하철 CASE에 과대하지만 만들어보기 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[MLOps 1127 필기 ]]></title>
            <link>https://velog.io/@rune_kkk/1127-%ED%95%84%EA%B8%B0</link>
            <guid>https://velog.io/@rune_kkk/1127-%ED%95%84%EA%B8%B0</guid>
            <pubDate>Wed, 27 Nov 2024 08:46:11 GMT</pubDate>
            <description><![CDATA[<ol>
<li>storage</li>
</ol>
<p>storage: 데이터를 저장하고 관리하는 컨셉적인 단어로 크게 두가지 방법: file system과 database</p>
<p>file system: 파일을 효율적으로 관리하기 위한 저기술 기법
파일은 파일로 덩어리로 본다. 내용물은 노상관. 
덩어리가 어디에 얼마만한 크기로 있는지만 중시함
변화되는 공간을 관리하는 것이 목표.
옛날에 디스크 조각모음을 하는 이유가 이 파일시스템을 깔끔정리하는 것
즉 수납에만 전문 / 정렬이나 찾아주는 역할에는 메리트가 없는 친구</p>
<p>데이터베이스: 그것에 비해 더 정렬, 탐색, 삭제추가에 용이하게 만든게 데이터베이스. 키와 인덱스로 정렬의 효율!! 파일이 있고 그 위에 더 진보된 데이터베이스가 있는 그림. </p>
<p>더하기빼고 수준의 기초 키워드 : 이진탐색, 정렬 알고리즘, 트리자료구조 &gt; 공부해보기 </p>
<p>광의의 파일: 입출력이 가능한 모든 것. 심지어 외부 디바이스까지도 파일이라고 부른다고...</p>
<ol start="2">
<li>데이터 베이스
탐색의 기준: index 
탐색의 결과물
이렇게 두가지로 나뉨</li>
</ol>
<p>키와 인덱스는 다른 개념이다. 
키에도 라벨링을 주는 것이 인덱스. </p>
<p>1) 1키 1밸류 구조 : 키를 주면 밸류를 꺼내주는 단순한 기능만. 인덱스가 키에게만 있는 한종류뿐이다<br>2) 행과 열로 나눈 relational database(RDB): 보통 첫 열에 key(ID처럼 식별가능한 것), 역사가 제일 길다. 스키마(규칙)을 정해야 새로운 데이터를 추가할 수 있다
    광의 스키마 = 전~체 데이터의 관리 구조 
    협의 스키마 = 테이블의 묶음, 테이블의 구조(몇개의 열, 열의 이름, 열별로 들어갈 형식...) , 테이블 그 자체로도 불리기도 한다
3) Document database : 1)과 2)를 합친 느낌? 유연하다. 규칙이 정해져있지 않아도 추가가 된다. 밸류값으로도 어떤 작동이 가능하다. 엑셀에서 값이 복잡하게 하이라이키가 구분되어있어서 tap을 계속 쪼개는 데이터 형식? *<em>대표적으로 몽고db. RDB는 정해진 규칙대로만 추가되고 관리되지만, DOCUMENT DATABSE는 규칙 노상관!!!! *</em>
비관계형 데이터베이스라고도 볼 수 있지만 딱 그렇다고는 할 수 없다.</p>
<p>4) 전혀다른 개념: VECTOR DATABASE
가까이 있는 적당히 대출 근접한 무언가를 찾는 것이 목적
무한한 공간에 수학적인 점을 찍어 데이터가 존재한다면, 그 주변의 적당한 다른 점을 찾아서 인덱싱하는것
그래서 키는 없다. 근처값으로 찾는거니까</p>
<p>머신러닝에서 한창 사용되는 최근에 가장 중요한 데이터베이스 </p>
<p>벡터와 벡터 사이의 유사도, DOT PRODUCT: 엄청 중요한 개념!! 
벡터의 행렬의 곱을 하면 유사도가 나온다??</p>
<p>위의 친구들은 검색알고리즘을 통해서 빠르게 밸류를 찾아주는 거라면
벡터 데이터 베이스는 유사도로 찾는 것!</p>
<p>그외...)</p>
<ol start="2">
<li><p>SQL 해보기</p>
</li>
<li><p>ORM은 전부 텍스팅해야하는 SQL에서 좀 더 편하게... </p>
</li>
<li><p>dbeaver: db를 엑셀처럼 ui로 보게 해주는 친구 </p>
</li>
<li><p>빅데이터랑 놀아보기
1) 찾는 방법: 
 원래 이런 애들은 파일 내용을 한줄한줄 보는게 아니라 전체를 다 펼쳐놓고 본다. 그래서 좀만 파일이 커지면 컴퓨터가 아프다. 
 큰파일을 사용할때는 커멘드라인이 더 편할 수 있다. </p>
</li>
</ol>
<p>2) 탐색을 잘 하는 방법: 인덱스 활용하기
인덱스 활용 안하고 그냥 키워드를 찾아줘! 라고 하면 한오백년 걸리는데, 인덱스를 넣으면 더 효율적으로 찾아진다. </p>
<p>인덱스를 많이 사용하면 좋지만, 또 그만큼 데이터가 더 커진다. 
db설계를 잘하는 것 = 인덱싱을 잘하는 것</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[XGBoost ]]></title>
            <link>https://velog.io/@rune_kkk/XGBoost</link>
            <guid>https://velog.io/@rune_kkk/XGBoost</guid>
            <pubDate>Sun, 24 Nov 2024 05:13:02 GMT</pubDate>
            <description><![CDATA[<h2 id="1-기초-통계기법-분류">1. 기초 통계기법 분류</h2>
<h3 id="1-회귀-regression">(1) 회귀 (Regression)</h3>
<p>회귀는 <strong>연속적인 값</strong>을 예측하는 데 사용되는 통계 기법입니다. 예를 들어, 집의 크기와 가격 데이터를 가지고, 새로운 집의 크기를 입력받아 그 집의 가격을 예측하는 문제에 사용됩니다.</p>
<h4 id="주요-특징">주요 특징:</h4>
<ul>
<li><strong>연속적인 출력 값:</strong> 예측 결과가 실수 또는 연속적인 값으로 나타납니다.</li>
</ul>
<h4 id="대표적인-알고리즘">대표적인 알고리즘:</h4>
<ul>
<li>선형 회귀(Linear Regression) </li>
<li>다중 회귀(Multiple Regression)</li>
<li>리지 회귀(Ridge Regression)</li>
</ul>
<h4 id="예시">예시:</h4>
<ul>
<li>주택 가격 예측</li>
<li>주식 가격 예측</li>
<li>날씨 예측</li>
</ul>
<h3 id="2-분류-classification">(2) 분류 (Classification)</h3>
<p>분류는 <strong>주어진 입력 데이터를 특정한 카테고리나 클래스에 할당하는 문제</strong>입니다. 예를 들어, 이메일 데이터를 가지고 그 이메일이 스팸인지 아닌지를 분류하는 문제에 사용됩니다.</p>
<h4 id="주요-특징-1">주요 특징:</h4>
<p>이산적인 출력 값: 예측 결과가 특정 카테고리 또는 클래스(예: 스팸 또는 비스팸)로 나타납니다.</p>
<h4 id="대표적인-알고리즘-1">대표적인 알고리즘:</h4>
<ul>
<li>로지스틱 회귀(Logistic Regression)</li>
<li>결정 트리(Decision Tree)</li>
<li>서포트 벡터 머신(SVM)</li>
<li>k-최근접 이웃(k-Nearest Neighbors, k-NN)</li>
</ul>
<h4 id="예시-1">예시:</h4>
<ul>
<li>스팸 이메일 분류</li>
<li>이미지 속 객체 인식 (예: 고양이, 개, 자동차 등)</li>
<li>질병 진단 (예: 특정 질병의 유무)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/6d0c1247-1e77-4c4c-aae7-18ca421e252c/image.png" alt=""></p>
<h3 id="3-랭킹">(3) 랭킹</h3>
<p>랭킹은 항목을 중요도, 관련성, 또는 <strong>특정 기준에 따라 순서대로 정렬</strong>하는 문제입니다. 예를 들어, 검색 엔진에서 사용자가 입력한 검색어에 가장 관련성이 높은 문서를 상위에 노출시키는 것이 랭킹 문제입니다.</p>
<h4 id="주요-특징-2">주요 특징:</h4>
<ul>
<li>순서 결정: 항목들 사이의 상대적인 순서를 결정합니다.</li>
<li>점수화: 각 항목에 점수를 부여하여 순위를 매깁니다.</li>
</ul>
<h4 id="대표적인-알고리즘-2">대표적인 알고리즘:</h4>
<ul>
<li>PageRank:구글의 검색 엔진 알고리즘으로, 웹페이지의 중요도를 평가하여 순위를 매기는 방법</li>
<li>Learning to Rank: 머신러닝 기법을 사용하여 항목들의 순서를 학습<pre><code>  * Pointwise Approach: 각 항목의 점수를 독립적으로 예측하여 순위를 매기는 방법.
  * Pairwise Approach: 두 항목을 비교하여 어느 쪽이 더 높은 순위인지 학습하는 방법.
  * Listwise Approach: 전체 목록을 학습하여 순서를 예측하는 방법.</code></pre></li>
</ul>
<h4 id="예시-2">예시:</h4>
<ul>
<li>검색 엔진 결과: 검색어에 대해 가장 관련성이 높은 문서를 상위에 표시.</li>
<li>추천 시스템: 사용자가 선호할 만한 아이템을 순서대로 추천.</li>
<li>순위 결정: 스포츠 팀의 순위를 매기거나, 영화의 순위를 결정.</li>
</ul>
<hr>
<hr>
<h2 id="2-predict-modeling-techniques">2. Predict Modeling Techniques</h2>
<h3 id="1-decision-tree">(1) Decision Tree</h3>
<p>Decision Tree(결정 트리)는 데이터의 특징을 기준으로 의사 결정을 내려 결과를 예측하는 모델입니다. 트리의 각 노드는 질문(또는 조건)을 나타내며, 각 가지(branch)는 해당 질문에 따른 답변(또는 조건의 결과)로 이어집니다. 최종적으로 잎 노드(leaf node)에서 예측 결과를 얻을 수 있습니다.</p>
<p><strong>장점: 텍스트</strong></p>
<ul>
<li>해석 용이성: 직관적으로 이해하기 쉬운 구조를 가집니다.</li>
<li>특징 선택 자동화: 가장 중요한 특징을 자동으로 선택해줍니다.</li>
</ul>
<h3 id="2-ensemble-learning">(2) Ensemble Learning</h3>
<p>Ensemble Learning(앙상블 학습)은 <strong>여러 개의 모델을 결합</strong>하여 하나의 예측 결과를 도출하는 방법입니다. 앙상블 학습은 개별 모델의 <strong>약점을 보완</strong>하고 예측 성능을 향상시킬 수 있습니다.</p>
<h4 id="주요-방법">주요 방법:</h4>
<ul>
<li><p><strong>Bagging:</strong> 같은 알고리즘을 여러 번 사용하여 학습 데이터를 <strong>무작위로 추출</strong>해 <strong>다수의 모델</strong>을 학습시키고, <strong>결과를 평균 내는 방법</strong>입니다. 대표적인 예로 <strong>랜덤 포레스트(Random Forest)</strong>가 있습니다.</p>
</li>
<li><p><strong>Boosting:</strong> <strong>직전 모델의 오류를 보완하는 방식으로, 순차적으로 모델을 학습</strong>시켜 예측 성능을 향상시키는 방법입니다. 대표적인 예로 AdaBoost, Gradient Boosting, XGBoost가 있습니다.</p>
</li>
</ul>
<h3 id="3-boosting이란">(3) Boosting이란?</h3>
<p>Boosting(부스팅)은 앙상블 학습의 일종으로, <strong>약한 학습기(weak learner)를 순차적으로 학습시켜 강한 학습기(strong learner)를 만드는 방법</strong>입니다. 각 단계에서 이전 모델의 오류를 보완하는 방식으로 학습합니다.</p>
<h3 id="4-gradient-boosting이란">(4) Gradient Boosting이란?</h3>
<p>Gradient Boosting(그래디언트 부스팅)은 Boosting 기법의 하나로, <strong>손실 함수(Loss Function)를 최소화</strong>하기 위해 각 단계에서** 그레디언트(gradient, 기울기)를 이용**해 모델을 학습시킵니다. 각 모델은 이전 모델의 오류를 줄이기 위해 학습하며, 최종 모델은 모든 모델의 결과를 결합하여 예측을 수행합니다.</p>
<p>주요 단계:</p>
<p>1) 초기 모델을 학습시킵니다.
2) 이전 모델의 오류를 분석하여 새로운 모델을 학습시킵니다.
3) 이 과정을 반복하여 최종 모델을 만듭니다.</p>
<hr>
<hr>
<h2 id="3-ml-핵심-개념-1-데이터-전처리와-관리">3. ML 핵심 개념 1) 데이터 전처리와 관리</h2>
<h3 id="1-데이터-분할-data-splitting">(1) 데이터 분할 (Data Splitting)</h3>
<p>데이터를 학습 세트, 검증 세트, 테스트 세트로 나누는 것은 머신러닝에서 매우 중요한 단계입니다.
주로 60-80 / 10-20 / 10-20 으로 분할함 </p>
<h4 id="학습-세트-training-set">학습 세트 (Training Set):</h4>
<p>모델을 학습시키는 데 사용되는 데이터입니다. 모델의 가중치나 파라미터를 조정하여 최적의 성능을 내도록 학습시킵니다. 충분히 많은 데이터를 포함하여 모델이 다양한 패턴을 학습할 수 있도록 해야 합니다.</p>
<h4 id="검증-세트-validation-set">검증 세트 (Validation Set):</h4>
<p>학습 과정 중 모델의 성능을 평가하고, 하이퍼파라미터를 튜닝하는 데 사용되는 데이터입니다. 학습 세트와는 별도로, 모델이 새로운 데이터에 대해 얼마나 잘 일반화할 수 있는지 평가합니다.</p>
<h4 id="테스트-세트-test-set">테스트 세트 (Test Set):</h4>
<p>최종적으로 모델의 성능을 검증하기 위해 사용되는 데이터입니다. 학습과 검증 과정에서 전혀 사용되지 않은 데이터여야 하며, 최종 모델의 일반화 성능을 평가합니다</p>
<h3 id="2-결측값-관리-handling-missing-values">(2) 결측값 관리 (Handling Missing Values)</h3>
<p>데이터셋에서 누락된 값들을 적절히 처리.</p>
<h3 id="3-희소-행렬과-희소성-인식">(3) 희소 행렬과 희소성 인식</h3>
<h4 id="희소-행렬sparse-matrix-대부분의-요소가-0인-행렬">희소 행렬(Sparse Matrix): 대부분의 요소가 0인 행렬.</h4>
<p>예: 인기없는 우리 동네 도서관. 베스트셀러 도서를 제외하고는 빌려가는 사람이 한명도 없었다. 이 경우 베스트셀러르르 제외하고 대부분 채들의 대출기록 데이터는 0이다.</p>
<h4 id="sparsity-awareness희소성-인식">Sparsity Awareness(희소성 인식)</h4>
<p>모델이 희소한 데이터 구조를 효과적으로 처리할 수 있도록 설계된 기능으로 이를 통해 메모리와 연산시간을 절약할 수 있다. </p>
<h4 id="sparsity-awareness의-주요-특징">Sparsity Awareness의 주요 특징</h4>
<ul>
<li><p>효율적인 메모리 사용: 대부분의 값이 0인 희소 행렬을 저장할 때, <strong>0이 아닌 값만 저장함으로써 메모리 사용을 최적화</strong>합니다. 이는 큰 데이터셋을 다룰 때 매우 유용합니다.</p>
</li>
<li><p>빠른 연산 속도: <strong>0이 아닌 값만을 이용하여 연산을 수행</strong>하므로, 불필요한 연산을 줄여 계산 속도를 향상시킵니다. 이는 모델이 더욱 빠르게 학습하고 예측할 수 있게 합니다.</p>
</li>
<li><p>희소 데이터 구조 지원: 다양한 희소 데이터 구조(Coordinate List, Compressed Sparse Row, Compressed Sparse Column 등)를 지원하여, 데이터 접근과 처리가 용이합니다.</p>
</li>
</ul>
<hr>
<h2 id="3-ml-핵심-개념-2-모델의-성능-평가와-최적화">3. ML 핵심 개념 2) 모델의 성능 평가와 최적화</h2>
<h3 id="1-손실-함수">(1) 손실 함수</h3>
<p>손실 함수(Loss Function)는 모델이 예측한 값과 실제 값 사이의 차이를 측정하는 데 사용되는 함수입니다. 이를 &quot;오류값&quot; 또는 &quot;로스&quot;라고도 합니다. 손실 함수는 모델이 얼마나 잘 예측하고 있는지를 평가하는 중요한 척도입니다. 최적화의 목표로 사용되는 함수입니다. </p>
<h4 id="손실-함수의-역할">손실 함수의 역할</h4>
<ul>
<li><p><strong>오류 측정:</strong> 손실 함수는 모델의 예측 값과 실제 값 사이의 차이를 <strong>수량화</strong>합니다. 이 차이는 예측이 얼마나 잘못되었는지를 나타내는 지표입니다.</p>
</li>
<li><p><strong>모델 최적화: 손실 함수를 최소화하는 방향으로 모델의 매개변수를 조정</strong> 합니다. 즉, _손실 함수 값이 작을수록 모델의 예측이 실제 값에 가깝다_는 것을 의미합니다.</p>
</li>
<li><p>*<em>Gradient Boosting: *</em>Gradient Boosting에서는 각 단계에서 손실 함수의 그라디언트(기울기)를 계산하여 모델의 매개변수를 업데이트합니다. 이렇게 함으로써 모델의 예측 성능을 점진적으로 향상시킵니다.</p>
</li>
</ul>
<h4 id="손실-함수의-종류">손실 함수의 종류</h4>
<ul>
<li><p><strong>Mean Squared Error (MSE):</strong> 회귀 문제에서 자주 사용되며, 예측 값과 실제 값의 차이의 제곱을 평균한 값입니다.</p>
</li>
<li><p><strong>Cross-Entropy Loss:</strong> 분류 문제에서 자주 사용되며, 예측 확률과 실제 클래스 간의 차이를 측정합니다.</p>
</li>
</ul>
<h4 id="로스의-반대말--정답지--ground-truth">로스의 반대말:  정답지,  ground truth</h4>
<h3 id="2-과적합과-정규화">(2) 과적합과 정규화</h3>
<h4 id="과적합">과적합:</h4>
<p>과적합은 모델이 학습 데이터에 너무 잘 맞춰져서 <strong>새로운 데이터에 대해 일반화하지 못하는 현상</strong>을 말합니다. 이는 모델이 <strong>학습 데이터의 잡음(noise)까지 학습하게 되어 발생</strong>합니다.</p>
<p><strong>과적합의 특징:</strong></p>
<ul>
<li>학습 데이터에 대한 높은 성능: 학습 데이터에 대해서는 매우 높은 정확도를 보입니다.</li>
<li>새로운 데이터에 대한 낮은 성능: 새로운 데이터나 테스트 데이터에 대해서는 예측 성능이 낮아집니다.</li>
</ul>
<p><strong>과적합을 방지하는 방법:</strong></p>
<ul>
<li><p>정규화 (Regularization): 모델의 복잡도를 줄이기 위해 패널티 항(term)을 추가합니다.</p>
</li>
<li><p>교차 검증 (Cross-Validation): 데이터를 여러 부분으로 나누어 모델을 검증합니다.</p>
</li>
<li><p>더 많은 데이터 수집: 더 많은 데이터를 수집하여 모델이 일반적인 패턴을 학습할 수 있도록 합니다.</p>
</li>
<li><p>드롭아웃 (Dropout): 신경망에서 일부 뉴런을 임의로 제외하여 과적합을 방지합니다.</p>
</li>
</ul>
<h4 id="정규화보통화-일반화">정규화(보통화, 일반화):</h4>
<p>정규화는 <strong>모델의 복잡도를 줄여 과적합을 방지</strong>하는 기법입니다. 정규화는 모델의 <strong>가중치에 패널티 항을 추가</strong>하여 과도한 학습을 방지합니다.</p>
<p><strong>주요 정규화 기법:</strong></p>
<ul>
<li><p><strong>L1 정규화:</strong> 모델의 가중치의 절대값 합에 패널티를 부과하여(제한을 두어) 가중치가 너무 커지지 않도록 제한을 두는 방법. </p>
<ul>
<li><p>비유 : 음식점 가게 주인이 재료값의 제한을 걸어두는 것. 제한이 없으면 너무 재료를 비싸게 사게 되거나, 사실 꼭 필요하지는 않은 재료들까지 다 사게 될 수 있다.</p>
</li>
<li><p><strong>효과 1: 불필요한 변수 제거:</strong> 가중치 절대값 합에 제한을 두면 불필요한 변수들의 가중치가 점점 더 작아져 결국 0이 되거나 무시할 수 있는 수준으로 낮아집니다. 이는 모델에서 중요하지 않은 변수를 자동으로 제거하는 효과를 줍니다.</p>
<ul>
<li><p>*<em>효과 2: 과도한 가중치 감소: *</em>너무 큰 가중치를 가지는 요소들의 가중치도 낮아져 모델이 과적합되는 것을 방지할 수 있습니다. 이는 모델의 복잡도를 줄이고, 일반화 성능을 향상시키는 데 도움을 줍니다.</p>
</li>
<li><p>Lasso Regression: L1 정규화를 사용하는 회귀 방법입니다.</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>L2 정규화:</strong> 모델의 가중치의 제곱 합에 패널티를 부과합니다.(제한을 줍니다) 이는 L1보다 더 부드럽게 가중치들을 작게/단순하게 만들어 모델의 복잡도를 줄입니다.</p>
<ul>
<li><p>L2는 가중치가 미미한 요소들의 가중치를 완전히 0이 되기보다는 작은 값을 만드는 부드러운 규제 / L1은 많은 가중치들을 아예 0으로 만들어 불필요한 변수를 완전히 제거하여 희소성 촉진에 효과적</p>
</li>
<li><p>L2는 제곱합의 기반하기에 큰 가중치는 더 많이 줄이고, 작은 가중치는 상대적으로 덜 줄이는 효과 / L1은 절대값의 합을 줄이기에 불필요한 변수들이 아예 삭제되어 변수를 선택하는 기능을 합니다. </p>
</li>
<li><p>Ridge Regression: L2 정규화를 사용하는 회귀 방법입니다.</p>
</li>
</ul>
</li>
</ul>
<ul>
<li><strong>Elastic Net:</strong> L1과 L2 정규화를 결합하여 사용하는 방법입니다. 이는 두 기법의 장점을 모두 활용할 수 있습니다.</li>
</ul>
<hr>
<h2 id="3-ml-핵심-개념-3-모델의-하이퍼파라미터-조정과-검증">3. ML 핵심 개념 3) 모델의 하이퍼파라미터 조정과 검증</h2>
<h3 id="1-하이퍼파라미터-hyperparameter">(1) 하이퍼파라미터 (Hyperparameter)</h3>
<p>하이퍼파라미터는 모델 학습 과정에서 (특히 본격적인 학습 전에) <strong>사용자가 직접 설정</strong>해야 하는 매개변수입니다. 이는 모델이 학습하는 동안 최적화되는 매개변수와는 다릅니다.</p>
<h4 id="비교">비교</h4>
<p>하이퍼파라미터: 학습 전에 설정되는 값들로, 요리사가 처음 계획으로 세우는 레시피의 각 요소들(재료를 몇가지 얼마큼씩 쓸까, 소금을 얼마나 넣을까, 어떤 세기의 불에서 몇분을 끓일까, 등)과 비슷합니다.</p>
<p>최적화되는 매개변수: 학습 중에 데이터에 따라 조정되는 값들로, 요리사가 맛을 보며 재료를 조정하는 것과 비슷합니다. 가장 대표적인 것으로 모델이 학습을 하며 찾아가게되는 가중치가 있습니다. </p>
<h4 id="주요-하이퍼파라미터">주요 하이퍼파라미터</h4>
<ul>
<li><p><strong>학습률 (Learning Rate):</strong> 학습 과정에서 모델의 가중치를 업데이트하는 크기를 결정합니다. 너무 크면 모델이 최적점을 지나칠 수 있고, 너무 작으면 학습이 매우 느려집니다.</p>
</li>
<li><p><strong>최대 깊이 (Max Depth):</strong> 트리 모델에서 트리의 최대 깊이를 결정합니다. 깊이가 깊을수록 모델이 복잡해져 과적합될 수 있습니다.</p>
</li>
<li><p>*<em>정규화 계수 (Lambda): *</em> 모델의 복잡도를 제어하여 과적합을 방지하는 정규화 항의 강도를 설정합니다.</p>
</li>
<li><p><strong>트리 수 (Number of Trees):</strong> 앙상블 방법에서 생성할 트리의 개수를 결정합니다. 너무 많으면 과적합될 수 있습니다.</p>
</li>
<li><p><strong>샘플링 비율 (Subsample):</strong> 학습 데이터를 샘플링하여 사용합니다. 전체 데이터를 사용하면 과적합될 수 있으므로 일부 데이터를 사용하여 학습합니다.</p>
</li>
</ul>
<h4 id="하이퍼파라미터-튜닝-방법">하이퍼파라미터 튜닝 방법</h4>
<ul>
<li><p><strong>그리드 탐색 (Grid Search):</strong> 가능한 하이퍼파라미터 값들의 모든 조합을 시도하여 최적의 조합을 찾습니다. 매우 계산 비용이 높지만, 최적의 결과를 얻을 수 있습니다.</p>
</li>
<li><p>*<em>랜덤 탐색 (Random Search): *</em> 하이퍼파라미터 공간에서 무작위로 값을 선택하여 최적의 조합을 찾습니다. 그리드 탐색보다 계산 비용이 적습니다.</p>
</li>
<li><p><strong>베이지안 최적화 (Bayesian Optimization):</strong> 이전 시도 결과를 바탕으로 다음 시도할 하이퍼파라미터를 선택하여 더 효율적으로 최적의 조합을 찾습니다.</p>
</li>
</ul>
<h3 id="2-교차검증-cross-validation">(2) 교차검증 (Cross-Validation)</h3>
<p>교차 검증은 <strong>데이터를 여러 부분으로 나누어</strong> 모델을 검증하는 방법으로, 모델의 일반화 성능을 평가하는 데 사용됩니다.</p>
<h4 id="주요-방법-1">주요 방법</h4>
<ul>
<li><p><strong>K-폴드 교차 검증 (K-Fold Cross-Validation)</strong>:
데이터를 K개의 폴드(fold)로 나누고, 각 폴드에 대해 모델을 학습한 후 나머지 폴드로 검증합니다. K번 반복하여 모든 폴드가 한 번씩 검증 세트가 되도록 합니다. 최종 결과는 K번의 검증 결과의 평균으로 나타냅니다.</p>
</li>
<li><p><strong>스트래티파이드 K-폴드 (Stratified K-Fold):</strong>
K-폴드 교차 검증과 비슷하지만, 각 폴드가 클래스 비율을 유지하도록 데이터셋을 나눕니다. 불균형한 데이터셋에서 유용합니다.</p>
</li>
<li><p><strong>LOO (Leave-One-Out Cross-Validation):</strong>
데이터셋의 각 샘플을 한 번씩 검증 세트로 사용하고, 나머지 샘플들로 모델을 학습합니다. 데이터셋이 작을 때 사용하지만, 계산 비용이 매우 높습니다.</p>
</li>
</ul>
<h4 id="교차-검증의-장점">교차 검증의 장점</h4>
<ul>
<li><p>모델 평가: 모델이 새로운 데이터에 대해 얼마나 잘 일반화될 수 있는지 평가할 수 있습니다.</p>
</li>
<li><p>과적합 방지: 데이터를 여러 번 나누어 사용하므로 과적합을 방지할 수 있습니다.</p>
</li>
<li><p>하이퍼파라미터 튜닝: 교차 검증을 통해 하이퍼파라미터를 최적화하는 데 사용됩니다.</p>
</li>
</ul>
<h4 id="데이터-분할과-교차검증">데이터 분할과 교차검증?</h4>
<p>데이터 분할은 내가 가진 데이터 전체를 3가지 용도(학습, 검증, 테스트)로 잘 나눠야한다는 개념</p>
<p>3가지로 나눠진 각각의 데이터 셋 내에서 
또 여러부분으로 나눠서 이를 교차검증하는 것이
하이퍼파라미터를 튜닝하거나 일반성 성능 평가하는데 필요하다!</p>
<hr>
<hr>
<h2 id="4-xgboost란">4. XGBoost란?</h2>
<h3 id="정의">정의</h3>
<p>XGBoost(Extreme Gradient Boosting)는 <strong>고성능</strong>의 머신러닝 알고리즘 라이브러리로, 특히 <strong>예측</strong> 성능이 뛰어나고 <strong>학습 속도가 빠릅니다</strong>. XGBoost는 다양한 데이터 과학 경진대회에서 많이 사용되는 알고리즘이기도 합니다.</p>
<p>XGBoost는 <strong>Decision Tree</strong>를 기반으로 하고, <strong>Gradient Boosting 방법</strong>을 사용하여 모델을 학습합니다.</p>
<h3 id="주요-장점">주요 장점</h3>
<h4 id="1-빠른-학습-속도">(1) 빠른 학습 속도</h4>
<ul>
<li><p><strong>병렬처리:</strong> 여러 CPU 코어를 사용하여 트리 분할 작업을 병렬로 수행함으로써 학습시간을 단축한다. 즉, CPU를 보다 효율적으로 사용하는 것! </p>
</li>
<li><p><strong>하드웨어 최적화:</strong> XGBoost는 하드웨어 최적화를 통해 데이터 접근을 빠르게 처리합니다. 이는 주로 CPU 캐시와 메모리 사용을 최적화하여 이루어집니다.</p>
<ul>
<li>*<em>분산학습 : *</em> 분산 학습은 대규모 데이터셋을 다루기 위해 여러 대의 컴퓨터에서 데이터를 분산 처리하여 학습하는 방법입니다. 이를 위해 대표적으로 Apache Spark와 Hadoop 같은 플랫폼을 사용합니다. </li>
</ul>
</li>
</ul>
<h4 id="2-모델-최적화">(2) 모델 최적화</h4>
<ul>
<li><p><strong>과적합 방지:</strong> 정규화(Regularization)를 통해 과적합을 효과적으로 방지합니다.</p>
</li>
<li><p>*<em>Sparsity Awareness: *</em> XGBoost는 희소 행렬(즉, 대부분의 값이 0인 행렬)을 효과적으로 처리할 수 있습니다. 이는 데이터 전처리와 모델 학습을 더욱 효율적으로 만듭니다.</p>
</li>
<li><p><strong>Tree Pruning (트리 가지치기)</strong> 
최대 깊이의 제한: XGBoost는 최대 트리 깊이를 제한하고, 가지치기(pruning) 기법을 통해 불필요한 분기를 제거합니다. 이는 모델의 복잡도를 줄이고, 학습 및 예측 속도를 향상시킵니다.</p>
</li>
<li><p><strong>Learning Rate (학습률) 조정</strong>
학습률 최적화: XGBoost는 학습률을 조정하여 모델의 예측 성능을 더욱 향상시킵니다. 이는 모델이 과도하게 학습되지 않도록 조절하는 데 도움이 됩니다.</p>
</li>
<li><p><strong>Handling Missing Values (결측값 처리)</strong>
결측값 처리: XGBoost는 데이터셋에서 결측값(값이 기록되지 않은 부분)을 효과적으로 처리할 수 있습니다. 이는 데이터 전처리 단계를 단순화하고, 더 많은 데이터를 활용할 수 있게 합니다. 삭제 / 대체 / 특수값 처리 등... </p>
</li>
</ul>
<h4 id="3-유연성">(3) 유연성</h4>
<p>회귀, 분류, 랭킹 등 다양한 문제에 적용할 수 있습니다.</p>
<h3 id="주요-개념기능">주요 개념/기능</h3>
<h4 id="1-tree-booster">(1) Tree Booster:</h4>
<p>Tree Booster는 XGBoost의 핵심 구성 요소로, Decision Tree를 기반으로 하는 모델을 생성합니다.</p>
<p>이를 통해 데이터를 분할하고 예측하는 데 사용됩니다.</p>
<h4 id="2-objective-function">(2) Objective Function:</h4>
<p>Objective Function은 모델이 최적화하려는 목표를 정의합니다.</p>
<p>일반적으로 손실 함수(Loss Function)와 정규화 항(Regularization Term)으로 구성됩니다.</p>
<p>예를 들어, 회귀 문제에서는 평균 제곱 오차(MSE)가 손실 함수로 사용될 수 있습니다.</p>
<h4 id="3-evaluation-metrics">(3) Evaluation Metrics:</h4>
<p>Evaluation Metrics는 모델의 성능을 평가하는 데 사용됩니다.</p>
<p>대표적인 예로 정확도(Accuracy), F1 점수(F1 Score), 평균 제곱 오차(MSE) 등이 있습니다.</p>
<h4 id="4-hyperparameter-tuning">(4) Hyperparameter Tuning:</h4>
<p>Hyperparameter Tuning은 모델의 성능을 최적화하기 위해 하이퍼파라미터를 조정하는 과정입니다.</p>
<p>XGBoost에서 중요한 하이퍼파라미터로는 학습률(Learning Rate), 최대 깊이(Max Depth), 정규화 계수(Lambda) 등이 있습니다.</p>
<h4 id="5-기타기능">(5) 기타기능</h4>
<ul>
<li><p><strong>Early Stopping:</strong> 조기 종료 기법을 사용하여 더 이상 성능이 향상되지 않으면 학습을 중단합니다.</p>
</li>
<li><p>** Feature Importance:** 모델에서 중요한 특징을 식별하여, 어떤 특징이 예측에 가장 큰 영향을 미치는지 알 수 있습니다.</p>
</li>
<li><p>*<em>Cross-validation: *</em> 데이터를 여러 부분으로 나누어 모델을 검증하고, 최적의 모델을 선택하는 데 사용됩니다.</p>
</li>
</ul>
<h2 id="5-xgboost-사용방법">5. XGBoost 사용방법</h2>
<h3 id="1-dxmatrix-생성">(1) DXMatrix 생성</h3>
<p>DMatrix는 XGBoost에서 사용되는 데이터 구조로, 효율적인 모델 훈련과 예측을 위해 설계되었습니다. DMatrix는 주로 다음과 같은 역할을 합니다:</p>
<ul>
<li><p>효율적인 메모리 사용: DMatrix는 메모리를 효율적으로 사용하여 큰 데이터셋을 다룰 때도 성능을 유지합니다. 이는 내부적으로 압축된 데이터 구조를 사용하기 때문입니다.</p>
</li>
<li><p>빠른 데이터 로드 및 처리: DMatrix는 다양한 데이터 형식을 빠르게 로드하고 처리할 수 있습니다. 예를 들어, CSV 파일이나 Pandas DataFrame을 직접 로드할 수 있습니다.</p>
</li>
<li><p>성능 최적화: DMatrix는 XGBoost의 핵심 연산을 최적화하여 모델 훈련과 예측 속도를 높입니다. 이는 스파스 매트릭스(sparse matrix)와 같은 고급 데이터 구조를 사용함으로써 가능해집니다.</p>
</li>
</ul>
<h4 id="dxmatrix-예제">DXMatrix 예제</h4>
<p>Pandas DataFrame을 사용하여 데이터셋을 DMatrix로 변환/생성하는 예제입니다:</p>
<pre><code># 판다스 
import xgboost as xgb
import pandas as pd

# 데이터 로드
data = pd.read_csv(&#39;your_data.csv&#39;)
X = data.iloc[:, :-1]  # 입력 변수
y = data.iloc[:, -1]   # 타겟 변수

# DMatrix 생성
dtrain = xgb.DMatrix(data=X, label=y)
</code></pre><ul>
<li><p><strong>입력 변수 (Input Variables):</strong> 모델이 학습할 때 사용하는 데이터의 독립 변수입니다. 이 변수들은 예측하려는 결과에 영향을 미치는 요소들입니다. 예를 들어, 주택 가격 예측 모델에서는 방 개수, 면적, 위치 등이 입력 변수가 될 수 있습니다.</p>
</li>
<li><p>*<em>타겟 변수 (Target Variable): *</em> 모델이 예측하려는 결과 값입니다. 이는 종속 변수로도 불리며, 입력 변수를 기반으로 예측해야 하는 값입니다. 주택 가격 예측 모델에서는 실제 주택 가격이 타겟 변수가 됩니다.</p>
</li>
<li><p>** dtrain:** XGBoost에서 학습에 사용될 데이터 객체로, dtrain은 훈련 데이터셋을 의미합니다. 
  -xgb.DMatrix: XGBoost에서 제공하는 데이터 구조로, 메모리 효율성을 높이고 빠른 처리를 가능하게 합니다.</p>
<ul>
<li>data=X: 입력 변수를 지정합니다. X는 독립 변수들의 데이터프레임입니다.</li>
<li>label=y: 타겟 변수를 지정합니다. y는 종속 변수(예측하려는 값)입니다</li>
</ul>
</li>
</ul>
<h3 id="2-모델-파라미터-설정">(2) 모델 파라미터 설정</h3>
<pre><code>params = {
    &#39;objective&#39;: &#39;reg:squarederror&#39;,
    &#39;max_depth&#39;: 6,
    &#39;learning_rate&#39;: 0.1,
    &#39;n_estimators&#39;: 100
}
</code></pre><ul>
<li>*<em>params: *</em> XGBoost 모델의 하이퍼파라미터를 설정하는 딕셔너리입니다.</li>
<li><strong>&#39;objective&#39;:</strong> 모델의 학습 목표를 설정합니다.
  ㅇ &#39;reg:squarederror&#39;는 회귀 문제를 의미하며, 제곱 오차 손실 함수를 최소화하려는 목표를 갖습니다.
  ㅇ 그 외:
<img src="https://velog.velcdn.com/images/rune_kkk/post/978e9825-38f5-4ea7-a90d-6dff2f9f9ed2/image.png" alt=""></li>
</ul>
<ul>
<li><p><strong>&#39;max_depth&#39;:</strong> 각 결정 트리의 최대 깊이를 설정합니다. 깊이가 클수록 모델이 복잡해질 수 있지만, 과적합(overfitting) 위험이 증가할 수 있습니다. 여기서는 6으로 설정했습니다.</p>
</li>
<li><p><strong>&#39;learning_rate&#39;:</strong> 학습률을 의미합니다. 각 트리가 모델에 기여하는 비율을 조정합니다. 값이 작을수록 학습이 천천히 진행되지만, 일반화 성능이 높아질 수 있습니다. 여기서는 0.1로 설정했습니다.</p>
</li>
<li><p>*<em>&#39;n_estimators&#39;: *</em> XGBoost 모델에서 생성할 결정 트리의 개수를 나타냅니다. 각 트리는 데이터를 분석하여 예측 모델을 개선하는 역할을 합니다. 일반적으로, 더 많은 트리를 생성할수록 모델의 성능이 좋아질 수 있지만, 학습 시간이 길어지고 과적합의 위험이 증가할 수 있습니다.여기서는 100으로 설정했습니다.</p>
</li>
</ul>
<h3 id="3-모델-훈련">(3) 모델 훈련</h3>
<pre><code>model = xgb.train(params, dtrain, num_boost_round=100)
</code></pre><ul>
<li><p>model: 훈련된 XGBoost 모델 객체를 저장합니다.</p>
</li>
<li><p>xgb.train: XGBoost 라이브러리의 함수로, 모델을 훈련시키는 역할을 합니다.</p>
</li>
<li><p>params: 모델 훈련에 사용할 파라미터들을 포함한 딕셔너리입니다. 예를 들어, objective, max_depth, learning_rate 등이 포함됩니다.</p>
</li>
<li><p>dtrain: 훈련 데이터가 담긴 DMatrix 객체입니다.</p>
</li>
<li><p>num_boost_round=100: 부스팅 라운드(트리)의 수를 설정합니다. 총 100개의 트리가 생성되어 모델을 훈련하게 됩니다. (파라미터의 n_estimators와 유사한 개념. 둘을 동시에 지정하는 것 지양) </p>
</li>
</ul>
<h3 id="4-모델-저장">(4) 모델 저장</h3>
<pre><code>model.save_model(&quot;xgboost_model.json&quot;)
</code></pre><ul>
<li><p>model.save_model: 훈련된 모델을 파일로 저장하는 메서드입니다.</p>
</li>
<li><p>&quot;xgboost_model.json&quot;: 모델이 저장될 파일의 이름입니다. JSON 형식으로 저장됩니다. <strong>나중에 이 파일을 불러와서 모델을 재사용할 수 있습니다.</strong></p>
</li>
</ul>
<h3 id="5-응답-반환">(5) 응답 반환</h3>
<pre><code>return {&quot;info&quot;: &quot;model trained and saved&quot;}
</code></pre><ul>
<li>return {&quot;info&quot;: &quot;model trained and saved&quot;}: 훈련이 완료된 후, 클라이언트에게 모델이 성공적으로 훈련되고 저장되었다는 정보를 JSON 형태로 반환합니다.</li>
</ul>
<h2 id="6-fastapi와-함께-사용하기">6. FastAPI와 함께 사용하기</h2>
<pre><code>from fastapi import FastAPI, File, UploadFile, HTTPException
import pandas as pd
import xgboost as xgb
import os

app = FastAPI()

# 상수 정의
UPLOAD_DIR = &#39;dataset_uploaded&#39;
MODEL_FILE = &#39;xgboost_model.json&#39;
uploaded_files = []

# 디렉토리가 존재하지 않으면 생성
if not os.path.exists(UPLOAD_DIR):
    os.makedirs(UPLOAD_DIR)

# 1. 학습용 데이터 셋 업로드
@app.post(&quot;/train-data-upload&quot;)
async def train_data_upload(file: UploadFile = File(...)):
    try:
        file_location = os.path.join(UPLOAD_DIR, file.filename)
        with open(file_location, &quot;wb&quot;) as f:
            f.write(await file.read())
        uploaded_files.append(file.filename)
        return {&quot;info&quot;: f&quot;file &#39;{file.filename}&#39; saved at &#39;{file_location}&#39;&quot;}
    except Exception as e:
        raise HTTPException(status_code=500, detail=f&quot;Error uploading file: {e}&quot;)

# 1.1 업로드 된 학습용 데이터 셋 확인하기
@app.get(&quot;/uploaded-files&quot;)
async def get_uploaded_files():
    return {&quot;uploaded_files&quot;: uploaded_files}

# 2. XGBoost 모델 훈련시켜서 탑재하기
@app.post(&quot;/train-model&quot;)
async def train_model(file: UploadFile = File(...)):
    try:
        file_location = os.path.join(UPLOAD_DIR, file.filename)
        with open(file_location, &quot;wb&quot;) as f:
            f.write(await file.read())

        data = pd.read_csv(file_location, delimiter=&#39;;&#39;)       # 데이터 로드 (tip! 세미콜론 구분)
        X = data.iloc[:, :-1]                                  # 입력 변수
        y = data.iloc[:, -1]                                   # 타겟 변수

        dtrain = xgb.DMatrix(data=X, label=y)                  # DMatrix 설정
        params = {                                             # 파라미터 설정
            &#39;objective&#39;: &#39;reg:squarederror&#39;,
            &#39;max_depth&#39;: 6,
            &#39;learning_rate&#39;: 0.1,
        }
        model = xgb.train(params, dtrain, num_boost_round=100) # 모델 훈련
        model.save_model(MODEL_FILE)                           # 모델 저장
        return {&quot;info&quot;: &quot;model trained and saved&quot;}             # 응답 반환
    except Exception as e:
        raise HTTPException(status_code=500, detail=f&quot;Error training model: {e}&quot;)

# 3. 예측 엔드포인트 설정
@app.post(&quot;/predict&quot;)
async def predict(file: UploadFile = File(...)):
    try:
        file_location = os.path.join(UPLOAD_DIR, file.filename)
        with open(file_location, &quot;wb&quot;) as f:
            f.write(await file.read())                    # 새로운 입력값 읽고 저장 

        data = pd.read_csv(file_location, delimiter=&#39;;&#39;)  # tip! 세미콜론 구분자 사용
        dtest = xgb.DMatrix(data=data)                    # 새로운 입력값을 훈련데이터 삼아서       

        model = xgb.Booster()                             # xgbooster로 이번 예측에 사용할 (위에서 만든) 모델 불러오기  
        model.load_model(MODEL_FILE)                     

        predictions = model.predict(dtest)                # 예측값 반환
        return {&quot;predictions&quot;: predictions.tolist()}
    except Exception as e:
        raise HTTPException(status_code=500, detail=f&quot;Error making prediction: {e}&quot;)
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[MLOPS 11/20 필기]]></title>
            <link>https://velog.io/@rune_kkk/MLOPS-1120-%ED%95%84%EA%B8%B0</link>
            <guid>https://velog.io/@rune_kkk/MLOPS-1120-%ED%95%84%EA%B8%B0</guid>
            <pubDate>Wed, 20 Nov 2024 08:29:39 GMT</pubDate>
            <description><![CDATA[<h3 id="퀴즈">퀴즈</h3>
<ol>
<li></li>
</ol>
<ul>
<li>domain: <a href="http://www.github.com">www.github.com</a></li>
<li>host:  <a href="http://www.github.com">www.github.com</a></li>
<li>port: http</li>
<li>path: /dlddu/seoul-line-mlops</li>
</ul>
<ol start="2">
<li><p>IP(Internet Protocol) 주소는 네트워크 상에서 장치를 식별하기 위해 사용되는 고유한 주소이다. DNS(Domain Name System) 는 인간이 이해하기 쉬운 도메인 이름(예: <a href="http://www.google.com)%EC%9D%84">www.google.com)을</a> IP 주소(예: 93.184.216.34)로 변환하는 시스템입니다.</p>
</li>
<li><p>GET, POST, PUT, PATCH, DELETE </p>
</li>
<li><p>json, form data, binary...</p>
</li>
</ol>
<h3 id="devcontainer-만들어보기">DEVCONTAINER 만들어보기</h3>
<ol>
<li>새로 만들기 vs 만든거 열기 </li>
<li></li>
</ol>
<p>베이스: 정말 기본이 되는 1개의 조건 : 
    언어(pyton 등) - 한 언어만 돌리는 경우 
    운영체제(ubuntu등) - 언어 외에도 다양한 걸 하고 싶을 때
피처: 베이스 위에다 깔고 싶은거.. git lfs, python, 등 툴/서비스 등등 
postCreateCommand : 위의 셋팅 아래에서 최초로 깔아야하는 것들
customizations : 각종 플러그인들을 설정해준다. 
    vscode의 플러그인 개별 설명페이지에서 바로 해당 플로그인을 .devcontainer.json에 추가할래? 라고 물어보며 추가가 된다! &gt; 단 이경우 이미 컨테이너가 켜져있으면 리빌드를 해야한다.</p>
<h3 id="과제설명">과제설명!!</h3>
<p>이 과제를 다해내면 간단한 MLOPS를 혼자서 다 해본것!!</p>
<h3 id="xg부스트">XG부스트</h3>
<p>ML모델 데이터 중 하나!</p>
<h4 id="코드-공부">코드 공부</h4>
<p>돌리는 값과
테스트해보는 값 구분!</p>
<h4 id="소개">소개</h4>
<p>통계 머신러닝의 가장 유용한친구다</p>
<ol>
<li>의사결정나무
와인의 다양한 팩터들 중, 높은 점수의 와인들의 공통점들을 찾아서 의사결정나무가 갈라지는 조건을 자체적으로 만들어낸다. </li>
</ol>
<p>최소한의 판단기준! </p>
<ol start="2">
<li>앙상블 기법
앙상블 기법의 정의는 어떤 것이든지 여러개를 쓰는 것 </li>
</ol>
<p>가장 직관적인 대표적인 앙상블기법: 배깅 = 랜덤 포레스트</p>
<p>의사결정 나무를 여러개 만들어서 각자 값을 내서 그 중에 다수결로..
week leaner, 즉 얕은 트리를 여러개로 다수결을 내면 값은 좋아진다!!</p>
<p>병렬식!</p>
<ol start="3">
<li>앙상블 중에 보깅 : gradient boosting
얕은 의사결정나무를 연달아서 태워서 값을 만든다
앙상블과다른 것은 시퀀스로 움직인다는 것! 
앞의 의사결정나무가 나온 값을 뒤의 나무가 활용한다</li>
</ol>
<p>앞의 결과를 미분적으로, 다음 에러를 줄이기 위해 학습ㅇ</p>
<p>로스 = ground truth와 얼마나 다른지, 틀렷는지 개량화한 것 
앞의 의사결정 나무의 값의 로스를 측정하고
앞으로 일어날 에러를 예측한다
이 에러발생예측을 다음 의사결정나무에게 &quot;넌 이러면 안대&quot;라고 학습시키고 돌려서
그래서 나온 값의 로스를 측정하고...
에러를 예측하고 다음 의사결정나무에게 이를 학습시키고...</p>
<p>&lt;&gt; 정답지 : ground truth </p>
<p>에러를 줄이는 방법 중 하나로 gradient boosting</p>
<ol start="4">
<li>xgboost
gradient boosting을 병렬로 해서 빠르게 해준다!</li>
</ol>
<p>그 중 gradient boosting은? </p>
<h4 id="feathre-importance">feathre importance</h4>
<p>커버 : 의사결정나무에서 이 팩터가 사용된 횟수 </p>
<p>게인 : ///</p>
<p>웨이트 : ///</p>
<p>xgboost가 좋은 이유는 이 feathre importance가 나오기 떄문! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[dvc 공부하기]]></title>
            <link>https://velog.io/@rune_kkk/dvc-%EA%B3%B5%EB%B6%80%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@rune_kkk/dvc-%EA%B3%B5%EB%B6%80%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 13 Nov 2024 06:57:38 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[DEV CONTAINER 101]]></title>
            <link>https://velog.io/@rune_kkk/DEV-CONTAINER-101</link>
            <guid>https://velog.io/@rune_kkk/DEV-CONTAINER-101</guid>
            <pubDate>Sun, 10 Nov 2024 17:13:31 GMT</pubDate>
            <description><![CDATA[<p>*<em>개발업계의 미래의 트렌드! *</em></p>
<h3 id="01-vs-code로-dev-container-시작하기">01 VS CODE로 DEV CONTAINER 시작하기</h3>
<p><strong>0) VS CODE, DOCKER 켜고 VS CODE에 DEV CONTAITNER EXTENTION 깔기
**
**1-1) 작업하고 싶은 폴더를 VS CODE에 열기/만들기</strong></p>
<p><strong>1-2) 사용하고 싶은 환경이 따로 있다면 git hub에서 찾아서 git clone으로 가져오기</strong></p>
<p>*<em>2) VS CODE 좌측 하단 민트색 칸 클릭하면 REMOTE와 관련된 선택지가 상단 중간의 Command Pallette(ctrl+shift+P)에 뜬다 / *</em>WSL, DEVCONTAINER 등..</p>
<ul>
<li><p>ADD Dev Container Configuration Files: 내가 직접 완전 새로운 데브컨테이너 만들기</p>
<pre><code>  * Dev Container Configuration File = devcontainer.json 파일을 지칭하는 것으로 개발환경에 필요한 도구, 라이브러리, 확장 프로그램, 이미지, 환경변수 등을 정의하고 컨테이너를 시작 및 연결하는 방법을 설명하는, 즉 DEV CONTAINER를 설정하는 파일 </code></pre><ul>
<li>Dev Container Rebuild : 기존에 있었던 데브 컨테이너의 볼륨(호스트 컴퓨터에 연동되어 저장된 파일)은 놔두고 Dev Container 다시 만들기</li>
<li>Open Folder in Container : 이미 나한테 있는 폴더를 Dev Container로 열고 싶을때 &gt;&gt; 1-0) 에서 git clone해온 파일들을 사용하고 싶을 때 이걸 쓴다. </li>
</ul>
</li>
</ul>
<p>(<a href="https://velog.velcdn.com/images/rune_kkk/post/4b8b85e8-cf70-4de5-8d64-f3c78d5bc2a3/image.png">https://velog.velcdn.com/images/rune_kkk/post/4b8b85e8-cf70-4de5-8d64-f3c78d5bc2a3/image.png</a>)</p>
<p><strong>3) 컨테이너 기본 설정 선택지들이 뜨며 선택할 수 있게 해준다. **
**1. Workspace 또는 User Data Folder:</strong>
이 옵션을 선택하면 개발 컨테이너 설정이 작업 공간(Workspace) 폴더나 사용자 데이터(User Data) 폴더에 저장됩니다. 주로 현재 작업 중인 프로젝트나 개인 설정을 적용하기 위해 선택할 수 있습니다.</p>
<p><strong>2. 기본 설치 프로그램(Basic Installers):</strong>
여기서 개발에 필요한 기본 도구 및 라이브러리를 포함하는 컨테이너를 선택할 수 있습니다. 예를 들어, Node.js, Python, Java 등 기본적인 개발 환경을 포함한 설정 파일이 제공됩니다.</p>
<p><strong>3. 특정 언어 또는 프레임워크에 맞춘 옵션:</strong></p>
<p>이 옵션에서는 특정 프로그래밍 언어나 프레임워크에 맞춘 컨테이너 설정 파일을 선택할 수 있습니다. 예를 들어, TypeScript, Ruby, Go, .NET 등 다양한 언어와 그에 맞는 환경을 선택할 수 있습니다.</p>
<p>각 언어 또는 프레임워크에 맞는 최적화된 설정이 포함되어 있어, 해당 환경에서 쉽게 개발을 시작할 수 있습니다.</p>
<p><strong>4. 특정 툴이나 런타임 환경:</strong></p>
<p>이 옵션은 특정 개발 도구나 런타임 환경을 제공하는 컨테이너 설정 파일입니다. 예를 들어, Docker, Kubernetes, Azure, GitHub Codespaces 등 특정 툴이나 플랫폼에서 작업하는 데 최적화된 환경을 선택할 수 있습니다.</p>
<p><strong>4) 모든 선택지를 다 만들면 devcontainer.json  파일이 만들어진 것을 확인 할 수 있다</strong></p>
<p><strong>5) 해당 container로 접속하기</strong>
devcontainer.json  파일이 있는 폴더에서 왼쪽 하단의 &#39;&gt;&lt;&#39; 아이콘을 클릭하거나, Command Palette (Ctrl+Shift+P)를 열고 “Remote-Containers: Reopen in Container” 명령을 실행</p>
<p>로딩시간이 좀 걸리고 나서 
좌측 하단에 DEV CONTAINER로 접속했다고 뜨고
TERMINAL의 내용도 LOCAL과 달라지면서 접속이 되었다는 것을 볼 수있다. </p>
<p><strong>6) 해당 Dev container에서 나가기</strong>
Command Palette (Ctrl+Shift+P)에서 
<strong>1. Reopen Folder Locally:</strong>
이 옵션을 선택하면 현재 작업 중인 폴더를 로컬 환경에서 다시 엽니다.
이 명령은 VS Code가 현재 원격 컨테이너나 서버에서 로컬 파일 시스템으로 전환하도록 합니다.
개발 컨테이너 내부에서 작업하던 것을 종료하고, 로컬 파일로 돌아가고 싶을 때 유용합니다.</p>
<p><strong>2. Close Remote Connection:</strong>
이 옵션은 현재 활성화된 원격 연결 자체를 종료합니다.
원격 컨테이너나 서버와의 연결을 끊고, VS Code는 원격 환경과의 상호작용을 중지합니다.
로컬 환경으로 돌아가거나 다른 원격 연결로 전환할 때 사용됩니다.</p>
<h3 id="02-devcontainerjson-자세히-보기">02 devcontainer.json 자세히 보기</h3>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/99ca94a9-b850-4ce8-a989-64a535cc69fe/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/1cc22026-4ae2-4e41-adc1-348bf41544d2/image.png" alt=""></p>
<h3 id="03-code-formatter">03 Code Formatter</h3>
<p>Code Formatter: 정해진 규칙(코딩 컨벤션)에 맞추어 코드를 자동으로 정렬/꾸며주는 도구. 가독성과 효율! </p>
<p>Linter(Lint): 코드에 오류나 버그가 있는지, 정해진 코딩 컨벤션을 잘 지키고 있는지 알려주는 플러그인/프로그램. 코딩 컨벤션에 위반하는 코드를 쓰면 빨간줄 등을 통해 error/warning을 표시한다.  </p>
<ol>
<li>black: 파이썬 코드 포매터로 일관된 스타일로 코드를 자동정렬해줌. 기본은 PEP 8, 커스터마이징 가능. </li>
<li>isort: 파이썬의 import문을 자동 정렬해줌. </li>
<li>flake8: 파이썬 PEP 8 표준 가이드를 따르는지를 검사하고 에러를 잡아주는 LINTER </li>
</ol>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/9633c31c-0bdb-4770-b7a6-d9b89662a585/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹 개발 기초지식]]></title>
            <link>https://velog.io/@rune_kkk/%EC%9B%B9-%EA%B0%9C%EB%B0%9C-%EA%B8%B0%EC%B4%88%EC%A7%80%EC%8B%9D</link>
            <guid>https://velog.io/@rune_kkk/%EC%9B%B9-%EA%B0%9C%EB%B0%9C-%EA%B8%B0%EC%B4%88%EC%A7%80%EC%8B%9D</guid>
            <pubDate>Sun, 10 Nov 2024 12:46:29 GMT</pubDate>
            <description><![CDATA[<h2 id="01-웹의-기본-요소">01 웹의 기본 요소</h2>
<h3 id="서버와-클라이언트">서버와 클라이언트</h3>
<p><strong>서버:</strong> 클라이언트의 요청을 받아 처리하고 응답하는 시스템/컴퓨터/브라우저/데이터베이스...
<strong>클라이언트:</strong> 서버에 요청을 보내고 응답을 받아 사용자에게 보여주는 시스템/컴퓨터/브라우저/앱...
*서버와 클라이언트는 절대적인게 아니다. 나의 컴퓨터도 어떨때는 서버가, 어떨때는 클라이언트가 될 수 있다. </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/07fffabf-f933-4081-bcf8-ed8737b5e138/image.png" alt=""></p>
<h3 id="웹브라우저와-웹-표준">웹브라우저와 웹 표준</h3>
<p><strong>웹브라우저: *<em>사용자가 인터넷에 접속하여 웹 페이지를 탐색하고 *</em>상호작용</strong>할 수 있게 도와주는 소프트웨어 애플리케이션입니다. 웹 브라우저는 서버에서 <strong>HTML, CSS, JavaScript 등의 파일을 받아와 사용자가 볼 수 있는 형태로 렌더링</strong>합니다.
    예) 크롬, 엣지, 사파리... </p>
<p><strong>웹 표준:</strong> 웹에서 콘텐츠를 작성하고 표시하는 데 사용되는 일련의 규칙과 가이드라인입니다. 이러한 표준은 웹의 상호 운용성을 보장하고,** 웹 페이지가 다양한 브라우저와 장치에서 일관되게 표시되도록 도와줍니다.** &gt; 그 덕에 &#39;웹&#39;방식이 다양한 서비스와 비즈니스의 포맷이 된 것! 
<img src="https://velog.velcdn.com/images/rune_kkk/post/bc4c773f-1e37-4461-acb0-93aa6f8b2597/image.png" alt=""></p>
<p><strong>웹사이트의 대표적인 세가지 언어</strong>
HTML은 웹 페이지의 구조를 정의하는 언어입니다. 웹 페이지의 제목, 단락, 링크, 이미지, 표 등 다양한 요소를 작성하는 데 사용됩니다.
<img src="https://velog.velcdn.com/images/rune_kkk/post/04b88b92-3405-4ebb-8fbe-5e52cdac872a/image.png" alt=""></p>
<p>CSS는 웹 페이지의 스타일과 레이아웃을 정의하는 언어입니다. HTML로 작성된 요소들의 색상, 글꼴, 크기, 배치 등을 지정하여 시각적으로 아름답게 만듭니다.</p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/35901a1e-3ad9-47dc-ac8f-713e955b7367/image.png" alt=""></p>
<p>JavaScript는 웹 페이지에 동적 기능을 추가하는 프로그래밍 언어입니다. 사용자의 동작에 반응하여 페이지의 내용을 변경하거나, 데이터를 서버와 주고받는 등의 작업을 수행합니다.
<img src="https://velog.velcdn.com/images/rune_kkk/post/b4612be4-cf03-4f0e-be46-5af1c977269b/image.png" alt=""></p>
<p><strong>크롬개발자 도구 활용하기</strong></p>
<h2 id="02-서버와-클라이언트의-소통">02 서버와 클라이언트의 소통</h2>
<h3 id="ip네트워크-주소와-dns">IP(네트워크 주소)와 DNS</h3>
<p><strong>IP(Internet Protocol) 주소</strong>는 네트워크 상에서 장치를 식별하기 위해 사용되는 고유한 주소입니다. 
(예: 192.168.0.1).</p>
<p><strong>DNS(Domain Name System)</strong> 는 인간이 이해하기 쉬운 도메인 이름(예: <a href="http://www.google.com)%EC%9D%84">www.google.com)을</a> IP 주소(예: 93.184.216.34)로 변환하는 시스템입니다. DNS는 전화번호부와 비슷하게 도메인 이름을 IP 주소로 매핑하여, 사용자가 도메인 이름을 입력하면 해당 IP 주소로 연결될 수 있도록 합니다.</p>
<p>*<em>IP와 DNS이 작동과정 *</em></p>
<p>1) 사용자가 웹 브라우저에 <a href="http://www.example.com%EC%9D%84">www.example.com을</a> 입력합니다.
2) 브라우저는 DNS 서버에 도메인 이름을 IP 주소로 변환해달라고 요청합니다.
3) DNS 서버는 <a href="http://www.example.com%EC%9D%98">www.example.com의</a> IP 주소를 찾아 브라우저에 반환합니다.
4) 브라우저는 IP 주소를 사용하여 해당 서버에 연결하고, 웹 페이지를 로드합니다.</p>
<p><strong>비유)</strong> IP를 찾는 것은 친구에게 전화걸때 번호를 전부 외워서 쳐서 거는 방법인데... 이게 비효율적이니 홍길동을 치면 해당 전화번호로 전화가 걸리게끔 하는 것</p>
<p>*<em>참고) *</em> DNS도 클라이언트의 요청으로 도메인과 상응하는 IP주소를 클라이언트에게 전달하는 것으로서 일종의 &#39;서버&#39;다.</p>
<p><strong>IP 주소의 2 종류</strong>
<strong>IPv4 (Internet Protocol Version 4)</strong>: 32비트 주소로, 0에서 255 사이의 숫자 4개로 구성됩니다. 
예: 192.168.1.1</p>
<p>약 43억 개의 주소를 제공하지만, 인터넷 사용의 급증으로 인해 주소가 부족한 상황에 직면</p>
<p><strong>IPv6 (Internet Protocol Version 6)</strong>: 128비트 주소로, 16진수 8개 그룹으로 구성됩니다.  훨씬 더 많은 주소를 제공하여, 사실상 무한에 가까운 주소를 사용할 수 있습니다. 이는 IPv4의 주소 부족 문제를 해결합니다.
예: 2001:0db8:85a3:0000:0000:8a2e:0370:7334</p>
<p><strong>궁금증) 내 컴퓨터의 IP는 계속 바뀌나요?</strong>
개인의 IP 주소는 여러 가지 이유로 변경될 수 있습니다: 대부분의 가정용 네트워크는 ISP(인터넷 서비스 제공자)로부터 <strong>유동 IP</strong> 주소를 할당받습니다. 이는 일정 기간이 지나면 변경될 수 있습니다. 네트워크 관리 효율성을 높이기 위해, ISP는 IP 주소를 필요에 따라 재할당합니다. 그래서 컴퓨터나 라우터를 재부팅하거나, ISP가 주기적으로 IP를 갱신할 때마다 IP 주소가 변경될 수 있습니다.</p>
<p>이와 반대로** 고정 IP**를 사용하는 경우, IP 주소가 변경되지 않습니다. 고정 IP는 특정 요구 사항이 있는 경우, 예를 들어 서버 운영, 원격 접속 등을 위해 사용됩니다. 웹 서비스 사업자들은 고정된 IP 주소를 사용하는 경우가 많습니다. 이렇게 하면 웹사이트나 서버에 대한 접근이 일관되게 유지되고, 도메인 이름이 항상 동일한 IP 주소로 매핑될 수 있습니다. 고정 IP는 특히 웹 호스팅, 메일 서버, VPN 서버, 원격 데스크탑 서비스 등에서 많이 사용됩니다.</p>
<h3 id="url">URL</h3>
<h4 id="url-정의">URL 정의</h4>
<p><strong>URL(Uniform Resource Locator)</strong>은 인터넷 상에서 특정 자원을 가리키기 위해 사용하는 주소 체계입니다. 웹 페이지, 이미지, 동영상 등 다양한 <strong>자원을 식별하고 접근하는 데 사용</strong>됩니다. LOCATOR = 위치를 알려주는 역할</p>
<h4 id="url의-구성-요소">URL의 구성 요소</h4>
<p>http:// <a href="http://www.example.com:80/path/to/resource?key1=value1&amp;key2=value2#section1">www.example.com:80/path/to/resource?key1=value1&amp;key2=value2#section1</a></p>
<ol>
<li><p>프로토콜 (Scheme)
웹 자원에 접근하는 방법을 정의합니다.
예: http://, https://, ftp://</p>
</li>
<li><p>도메인 이름 (Host)
자원이 위치한 서버의 이름입니다. 서버의 주인 이름. IP주소로도 대체 가능
예: <a href="http://www.example.com">www.example.com</a>
subdomain : www가 해당 서버의 메인페이지, 이게 바뀌면 해당 서버의 부속 페이지들. <a href="http://www.naver.com">www.naver.com</a> / blog.naver.com / mail.naver.com
secondary domain: 주인의 진짜 이름
Top-Level Domain: 주인의 성격을 알려줌 .ac .uk .kr .co 
<img src="https://velog.velcdn.com/images/rune_kkk/post/1c0faef4-37bd-44a0-9317-1eeb4d3d642e/image.png" alt=""></p>
</li>
<li><p>포트 번호 (Port)
서버의 특정 서비스를 가리키는 번호입니다. 일반적으로 생략 가능하며, 기본값은 http의 경우 80, https의 경우 443입니다.
예: :80, :443</p>
</li>
<li><p>경로 (Path)
서버 내에서 자원의 위치를 가리킵니다.
예: /path/to/resource</p>
</li>
<li><p>쿼리 문자열 (Query)
자원에 대한 추가적인 매개변수를 전달합니다.
예: ?key1=value1&amp;key2=value2
<img src="https://velog.velcdn.com/images/rune_kkk/post/a0993c91-8fd8-4b8e-a60e-667593af2544/image.png" alt=""></p>
</li>
<li><p>프래그먼트 (Fragment)
자원의 특정 부분을 가리킵니다. 주로 웹 페이지 내의 특정 섹션으로 이동할 때 사용됩니다.
예: #section1
<img src="https://velog.velcdn.com/images/rune_kkk/post/3c866098-ccc4-431e-94c5-14f08cba0388/image.png" alt=""></p>
</li>
</ol>
<h3 id="프로토콜">프로토콜</h3>
<p><strong>정의</strong>
프로토콜은 컴퓨터 네트워크에서 데이터를 전송하고 받는 규칙이나 절차를 정의한 것입니다. 프로토콜은 <strong>네트워크 통신의 언어</strong>라고 생각할 수 있습니다. 이 규칙 덕분에 서로 다른 시스템과 장치들이 원활하게 통신할 수 있습니다.</p>
<p><strong>주요 종류</strong></p>
<ol>
<li><p>HTTP (HyperText Transfer Protocol)
설명: 웹 브라우저와 웹 서버 간에 데이터를 주고받기 위해 사용하는 프로토콜입니다.
역할: 웹 페이지, 이미지, 동영상 등 다양한 웹 콘텐츠를 전송합니다.
예시: <a href="http://www.example.com">http://www.example.com</a></p>
</li>
<li><p>HTTPS (HyperText Transfer Protocol Secure)
설명: HTTP의 보안 버전으로, 데이터를 암호화하여 안전하게 전송합니다.
역할: 민감한 정보(예: 로그인 정보, 결제 정보)를 안전하게 전송합니다.
예시: <a href="https://www.example.com">https://www.example.com</a></p>
</li>
<li><p>FTP (File Transfer Protocol)
설명: 파일을 전송하기 위한 프로토콜입니다.
역할: 컴퓨터 간에 파일을 업로드하거나 다운로드합니다.
예시: <a href="ftp://ftp.example.com">ftp://ftp.example.com</a></p>
</li>
<li><p>SMTP (Simple Mail Transfer Protocol)
설명: 이메일을 전송하기 위한 프로토콜입니다.
역할: 이메일 서버 간에 메일을 전송합니다.
예시: 이메일 서버 간 메일 전송</p>
</li>
<li><p>SSH (Secure Shell)
설명: SSH는 네트워크를 통해 두 컴퓨터 간에 보안된 연결을 확립하기 위한 프로토콜입니다. 주로 <strong>원격 로그인과 명령어 실행을 위해 사용</strong>됩니다.
역할: 네트워크를 통해 안전하게 원격 서버에 접속하고, 명령을 실행하거나 파일을 전송할 수 있습니다.
예시: ssh user@remote_server</p>
</li>
<li><p>IMAP/POP3 (Internet Message Access Protocol/Post Office Protocol)
설명: 이메일 클라이언트가 이메일 서버에서 메일을 가져오기 위한 프로토콜입니다.
역할: 이메일을 읽고, 가져오고, 삭제합니다.
예시: 이메일 클라이언트와 서버 간 메일 읽기</p>
</li>
</ol>
<p><strong>과정</strong></p>
<ol>
<li>클라이언트 요청: 클라이언트가 URL을 통해 HTTP 요청을 보냅니다. 예를 들어, <a href="http://www.example.com%EC%97%90">http://www.example.com에</a> 대한 요청입니다.</li>
<li>서버 수신: 서버는 이 요청을 수신하고, HTTP 요청임을 인식합니다.</li>
<li>요청 처리: 서버는 HTTP 프로토콜에 맞춰 요청을 처리합니다. 이는 요청된 자원(예: HTML 파일, 이미지 등)을 준비하는 과정입니다.</li>
<li>응답 반환: 서버는 준비된 자원을 HTTP 응답 형식으로 클라이언트에게 보냅니다. 이 응답에는 상태 코드, 헤더, 바디가 포함됩니다.</li>
</ol>
<h3 id="http">HTTP</h3>
<p><strong>HTTP의 주요 구성 요소</strong></p>
<ol>
<li><p>HTTP 매서드
명령어!</p>
</li>
<li><p>HTTP 엔드포인트 
엔드포인트는 클라이언트가 서버에 요청을 보낼 때 <strong>대사을 지칭</strong>하는 <strong>URL의 끝자락 값</strong>입니다. 이는 서버의 특정 리소스나 기능을 가리킵니다.</p>
</li>
</ol>
<p>전체: <a href="https://api.example.com/users">https://api.example.com/users</a>
클라이언트가 이 URL을 통해 서버에 요청을 보내면, 서버는 /users 엔드포인트에 해당하는 리소스를 처리하여 응답합니다.</p>
<ol start="2">
<li><p>HTTP 코드 (Status Code)
HTTP 상태 코드는 클라이언트의 요청에 대한 서버의 응답 상태를 나타냅니다. 상태 코드는 3자리 숫자로 구성됩니다.
200 OK: 요청이 성공적으로 처리되었음을 나타냅니다.
404 Not Found: 요청한 리소스를 찾을 수 없음을 나타냅니다.
500 Internal Server Error: 서버 내부에서 오류가 발생했음을 나타냅니다.</p>
</li>
<li><p>HTTP 헤더 (Header)
HTTP 헤더는 요청 및 응답에 대한 추가 정보를 제공합니다. 헤더는 키-값 쌍으로 구성됩니다.
예시:
Content-Type: 요청 또는 응답의 콘텐츠 유형을 나타냅니다 (예: application/json).
Authorization: 인증 정보를 포함합니다 (예: Bearer token).
User-Agent: 요청을 보낸 클라이언트의 정보입니다 (예: 브라우저 정보).</p>
</li>
<li><p>HTTP 바디 (Body)
HTTP 바디는 요청 또는 응답의 실제 데이터를 포함합니다. 바디는 HTML, JSON, XML, 텍스트 등의 형식일 수 있습니다.</p>
</li>
</ol>
<p>즉, 바디는 데이터 그 자체, 헤더는 그 데이터들의 다양한 옵션들... </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/5a714a1e-84e4-4580-b44a-61fe8d900788/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/16800124-6c4d-4bfe-936a-165d063fc54a/image.png" alt=""></p>
<p><strong>HTTP 매서드</strong></p>
<ol>
<li><p>GET
설명: 서버에서 자원을 요청할 때 사용됩니다.
역할: 데이터를 조회합니다. 요청에 대한 응답으로 서버는 요청된 자원을 반환합니다.
예시: GET /items/1 (아이디가 1인 아이템을 조회해줘!)</p>
</li>
<li><p>POST
설명: 서버에 데이터를 제출할 때 사용됩니다.
역할: 새로운 자원을 생성합니다. 서버는 요청의 결과로 생성된 자원에 대한 정보를 반환합니다.
예시: POST /items (새로운 아이템을 생성해줘!)</p>
</li>
<li><p>PUT
설명: 서버의 기존 자원을 업데이트할 때 사용됩니다.
역할: 자원을 전체적으로 갱신합니다. 요청된 자원 전체를 바꾸며, 서버는 갱신된 자원을 반환합니다.
예시: PUT /items/1 (아이디가 1인 아이템을 업데이트해줘!)</p>
</li>
<li><p>PATCH
설명: 서버의 기존 자원을 부분적으로 업데이트할 때 사용됩니다.
역할: 자원의 일부를 수정합니다. PUT과 달리 전체 자원이 아닌 부분적인 업데이트를 수행합니다.
예시: PATCH /items/1 (아이디가 1인 아이템의 일부를 수정해줘!)</p>
</li>
<li><p>DELETE
설명: 서버에서 자원을 삭제할 때 사용됩니다.
역할: 요청된 자원을 삭제합니다. 서버는 삭제가 성공적으로 완료되었음을 나타내는 응답을 반환합니다.
예시: DELETE /items/1 (아이디가 1인 아이템을 삭제해줘!)</p>
</li>
<li><p>HEAD
설명: GET 요청과 유사하지만, 서버는 응답 본문을 반환하지 않습니다.
역할: 서버의 상태나 자원의 메타데이터를 확인합니다.
예시: HEAD /items/1 (아이디가 1인 아이템의 헤더 정보를 조회해줘!)</p>
</li>
<li><p>OPTIONS
설명: 서버에서 허용되는 메서드를 확인할 때 사용됩니다.
역할: 특정 자원에 대해 서버가 지원하는 HTTP 메서드를 확인합니다.
예시: OPTIONS /items (이 아이템에대해서 내가 쓸수 있는 메서드를 조회해줘!)</p>
</li>
</ol>
<h3 id="포트">포트</h3>
<p><strong>포트</strong>는 네트워크 통신에서** 특정 서비스를 식별<strong>하기 위해 사용되는 논리적 번호입니다. 포트는 **IP 주소와 함께 사용</strong>되어** 데이터가 적절한 애플리케이션으로 전달되도록 합니다.**</p>
<pre><code>IP: 그 데이터를 김윤아에게 가져와!
포트: 김윤아가 들고 있는 바구니 중에서 A바구니에 넣어! </code></pre><p><strong>포트의 역할</strong>
식별: 동일한 IP 주소에서 여러 애플리케이션이 실행될 수 있는데, 포트 번호를 사용하여 특정 애플리케이션을 식별합니다.
통신: 클라이언트와 서버 간의 통신이 이루어지는 엔드포인트를 정의합니다.</p>
<p><strong>포트 번호</strong></p>
<ul>
<li><p>0-1023 (Well-Known Ports): 범용 서비스와 프로토콜에 예약된 포트입니다.
80: HTTP
443: HTTPS
22: SSH
21: FTP</p>
</li>
<li><p>1024-49151 (Registered Ports): 특정 애플리케이션에 등록된 포트입니다.</p>
</li>
<li><p>49152-65535 (Dynamic/Private Ports): 임시 또는 개인용으로 사용되는 포트입니다. 동적으로 할당될 수 있습니다.</p>
</li>
</ul>
<p>주의) 포트충돌시 오류 발생 - 포트를 바꿔줘야한다! </p>
<h3 id="정적-웹사이트--동적-웹사이트">정적 웹사이트 / 동적 웹사이트</h3>
<p><strong>정적 웹사이트 (Static Website)</strong>
정적 웹사이트는 HTML 파일로 구성된 웹사이트로, 서버에서 클라이언트로 그대로 전송됩니다. 이러한 웹사이트는 변경되지 않는 콘텐츠를 제공합니다.</p>
<ul>
<li>특징:
고정된 콘텐츠: 콘텐츠가 고정되어 있으며, 페이지의 내용이 자주 변경되지 않습니다.
빠른 로딩 속도: 서버에서 클라이언트로 파일을 바로 전송하므로 로딩 속도가 빠릅니다.
유지보수 용이: 서버 측에서 복잡한 처리가 필요하지 않으므로 관리가 쉽습니다.
예시: 개인 블로그, 포트폴리오 사이트, 회사 소개 사이트 등</li>
</ul>
<p><strong>동적 웹사이트 (Dynamic Website)</strong>
동적 웹사이트는 서버에서 클라이언트의 요청에 따라 콘텐츠가 동적으로 생성되는 웹사이트입니다. 이러한 웹사이트는 사용자 인터랙션에 따라 페이지의 내용이 변경됩니다.</p>
<ul>
<li>특징:
변경 가능한 콘텐츠: 사용자 입력, 데이터베이스 정보 등을 기반으로 페이지의 내용이 변경됩니다.
복잡한 처리: 서버 측에서 데이터를 처리하고 결과를 생성하여 클라이언트에 전송합니다.
유연성: 사용자 맞춤형 콘텐츠 제공이 가능합니다.
예시: 페이지의 틀만 같고 유저의 요청/데이터에 따라 서로 다른 내요들로 채워지는 ... 소셜 미디어, 전자 상거래 사이트, 뉴스 사이트 </li>
</ul>
<p><strong>동적 웹사이트의 두 종류</strong></p>
<p><strong>1. 서버 사이드 렌더링 (Server-Side Rendering, SSR)</strong></p>
<ul>
<li>설명: <strong>서버에서 HTML을 동적으로 생성</strong>하여 클라이언트에 전송합니다. 클라이언트는 완성된 HTML을 수신하여 렌더링합니다.
장점: 초기 로딩 속도가 빠르고, 사용자별 맞춤형 내용 제공에 유리합니다.
예시: 전통적인 웹 애플리케이션(예: PHP, ASP.NET), 일부 Node.js 프레임워크(예: Next.js)</li>
</ul>
<p><strong>2. 클라이언트 사이드 렌더링 (Client-Side Rendering, CSR)</strong></p>
<ul>
<li>설명: 서버에서 기본 HTML을 전송하고, JavaScript를 통해** 클라이언트 측에서 동적으로 콘텐츠를 생성** 및 렌더링합니다.
장점: 사용자 경험이 매끄럽고, 클라이언트 측에서 빠른 인터랙션이 가능합니다.
예시: 모던 웹 애플리케이션(예: React, Vue.js, Angular)</li>
</ul>
<h2 id="03-데이터베이스">03 데이터베이스</h2>
<h4 id="관계형-데이터베이스-relational-database"><strong>관계형 데이터베이스 (Relational Database)</strong></h4>
<p>관계형 데이터베이스는 데이터를 테이블 형식으로 저장하며, 각 테이블은 행과 열로 구성됩니다. 테이블 간의 관계는 외래 키(foreign key)를 통해 정의됩니다.</p>
<ul>
<li>특징:</li>
<li><em>구조화된 데이터*</em>: 데이터는 테이블 형식으로 저장되며, 각 테이블은 고유한 스키마를 가집니다. 즉 심혈을 기울여 구조를 기획하고, 활용시에도 엄격하고 고정된 활용도를 가지게 된다. 
관계: <strong>테이블 간의 관계</strong>를 통해 데이터의 정합성을 유지합니다.
SQL: 데이터 쿼리 및 조작을 위해 구조적 질의 언어(SQL)를 사용합니다.
트랜잭션 지원: ACID(Atomicity, Consistency, Isolation, Durability) 특성을 지원하여 데이터의 일관성과 신뢰성을 보장합니다.</li>
<li>예시:
MySQL: 오픈 소스 관계형 데이터베이스 관리 시스템.
PostgreSQL: 객체 관계형 데이터베이스 시스템.
Oracle DB: 상업용 관계형 데이터베이스 관리 시스템.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/da10155c-df50-4037-ae45-b743f7b8b6e4/image.png" alt="">
<img src="https://velog.velcdn.com/images/rune_kkk/post/ed13a595-1bb0-423e-aac3-def4831f74fe/image.png" alt=""></p>
<h4 id="비관계형nosql-데이터베이스-nosql-database"><strong>비관계형(NoSQL) 데이터베이스 (NoSQL Database)</strong></h4>
<p>비관계형(NoSQL) 데이터베이스는 테이블 형식이 아닌 다양한 데이터 모델을 지원합니다. 이는 주로 대용량 데이터와 높은 성능 요구 사항을 충족시키기 위해 사용됩니다.</p>
<ul>
<li>특징:</li>
<li><em>유연한 데이터*</em> 모델: 키-값, 문서, 그래프, 칼럼 패밀리 등 다양한 데이터 모델을 지원합니다.
수평 확장성: 데이터를 분산된 방식으로 저장하며, 수평 확장을 통해 성능을 향상시킵니다.
스키마 없음: 데이터 구조가 고정되어 있지 않아 <strong>유연한 스키마를</strong> 가질 수 있습니다.
고성능: 대규모 데이터를 빠르게 처리할 수 있습니다.</li>
<li>예시:
MongoDB: 문서 지향 데이터베이스로, JSON과 유사한 BSON 형식을 사용합니다.
Cassandra: 분산형 칼럼 패밀리 데이터베이스로, 높은 확장성과 가용성을 제공합니다.
Redis: 인메모리 키-값 저장소로, 빠른 데이터 접근을 지원합니다.
Neo4j: 그래프 데이터베이스로, 복잡한 관계를 저장하고 쿼리하는 데 최적화되어 있습니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/9be905ee-f72e-4b17-8d43-c1e11a269139/image.png" alt=""></p>
<p>참고) 좋고 나쁜 건 없다! 상황에 맞게 사용하기
비관계형이 늘어나는 추세지만, 관계형이 주되게 사용된다
비관계형은 그냥 일단 데이터를 저장해두는 경우에도 사용된다 (예: 우리 웹사이트에서 고객들이 어디를 클릭하는지 로그기록 일단 다 저장해두기) </p>
<h2 id="04-api">04 API</h2>
<p>API(Application Programming Interface)소프트웨어 애플리케이션 간의 상호작용을 가능하게 하는 인터페이스(규칙, 도구의 집합)입니다. 이를 통해 서로 다른 소프트웨어 시스템이 데이터를 주고받고 기능을 호출할 수 있습니다.</p>
<p><strong>클라이언트: *<em>API를 호출하여 데이터를 요청하거나 기능을 수행하는 애플리케이션.
*</em>서버:</strong> API 요청을 받아들이고, 요청된 작업을 수행하여 클라이언트에 응답하는 시스템.</p>
<p><strong>동작순서</strong></p>
<ol>
<li><p>클라이언트 요청 (Request)
클라이언트 애플리케이션이 서버의 API에 요청을 보냅니다. 요청에는 필요한 데이터와 원하는 작업을 지정합니다.
예: HTTP 요청 (GET, POST, PUT, DELETE 등)을 통해 API 호출.</p>
</li>
<li><p>서버 처리 (Processing)
서버는 클라이언트로부터 받은 요청을 처리합니다. 요청된 데이터나 기능에 따라 작업을 수행합니다.
예: 데이터베이스 조회, 데이터 생성/수정/삭제, 외부 API 호출 등.</p>
</li>
<li><p>서버 응답 (Response)
서버는 요청된 작업을 완료한 후, 결과를 클라이언트에 응답합니다. 응답에는 상태 코드, 헤더, 바디가 포함됩니다.
예: JSON 형식의 데이터, 상태 코드(200 OK, 404 Not Found 등).</p>
</li>
</ol>
<p><strong>API의 구성 요소</strong></p>
<ul>
<li>엔드포인트 (Endpoint): API가 제공하는 리소스나 기능을 가리키는 URL 경로입니다.</li>
<li>메서드 (Method): API 요청의 종류를 나타냅니다. 주로 HTTP 메서드를 사용합니다 (GET, POST, PUT, DELETE 등).</li>
<li>헤더 (Header): 요청이나 응답에 대한 메타데이터를 포함합니다 (예: Content-Type, Authorization).</li>
<li>바디 (Body): 요청 또는 응답의 실제 데이터를 포함합니다. 주로 JSON, XML 등의 형식을 사용합니다.
JSON</li>
</ul>
<p><strong>HTTP와 API 똑같은데?</strong>
HTTP : 서버간의 통신
API : 어플리케이션 간의 통
사실 역할이 같음! 그래서 똑같음!
그리고 대부분의 API가 가장 안정적이고 표준화된 HTTP를 기반으로 만들어진거임 </p>
<p><strong>JSON (JavaScript Object Notation)</strong>
JSON (JavaScript Object Notation)은 데이터를 저장하고 전송하기 위한 경량 데이터 형식입니다. JSON은 사람이 읽기 쉬운 텍스트 형식으로, 구조화된 데이터를 표현하는 데 사용됩니다. 주로 웹 애플리케이션에서 서버와 클라이언트 간의 데이터 교환에 많이 사용됩니다. 간결 / 유연 / 호환</p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/d49c147e-492e-4b0a-a5e3-8ab1e6b5bb0e/image.png" alt=""></p>
<p>JSON의 사용예시</p>
<ol>
<li><p>API: 클라이언트가 요청한 내용을 서버가 JSON 형태로 반환한다 예) 사용자정보, 상품 목록 정보 
<img src="https://velog.velcdn.com/images/rune_kkk/post/3861e3f1-d336-40b8-9f6b-85b4ed56f62e/image.png" alt=""></p>
</li>
<li><p>앱/도커의 설정값: 각 설정항목에 대응되는 설정값을 JSON상태로 저장해서 사용한다. 
<img src="https://velog.velcdn.com/images/rune_kkk/post/7fdf59eb-79f5-4b31-b21b-c451da73010a/image.png" alt=""></p>
</li>
</ol>
<h2 id="요약">요약</h2>
<blockquote>
<p>서버와 클라이언트
IP와 도메인 : 서버 이름, 서버 식별 
URL : 서버 내 자원 위치 , 자원 식별 
프로토콜 : 서버와 클라이언트 간의 통신 언어<br>포트 : 서버/클라이언트 내 애플리케이션 식별
브라우저</p>
</blockquote>
<blockquote>
<p>HTTP 매서드 : 명령어
HTTP 엔드포인트 : 대상 지칭
HTTP 코드 : 명령어 상태
HTTP 헤드 : 바디의 옵션들
HTTP 바디 : 내용물 그 자체 
GET POST PUT PATCH DELETE</p>
</blockquote>
<blockquote>
<p>정적 웹사이트 / 동적 웹사이트 / 서버 사이드 / 클라이언트 사이드</p>
</blockquote>
<blockquote>
<p>관계형 데이터베이스 / 비관계형 데이터 베이스 </p>
</blockquote>
<blockquote>
<p>API : 어플리케이션 간의 소통을 위한 인터페이스</p>
</blockquote>
<h2 id="05-fastapi와-포스트맨">05 FastAPI와 포스트맨</h2>
<h3 id="툴-정의">툴 정의</h3>
<p>FastAPI: Python으로 작성된 고성능 웹 프레임워크로, RESTful API를 쉽고 빠르게 개발할 수 있도록 도와줍니다. 즉 API 잘만들어주는 툴! </p>
<p>Postman: API 개발, 테스트, 문서화, 모니터링을 위한 도구로, FastAPI로 개발한 API를 테스트하고 디버깅하는 데 유용합니다</p>
<p><strong>Uvicorn</strong>: ASGI 서버로, FastAPI 애플리케이션을 실행하는 데 사용됩니다. pip으로 같이 깔아야한다. </p>
<h3 id="fastapi-시작하기--get-서버의-값-가져오기">FastAPI 시작하기 : GET 서버의 값 가져오기</h3>
<p><strong>1) FastAPI와 Uvicorn을 설치</strong>
pip install fastapi uvicorn</p>
<p>확인 : pip list </p>
<p><strong>2) 작업하고 싶은 폴더로 가서 파이썬 파일 하나 만들기</strong></p>
<p>*<em>3) FastAPI 애플리케이션 작성하기 *</em></p>
<pre><code>
##FastAPI 클래스 가져오기     
from fastapi import FastAPI

##FastAPI 클래스의 인스턴스를 생성하여 app이라는 변수에 할당
app = FastAPI()

##초기 데이터 설정 
items = {
    1: {&quot;이름&quot;:&quot;김윤아&quot;, &quot;나이&quot;:&quot;30&quot;, &quot;직업&quot;:&quot;회사원&quot;, &quot;특이사항&quot;:&quot;화가 많음&quot;}, 
    2: {&quot;이름&quot;:&quot;한요한&quot;, &quot;나이&quot;:&quot;29&quot;, &quot;직업&quot;:&quot;회사원&quot;, &quot;특이사항&quot;:&quot;너무 침착함&quot;}
}

##&quot;/&quot;경로로 GET요청이 들어오면, JSON 형식의 응답인 &quot;message&quot;: &quot;Hello, World!&quot;을 반환하라. 
@app.get(&quot;/&quot;)
def read_root():
    return {&quot;message&quot;: &quot;Hello, let me introduce my friends&quot;}

##&#39;items/아이템키(위의 1, 2..)&#39;로 들어오면 해당값을 보여줘라. 
@app.get(&quot;/items/{item_id}&quot;)
def read_item(item_id: int): 
    item = items.get(item_id)   #이부분 모르겠음.. 
    if item:    
        return item 
    return {&quot;error&quot;: &quot;Item not found&quot;}

##&#39;/items/ 경로로 들어오면 아이템들 전부 보여줘라.
@app.get(&quot;/items&quot;) 
def read_items(): 
    return items</code></pre><ul>
<li><p>인스턴스: 클래스(Class)라는 청사진을 기반으로 생성된 구체적인 객체(Object)를 말합니다. 객체 지향 프로그래밍에서 클래스는 특정 종류의 객체를 정의하는 템플릿이며, 인스턴스는 그 템플릿을 바탕으로 생성된 실제 객체입니다.
클래스: 설계도. 예를 들어, 자동차를 만드는 설계도라고 생각할 수 있습니다.
인스턴스: 설계도를 바탕으로 실제로 만들어진 자동차 한 대.</p>
</li>
<li><p>데코레이터: 데코레이터는 기존의 함수나 메서드에 기능을 추가하거나 수정하는 데 사용되는 Python의 고급 기능입니다. 데코레이터는 함수나 메서드의 앞에 @데코레이터이름을 붙여 사용하며, 주로 반복적인 코드의 중복을 줄이고 기능을 확장하는 데 유용합니다.</p>
</li>
<li><p>엔드포인트 : 위의 API에서 엔드포인트는 &#39;/&#39;와 &#39;/items/{item_id}&#39; 두개가정의되었다. </p>
</li>
</ul>
<p><strong>4. API 테스트</strong>
브라우저 또는 Postman을 사용하여 API를 테스트해볼 수 있습니다.</p>
<ul>
<li><a href="http://127.0.0.1:8000(=%EB%A3%A8%ED%8A%B8)%EC%97%90">http://127.0.0.1:8000(=루트)에</a> 접속하면 &quot;Hello, World!&quot; 메시지를 확인할 수 있습니다.</li>
<li><a href="http://127.0.0.1:8000/items/1%EC%97%90">http://127.0.0.1:8000/items/1에</a> 접속하면 {&quot;name&quot;: &quot;Pen&quot;, &quot;description&quot;: &quot;A smooth-writing pen&quot;, &quot;price&quot;: 1.99, &quot;tax&quot;: 0.2} } 메세지를 확인할 수 있다. </li>
</ul>
<p><strong>질문) 왜 127.0.0.1:8000인가??</strong>
Uvicorn은 FastAPI 애플리케이션을 실행할 때 기본적으로 127.0.0.1 (로컬 호스트)와 포트 8000을 사용합니다.
127.0.0.1은 로컬 호스트 주소로, 현재 컴퓨터에서만 접근할 수 있는 서버 주소입니다. 포트 8000은 Uvicorn이 기본적으로 사용하는 포트 번호입니다.</p>
<p><strong>참고) URL 다르게 설정하기</strong>
기본 설정이 아닌 다른 주소나 포트를 사용하고 싶다면 Uvicorn 명령어에 옵션을 추가할 수 있습니다:</p>
<pre><code>uvicorn main:app --host 0.0.0.0 --port 8080 --reload</code></pre><p>결과: 애플리케이션이 <a href="http://0.0.0.0:8080%EC%97%90%EC%84%9C">http://0.0.0.0:8080에서</a> 실행됩니다.
참고로 host 0.0.0.0는 모든 네트워크 인터페이스에서 접근 가능하게 설정하는 겁니다. </p>
<h3 id="fastapi-시작하기--post-서버에-값-추가하기">FastAPI 시작하기 : POST 서버에 값 추가하기</h3>
<p>최종 전체 코드 </p>
<pre><code>from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    이름: str
    나이: int
    직업: str
    특이사항: str = None

items = {
    1: {&quot;이름&quot;:&quot;김윤아&quot;, &quot;나이&quot;:&quot;30&quot;, &quot;직업&quot;:&quot;회사원&quot;, &quot;특이사항&quot;:&quot;화가 많음&quot;}, 
    2: {&quot;이름&quot;:&quot;한요한&quot;, &quot;나이&quot;:&quot;29&quot;, &quot;직업&quot;:&quot;회사원&quot;, &quot;특이사항&quot;:&quot;너무 침착함&quot;}
}

@app.get(&quot;/&quot;)
def read_root():
    return {&quot;message&quot;: &quot;Hello, let me introduce my friends&quot;}

@app.get(&quot;/items/{item_id}&quot;)
def read_item(item_id: int):
    item = items.get(item_id)
    if item:
        return item
    return {&quot;error&quot;: &quot;Item not found&quot;}

@app.get(&quot;/items&quot;)
def read_items():
    return items

@app.post(&quot;/items/&quot;)
def create_item(item: Item):
    item_id = len(items) + 1
    items[item_id] = item.dict()
    return {&quot;item_id&quot;: item_id, &quot;item&quot;: item}
</code></pre><p><strong>1. 데이터 모델 정의</strong>
먼저, 아이템의 데이터 모델을 정의할 필요가 있습니다. 즉 데이터의 틀을 정의내리기! Pydantic을 사용하여 데이터 검증과 <strong>직렬화</strong>를 처리할 수 있습니다.</p>
<p>우선 Pydantic 깔기: 
pip install pydantic</p>
<p>다음 아래의 코드 추가</p>
<pre><code>from pydantic import BaseModel

class Item(BaseModel):
    이름: str
    나이: int
    직업: str
    특이사항: str = None
</code></pre><p><strong>2. POST 엔드포인트 추가</strong>
이제 새로운 아이템을 추가하는 POST 엔드포인트를 추가해봅시다.</p>
<pre><code>@app.post(&quot;/items/&quot;)
def create_item(item: Item):
    item_id = len(items) + 1
    items[item_id] = item.dict()
    return {&quot;item_id&quot;: item_id, &quot;item&quot;: item}
</code></pre><p><strong>3. 실행 및 테스트</strong>
이제 FastAPI 애플리케이션을 실행하고, POST 요청을 통해 새로운 아이템을 추가해볼 수 있습니다. 예를 들어, Postman을 사용하여 다음과 같이 요청을 보낼 수 있습니다:</p>
<p>포스트맨 앱 사용방법 : <a href="https://hyunki99.tistory.com/93">https://hyunki99.tistory.com/93</a></p>
<hr>
<h3 id="문제-브라우저에서-무한로디엥-빠졌다">문제: 브라우저에서 무한로디엥 빠졌다.</h3>
<p>uvicorn main:app --port 9000 --reload 
포트번호 바꿔보자!</p>
<h3 id="문제-포트를-바꿔도-몇분-후면-또-api가-안됨">문제: 포트를 바꿔도 몇분 후면 또 api가 안됨</h3>
<p>uvicorn main:app --reload --log-level debug</p>
<h3 id="자주-발생하는-문제">자주 발생하는 문제</h3>
<p>pip install을 했는가?
import된 클래스 명령어인가?
변수의 철자가 다르지 않은가?
api 위치에 오타는 없는가? s나 / 여부확인! </p>
<hr>
<h4 id="httpexception이-필요한-이유">HTTPException이 필요한 이유</h4>
<p>500 Internal Server Error는 서버에서 발생한 예외가 원인일 수 있습니다. 로그에 &quot;Exception in ASGI application&quot; 메시지가 표시된다면, 애플리케이션 코드에서 예외가 발생하고 있다는 의미입니다. 구체적인 원인을 파악하려면, 예외 메시지와 스택 트레이스를 확인하는 것이 중요합니다.</p>
<pre><code># 임포트하기 
from fastapi import FastAPI, File, UploadFile, HTTPException

# 사용하기 
    except Exception as e: 
        raise HTTPException(status_code=500, detail=str
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Docker 101]]></title>
            <link>https://velog.io/@rune_kkk/Docker-101</link>
            <guid>https://velog.io/@rune_kkk/Docker-101</guid>
            <pubDate>Wed, 06 Nov 2024 04:03:54 GMT</pubDate>
            <description><![CDATA[<h2 id="1-용어">1. 용어</h2>
<p><strong>Docker:</strong> 
컨테이너를 사용하여 각각의 프로그램을 분리된 환경에서 실행 및 관리 할 수 있는 툴이다. </p>
<p>사용하는 이유: 독립성과 재현성, 나의 로컬 컴퓨터를 오염시키지 않아도 된다. </p>
<p>*<em>컨테이너: *</em> 
하나의 컴퓨터 환경 내에서 환경이 독립된 여러개의 미니 컴퓨터 환경을 만들게 되는데 그 각각의 미니 컴퓨터 환경을 컨테이너라고 한다. 
    비유1) 마치 윈도우 환경에서 하나에 컴퓨터에 여러 사용자가 사용할 수 있도록 계정이 나뉜 경우, 각각의 사용자 계정은 완전 별도의 환경으로 꾸려지게 된다. 
    비유2) 과거 버추얼머신과 비교하자면 넓은 건물 내부에 진짜 벽을 세워서 방을 나눠 세를 주는 경우의 복잡/어렵/시간비효율과 비교하여, 세입자가 자기만의 작은 컨테이너를 가지고 들어와서 살게되면 벽을 세워야하는 어려움이 사라져서 용이함. </p>
<p>*<em>호스트 컴퓨터: *</em>
여러 컨테이너가 가동되고 있는 마치 내 노트북같은 컴퓨터를 호스트 컴퓨터라고 한다. </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/ccadd9e7-a6be-41bf-b0e1-51c49afa3984/image.png" alt=""></p>
<p>*<em>컨테이너의 독립성: *</em>
    1) 디스크(저장공간)을 각각 가지고 있다. 즉 a컨테이너에서 b컨테이너의 저장파일에 닿을 수 없다
    2) 네트워크도 독립적이라 컨테이너별로 고유한 ip와 포트정보를 가지고 있다. </p>
<p><strong>이미지</strong>
비유) 닌텐도의 게임별 게임 칩
Node.js라는 프로젝트를 이미지로 만들었을 경우, 다른 누군가 이를 docker를 통해 실행시키면 Node.js가 컨테이너 환경에서 <strong>복잡한 설치과정없이</strong> 손쉽게 실행된다. </p>
<p>즉 Node.js에 필요한 다른 곁다리 친구들의 다운로드,설치, 버전맞춤에 필요한 모든 액션들이 이미지에 다 저장되어 있어서, 이 이미지를 실행하면 한큐에 뚝딱! 바로 Node.js를 사용할 수 있게끔 미니 컴퓨터 안에서 셋팅+실행해준다. </p>
<p><strong>dockerhub:</strong>
github처럼 이미지를 저장해 놓고, 공유하고, 이를 다운받을 수 있는 곳
우리는 이미지를 가져올 때 dockerhub에서 올라가 있는 이미지를 다운받게 되는 것이다. </p>
<p>참고) 이미지는 버전을 tag라고 부른다. </p>
<p>도커허브에서는 버전=태그들의 정보와 이미지별 how to use가 적혀있는데
특히 고유한 옵션을 필수로 입력해야만 사용할 수 있는 이미지들이 있어 
이 부분을 반드시 확인하는게 좋다! 
예: mysql이 password 옵션</p>
<p><strong>docker desktop:</strong>
현재 내 컴퓨터의 컨테이너/이미지 상태들을 보여주는 아주 편리한 프로그램!! 보면서 작업하면 좋다. </p>
<p>참고) docker desktop도 docker hub도 각각 한번씩 로그인해줘야한다! </p>
<h2 id="2-명령어들">2. 명령어들</h2>
<h3 id="1-이미지-관련">(1) 이미지 관련</h3>
<p>*<em>docker pull [이미지명] *</em>
    이미지 다운로드 받기 </p>
<p>*<em>docker pull [이미지명]: [버전=태그명] *</em>
    해당 버전의 이미지를 다운받아오기, 각자 다른 버전의 이미지는 서로 다른 파일처럼 별개로 저장되어 다운로드되어진다. 태그를 입력하지 않으면 기본으로 latest 즉 가장 최신의 이미지가 자동으로 다운되느 것. </p>
<p>*<em>docker image ls *</em>
    다운 받아져 있는 이미지들 확인하기
        첫행: 이미지 이름
        TAG: 버전명
        IMAGE ID: 이미지 별로 아이디가 존재한다 (COMMIT ID 처럼)
        CREATED: 제작자가 이 이미지를 만든 날짜 (내가 다운받은 날짜가 아님!) </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/ff09cc35-4d8d-45a7-ba12-32d76063ed16/image.png" alt=""></p>
<p>*<em>docker image rm [IMAGE ID 앞자리 3-4글자/또는 이미지 이름] *</em>
    해당 이미지 삭제하기. 단, 지금 이 이미지를 사용 중인 &#39;중단된&#39; 컨테이너가 있다면 삭제 불가. 
<img src="https://velog.velcdn.com/images/rune_kkk/post/014bfe0f-c66b-4a79-94ec-f45607d58c86/image.png" alt=""></p>
<p><strong>docker image rm -f [IMAGE ID 앞자리 3-4글자]</strong>
    지금 중단된 컨테이너가 사용 중인 이미지 강제로 삭제. 단, 지금 계속 켜져있는 컨테이너의 이미지는 삭제할 수 없다. 이 경우 컨테이너를 중단시키고 이 명령어 사용하기 </p>
<p><strong>docker image rm $(docker images -q)</strong>
    지금 사용중이지 않은 모든 이미지 삭제하기</p>
<p><strong>docker image rm -f $(docker images -q)</strong>
    지금 중지된 컨테이너에서 사용중인 이미지 삭제하기</p>
<h3 id="2-컨테이너-관련">(2) 컨테이너 관련</h3>
<p><strong>docker create [이미지 이름]</strong>
    해당 이미지를 가지고 도커 생성하기 
    만약 다운받지 않은 이미지일지라도 create 명령어를 주면 다운로드가 되면서 동시에 컨테이너를 생성한다 </p>
<p><strong>docker start [컨테이너 ID의 일부]</strong> 
    create는 컨테이너를 만들기만 하고 실행하진 않는다. start를 해줘야 컴퓨터의 전원버튼을 켜는 것. 컴퓨터를 켜면 ps -a 명령어에서 상태가 UP으로 바뀐다.ㅣ </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/5c8ffeb3-aabf-41b4-940d-41643be04f5c/image.png" alt=""></p>
<p><strong>docker run [이미지 이름]</strong>
    도커 create와 start를 합친 기능. 
    사실 pull+creat+start!! 이걸 가장 많이 사용한다! </p>
<hr>
<p><strong>docker ps -a</strong> 
    내 컴퓨터에 떠있는 모든 컨테이너 리스트 (실행, 중단 모두)
    CONTAINER ID : 컨테이너를 식별하는 아이디
    IMAGE: 어떤 이미지가 해당 컨테이너에 열려있는지
    STATUS: 각 컨테이너의 상태 : CREATED / UP / EXTISTED</p>
<p><strong>docker ps</strong>
    현재 실행중인 컨테이너들만 리스트 </p>
<hr>
<p><strong>docker stop [컨테이너 ID의 일부]</strong> 
    해당 컨테이너의 중지 = 컴퓨터를 얌전히 윈도우&gt;시스템 종료 버튼 눌러서 끄는 정상적인/안전하게 방법</p>
<p>참고) 여러개를 한번에 중지하는 방법: 띄어쓰기 넣어서 아이디 여러개 넣기 </p>
<p><strong>docker kill [컨테이너 ID의 일부]</strong> 
     해당 컨테이너의 중지 but 컴퓨터의 전원버튼 오래눌러서 끄는것처럼 비정상적으로 끄는 방법/stop과 다르게 무식하게 끄느라 파일들이 손상될 수 있다. 하지만 컴퓨터가 먹통되었을때는 어쩔 수 없이 써야하는 명령어</p>
<hr>
<p><strong>docker rm [컨테이너 ID의 일부]</strong> 
    중지되어있는 컨테이너 삭제하기! 실행중인 컨테이너를 삭제하려하면 오류창이 뜬다. </p>
<p><strong>docker rm $(docker ps -qa)</strong>
    중지된 모든 컨테이너 한번에 삭제하기 </p>
<p><em>*docker rm -f [컨테이너 ID의 일부]</em>
    실행되고 있는 컨테이너 중시키고 삭제하기  &gt;&gt; 즉 stop+rm로 편리함! </p>
<hr>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/d74bf1b7-3dcf-4f7f-b01d-b4de95457e9a/image.png" alt=""></p>
<p>위의 상태는 <strong>foreground</strong>; 내가 실행시킨 프로그램의 내용이 화면에 실행되고 출력되는 상태 
/ 반대말은** background**; 내가 실행시킨 프로그램이 컴퓨터 내부적으로 실행되는 상태</p>
<p>foreground에서 나가는 방법: <strong>ctrl+c</strong></p>
<p><strong>docker run -d [이미지 이름]</strong>
    백그라운드에서 컨테이너를 만들면서 이미지를 여는 방법 
<strong>docker run -it [이미지 이름]</strong>
    포어그라운드에서 인터렉티브한 환경으로 컨테이너를 만들면서 이미지를 여는 방법</p>
<hr>
<p><strong>docker run --name [원하는 컨테이너 이름] [이미지 이름]</strong>
    컨테이너를 만들때 원하는 이름 붙여서 만들기 
      docker ps를 하면 제일 마지막 행에 이름이 붙여진 걸 알 수 있다. </p>
<hr>
<p><strong>환경변수</strong>
이미지마다 고유한 환경을 구성하는데 입력해줘야하는 변수들이 있을 수 있다.  이러한 것들을 지정해주는 옵션은 -e</p>
<p><strong>docker run -e [환경변수 이름]=[환경변수값] [이미지명]</strong>
(예: mysql의 비밀번호 )
docker run -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql</p>
<p>입력한 환경변수 확인하는 법</p>
<p>1) 해당 컨테이너로 들어가기 
2) **echo $[환경변수이름]</p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/1ca9cebb-248c-4d19-92eb-52dfd1dc3ca0/image.png" alt=""></p>
<hr>
<p><strong>포트맵핑하는 법</strong></p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/5ab9b224-f912-44af-929c-70ba7ba79d91/image.png" alt=""></p>
<p>컨테이너에서 backgound로 만든 내용을 브라우저를 통해 로컬호스트로 불러오기를 할는 방법 : 
ps로 포트 확인하기 &gt; 크롬(가능하면 시크릿 모드(ctrl+shift+n)로) &gt; localhost:[포트번호]</p>
<p><strong>하지만!!! 불러와지지 않는다 왜??
포트맵핑을 하지 않아서!!</strong> 
컨테이너는 독립된 컴퓨터로서 자기만의 port를 가지고있다. 
이 컨테이너만의 port를 내 호스트 컴퓨터의 port와 연결시켜주는 것을 &quot;portmapping&quot;이라고 한다. </p>
<p>포트맵핑을 하면서 컨테이너 만드는 법
<strong>docker run -d -p [호스트포트]:[컨테이너포트] [이미지 이름]</strong>
(예: docker run -d -p 4000:80 nginx)
(더 편리한 예: docker run -d -p 80:80 nginx)
<img src="https://velog.velcdn.com/images/rune_kkk/post/3a71980f-97b7-4b8a-bbed-cdc63687badf/image.png" alt=""></p>
<p>참고) 만약 포트맵핑을 하려했는데 해당 포트가 already in use라고 뜬다면?
상황의 예: 컨테이너로 mysql을 포트매핑하려했는데, 내 호스트 컴퓨터에서 이미 mysql을 열심히 사용중이라 같은 이름의 포트로 연결이 안됨
해결방법: 호스트 컴퓨터의 mysql 강제 종료하기 
<img src="https://velog.velcdn.com/images/rune_kkk/post/cdf74748-9e61-4eb7-aa5b-46dceae51272/image.png" alt=""></p>
<hr>
<p><strong>docker logs [컨테이너 Id 일부]</strong>
도커의 모든 작동기록인 로그들을 보는 방법</p>
<p><strong>docker logs --tail [원하는 숫자] [컨테이너 Id 일부]</strong>
숫자만큼의 가장 최근 로그들만 보기</p>
<p><strong>docker logs -f  [컨테이너 Id 일부]</strong>
실시간 로그 결과 보기 
단 예전 로그들도 다뜨고 난 뒤에 추가된다</p>
<p>(응용) <strong>docker logs --tail 0 -f [컨테이너 Id 일부]</strong>
예전로그들은 안보여주고 지금부터 추가되는 것들만 쌓임</p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/04ca4cf0-a64f-48eb-bb0d-f0166a904e1c/image.png" alt=""></p>
<p>*<em>로그를 언제쓰는가? 디버깅할떄! *</em>
상황 예)run을 했는데 create는 되었지만 start는 안된 컨테이너의 이유를 찾기! = password option is not specified라고 답을 알수있음
<img src="https://velog.velcdn.com/images/rune_kkk/post/e0b74c19-4a05-4abf-91c3-4431f57fdadc/image.png" alt=""></p>
<hr>
<p>*<em>실행중인 컨테이너 내부에 접속하기! *</em></p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/fe308e94-6ad5-4259-b6fe-82f93f75943c/image.png" alt=""></p>
<p><strong>docker exec -it [컨테이너 id] [실행형식]</strong>
예) docker exec -it 500 bash</p>
<p>완전 별개의 객체인 호스트와 컨테이너
우리가 쓰는 터미널은 호스트 컴퓨터의 터미널이다
그 터미널로 컨테이너로 들어가서 컨테이너를 작동시킬 수 있는 코드! </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/3668b5ae-cf76-4ab1-a965-7124d5a6e2d6/image.png" alt=""></p>
<p>위의 커멘드를 입력하면 커멘드 행 앞에 다른 이름이 뜨는 것을 볼 수 있다. 
bash로 들어가면 리눅스 커멘드 ls, cd, cat 등을 자유롭게 쓸 수 있다. </p>
<p>해당 컨테이너에서 나오는 방법: *<em>exit *</em></p>
<hr>
<p><strong>도커 볼륨</strong></p>
<p>도커의 한계:
만약 아래와 같이 할 경우</p>
<p>1) 컨테이너를 만들어서 a이미지를 실행시키고 열심히 작업해서 파일 1을 컨테이너에 생성함
2) 해당 컨테이너를 닫고 삭제함
3) 다음날 같은 a이미지로 컨테이너를 새로 만들어 실행함
결과: 파일 1은 사라져있다!!</p>
<p>왜냐하면 도커로 만드는 컨테이너는 이러한 휘발성=재현성을 목표로 만들어졌으니까</p>
<p>하지만 만약 다시 a이미지를 열었을때 이전 파일들을 다시 가져오고 싶다면?
호스트 저장공간과 컨테이너의 저장공간을 연결지어놓는 <strong>&#39;볼륨&#39;</strong>이라는 명령어를 써놔야함!!</p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/5279bc3d-f450-4bd9-918b-caca81768ea6/image.png" alt=""></p>
<p><strong>docker run -v [호스트의 디렉토리 절대경로]:[컨테이너의 디렉토리 절대경로] [이미지 이름]</strong></p>
<p>즉 이경우, 앞의 경우과 다르게
컨테이너의 작업 디렉토리에서 작업한 결과가 호스트 컴퓨터의 작업디렉토리에 연동되어 저장되고, 이 컨테이너를 삭제해도 호스트 컴퓨터에 작업 결과들이 남아있게 된다. </p>
<p><strong>컨테이너의 디렉토리 절대경로는 이미지마다 다른데</strong>
<strong>도커허브에서 해당 이미지에 대한 세부설명 중 &quot;where to store data&quot; 파트에 있음</strong></p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/e0f1ad9b-cf7f-400d-b116-72251938dd6a/image.png" alt=""></p>
<p><strong>-p로 포트맵핑만 한 경우</strong>
<img src="https://velog.velcdn.com/images/rune_kkk/post/a028563c-1214-4154-8dc5-3be7d145e09e/image.png" alt=""></p>
<p>컨테이너가 돌아가는 동안에는 호스트 컴퓨터의 데이터플랫폼에서 해당 mysql을 열어보면 잘 연결이되지만, 컨테이너를 종료하고 나면 호스트 컴퓨터의 데이터플랫폼에서 해당 mysql이 인식되지 않는다. </p>
<p><strong>-p로 포트맵핑도 하고 볼륨도 한 경우</strong></p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/42d2fa5f-c280-40ce-82bf-d26ec93d6a8b/image.png" alt=""></p>
<p>이 경우 컨테이너를 지웠다가 새로만들면서 이미지를 열면 
이전 컨테이너에서 작업한 파일들이 호스트의 저장공간에 저장되어있었어서 다시활용할 수 있다.  </p>
<p>*<em>주의사항: 호스트컴퓨터의 저장공간과 관련된 각종 환경변수는 처음 컨테이너를 연결했던 때로 유지된다. 만약 컨테이너를 다시 만들어서 들어올때 환경변수를 다르게 해놨다면, 해당 디렉토리를 사용할 수 없거나, 아예 그 프로그램이 안돌아가게 된다. *</em>
이런 경우 기존의 호스트 저장공간 내 디렉토리를 삭제해주거나, 
이미지를 실행시켜서 거기 안에서 환경변수를 바꿔줘야한다. </p>
<hr>
<p>기타 </p>
<p><strong>docker run --rm [이미지이름]</strong>
이 도커를 stop할때 동시에 삭제되도록 하는 것 </p>
<hr>
<p>요약</p>
<blockquote>
<p>용어: 이미지, 컨테이터, 도커, 도커 허브, 도커 데스크탑</p>
</blockquote>
<blockquote>
<p>기본 명령어:
이미지 가져오기
컨테이너 만들기
컨테이너 시작하기
이미지 가져오기+컨테이너 만들기+컨테이너 시작하기
컨테이너 끄기
컨테이너 리스트 확인하기 (실행중인 것만)
컨테이너 리스트 전체보기
이미지 리스트 보기
컨테이너 삭제하기
이미지 삭제하기
컨테이너 로그 확인하기
컨테이너 최근 n개 로그만 확인하기</p>
</blockquote>
<blockquote>
<p>run 명령어 옵션: 
포트맵핑
볼륨
이름 지정
foreground에서 run
background에서 run
종료하면 자동삭제 조건으로 run</p>
</blockquote>
<blockquote>
<p>background로 실행중인 컨테이너에 들어가기
컨테이너에서 나오기</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[MLOPs 101]]></title>
            <link>https://velog.io/@rune_kkk/MLOPs-101</link>
            <guid>https://velog.io/@rune_kkk/MLOPs-101</guid>
            <pubDate>Tue, 05 Nov 2024 16:33:26 GMT</pubDate>
            <description><![CDATA[<h2 id="0-mlops란">0. MLOPs란</h2>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/adf7dafc-c061-42c2-9126-99bb2d89b357/image.png" alt=""></p>
<ol>
<li>문제정의</li>
<li>데이터 가져오기</li>
<li>데이터 탐색 </li>
<li>데이터 가공 </li>
<li>데이터 검증 </li>
<li>데이터 나누기</li>
<li>학습방법 결정 </li>
<li>모델 만들기</li>
<li>모델 검증</li>
<li>대규모 학습</li>
<li>대규모 배포 준비</li>
<li>배포/운영</li>
<li>로깅</li>
<li>모니터링</li>
</ol>
<h3 id="누가">&lt;누가?&gt;</h3>
<p><strong>파란색: 데이터 사이언티스트</strong>
    - 빠르게 실험 반복하기
    - 가장 좋은 툴 찾기
    - 머리 아픈 관리는 최소화하기
    - 대용량 데이터 가공 및 모델 학습
*<em>초록색: 데이터/소프트웨어 엔지니어 *</em>
    - 툴과 플랫폼의 재사용
    - 컴플라이언스
    - 모니터링 및 감사
    - UPTIME 유지하기 (서비스 죽지않고 살아있게 만들기) </p>
<h3 id="devops와-mlops-비교">&lt;DevOps와 MLOPs 비교&gt;</h3>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/a8bd038e-262a-4699-ada7-a62ffa77e4f3/image.png" alt=""></p>
<p><strong>DevOps</strong>
데브옵스의 중요한 대부분의 영역은 &#39;조직문화관리&#39;
but 그외의 플로우는 크게 두 단계
코드를 만드는 단계 &gt; 서비스 형태로 패키징해서 운영하는 단계
그리고 그 과정에서 테스트/모니터링 단계는 3개
부분적으로 만든 유닛코드 테스트 &gt; 전체 코드를 종합적으로 테스트 &gt; 배포후 모니터링 </p>
<p><strong>MLOPs</strong>
데브옵스와 비슷한 구조지만 두가지가 다르다!  </p>
<ol>
<li>한 단계가 추가됨 = 모델 만들기 = <strong>Model Traiding</strong></li>
<li>내가 코드만 만들면 되는 데브옵스와 다르게 <strong>DATA</strong>를 가져와 사용해야해서  만들어지는 단계들이 있다.<ul>
<li>데이터는 크게 두개: 1) 모델을 계속 테스트해보며 만드는 과정에서 가져오는 데이터와 2) 이를 배포해서 사용하는 중에 모이게 되는 현실/진짜/REALTIME 데이터들 </li>
</ul>
</li>
</ol>
<p>공통점은 결국 배포 후 운영하며 모니터링을 통해 다시 원래의 실험단계로 돌아와야한다는 루프를 그려내는 것! </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/dd402745-23bb-491b-a5e1-b41d70760623/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/b654d555-1ff9-4510-8096-7b9fcf97d90d/image.png" alt=""></p>
<h2 id="1문제-정의">1.문제 정의</h2>
<p>머신러닝 프로젝트의 출발점! 
아래의 빈칸들을 채워보기 </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/f8c046d3-26fb-4496-8af9-aa29152922b2/image.png" alt=""></p>
<h2 id="2데이터-준비">2.데이터 준비</h2>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/154053e2-2598-4416-9985-8f928af7d049/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/1ae476d4-950c-4620-8169-5e08c1705b0e/image.png" alt=""></p>
<h3 id="1-데이터-가져오기">(1) 데이터 가져오기</h3>
<h4 id="①-데이터-확보">① 데이터 확보</h4>
<p>어떤 데이터를 어디에서?</p>
<h4 id="②-데이터-수집">② 데이터 수집</h4>
<p>실시간 방식 / 배치 방식?? </p>
<h4 id="③-데이터-연계">③ 데이터 연계</h4>
<p>엑셀이면 VLOOKUP으로 연관된 것들을 묶어서 보거나, 
그림데이터면 연관된 것들끼리 묶어놓거나
텍스트 형태면 모델이 필요료할 형태로 묶기 </p>
<h4 id="④-데이터셋-공유-및-재사용">④ 데이터셋 공유 및 재사용</h4>
<p>데이터를 어디서 가져왔고, 버전별로 어떻게 되어있고, 어떻게 과거에 사용했고, 또 팀원들과 공유할건지... 이에 대해 고민하고 효율화시키는 것이 중요해진다! </p>
<h4 id="⑤-data-drift-감지-및-관리">⑤ DATA DRIFT 감지 및 관리</h4>
<p>데이터의 통계적 특성이 시간이 지나면서 변하는 현상인 DATA DRIFT를 관리해야함</p>
<h3 id="2-데이터-탐색가공">(2) 데이터 탐색/가공</h3>
<h4 id="①-데이터-탐색">① 데이터 탐색</h4>
<p>내가 확보한 데이터가 어떠한 형태인지 확인하기
빠진 값은 없는지, 내가 예상한 분포를 가지고 있는지?
<img src="https://velog.velcdn.com/images/rune_kkk/post/8db7b8bf-f7f5-4cde-b914-c7358f9a8467/image.png" alt=""></p>
<p>데이터들을 다양한 형태로 시각화해보며 탐색하기  </p>
<h4 id="②데이터-가공">②데이터 가공</h4>
<p>①에서 발견된 미흡하거나 특이사항이 있는 부분들은 가공을 통해서 보완/조정하기<br>이부분에 자동화 기술이 들어가기고 합니다. 
(빠진 값 채우기, CLASS 간 균형등 체크포인트들을 만들어서...)</p>
<h4 id="③-데이터-레이블링">③ 데이터 레이블링</h4>
<p>레이블 = 목표값
예를들어 이미지로 동물을 분류하기는 모델을 만든다면
기존 사자와 돌고래 사진에서 &quot;이건 사자&quot; &quot;이부분은 돌고래&quot;라고 레이블을 달아 주는 과정도 본격적인 모델링 전 데이터 가공과정의 일종이다. 
<img src="https://velog.velcdn.com/images/rune_kkk/post/019d2530-8724-4567-9431-1732798639cc/image.png" alt=""></p>
<p>또다른 예: 텍스트로 모델링 할때 사용되는 단어들 중에서 이건 POSITIVE 표현, NEGATIVE 표현... 이렇게 나눠서 라벨링하는 것 
<img src="https://velog.velcdn.com/images/rune_kkk/post/db7f47e9-6000-47e4-8082-0312b37f18e9/image.png" alt=""></p>
<h4 id="④-feature-importance-탐색">④ feature importance 탐색</h4>
<p>데이터의 컬럼 = feature
어떤 컬럼이 내 모델에 더 중요하고, 덜 중요한가?
이건 로컬 지식을 기반으로 한 이성적 판단으로도 갈음할 수 있지만
데이터의 관계성 자체만으로도 판단할 수 있다. </p>
<p>이렇게 어떤 데이터 feature가 더 중요한지 덜 중요한지 판단하는것도 탐색의 한 과정이다. </p>
<h2 id="3-실험학습">3. 실험/학습</h2>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/7b952043-1947-4204-a8a7-1ecfd0ae3aa8/image.png" alt=""></p>
<p>데이터를 가공하는 과정과 밀접하다
데이터가 어떻게 가공되었는지가 모델의 성능을 좌우한다. </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/722b07a7-4b82-48ba-8260-b5118a5785bb/image.png" alt=""></p>
<h4 id="①-모델학습--최적화--비교평가">① 모델학습 / 최적화 / 비교평가</h4>
<p>모델을 만든다는 건 결국 입력을 받아 출력물을 만드는 것. 
어떤 입력조건 = input 환경이 필요한가?
<strong>1. data set
2. training algorithm 
3. hyperparameter values</strong></p>
<p>*<em>이 세가지 중 하나가 변하면 model의 출력값은 변한다. *</em></p>
<p>참고: data set은 데이터 / 알고리즘과 하이퍼파라미터는 코드적 요소이다. </p>
<h4 id="②-실험-추적관리">② 실험 추적관리</h4>
<p>여러 모델은 비교해야하는 ①을 하다보면 이런것들이 궁금해진다.
최근 모델들에서 어떤 알고리즘과 파라미터를 썻더라? 
데이터의 feature 변경은 어떤 영향이 있더라?
지난번에 썼던 스크립트는 어떤 버전이었지?</p>
<p>그래서 필요한게 실험 추적관리!</p>
<ul>
<li>실험실행에 사용한 input 요소들(data set, code...)과 환경(파이썬 패키지 등)을 기록하고</li>
<li>실험 실행으로 출력된 출력물들, 모델의 버전들도 유기적으로 기록되어야한다! </li>
</ul>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/6b192a3d-0dfb-4e99-8ed6-aedc404b7043/image.png" alt=""></p>
<p>중요한건 input과 output이 잘 연계되어 기록관리되어야 한다! 
어떤 input / 어떤 모델 / 어떤 output &gt;&gt; 유기적 관계! </p>
<h4 id="③-자동화된-ml-automated-ml">③ 자동화된 ML (automated ML)</h4>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/6e8c63fb-a014-44b7-a258-9ea7ec794af6/image.png" alt=""></p>
<p>데이터 input을 넣어주면 
자동으로 코드적 input(알고리즘과 데이터전처리 기법 등)에 variation을 주며 
output의 성능을 예측해내 효율성을 올려주는 것</p>
<p>중요한 것은
마냥 랜덤하게 돌리는 것이 아니라 
성능을 높이는 방향을 스스로 찾아서 돌려본다는 점이다!! </p>
<p>모델의 결과값만 보는게 아니라 이를 정량화해서 자동으로 성능지표가 뽑혀 비교분석할 수 있도록 해줘야함. </p>
<h4 id="④-모델의-검증-예측성능처리성능">④ 모델의 검증: 예측성능/처리성능</h4>
<ul>
<li><p>예측성능: 이 모델이 얼마나 실제값을 잘 설명하나</p>
<ul>
<li>개별 모델의 지표들에 따라... </li>
<li>분류나 회귀냐에 따라 기준이 다름</li>
</ul>
</li>
<li><p>처리성능: 실제 서비스로 넘어갔을때 안정적으로 확장에 용이하게 작동하나 </p>
<ul>
<li>어떤 이슈가 있었고 이것이 어떤 로그로 해결되어왔는가</li>
</ul>
</li>
</ul>
<h4 id="⑤-모델해석">⑤ 모델해석</h4>
<p>모델 검증의 한 과정으로 내 모델이 예측을 잘하고 있는지, 왜 이 예측값이 나왔는지, 어디를 보고 중요하게 생각했기에 그 값이 나왔는지를 해석해보는 것. 설사 맞는 예측을 했다 하더라도 그 이유가 나의 상식과 다르다면, 또는 사실과 전혀 다른 이유로 그 결론을 추론했다면 그 모델은 틀린 모델이다. 
예)
<img src="https://velog.velcdn.com/images/rune_kkk/post/61e3930c-7b4e-4b4a-a993-4c9956737dda/image.png" alt=""></p>
<p><strong>모델 해석을 해야하는 이유</strong>는 다양하다. 
&quot;accuracy 지표가 높으면 추론체택!&quot;이라는 자동 로직에 기반한 것이 아니라 그 내용을 들여다보고 사람이 판단할 수 있게 하는것 =  이를 human in the loop라고 한다. 
내 모델이 체택되기 위해서는 모델의 합리성을 증명하기 위해서 모델 해석이 필요하고, 
심지어 비즈니스별로 모델 해석이 의무화되기도 한다: 의료 등 
<img src="https://velog.velcdn.com/images/rune_kkk/post/7ee5f510-b2d2-4575-8bd7-66eebfaff53e/image.png" alt=""></p>
<p>*<em>모델해석 방법 *</em>
글로벌: 내 모델의 전체적인 해석 
로컬: 내 모델의 특정 영역 별 해석 
model specific: 특정 모델에만
model agnostic: 모든 모델에 범용적으로 </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/ee3495a7-725b-4dc8-b2df-dbd9af8f9b84/image.png" alt=""></p>
<p>오른쪽의 리스트들은 다양한 모델 해석 로직, 툴들이다</p>
<p>azure에는 다양한 모델 해석 및 시각화 모델이 탑재되어 있다. 
SHAP: 트리모델에 적합한/딥러닝/커널모델에 적합한 해석 테크닉
MIMIC: 원래 모델이 엄청 복잡한 경우 그것과 비슷하게 행동하는 대체 모델을 만들어 돌려본 후 해석하는 간접적인 방법  </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/6f27e837-3726-4a01-b942-9635ffefb385/image.png" alt=""></p>
<p>특히 로컬과 글로벌 간의 FEATURE IMPORTANCE의 차이 중요함
PERTURBATION탐색 &amp; ICE는 같은 데이터셋에 하나의 FEATURE만 바뀌었을때 어떤 변화가 나오는지 알아보는 해석툴 
(예: 당뇨병 환자A의 모든 요소는 동일한데 나이만 30대에서 60대로 바꾸었을때의 결과값의 변화 등)</p>
<h2 id="4-배포-서빙">4. 배포 서빙</h2>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/6b93d7bc-7362-43d8-b06b-4e8bb8376660/image.png" alt=""></p>
<p>전반부는 데이터 사이언티스트가 데이터와 모델을 만들고 
후반부는, 즉 모델을 서비스화 하는 것은 데이터/소프트웨어 엔지니어에게로 이관</p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/5caa16cc-a430-45e0-8488-5c913fe542fe/image.png" alt=""></p>
<p>가장 중요한 건 컨테이너, 즉 도커를 통해 이미지를 배포한다! 
*<em>ML에서 컨테이너를 선택한 이유 = 재현의 안전성!! *</em></p>
<p><strong>컨테이너에 들어가는 내용</strong></p>
<ol>
<li>모델 등록 : 다양한 모델이 실험되었고 그중 최적의 모델이 체택되면 이걸 서비스화하기 위해 모델을 등록한다</li>
<li>파이썬 패키지 정보 제공: 어떤 파이썬 패키지를 이용해서 예측을 수행할 것인지</li>
<li>추론로직 제공: 어떻게 데이터를 받아오고, 어떻게 가공하고, 어떻게 모델을 활용해서 예측값을 계산해내고, 필요하다면 그 값을 또 어떻게 가공(시각화 등)해서 최종 리턴할 것인지? </li>
</ol>
<p><strong>데이터 드리피트</strong>
모델 성능 파악을 위한 모니터링 방법 중 하나
모델 성능 파악은 결국
모델이 만들어낸 예측값과 실체값이 같은지 확인하는 것. </p>
<p>근데 문제는 실체값은 나~중에 나오니까 예측값을 만드는거라
모델 성능을 바로바로 측정하기 하기 어렵다. 
그래서 사용하는 것이 데이터 트리프트</p>
<p>= 내가 학습할때 썼던 데이터 셋의 패턴과 지금 운영상태에서 들어오고 있는 데이터 셋의 비교! 이 둘의 패턴이 처음엔 같았지만 점점 패턴이 뭉그러진다면... 모델의 성능이 떨어지고 있는 것이라고 간접적으로/미리미리 측정한다. </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/e058e042-dd6f-42b6-baf0-6d5da45ad12d/image.png" alt="">
예시) AZURE의 드리프트 </p>
<p>나의 모델개발 시절의 데이터 셋과 지금 운영중에 수집되는 데이터들의 드리프트 정도가 78%이고 그 가장 큰 피처는 &quot;온도&quot;다. 그리고 만약 이 드리프트가 20%이하로 떨어지면 나에게 알람을 주고, 자동 재학습/재배포 루프를 돌려라 라고 명령을 줄 있음. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[3주차. 개발 환경 - Git, Docker, IDE]]></title>
            <link>https://velog.io/@rune_kkk/3%EC%A3%BC%EC%B0%A8.-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-Git-Docker-IDE</link>
            <guid>https://velog.io/@rune_kkk/3%EC%A3%BC%EC%B0%A8.-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-Git-Docker-IDE</guid>
            <pubDate>Wed, 23 Oct 2024 14:07:42 GMT</pubDate>
            <description><![CDATA[<h3 id="1-git-이어서">1. git 이어서</h3>
<p>1) 실습 : 이상적 상황은 서로 구분된 영역을 분배받아서 일을 하면 된다. </p>
<h3 id="2ide-visual-studio-code">2.IDE: VISUAL STUDIO CODE</h3>
<p>항상 작업하고 싶은 폴더를 켜줘야한다 주로 그것은 깃 폴더로 하는 편.
모든 작업들이 폴더를 단위로 이루어지는 편</p>
<p>확장 툴이 많아서 인기가 많음</p>
<p>오늘쪽 상단에 다양한 창들 켜고 닫고할 수 있는 ui</p>
<p>로컬과 리모트</p>
<p>docker: </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Commit 다루기 ]]></title>
            <link>https://velog.io/@rune_kkk/Commit-%EB%8B%A4%EB%A3%A8%EA%B8%B0</link>
            <guid>https://velog.io/@rune_kkk/Commit-%EB%8B%A4%EB%A3%A8%EA%B8%B0</guid>
            <pubDate>Tue, 22 Oct 2024 15:43:23 GMT</pubDate>
            <description><![CDATA[<h3 id="1-커밋과-관련된-코드들">1. 커밋과 관련된 코드들</h3>
<p>1) <strong>git log</strong>
해당 레포지토리에서 이때까지 한 커밋들의 과정, 즉 커밋 히스토리를 불러올 수 있다. </p>
<p>최신것 부터 오래된 것 순으로 나열된다</p>
<p>각 커밋들의 내용은 아래와 같이 표시된다. 
커밋 아이디 // 수정한 사람 // 수정날짜 // 커밋이 입력한 -m의 메모 
<img src="https://velog.velcdn.com/images/rune_kkk/post/d1764acf-ce13-465c-989e-87d43a22b575/image.png" alt=""></p>
<p>이 로그 창에서 나오려면 <strong>q + 엔터</strong></p>
<p>이 로그를 한줄씩 간결하게 보고싶으면 
<strong>git log --pretty=oneline</strong> 
<img src="https://velog.velcdn.com/images/rune_kkk/post/2c419b6e-d347-425d-9c65-1be48e1e9904/image.png" alt=""></p>
<p>2) <strong>git show [커밋아이디 또는 커밋아이디의 첫 네자리]</strong>
해당 커밋에서 구체적으로 무엇이 바뀌었는지 자세하게 볼 수 있다. </p>
<p>빨간색 - 뒤에 적힌 내용은 커밋 전 내용
초록색 + 뒤의 내용은 커밋 후 바뀐 내용 </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/9f84ef70-e989-4849-871c-5c5df758b665/image.png" alt=""></p>
<p>3) <strong>git commit</strong> -m 옵션 없이, 더 자세한 설명으로 커밋하기
-m없이 커밋을 하면 vim(리눅스의 기본 문서파일)이 실행되며 해당 커밋에 대한 보다 상세한 설명을 넣을 수 있게 해준다.
아래의 사진은 아직 vim에 아무것도 넣지 않은 상태의 첫 화면 
<img src="https://velog.velcdn.com/images/rune_kkk/post/12654179-0a24-41c8-9327-2e9a1f071f70/image.png" alt=""></p>
<p><strong>&lt;vim 사용법&gt; **
<img src="https://velog.velcdn.com/images/rune_kkk/post/e07fd34c-959d-4f17-8eb9-dd5110facaeb/image.png" alt="">
*<em>텍스트 입력: 입력 모드(i) → 텍스트 입력 → 다른 상태로 가고 싶으면 ESC *</em>
텍스트 한 줄 복사: 일반 모드 → 복사하고 싶은 줄에 커서 위치 → yy
텍스트 한 줄 잘라내기: 일반 모드 → 잘라내고 싶은 줄에 커서 위치 → dd
특정 영역 복사: 비주얼 모드(V는 줄 단위, v는 글자 단위) → 복사하고 싶은 영역 커서로 설정 → y
특정 영역 잘라내기: 비주얼 모드(V는 줄 단위, v는 글자 단위) → 잘라내고 싶은 영역 커서로 설정 → d
텍스트 붙여넣기: 일반 모드 → 붙여넣고 싶은 위치에 커서 위치 → p
**파일 저장: 명령 모드(:) → w + enter</strong>
<strong>파일 저장 + vim 종료: 명령 모드(:) → wq + enter</strong>
vim 종료 (내용 저장되지 않음): 명령 모드(:) → q! + enter</p>
<p>vim을 종료하고 끝내면 아래의 화면이 나오며 잘 commit이 된다. 궁금하면 git log로 확인하기 </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/a3cbf8b6-28ab-4680-a0ff-ff8b166b8861/image.png" alt=""></p>
<p>4) <strong>git commit --amend</strong>
최신 커밋 수정하기! 
당근 그 전에 git add . 해줘야함</p>
<p>git commit --amend하면 vim이뜨고 그때 적은 코멘트가 뜨는데 이것도 같이 바꿀 수 있다. </p>
<p>이렇게 바꾸면, 커밋아이디가 바뀐다!!</p>
<p>5) <strong>git diff [예전 커밋 아이디 앞 4글자] [최근 커밋 아이디 앞 4글자]</strong>
두 커밋 사이의 변화를 알아보는 커멘드다. </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/8e0fbbd7-d9c5-4d50-88a0-2aab67b4c50b/image.png" alt=""></p>
<h3 id="2-커밋-메시지-작성-가이드라인">2. 커밋 메시지 작성 가이드라인</h3>
<p>개인 프로젝트의 경우에는 커밋 메시지를 어떻게 작성하든 큰 상관이 없을 수 있지만, 회사에서 여러 명이 참여하는 프로젝트의 경우에는 이 커밋 메시지가 아주 중요합니다. 그래서 커밋 메시지를 어떻게 작성해야하는지에 대한 규칙이 정해져있는 경우가 많은데요.</p>
<p>그 규칙들은 회사마다 전부 다르겠죠? 그래도 커밋 메시지를 어떻게 작성하면 좋은지에 대한 일반론적인 가이드라인은 있습니다</p>
<p>(1) 커밋 메시지의 제목과 상세 설명 사이에는 한 줄을 비워두세요.
(2) 커밋 메시지의 제목 뒤에 온점(.)을 붙이지 마세요.
(3) 커밋 메시지의 제목의 첫 번째 알파벳은 대문자로 작성하세요.
(4) 커밋 메시지의 제목은 명령조로 작성하세요.
    Fix it (O),  Fixed it, Fixes it(X)
(5) 커밋의 상세 내용에는 이런 걸 적으면 좋습니다.
    왜 커밋을 했는지
    어떤 문제가 있었고
    적용한 해결책이 어떤 효과를 가지는지
 (6) 다른 사람들이 자신의 코드를 바로 이해할 수 있다고 가정하지 말고 최대한 친절하게 작성하세요.</p>
<h3 id="3-커밋-생성-가이드라인-가이드라인">3. 커밋 생성 가이드라인 가이드라인</h3>
<p> (1) <strong>하나의 커밋에는 하나의 수정사항, 하나의 이슈(issue)를 해결한 내용만 남기도록 하세요.</strong> 다양하게 수정을 하고나서 하나의 커밋으로 남기는 것은 좋지 않습니다. 하나의 커밋이 하나의 사실만을 갖고 있어야 나중에 이해하기 쉽습니다.</p>
<p> 어느 정도의 수정사항을 하나의 단위로 볼 것인지는 상황에 따라 조금씩 다를 수 있습니다. 회사의 규칙에 따라 다를 수도 있구요. 어찌 됐든 너무 많은 작업의 결과를 하나의 커밋으로 담지 않아야겠다는 생각을 하면서 커밋을 해야합니다.</p>
<p> (2) 현재 프로젝트 디렉토리의 상태가 그 내부의 전체 코드를 실행했을 때 에러가 발생하지 않는 상태인 경우에만 커밋을 하도록 하세요. 나중에 동료 개발자가 특정 커밋의 코드로 실행했을 때 에러가 발생한다면 혼란을 줄 수 있습니다.
 *<em>즉 커밋으로 보관된 특정 시점의 전체 코드는 항상 문제없이 실행되는 상태여야 합니다. 
*</em></p>
<h3 id="4-alias-긴-커멘들-줄이기">4. ALIAS: 긴 커멘들 줄이기</h3>
<p>Git에는 길이가 긴 경우의 커맨드 전체에 별명을 붙여서 그 별명을 사용할 수 있도록 해주는 기능이 있습니다.
이 때 붙이는 별명을 alias라고 하고, 별명을 붙이는 행위를 aliasing이라고 합니다.</p>
<p><strong>git config alias.[줄여서 쓰고싶은 말] &#39;[원래 긴 커멘드]&#39;</strong></p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/a7459ac4-fd19-4ea5-b0d9-724ae2b3b254/image.png" alt=""></p>
<h3 id="5-head와-get-reset">5. HEAD와 get reset</h3>
<p><strong>1) HEAD</strong>
위의 git history를 하면 나오는 HEAD</p>
<p>HEAD는 어떤 커밋을 가리키는 존재로, 주로 보통 가장 최근에 한 커밋을 가리키지만 안그럴 때도 있다. **지금 working directory에 보이는 구성은 주로 HEAD가 가리키는 커밋에 따라 구성되게 된다. (꼭 그렇지는 않다) 그레서 HEAD에 해당하는 커밋을 다른 시점의 커밋으로 바꾸면, working directory의 구성도 달라진다. </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/0f3cce70-68aa-49ef-81bf-715367c09581/image.png" alt=""></p>
<p><strong>2) get reset</strong>
그럼 과거의 커밋으로 HEAD를 옮기는 방법은?
*<em>get reset --hard [돌아가고 싶은 커밋 아이디 4자리]
*</em> : 이걸 사용하면 head의 위치가 바뀌며 working directory도 같이 바뀐다. 하지만 --hard는 과거의 모든 기록을 없애버리는 거라서 권장하지 않는다.이 외에도 2가지 reset 옵션. 
<img src="https://velog.velcdn.com/images/rune_kkk/post/31b05351-cbe2-417a-9a95-1a2e41b71d76/image.png" alt="">
<img src="https://velog.velcdn.com/images/rune_kkk/post/7b0f7451-f286-416a-865a-2d4b8ee58638/image.png" alt="">
<img src="https://velog.velcdn.com/images/rune_kkk/post/b99342aa-b9d6-42bc-bbd5-d8f500583680/image.png" alt=""></p>
<pre><code>    참고) staging area 확인하는 방법 : **git status**
    참고) staging area에 있던 것들은 커밋을 하더라도 계속 남아있다. </code></pre><p><strong>get reset --soft [커밋아이디]</strong> 
    - git history하면 head의 위치는 변해있지만 
    - cat이나 ls로 확인하면 working directory는 reset 전과 같다. 
    - 그리고 git status로 보면 내가 reset하기 전에 수정한 파일/디렉토리말고 다른 파일/디렉토리들도 commit된 파일/디렉토리로서 <strong>초록색</strong>으로 뜬다.  이건 오래된 커밋 기록(커밋때 마다 어떤 것이 staging에 있었나)이 남아있기 때문인데, reset 전 커밋과 현재 head가 되어있는 커밋 간의 모든 차이가 commit 된 파일리스트에 보이게 된 것이다. </p>
<p><strong>get reset --mixed [커밋아이디]</strong>
    - git history하면 head의 위치는 변해있고
    - cat이나 ls로 확인하면 working directory는 reset 전과 같다. 
    - 하지만 git status로 보면 내가 reset하기 전에 수정한 파일/디렉토리와 head와 다른 최신의 파일/디렉토리들도 모두 commit이 되지 않아 <strong>붉은색</strong> 글자로 뜬다.  이는 mixed를 하면 staging area도 같이 바뀌면서 옛~날에 지금 head를 commit했던 그 시점의 staging area의 상태로 돌아간 것이라 아무것도 staging이 안된 상태로 대체된 것이다. </p>
<p><strong>3) get reset한 거 되돌리기 = 즉 가장 최신 파일로 돌아가기</strong>
만약 git hub에 최신 파일을 push해두었다면
git pull로 그 내용을 가져오면 
working - staging - repository 모두 다 최신 파일로 가져오게 됨! </p>
<p>**4) HEAD를 기준으로 git reset하기</p>
<p>git reset [옵션] [커밋 아이디]
위의 방법은 커밋 아이디를 일일이 알아야한다는 번거로움이 있음</p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/001245a1-bbe5-432e-a726-548c2881f1f2/image.png" alt=""></p>
<p>위와 같이 현재 HEAD가 6커밋에 있는 경우에서</p>
<ul>
<li>git reset --hard HEAD^  : 하나 이전 버전 즉, 5로 reset</li>
<li>git reset --hard HEAD~2 : 2개 이전 즉, 3번으로 리셋
...</li>
</ul>
<h3 id="6-tag달기">6. tag달기</h3>
<p>커밋 메세지 말고도 좀 더 중요한 의미가 있는 커밋들에게 태그를 달 수 있다. 
예를들어 commit 1-3은 버전 1, 4부터는 버전 2일때
각 버전의 시작 커밋인 commit 1과 4에게 version 1, 2라고 태그를 달아주는 식이다. </p>
<p>이를 위한 방법</p>
<ul>
<li>태그 넣기: git tag [태그 이름] [커밋 아이디]</li>
<li>디렉토리 내 모든 태그 보기: git tag</li>
<li>해당 태그가 붙은 commit 자세히 보기 : git show [태그 이름]</li>
</ul>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/d24a99d8-fe6d-44e4-beb8-c872d4d1cc66/image.png" alt=""></p>
<h3 id="정리">[정리]</h3>
<p>git log : 커밋 히스토리를 출력</p>
<p>git log --pretty=oneline : --pretty 옵션을 사용하면 커밋 히스토리를 다양한 방식으로 출력할 수 있습니다. --pretty 옵션에 oneline이라는 값을 주면 커밋 하나당 한 줄씩 출력해줍니다. --pretty 옵션에 대해 더 자세히 알고싶으면 이 링크를 참고하세요.</p>
<p>git show [커밋 아이디] : 특정 커밋에서 어떤 변경사항이 있었는지 확인</p>
<p>git commit --amend : 최신 커밋을 다시 수정해서 새로운 커밋으로 만듦</p>
<p>git config alias.[별명] [커맨드] : 길이가 긴 커맨드에 별명을 붙여서 이후로 별명으로 해당 커맨드를 실행할 수 있도록 설정</p>
<p>git diff [커밋 A의 아이디] [커밋 B의 아이디] : 두 커밋 간의 차이 비교</p>
<p>git reset [옵션] [커밋 아이디] : 옵션에 따라 하는 작업이 달라짐(옵션을 생략하면 --mixed 옵션이 적용됨)</p>
<p>(1) HEAD가 특정 커밋을 가리키도록 이동시킴(--soft는 여기까지 수행)</p>
<p>(2) staging area도 특정 커밋처럼 리셋(--mixed는 여기까지 수행)</p>
<p>(3) working directory도 특정 커밋처럼 리셋(--hard는 여기까지 수행)</p>
<p>그리고 이때 커밋 아이디 대신 HEAD의 위치를 기준으로 한 표기법(예 : HEAD^, HEAD~3)을 사용해도 됨</p>
<p>git tag [태그 이름] [커밋 아이디] : 특정 커밋에 태그를 붙임</p>
<p>이번 레슨은 어땠나요?</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git Hub]]></title>
            <link>https://velog.io/@rune_kkk/Git-Hub</link>
            <guid>https://velog.io/@rune_kkk/Git-Hub</guid>
            <pubDate>Mon, 21 Oct 2024 15:53:35 GMT</pubDate>
            <description><![CDATA[<h3 id="1-git-hub란">1. Git Hub란?</h3>
<p>로컬의 레포지토리를 가상의 컴퓨터에 올려서 버전관리와 작업이 가능하게 해주는 다양한 프로그램들 중 가장 유명한 프로그램! </p>
<p>용어구분: 원격/리모트 레포지토리 &lt;&gt; 로컬 레포지토리 
<img src="https://velog.velcdn.com/images/rune_kkk/post/afa16cb8-213c-4f7a-8b55-8fb8999a61a4/image.png" alt=""></p>
<h3 id="2-github-시작하기">2. GitHub 시작하기</h3>
<h4 id="1-새로운-레포지토리-만들기">1) 새로운 레포지토리 만들기</h4>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/23397ff4-f055-4ba8-b5d0-3676a37147d0/image.png" alt=""></p>
<h4 id="2-프로젝트-이름-설명-권한설정-등-후-create">2) 프로젝트 이름, 설명, 권한설정 등 후 create</h4>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/f310ae92-0ae3-4223-9980-5e327fcf7d57/image.png" alt=""></p>
<h4 id="3-해야하는-작업에-맞춰-터미널에-복붙">3) 해야하는 작업에 맞춰 터미널에 복붙!</h4>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/e2d40bf6-269f-476b-8636-0045ec592315/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/8cd93638-c1e3-4d9e-9b3c-69f77437e428/image.png" alt=""></p>
<pre><code>    참고) 만약 처음에 연결하는 레포지토리를 잘못 넣었다면? git remote remove origin 코멘드로 연결 끊고 다시하기!! </code></pre><h4 id="4-깃허브-새로고침하면-화면-뙇">4) 깃허브 새로고침하면 화면 뙇</h4>
<h3 id="3-깃허브-화면-이해하기">3. 깃허브 화면 이해하기</h3>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/faf9aaee-3713-4971-b20a-2f3734ca2cdf/image.png" alt=""></p>
<p>1) 내 레파지토리의 파일들이 보인다 &gt; 클릭하면 실제 현재 내용 볼 수 있음
<img src="https://velog.velcdn.com/images/rune_kkk/post/f66309cb-fa26-4ace-90e8-68a8de1b6bbd/image.png" alt=""></p>
<p>2) 아래의 각 파일의 내용이 보이는데 그 옆의 펜모양을 누르면 이를 리모트에서 바로 수정할 수 있음</p>
<p>3) <strong>(숫자) Commits</strong>를 클릭하면 그동안의 Commits들의 기록, 일시, 남긴 메모가 보인다 &gt; 클릭하면 어떤 것을 수정/추가/삭제했는지가 보인다. +는 추가한 내용, -는 삭제한 내용이다.  협업자가 코멘트를 남길 수 있게 해두었다. 
<img src="https://velog.velcdn.com/images/rune_kkk/post/a2bb3035-3b16-48bf-9ed1-026c9f209eeb/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/dccc88d9-aeea-43ac-a52d-f390cd646f52/image.png" alt=""></p>
<h3 id="4-로컬에서-바뀐-내용을-리모트에-올리기">4. 로컬에서 바뀐 내용을 리모트에 올리기</h3>
<p>git hub에 연결된 로컬의 레포지토리에서 </p>
<p>git add .
git commit -m &quot;  &quot;
로 커밋을 한 번 한 후에</p>
<p><strong>git push</strong>
를 하면 git hub에 새로 commit된 내용이 반영된다 </p>
<h3 id="5-리모트에서-바뀐-내용-로컬에-가져오기">5. 리모트에서 바뀐 내용 로컬에 가져오기</h3>
<p>깃허브에서 연필모양을 클릭해 파일을 바로 수정한후 change commits을 했다면, 깃허브에 commits의 숫자가 늘어난 것을 볼 수 있다.</p>
<p>또는 리모트 레포지토리가 다른 협업자의 commit&amp;merge로 인해 업데이트가 될 수있다. </p>
<p>더 뒤처지게 된 로컬 레포지토리오 리모트의 것을 가져오는 것은
*<em>git pull *</em></p>
<h3 id="6-내-리모트-레포지토리에-다른-사람-초대하기">6. 내 리모트 레포지토리에 다른 사람 초대하기</h3>
<p>원칙적으로 자신의 리모트 레포지토리에는 자신만 git push를 할 수 있다. </p>
<p>만약 다른 사용자도 git push를 할 수 있게 해주려면 그 사용자를 해당 리모트 레포지토리의 collaborator로 지정하면 된다.</p>
<p>git hub &gt; setting &gt; collaborators &gt; 비번확인 &gt; add people</p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/02338632-878d-43f3-8bf0-aa2c8b065004/image.png" alt=""></p>
<h3 id="7-다른-프로젝트-가져오기">7. 다른 프로젝트 가져오기</h3>
<p>1) github &gt; 좌측 메뉴 &gt; explore에서 다양한 다른 사람들이 만든 레포지토리들을 볼 수 있고, 검색할 수 있다.  (예: NumPy)
2) 맘에 드는 레포지토리를 클릭, code 버튼을 누르면 나오는 주소 복사! 
<img src="https://velog.velcdn.com/images/rune_kkk/post/4266c816-4dee-4d9e-883f-5845f8c7fc41/image.png" alt=""></p>
<p>(여기서 주의! 기존 내가 git hub와 연동해서 작업하던 레포지토리에서 나와서 다른 디렉토리에서 새로운 클론을 가져와야한다! 아니면 기존 레포지토리가 망가진다!! ) </p>
<p>3) *<em>git clone [복사한 주소] *</em>
제대로 작동되었다면, 해당 레포지토리가 만들어지며 그 안에 git hub에서 본 파일들이 모두 가져와진 것을 알 수 있다. </p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/c57f7391-04fd-48e7-9076-149e4c2a972e/image.png" alt=""></p>
<h3 id="8-readmemd-꾸미기">8. README.md 꾸미기</h3>
<p>보통 README.md 파일에는</p>
<p>1) 이 프로젝트가 어떤 프로젝트인지 설명하거나
2) 프로그램의 주요 사용법을 알려주거나
3) 프로그램을 실행시키려면 어떤 사전 작업이 필요한지를 알려주는
내용들이 적혀있다. </p>
<p>GitHub에서는 README.md 파일을 프로젝트의 메인 화면에 보여주기 때문에 README.md 파일의 내용을 가독성있게 작성하는 것이 중요하다. </p>
<p>확장자 md는 markdown이라는 단어의 줄임말이다. markdown은 이 파일에 마크다운으로 내용을 작성할 수 있다는 걸 나타낸다. 마크다운이란 특정 규칙에 맞게, 간단한 텍스트만으로 어떤 표시를 해두면, 그것이 자동으로 HTML 태그로 전환되도록 약속된 문법이다. </p>
<p>이를 예쁘게 만드는 규칙은 velog의 규칙과 동일하다!! 샵으로 크기 키우기, 별로 볼드 넣기 등등. </p>
<h3 id="정리">&lt;정리!!&gt;</h3>
<ul>
<li><strong>git push -u origin master</strong> : 로컬 레포지토리의 내용을 처음으로 리모트 레포지토리에 올릴 때 사용합니다.(-u origin master가 무슨 뜻인지는 &#39;Git에서 브랜치 사용하기&#39; 챕터에서 배울 거니까 걱정마세요!)</li>
<li><strong>git push</strong> : 로컬 레포지토리의 내용을 리모트 레포지토리에 보내기</li>
<li><strong>git pull</strong> : 리모트 레포지토리의 내용을 로컬 레포지토리로 가져오기</li>
<li>*<em>git clone [프로젝트의 GitHub 상 주소] *</em> : GitHub에 있는 프로젝트를 내 컴퓨터로 가져오기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2주차. 개발환경 - Git, Docker, IDE]]></title>
            <link>https://velog.io/@rune_kkk/2%EC%A3%BC%EC%B0%A8.-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-Git-Docker-IDE</link>
            <guid>https://velog.io/@rune_kkk/2%EC%A3%BC%EC%B0%A8.-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-Git-Docker-IDE</guid>
            <pubDate>Wed, 16 Oct 2024 08:33:28 GMT</pubDate>
            <description><![CDATA[<p>오늘은 lama를 로컬에서 사용해보기, jupitor를 사용해보기 </p>
<p>깃의 정체성, 목적, 가치관을 이해해야 올바르게 쓸 수 있다</p>
<ol>
<li>CRUD 정보처리의 4가지 기능
CREAT 만들기
READ 읽기
UPDATE 수정하게
DELETE 삭제하기</li>
</ol>
<p>여기서 GIT은 수정과 삭제를 일반적인 다른 프로그램과 다르게 처리한다</p>
<ol start="2">
<li><p>이상적인 정보관리 방법 : 치킨이 늦게오게 된 경위를 따지기 위해서는 주문부터 배달도착까지 모든 사건사건마다 다 기록을 남겨야 오해없이 상황을 파악할 수 있다. </p>
</li>
<li><p>GIT
COMMIT: 정보의 단위이자 정보를 생성하는 행위 (아래의 
 예) 주문을 받았다, 조리를 시작했다, 배달기사 호출, 조리 끝, 배달기사 출발...
BRANCH : COMMIT 정보들을 선으로 연결한 것</p>
</li>
</ol>
<p>GIT의 매인은 <strong>기록+협업</strong></p>
<p>협업시 하나의 프로젝트 일을 여러명에게 분배해주면 이렇게 BRANCH가 갈라지고 나중에 합쳐진다. 그중 메인은 MASTER BRANCH 또는 MAIN BRANCH라고 부른다. 
<img src="https://velog.velcdn.com/images/rune_kkk/post/b6554660-24c7-4370-93ef-e4e24c6cdc80/image.png" alt=""></p>
<p>이때 합치는 과정이 복잡하다. 
주로 MASTER BRANCH는 리뷰가 다다다 끝난 코드만 얹는 것을 권장한다. </p>
<p>가지는 주로 업무별로 갈라진다. </p>
<p>BRANCH는 오래 붙잡고 있으면 안된다. 내가 뜯어온 MASTER 버전이 다른 협업자가 MERGE하며 빠르게 구버전이 되므로.... 그래서 코딩은 빠르게 작업해서 빠르게 MERGE해야한다. </p>
<ol>
<li>Repository 생성</li>
<li>git hub에서 초대하기, 초대받기 </li>
<li>Cloning하기 : git clone (초대받은 git hub의 주소)
 서버에 있는 것을 내 컴퓨터에서 하는 것. 즉 파일 다운받기 
 로컬(내컴퓨터)과 서버에 있는 것(리모트)을 잘 구분해야한다! 
<img src="https://velog.velcdn.com/images/rune_kkk/post/08cffa42-0d08-4e80-a8ab-02d9f23f0455/image.png" alt=""></li>
</ol>
<ol start="4">
<li><p>확인하기 
git status : 마지막 commit 기준으로 뭐가 바뀌었는지 나온다.
git diff : 더 자세한 변경사항을 알려준다. </p>
</li>
<li><p>git add하기 
git add . 다 넣기!</p>
</li>
<li><p>git commit -m &quot;  &quot;</p>
</li>
<li><p>git branch ??</p>
</li>
<li><p>git pull 
동료들이 수정한 master의 최신버전을 내 로컬로 가져오기  </p>
</li>
</ol>
<p>branch 만드는 방법
    1) git check out
    2) git switch -c (이름)</p>
<p>카톡 만들기 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git]]></title>
            <link>https://velog.io/@rune_kkk/Git</link>
            <guid>https://velog.io/@rune_kkk/Git</guid>
            <pubDate>Tue, 15 Oct 2024 20:20:03 GMT</pubDate>
            <description><![CDATA[<h2 id="1-git이란">1. Git이란?</h2>
<p>1) Git은 <strong>버전관리와 동시협업</strong>을 가능하게 해주는 툴이다. 
2) Git의 역사
만든사람:  리누스 토발즈(Linus Torvalds) =  리눅스(Linux)라고 하는 운영 체제를 만든 사람
만든 목적: 빠른 속도, 단순한 디자인, 비선형적 개발 지원(수천개의 브랜치 병행 가능), 완전 분산형 시스템, 거대 프로젝트도 속도저하 문제 없음</p>
<p>3) Github란?
원격저장소 = 외부의 컴퓨터를 대신 만들어주는 서비스 
<strong>내 컴퓨터가 아닌 Github에 나의 git 버전들을 백업</strong>해두는 곳. 
즉, 다른 컴퓨터에서도 사용할 수 있게 해주고, 내 컴퓨터에 이상이 생겨도 문제없게 만들어주며, 또 <strong>다른 사람과 협업이 가능</strong>하게 해줌! 
Git과 Github는 다름! </p>
<p>4) Git 다운로드 : <a href="https://git-scm.com/">https://git-scm.com/</a></p>
<p>참고)  Git Bash = GWindows에서도 유닉스 커맨드를 사용할 수 있도록 해주는 프로그램. 
<img src="https://velog.velcdn.com/images/rune_kkk/post/b08676e4-7f16-4a20-8f0a-9a1db11274a4/image.png" alt="">
Git Bash를 사용할땐 원하는 폴더에 들어가 오른쪽 클릭해서 Git Bash 열면 해당 폴더 위치에서 실행됨 
<img src="https://velog.velcdn.com/images/rune_kkk/post/03dc8ab7-a5b1-4383-89f9-e759e3f2c83e/image.png" alt=""></p>
<h2 id="2-git-써보기">2. Git 써보기</h2>
<p><strong>1) 커밋과 레포지토리</strong>
Commit 커밋 = 프로젝트 디렉토리의 특정 모습을 하나의 버전으로 남기는 행위와 그 각각이 버전을 부르는 것</p>
<p>Repository 레포지토리 = 커밋이 저장되는 곳. Git이 원하는 프로젝트의 시점마다 프로젝트 디렉토리의 구성요소의 모습과 변경사항에 대한 설명을 저장하는 곳.</p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/364b8d73-7432-44e2-be94-b1dc96279bd4/image.png" alt="">
<img src="https://velog.velcdn.com/images/rune_kkk/post/075f6e8d-03a4-40ce-85d3-8149007e9b0a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/ec05b459-88e9-4c28-beed-41d66115562c/image.png" alt=""></p>
<p><strong>2) git의 3가지 영역</strong></p>
<ul>
<li>working directory: 진짜 작업을 하는 로컬, 내 컴퓨터의 영역</li>
<li>staging area: git add로 working directory에서 &#39;선별&#39;된 git에 올라갈 요소. 만약 staging area가 없다면 원하는 것들만 선별적으로 커밋에 반영할 수 없게 됩니다.   </li>
<li>repository: 최종적으로 변동 이력, 커밋들이 저장되는 곳 </li>
</ul>
<p><strong>3) git 해보기</strong>
    1. 프로젝트 디렉토리 만들기
    2. <strong>- git init =</strong> 레포지토리 만들기
<img src="https://velog.velcdn.com/images/rune_kkk/post/90bb99f1-97cb-47ae-9569-7b303eb5287a/image.png" alt="">
    3. (최초에 한번만 하면 됨) 내가 누군지 정보 알려주기 : 
                            git config user.name &quot; &quot; 
                              git config user.email &quot;  &quot;
                            <img src="https://velog.velcdn.com/images/rune_kkk/post/b05e731c-ad11-459f-8bcc-5c686236f62e/image.png" alt="">
    4. add 하기: 커밋할 파일 지정해주기(add 하기 = staging are로 넣기): 
            <strong>git add (파일이름)</strong>
            <strong>git add .</strong>  &gt;&gt; 현재 디렉토리 내에 변경사항이 있는 모든 파일들을 add하기
    5. 확인하기 : <strong>git status</strong>, 상단에는 add가 된 변동사항이, 하단에는 변동은 있었지만 stage are에 들어가지 않은 사항이 나온다. 어떤 것을 add했고 안했는지 꼭 확인하고 commit하기!! 
          <img src="https://velog.velcdn.com/images/rune_kkk/post/6b477a8a-bc4c-4782-9ff9-a49d49965e46/image.png" alt="">
          <img src="https://velog.velcdn.com/images/rune_kkk/post/8439e838-a49b-4ecd-b2c6-5286b316c7cf/image.png" alt="">
          <img src="https://velog.velcdn.com/images/rune_kkk/post/c5c1a62b-a8ed-42e3-afe5-73ac27919443/image.png" alt=""></p>
<ol start="6">
<li>커밋하면서 커밋메시지 남기기 : <strong>git commit -m &quot;메시지 내용&quot;</strong><pre><code>                     ![](https://velog.velcdn.com/images/rune_kkk/post/e8aa03ef-ddc1-49c7-8c8c-208f2cbee8d3/image.png)</code></pre></li>
</ol>
<p><strong>4) git의 4가지 상태</strong>
파일들은 아래의 2가지 상태를 가지고, tracked는 또 3가지 상태로 구분된다. 
    - <strong>untracked :</strong> 추적되지 않고 있다는 뜻으로, 파일 생성 이후 한번도 git add를 안해주면 이 상태. 
    - <strong>tracke ** 
        -- **staged</strong> : 수정 후 add가 되어 staging are에 올라와있는 상태
        -- <strong>unmodified</strong> : 최신 커밋의 모습과 비교했을 때 바뀐게 없는 상태. 커밋 직후 working directory 안의 모든 파일이 이상태임 
        -- *<em>modified *</em> : 최신 커밋과 비교했을 때 바뀐내용이 있는 상태</p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/4503b8d0-3e63-43c8-9115-3af1ee03909f/image.png" alt=""></p>
<p><strong>5) git add 취소하기</strong>
<strong>git reset 파일이름</strong>
staging area에서 파일을 제거, 하지만 변경된 새모습은 그대로 working directory에 남아있음!</p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/4df3d6e3-dca4-4899-ad1b-eb47e21f810b/image.png" alt=""></p>
<p><strong>6) git의 커멘드 사용법 알아보기</strong>
<strong>git help 커멘드이름</strong></p>
<p>txt 파일이 열리며 자세한 설명을 볼 수 있다. 
<img src="https://velog.velcdn.com/images/rune_kkk/post/36d26c79-07a1-443b-853d-22aee1c58879/image.png" alt=""></p>
<h3 id="정리">[정리]</h3>
<ul>
<li>git init : 현재 디렉토리를 Git이 관리하는 프로젝트 디렉토리(=working directory)로 설정하고 그 안에 레포지토리(.git 디렉토리) 생성</li>
<li>git config user.name &#39;codeit&#39; : 현재 사용자의 아이디를 &#39;codeit&#39;으로 설정(커밋할 때 필요한 정보)</li>
<li>git config user.email &#39;teacher@codeit.kr&#39; : 현재 사용자의 이메일 주소를 &#39;teacher@codeit.kr&#39;로 설정(커밋할 때 필요한 정보)</li>
<li>git add [파일 이름] : 수정사항이 있는 특정 파일을 staging area에 올리기</li>
<li>git add [디렉토리명] : 해당 디렉토리 내에서 수정사항이 있는 모든 파일들을 staging area에 올리기</li>
<li>git add . : working directory 내의 수정사항이 있는 모든 파일들을 staging area에 올리기</li>
<li>git reset [파일 이름] : staging area에 올렸던 파일 다시 내리기</li>
<li>git status : Git이 현재 인식하고 있는 프로젝트 관련 내용들 출력(문제 상황이 발생했을 때 현재 상태를 파악하기 위해 활용하면 좋음)</li>
<li>git commit -m &quot;커밋 메시지&quot; : 현재 staging area에 있는 것들 커밋으로 남기기</li>
<li>git help [커맨드 이름] : 사용법이 궁금한 Git 커맨드의 공식 메뉴얼 내용 출력</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이참 단축키 모음]]></title>
            <link>https://velog.io/@rune_kkk/%ED%8C%8C%EC%9D%B4%EC%B0%B8-%EB%8B%A8%EC%B6%95%ED%82%A4-%EB%AA%A8%EC%9D%8C</link>
            <guid>https://velog.io/@rune_kkk/%ED%8C%8C%EC%9D%B4%EC%B0%B8-%EB%8B%A8%EC%B6%95%ED%82%A4-%EB%AA%A8%EC%9D%8C</guid>
            <pubDate>Tue, 01 Oct 2024 17:08:23 GMT</pubDate>
            <description><![CDATA[<ol>
<li>한번에 주석처리, 해제 : ctrl + /</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[3. [기초지식] 소프트웨어 이해하기]]></title>
            <link>https://velog.io/@rune_kkk/3.-%EA%B8%B0%EC%B4%88%EC%A7%80%EC%8B%9D-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@rune_kkk/3.-%EA%B8%B0%EC%B4%88%EC%A7%80%EC%8B%9D-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 29 Sep 2024 09:21:56 GMT</pubDate>
            <description><![CDATA[<h2 id="01-다양한-어플리케이션">01 다양한 어플리케이션</h2>
<p>애플리케이션이란 <strong>앤드유저가 직접 사용하는 프로그램</strong>이다. 
컴퓨터 애플리케이션, 모바일 애플리케이션 외에도 다양한 기계에 숨어있는 아주 다양한 애플리케이션이 있다. 
<img src="https://velog.velcdn.com/images/rune_kkk/post/9e1a2ac2-eae3-4349-907f-f2f1c8a99494/image.png" alt="">
<img src="https://velog.velcdn.com/images/rune_kkk/post/d8ff0265-a50a-4b6c-880f-1e23c94bc602/image.png" alt=""></p>
<h2 id="02-컴파일러-vs-인터프리터">02 컴파일러 VS 인터프리터</h2>
<p>코드를 적으면 이를 앱으로 만들어주는 친구들, 컴파일러 &amp; 인터프리터 
이들은 일종의 프로그래밍 언어의 번역기인데, 작동 방식이 다름</p>
<p>컴파일러는 개발자가 테스트를 할때 마다도 코드 전체를 계속 컴파일을 새로해서 머신코드로 만들어서 확인해봐야함. (컴파일에 시간이 꽤 걸림) 사용자에게도 긴~ 머신코드로 전달되기때문에 용량은 크지만, 사용자 컴퓨터가 이 머신코드를 바로 실행하면 되기에 실행속도는 빠름. 
<img src="https://velog.velcdn.com/images/rune_kkk/post/910ba1c2-962b-4ce9-8776-96f3df8d7b8f/image.png" alt=""></p>
<p>인터프리터는 개발자가 적은 코드를 한줄 한줄 번역해서 실행시키는 일종의 실행기이다. 그래서 개발할때 언제든지 빠르게 테스트 가능. 단, 사용자에게도 고수준 언어로 전달되어 용량은 가볍지만, 사용자 컴퓨터에서 인터프리터가 돌아가며 실행되어야해서 느리다. 
<img src="https://velog.velcdn.com/images/rune_kkk/post/6b30b081-51a4-4902-9d09-a8186564be27/image.png" alt=""></p>
<p><strong>컴파일러는 “개발 편의성은 떨어지지만, 실행 속도는 빠르다.”
인터프리터는 “개발 편의성이 높지만, 실행 속도는 느리다.”</strong></p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/b7aa11b1-9fa2-415c-b846-545db9ed858e/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[4. 파이썬 모듈과 패키지]]></title>
            <link>https://velog.io/@rune_kkk/%EC%BD%94%EB%94%A9%EA%B8%B0%EC%B4%88-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%AA%A8%EB%93%88%EA%B3%BC-%ED%8C%A8%ED%82%A4</link>
            <guid>https://velog.io/@rune_kkk/%EC%BD%94%EB%94%A9%EA%B8%B0%EC%B4%88-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%AA%A8%EB%93%88%EA%B3%BC-%ED%8C%A8%ED%82%A4</guid>
            <pubDate>Sun, 29 Sep 2024 07:19:12 GMT</pubDate>
            <description><![CDATA[<h2 id="1-모듈">1. 모듈</h2>
<h3 id="01-모듈module이란">01 모듈(Module)이란?</h3>
<p>복잡한 서비스를 만들때는 코드를 파일단위로 나눠준다. 이 파일단위를 모듈이라고 한다. 예를 들어 게임의 상점 기능으 만든다면, 아이템 모듈, 상점의 거래기능 모듈, npc 모듈... 이렇게!  </p>
<p>모듈의 장점 </p>
<ul>
<li>한 파일에서 구현하고자 하는게 더 명확해져서 코드를 짜고 관리하기 쉬워짐</li>
<li>코드를 여러곳에 재사용하기 쉬워짐</li>
</ul>
<h3 id="02-다른-파일모듈-사용하기">02 다른 파일=모듈 사용하기</h3>
<ol>
<li><p>기본방법 
 1) 같은 폴더에 있는 모듈 
 2) import 모듈파일명 </p>
<pre><code> 이러면 모듈에 있는 모든 변수와 함수를 사용 가능</code></pre><p> 3) 모듈에 있는 함수 사용하기</p>
<pre><code> print(모듈.함수())</code></pre></li>
<li><p>모듈이름이 너무 길어서 귀찮을때, 모듈이름을 축약한 간략한 이름으로 정의
 import calculator as calc
 print(calc.plus(3.5))</p>
</li>
<li><p>모듈에서 특정 함수만 가져오기,그 경우 모듈이름을 사용하지 않아도 된다!
 from calculator import add, mulitply
 print(add(2,5))</p>
</li>
<li><p>모듈의 모든 함수를 from으로 가져오기 
 from calculator import *
 print(add(2,5))</p>
<pre><code> - 장점: 함수 앞에 모듈명을 다 쓸 필요가 없음
 - 단점: 이 함수가 어떤 모듈에서 가져온 건지 알 수 없어서 비추천! </code></pre></li>
</ol>
<h3 id="03-클래스">03 클래스</h3>
<p>모듈에는 변수, 함수 뿐만 아니라 클래스도 있다. 클래스란? 
클래스는 파이썬에서 객체 지향 프로그래밍을 구현하는 중요한 개념.
클래스는 데이터(속성)와 해당 데이터를 처리하는 함수(메서드)를 하나로 묶은 사용자 정의 데이터 타입
클래스를 사용하면 코드의 재사용성과 유지보수성을 높일 수 있음 </p>
<p>예시1)</p>
<pre><code>class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def introduce(self):
        print(f&quot;안녕하세요, 저는 {self.name}이고, 나이는 {self.age}살입니다.&quot;)

p1 = Person(&quot;홍길동&quot;, 30)
p1.introduce()  # 출력: 안녕하세요, 저는 홍길동이고, 나이는 30살입니다.

</code></pre><p>예시2) </p>
<pre><code># 원 클래스
class Circle:
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius * self.radius

# 정사각형 클래스
class Square:
    def __init__(self, length):
        self.length = length

    def area(self):
        return self.length * self.length</code></pre><p>다른 파일에서 클래스를 가져올때도 import를 사용하며, as를 통해 이름을 바꿔서 임포트할 수도 있다. </p>
<pre><code>from shapes2d import Square as Sq

square = Sq(3)
print(square.area())</code></pre><h3 id="04-파일에-무슨-요소가-있는가-알아보기">04 파일에 무슨 요소가 있는가 알아보기</h3>
<p><strong>dir 함수</strong> 이 파일에 정의된 모든 요소를 알려주는 함수 
    예) print(dir(파일이름))
    예) print(dir())  #현재 파일에 대해 알아보기
    변수, 함수, 임포트된 모듈(as로 약자로 쓰면 약자이름이 나온다), 임포트된 함수(from을 써서 특정 함수만 가져오면 모듈이름은 dir 결과값에 포함되지 않는다)가 나옴
    이 외에도 <strong>doc</strong>, <strong>filr</strong>과 같은 녀석들이 나오는데 이를 특수변수, 던더(더블언더스코어)라고 부른다. 파이썬이 내부적으로 관리하는 변수들임. </p>
<p><strong>네임스페이스</strong> 특정한 객체를 이름에 따라 구분할 수 있는 범위
    dir로 보는 것이 네임스페이스이다</p>
<p><strong>파이썬에서는 같은 이름의 요소가 정의될 경우 뒤의 정의로 적용된다</strong>
예)</p>
<pre><code>from area import square

def square(r) :
    return r*4

print(squre(r)) </code></pre><p>결과: area 모듈의 square의 답이 아닌 r*4로 정의된 새로운 square의 답이 출력됨
    이를 방지하는 방법 
        1. import된 square를 다른 임으로 정의한다. 
            from are import square as sq
        2. import를 area 모듈 전체로 한다.
        이 경우 dir을 하면 square가 아닌 area로 잡히기 때문! 
        square는 새로 정의된 함수로, area.square는 이와 별개로 정의 및 호출된다. </p>
<h3 id="05-스탠다드-모듈">05 스탠다드 모듈</h3>
<p>모듈을 다르게 정의하면, 여러가지 기능을 정리해둔 파이썬 파일!
그리고 많이 쓸법한 기능들은 이미 모듈로 만들어져 파이썬에 내장되어있음 =** 스탠다드 모듈**</p>
<p><img src="https://velog.velcdn.com/images/rune_kkk/post/5e7222c3-0713-41b3-bf43-fedf788d269a/image.png" alt=""></p>
<p><strong>파이썬 표준 라이브러리 :</strong> 여기서 모든 스탠다드 모듈 확인 가능 
<a href="https://docs.python.org/ko/3/library/">https://docs.python.org/ko/3/library/</a></p>
<p><strong>대표 모듈들</strong></p>
<h4 id="math">math</h4>
<p>math는 기본적인 수학 모듈입니다. 여러 수학적인 함수를 제공해 줍니다.
예)
math.cos(0)
math.log10(100)</p>
<h4 id="random">random</h4>
<p>랜덤 한 숫자를 생성하기 위한 다양한 함수들을 제공해 줍니다.</p>
<p>random.randint(1, 20)  # 랜덤한 정수 1 &lt;= N &lt;= 20 
random.uniform(0, 1)   # 랜덤한 소수 0 &lt;= x &lt;= 1</p>
<h4 id="datetime">datetime</h4>
<p>날짜와 시간을 다루기 위한 다양한 &#39;클래스&#39;를 갖추고 있습니다. </p>
<p>today = datetime.datetime.now() # 현재 시간과 날짜
print(today.strftime(&quot;%A, %B %dth %Y&quot;)) # 출력값을 &quot;요일, 월 일 연도&quot;로 포매팅
pi_day = datetime.datetime(2020, 3, 14, 13, 6, 15) # 특정 시간과 날짜
print(today - pi_day) # 두 datetime의 차이</p>
<h4 id="os">os</h4>
<p>Operating System, 즉 운영체제의 약자입니다. os 모듈을 통해서 파이썬으로 운영체제를 조작하거나 운영체제에 대한 정보를 가져올 수 있습니다.</p>
<p>os.getlogin() # 현재 어떤 계정으로 로그인 돼있는지 확인
os.getcwd() # 현재 파일의 디렉토리 확인 
os.getpid() # 현재 프로세스 ID 확인</p>
<h4 id="ospath---잘-모르겠음">os.path ####  (잘 모르겠음)</h4>
<p>파일 경로를 다룰 때 쓰입니다.</p>
<p>os.path.abspath(&#39;..&#39;) # 주어진 경로를 절대 경로로
os.path.relpath(&#39;/Users/codeit/PycharmProjects&#39;) # 주어진 경로를 현재 디렉토리를 기준으로 한 상대 경로로
os.path.join(&#39;/Users/codeit/PycharmProjects&#39;, &#39;standard_modules&#39;) # 주어진 경로들을 병합</p>
<h4 id="re">re</h4>
<p>프로그래밍에서 Regular Expression (RegEx, re, 한국어로는 정규 표현식)은 특정한 규칙/패턴을 가진 문자열을 표현하는 데 사용됩니다.</p>
<pre><code>import re 

# 알파벳으로 구성된 단어들만 매칭
pattern = re.compile(&#39;^[A-Za-z]+$&#39;)
print(pattern.match(&#39;I&#39;))
print(pattern.match(&#39;love&#39;))
print(pattern.match(&#39;python3&#39;))

print()

# 숫자가 포함된 단어들만 매칭
pattern = re.compile(&#39;.*\d+&#39;)
print(pattern.match(&#39;I&#39;))
print(pattern.match(&#39;love&#39;))
print(pattern.match(&#39;python3&#39;))
</code></pre><p>답: 
&lt;re.Match object; span=(0, 1), match=&#39;I&#39;&gt; 
&lt;re.Match object; span=(0, 4), match=&#39;love&#39;&gt;
None  #3이 있어서 none이 나옴 </p>
<p>None #숫자가 하나도 없어서 none이 나옴 
None #숫자가 하나도 없어서 none이 나옴 
&lt;re.Match object; span=(0, 7), match=&#39;python3&#39;&gt;</p>
<h4 id="pickle">pickle</h4>
<p>pickle 을 사용하면 파이썬 오브젝트(객체)를 바이트(byte) 형식(0,1로 된 이진법 형식)으로 바꿔서 파일에 저장할 수 있고 저장된 오브젝트를 읽어올 수도 있습니다.복잡한 데이터 구조를 저장하고 불러올 때 유용합니다.</p>
<pre><code>import pickle

# 딕셔너리 오브젝트
obj = {&#39;my&#39;: &#39;dictionary&#39;}  

# obj를 filename.pickle 파일에 저장
with open(&#39;filename.pickle&#39;, &#39;wb&#39;) as f:
    pickle.dump(obj, f)

# filename.pickle에 있는 오브젝트를 읽어옴 
with open(&#39;filename.pickle&#39;, &#39;rb&#39;) as f:
    obj = pickle.load(f)

print(obj)</code></pre><p>값: {&#39;my&#39;: &#39;dictionary&#39;}</p>
<h4 id="json">json</h4>
<p>json 모듈은 pickle과 비슷하지만 오브젝트를 JSON 형식으로 바꿔줍니다. JSON 형식에 맞는 데이터 (기본 데이터 타입들, 리스트, 딕셔너리)만 바꿀 수 있습니다.</p>
<p>JSON 형식이란 JavaScript Object Notation의 약자로, 데이터를 교환하기 위한 경량의 데이터 형식입니다. 주로 웹 애플리케이션에서 서버와 클라이언트 간에 데이터를 주고받을 때 사용됩니다. JSON은 사람이 읽고 쓰기 쉽고, 기계가 해석하고 생성하기도 쉬운 형식입니다.</p>
<pre><code>import json

# 딕셔너리 오브젝트
obj = {&#39;my&#39;: &#39;dictionary&#39;}  

# obj를 filename.json 파일에 저장
with open(&#39;filename.json&#39;, &#39;w&#39;) as f:
    json.dump(obj, f)

# filename.json에 있는 오브젝트를 읽어옴 
with open(&#39;filename.json&#39;, &#39;r&#39;) as f:
    obj = json.load(f)

print(obj)</code></pre><p>값 : {&#39;my&#39;: &#39;dictionary&#39;}</p>
<h4 id="copy">copy</h4>
<p> 파이썬 오브젝트를 복사할 때 쓰입니다.
 예를 들어 &#39;=&#39; 연산자는 실제로 리스트를 복사하지 않습니다. 그렇기에 리스트를 복사하려면 슬라이싱을 사용하거나 copy.copy() 함수를 사용해야 합니다. </p>
<pre><code>import copy

a = [1, 2, 3] 
b = a
c = a[:]
d = copy.copy(a)
a[0] = 4
print(a, b, c, d)

#값: [4, 2, 3] [4, 2, 3] [1, 2, 3] [1, 2, 3]
# 여기서 b는 =라서 복사가 아니고 d는 복사이다. 값의 차이 주의!  
</code></pre><pre><code># 하지만 오브젝트 안에 오브젝트가 있는 경우 copy.copy() 함수는 가장 바깥에 있는 오브젝트만 복사함 
# 오브젝트를 재귀적으로 복사하려면 copy.deepcopy() 함수를 사용해야 함

a = [[1,2,3], [4,5,6], [7,8,9]]
b = copy.copy(a)
c = copy.deepcopy(a)
a[0][0] = 4
print(a, b, c)

#값: 
[[4, 2, 3], [4, 5, 6], [7, 8, 9]]
[[4, 2, 3], [4, 5, 6], [7, 8, 9]] 
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
</code></pre><h4 id="sqlite3">sqlite3</h4>
<p>sqlite3 모듈을 통해 파이썬에서 SQLite 데이터베이스를 사용할 수 있습니다.</p>
<pre><code>import sqlite3

# 데이터베이스 연결
conn = sqlite3.connect(&#39;example.db&#39;)

# SQL 문 실행 
c = conn.cursor()
c.execute(&#39;&#39;&#39;SELECT ... FROM ... WHERE ... &#39;&#39;&#39;)

# 가져온 데이터를 파이썬에서 사용
rows = c.fetchall()
for row in rows:
    print(row)

# 연결 종료
conn.close()</code></pre><h3 id="06-파일-경로">06 파일 경로</h3>
<p> <img src="https://velog.velcdn.com/images/rune_kkk/post/fa5611cc-a1f0-4c55-abe6-6fd561bc2866/image.png" alt=""></p>
<p> 컴퓨터의 파일 시스템은 하나의 뿌리에서 시작해서 여러 개의 가지로 뻗어나가는, 나무 같은 구조를 가지고 있습니다. root라는 폴더 안에 my, your 폴더들이 있고 my 폴더 안에는 folder라는 폴더와 file1.py라는 파일이 있고...</p>
<p> 파일 시스템의 뿌리는 항상 <strong>&#39;루트(root)&#39;</strong> 라고 합니다. 그리고 프로그래밍에서는 폴더를 ** &#39;디렉토리(directory)&#39;**라고도 합니다.</p>
<p><strong>Windows 파일경로 표시방법</strong></p>
<ol>
<li><p>디렉토리 안을 \ 또는 \로 표기합니다.  (\을 사용하는 이유는 \n 처럼 \이 다른용도로도 사용되기 때문) </p>
</li>
<li><p>루트 디렉토리 안은 하드 드라이브에 따라서 C:\ 혹은 D:\로 표기합니다</p>
</li>
<li><p>. 은 현재 디렉토리를 뜻하고 .. 은 상위 디렉토리 (현재 디렉토리를 포함하고 있는 디렉토리)를 뜻합니다</p>
</li>
<li><p>절대경로 
 file1.py의 경로: C:\my\file1.py
 file2.py의 경로: C:\my\folder\file2.py
 directory의 경로: C:\your\directory</p>
</li>
<li><p>상대경로 ; 
 현재위치 my폴더 </p>
<pre><code> file1.py의 경로: .\file1.py
 file2.py의 경로: .\folder\file2.py</code></pre><p>   현재위치 file1.py</p>
<pre><code> file2.py의 경로: .\foler\file2.py  #현재위치가 my이기 때문 </code></pre><p> 현재위치 file3.py</p>
<pre><code> file4.py의 경로: .\file4.py  #현재위치가 directory이기 때문 </code></pre><p> 현재위치 folder</p>
<pre><code> file1.py의 경로: ..\file1.py  #my로 거슬러 올라가야함 </code></pre><p> 현재위치 file3.py</p>
<pre><code> your의 folder: ..\folder  #현재위치가 directory이기 때문 </code></pre></li>
</ol>
<h3 id="07-모듈-검색-경로">07 모듈 검색 경로</h3>
<p>컴퓨터는 우리가 import해오라고 명령한 모듈을 어떻게 찾아낼까? 
<strong>sys.path</strong>로 확인해보는 방법</p>
<pre><code>import sys  #스탠다드 모듈 중 하나로 파이썬 실행환경과 관련된 변수와 함수들이 저장되어있음

print(sys.path)  #파이썬이 모듈을 찾아보는 경로가 저장되어 있음 </code></pre><p>값: 아래의 값들이 리스트 []안에 나옴! </p>
<p>1) &#39;C:\Users\tonia\PycharmProjects\코드잇\파이썬 모듈과 패키지 - 모듈 사용해보기 실습&#39;, &#39;C:\Users\tonia\PycharmProjects\코드잇\파이썬 모듈과 패키지 - 모듈 사용해보기 실습&#39;, 
2) &#39;C:\Program Files\JetBrains\PyCharm 2024.2.1\plugins\python-ce\helpers\pycharm_display&#39;, 
3) &#39;C:\Users\tonia\AppData\Local\Programs\Python\Python312\python312.zip&#39;, 
4) &#39;C:\Users\tonia\AppData\Local\Programs\Python\Python312\DLLs&#39;, 
5) &#39;C:\Users\tonia\AppData\Local\Programs\Python\Python312\Lib&#39;, 
6) &#39;C:\Users\tonia\AppData\Local\Programs\Python\Python312&#39;, 
7)&#39;C:\Users\tonia\PycharmProjects\코드잇\파이썬 모듈과 패키지 - 모듈 사용해보기 실습\.venv&#39;,
8) &#39;C:\Users\tonia\PycharmProjects\코드잇\파이썬 모듈과 패키지 - 모듈 사용해보기 실습\.venv\Lib\site-packages&#39;, 
9) &#39;C:\Program Files\JetBrains\PyCharm 2024.2.1\plugins\python-ce\helpers\pycharm_matplotlib_backend&#39;,
10) &#39;C:\Program Files\JetBrains\PyCharm 2024.2.1\plugins\python-ce\helpers\pycharm_plotly_backend&#39;]</p>
<p>sys.path의 첫파일은 무조건 지금 파이썬 파일이 있는 폴더. 즉 파이썬은 같은 폴더에 저장되었는지 찾아본다는 뜻. 이외의 경로들은 파이썬이 디폴트 경로로서, 예를들어 5)은 각종 스탠다드 모듈이 저장되어있음. 8) site-packages는 외부패키지들을 다운받아서 사용할 경우, 외부패키지들이 다운받아지는 경로이다. 즉, 다운받은 외부패키지를 모듈로 끌어올 수 있는 것은 이 경로에 있기 때문! </p>
<p><strong>sys.path에 경로 추가하기</strong></p>
<ol>
<li>sys.path는 결국 리스트이기 때문에 .append() 함수를 써서 쉽게 새로운 경로를 추가할 수 있습니다. 예를 들어 sys.path에 바탕 화면의 경로를 추가하고 싶다면 아래와 같은 코드를 추가해 주면 됩니다. 단, <strong>append()해 주면 프로그램이 종료되면 그 경로는 sys.path에서 사라집니다.</strong> 그 경로에 있는 모듈을 쓰고 싶으면 매번 append()를 해 줘야 합니다.</li>
</ol>
<pre><code>import sys
sys.path.append(&#39;C:\\Users\\codeit\\Desktop&#39;) # Windows</code></pre><ol start="2">
<li>새로운 path를 영구적으로 추가하고 싶을 땐
 1) PyCharm - File → Settings - Project - Project Interpreter
 2) Python Interpreter 목록들을 드롭다운해서 거기서  show all 클릭
 <img src="https://velog.velcdn.com/images/rune_kkk/post/7eebb790-39f0-4bc3-bac9-b5b60244fd65/image.png" alt="">
 3) 좌측 상단의 파일모양 (show interpreter path) 클릭
 <img src="https://velog.velcdn.com/images/rune_kkk/post/562d6aa1-9ab7-4838-9ab4-e664aaaf3376/image.png" alt="">
 4) interpreter paths가 나열된 페이지 위의 + 눌러서 원하는 경로 선택 
 <img src="https://velog.velcdn.com/images/rune_kkk/post/6ad40ec5-19b6-4328-8b09-d5b39b1e59b6/image.png" alt="">
 5) ok, ok, ok, 
 6) 확인해보기: sys.path</li>
</ol>
<h3 id="08-스크립트와-모듈">08 스크립트와 모듈</h3>
<p><strong>스크립트:</strong> 프로그램을 작동시키는 코드를 담은 실행 용도의 파일
<strong>모듈:</strong> 프로그램에 필요한 변수나 함수를 정의해놓은 파일로 여기서는 실행을 하지 않는다. </p>
<p>만약! 모듈에 정의만 있는게 아니라 실행이 있다면?
그 모듈을 import한 스크립트는 import와 동시에 모든 코드를 실행하는 거라 실행 코드까지 실행해버림! 이 현상을 막기 위해서는?</p>
<p>*<em>던더네임 사용하기 *</em>
던더네임은 파이썬이 이름을 자동으로 지정해주는 변수인데, 모듈 내에서 던더네임을 물으면 <strong>main</strong>가 리턴되고, 스크립트에서 해당 모듈의 던더네임을 물으면 모듈파일명이 리턴된다. </p>
<pre><code>#모듈파일명 area에서 

print(f&quot;module is {__name__}&quot;)  #값: module is __main__</code></pre><pre><code>#스크립트 파일명 run에서 

print(f&quot;script is {__name__}&quot;)   #값: script is __main__
import area  #값: module is are</code></pre><p>*<em>이를 활용해 조건을 걸어 모듈에서는 실행되는 명령을 스크립트에서는 실행되지 않게 만들 수 있다. *</em></p>
<pre><code>#모듈파일명 area에서 

if __name__ == __main__ : 
    ~~모듈에서만 실행하고 싶은 코드~~</code></pre><h3 id="09-main-함수">09 main() 함수</h3>
<p>파이썬은 파일을 실행하면 포함된 모든 코드가 처음부터 끝까지 실행된다
하지만 Java, C, C++는 main()이라는 함수를 써야지만 그 안의 코드들이 작동된다. main()이 프로그램을 작동시키는 코드인 것이다. </p>
<p>Java에서 &quot;Hello World&quot; 출력하기; 안의 main()함수가 있어서 출력이 되는 것!</p>
<pre><code>class HelloWorld {
    public static void main(String[] args) {
        System.out.println(&quot;Hello World!&quot;); 
    }
}</code></pre><p>파이썬에서도 이런 패턴을 활용할 수 있다. 던더네임과 함께!
모듈에서만 사용하고 싶은 부분을 def main()으로 정의해 놓고 그 아래 던더네임으로 main()의 출력에 제약을 걸어두는 것이다. 이 방법을 사용할 경우 모듈에서만 가동시키려는 코드가 어디에 있는지 한눈에 보여 코드의 가독성이 올라간다. 그러므로 던더네임과 함께 def main()을 활용하는 방법 적극 권장!!</p>
<pre><code>#모듈명 area 파일 내 

PI = 3.14

# 원의 면적을 구해 주는 함수
def circle(radius):
    return PI * radius * radius  

# 정사각형의 면적을 구해 주는 함수
def square(length):
    return length * length

# 함수들을 테스팅 하는 메인 함수
def main():
    # circle 함수 테스트
    print(circle(2) == 12.56)
    print(circle(5) == 78.4)

    # square 함수 테스트
    print(square(2) == 4)
    print(square(5) == 25)

if __name__ == &#39;__main__&#39;:
    main()</code></pre><h2 id="2-패키지">2. 패키지</h2>
<h3 id="01-패키지란">01 패키지란</h3>
<p><strong>패키지 : 여러 모듈의 묶음</strong>. 예를들어 게임의 상점과 관련된 모듈들인 아이템 모듈, 거래 모듈, npc 모듈을 묶어서 상점 패키지로 만드는 것. </p>
<p><strong>패키지 만드는 방법</strong> 폴더(디렉토리)를 만들고 패키지로 묶고 싶은 모듈 파이썬 파일들을 하나의 폴더에 넣고, 또하나의 파이썬 파일을 만들어 파일명을 &quot;<strong>init</strong>&quot;이라고 짓는다. 파이참에서 오른쪽 클릭 - NEW - Python Package를 하면 자동으로 이 이닛 파일이 생성된다. </p>
<p><strong>패키지 불러오는 방법</strong>
1.import &lt;package.module&gt;
    단, 모듈 내 함수나 변수만을 불러오기 위해 &lt;package.module.members&gt;을 사용하면 오류남. 이렇게 특정 함수나 변수만 가져오고 싶으면 4번 사용.<br>2.import <package>
**      단, 이 경우 package 안에 그냥 있는 모듈들은 임포트가 안되고 &quot;<strong>init</strong>&quot;을 활용해야한다
**
3. from <package> import &lt;module(s)&gt;
4. from &lt;package.module&gt; import &lt;member(s)&gt;</p>
<ul>
<li>import 뒤에 as를 써서 이름 바꿔주는 것도 가능! </li>
</ul>
<h3 id="02-init-파일이란">02 init 파일이란?</h3>
<p>&quot;이 폴더는 패키지 폴더이다&quot;라고 말해주는 파일
파이썬 3.3 버전 이전에는 init이 필수, 그 이후로는 필수가 아니지만
*<em>버전간의 호환과 패키지의 명확성을 위해 항상 패키지에 init 파일 만들어주기! *</em></p>
<p>init = initialize
<strong>즉, 패키지를 import하면 init 파일의 코드먼저 실행됨</strong>
즉, 패키지를 초기화할때 사용됨.</p>
<p>위의 &lt;package.module.members&gt;를 가능하게 해줌</p>
<p>  1) init 파일에 아래를 입력해두면
      from package import module
  2) 스크립트 파일에서 아래처럼 쓸 수 있음 
      import package
      print(package.module.members)</p>
<p>((중요))특정 모듈만 더 간소화된 코드로 가져오고 싶다면</p>
<p>  1) init 파일에 아래를 입력해두면 (여기서 package.module로 써야하는것 유의!!)
      <strong>from package.module import members</strong>
  2) 스크립트 파일에서 모듈명을 생략하고 아래처럼 쓸 수 있음 
      <strong>import package
      print(package.members)</strong></p>
<p>*<em>패키지 속 여러 모듈에서 똑같이 사용되는 변수와 함수들은 &quot;<strong>init</strong>&quot;에 저장해두면 관리에 용이해진다. *</em> 그리고 다른 모듈들에서는 from <strong>init</strong> import &lt;변수,함수&gt; 해주기. </p>
<p>init이 비어있는데 스크립트에서 import package만 넣는다? package 이름만 가고 안의 내용은 전혀 임포트되지 않는다. 이경우 반드시 init에서 어떤 것을 가져갈지 정해줘야한다. import package.module 또는 from package.module import members라고! </p>
<h3 id="03-all-특수변수">03 <strong>all</strong> 특수변수</h3>
<p><strong>all</strong>은 &quot;패키지의 전체를 가져와!&quot;라는 명령에서 <strong>&#39;전체&#39;가 무엇인지 정의해주는 특수변수</strong> 임
즉, import &#39;<em>&#39;에서 &#39;</em>&#39;의 범위를 결정하는 것</p>
<p>예를들어 그냥 &#39;*&#39;를 사용하면  package의 모든 요소가 불려오지 않는다. 
    from package import *   #안불러와짐 </p>
<p>package의 전체를 가져오기 위해서는 </p>
<p>  1) <strong>init</strong> 파일에 <strong>all</strong>을 정의해준다
      <strong>all</strong> = [&#39;module1&#39;, &#39;module2&#39;]
  2) 스크립트 파일에서 &#39;*&#39;을 사용해서 불러온다. 그러면 <strong>all</strong>에 적용한 것들만 불러와진다.</p>
<p>이는 모듈 내 함수나 변수를 불러올때도 적용된다. </p>
<h3 id="04-서브패키지">04 서브패키지</h3>
<p><strong>서브패키지</strong> 하나의 패키지에 여러 패키지가 들어가기도 하는데 그 하위 패키지가 서브패키지
  <img src="https://velog.velcdn.com/images/rune_kkk/post/da4ff6c4-1d54-4bf7-85d7-4f6682caf54c/image.png" alt=""></p>
<p>서브패키지를 가져오는 방식은 일반적인 패키지&amp;모듈을 불러오는 방식과 동일하다
package &gt; sub-package &gt; modules &gt; members 라고 했을 때, package의 init이 비어있으면 스크립트에는;</p>
<p>  1) import package #아무것도 임포트 되지 않는다
  2) from package.sub-package.modules import members
  3) from package.sub-package import module
  4) import package.sub-package.module #sub-package의 init파일에 module이 적혀있어야한다</p>
<ul>
<li>as를 쓸 수 있다. </li>
</ul>
<p> ((중요)) 메인 package에서 가장 간결하에 members를 부르고 싶으면 package의 init에 가장 자세한 경로를 적은 from~ import~를 적을 것 
  예를들어 ; from package.subpackage.module import members</p>
<h3 id="05-상대경로-임포트">05 상대경로 임포트</h3>
<p>같은 폴더안에 있는 모듈을 불러올땐
  from . import module</p>
<p>상위 폴더 하위의 모듈과 멤버를 불러올땐
  from ..module import members </p>
<p>상대경로의 단점은 파일 구조가 모호해진다는 점. 그러므로 좀만 길어져도 상대경로는 지양할 것 </p>
<h2 id="3-외부패키지">3. 외부패키지</h2>
<h3 id="01-외부패키지란">01 외부패키지란?</h3>
<p>좋은 개발자가 되려면 남의 코드를 잘 써야함!
남이 만들어놓은 패키지를 외부 패키지, 외부 라이브러리라고 함. </p>
<p>외부패키지를 사용하기 위해 알아야하는 것들</p>
<ol>
<li>패키지에 어떤 함수들이 있는지</li>
<li>패키지의 함수들이 무엇을 하는지 
이는 <strong>패키지 공식문서</strong>에 잘 정리돼있음</li>
</ol>
<p>스탠다드 라이브러리 vs 외부 라이브러리
  <strong>스탠다드 라이브러리</strong>는 프로그래밍에 필요한 가장 기본적인 기능들을 제공합니다. 스탠다드 라이브러리 안에는 자료형, 내장 함수, 스탠다드 모듈 등이 있습니다. <strong>참고로 스탠다드 라이브러리는 패키지가 아닙니다. *<em>여기서 &#39;라이브러리&#39;는 단순히 어떤 기능들의 모음을 뜻합니다. *</em>스탠다드 라이브러리는 파이썬을 설치하면 기본적으로 딸려오기 때문에 따로 설치하지 않아도 됩니다.</strong>
  <strong>외부 라이브러리</strong> 또는 외부 패키지는 파이썬을 사용하는 일반 개발자들이 패키지를 만들어서 PyPI에 업로드해 놓은 것입니다. <strong>외부 라이브러리는 파이썬의 일부가 아니고 우리가 직접 설치해야 합니다.</strong></p>
<h3 id="02-외부-패키지-설치하기">02 외부 패키지 설치하기</h3>
<p>*<em>파이썬의 공식패키지 저장소 PYPI *</em> Python Package Index 
  <a href="https://pypi.org/">https://pypi.org/</a>
  이 기능을 위해 어떤 패키지를 써야하지? / 이 패키지는 어떻게 써야하지? 에 대한 모든 정보! </p>
<p><strong>PIP</strong> PyPI에서 패키지를 다운로드해서 설치해주는 관리도구, 설치-업그레이드-삭제 모두 여기서 관리. 파이썬 3.4부터 pip이 파이썬과 같이 자동으로 설치됨 
      pip 설치 여부 확인 방법 : cmd에서 pip 입력해보기
      pip 재설치 방법: 파이썬 제거 후 재설치 </p>
<p><strong>파이참으로 패키지 설치하기</strong></p>
<p>  1) FILE &gt; SETTINGS
  2) PROJECT: (현재 프로젝트이름) &gt; Python Interpreter
  3) +버튼누르기 
<img src="https://velog.velcdn.com/images/rune_kkk/post/5cc1261b-700d-4161-8ced-31a13a3e17cd/image.png" alt="">
  4) 원하는 패키지 검색 &gt; 우측 하단에 버전 선택 또는 선택안하면 가장 최신 버전으로 설치됨
  5) 잠시 후 설치완료 메세지 
  6) 지우고 싶으면 -버튼으로 지울 수 있음 
(중요) 외부 패키지는 프로젝트별로 추가/삭제하며 관리해야한다! </p>
<p><strong>cmd에서 커멘드라인으로 패키지 설치하기</strong></p>
<p>  1) 설치하기 : pip3 install (패키지명)
  2) 삭제하기 : pip3 uninstall (패키지명)
  3) 특정 버전 설치하기: pip3 install (패키지명)==1.1.0 </p>
<h3 id="03-유용한-패키지">03 유용한 패키지</h3>
<p><strong>(1) 데이터 분석 &amp; 시각화</strong>
<strong>numpy</strong>
numpy는 행렬(다차원 배열)을 다루는 패키지입니다. 데이터 분석이나 머신 러닝을 할 때는 데이터가 행렬 형식인 경우가 많습니다.</p>
<p>공식 홈페이지: <a href="https://numpy.org/">https://numpy.org/</a></p>
<p><strong>pandas</strong>
pandas는 데이터를 우리가 쉽게 다룰 수 있는 테이블 형식으로 만들어 줍니다. 결국 데이터 분석이나 머신 러닝을 하려면 데이터를 다뤄야 하기 때문에 pandas는 데이터 분석의 가장 핵심적인 패키지라고 할 수 있습니다. 거의 모든 데이터 사이언스 패키지들은 pandas 와 연동됩니다.</p>
<p>공식 홈페이지: <a href="https://pandas.pydata.org/">https://pandas.pydata.org/</a></p>
<p><strong>matplotlib</strong>
matplotlib은 파이썬에서 가장 많이 쓰이는 데이터 시각화 라이브러리입니다. 일반적인 그래프들은 거의 다 matplotlib으로 그릴 수 있습니다.</p>
<p>공식 홈페이지: <a href="https://matplotlib.org/">https://matplotlib.org/</a></p>
<p><strong>seaborn</strong>
seaborn은 matplotlib를 기반으로 한 시각화 라이브러리입니다. matplotlib 보다 간단한 문법을 사용해서 더 예쁜 그래프들을 그릴 수 있습니다.</p>
<p>공식 홈페이지: <a href="https://seaborn.pydata.org/">https://seaborn.pydata.org/</a></p>
<p><strong>(2) 머신 러닝</strong>
<strong>sklearn</strong>
sklearn은 가장 대중적인 머신 러닝 라이브러리입니다. 기본적인 머신 러닝 알고리즘은 모두 지원합니다. 데이터 가공, 모델 평가 기능도 제공합니다.</p>
<p>공식 홈페이지: <a href="https://scikit-learn.org/stable/">https://scikit-learn.org/stable/</a></p>
<p><strong>tensorflow, pytorch, keras</strong>
모두 딥러닝에 최적화된 라이브러리들입니다. 컴퓨터 비전에 많이 사용되는 CNN (Convolutional Neural Network), 자연어 처리에 많이 사용되는 RNN (Recurrent Neural Network) 모델 등을 구현할 수 있습니다.</p>
<p>공식 홈페이지: <a href="https://www.tensorflow.org/?hl=ko">https://www.tensorflow.org/?hl=ko</a> (한국어), <a href="https://pytorch.org/">https://pytorch.org/</a>, <a href="https://keras.io/">https://keras.io/</a></p>
<p><strong>nltk</strong>
nltk는 텍스트 데이터 가공, 시각화 등을 지원하는 자연어 처리 라이브러리입니다.</p>
<p>공식 홈페이지: <a href="https://www.nltk.org/">https://www.nltk.org/</a></p>
<p><strong>(3) 웹개발</strong>
<strong>django</strong>
django는 파이썬에서 많이 쓰이는 웹 프레임워크입니다.</p>
<p>일반적으로 프레임워크는 어떤 소프트웨어의 뼈대 같은 역할을 합니다. 웹 프레임워크는 웹 애플리케이션을 만들기 위한 뼈대입니다. 우리는 뼈대를 제외한 나머지 디테일을 채워 넣기만 하면 됩니다.</p>
<p>공식 웹사이트: <a href="https://www.djangoproject.com/">https://www.djangoproject.com/</a></p>
<p><strong>flask</strong>
flask는 파이썬에서 많이 쓰이는 또 다른 웹 프레임워크입니다. django  웹 개발에 필요한 모든 기능을 제공하지만 비교적 복잡하고 flask는 기본적인 기능만 제공하지만 비교적 간단합니다.</p>
<p>공식 웹사이트: <a href="https://flask.palletsprojects.com/en/1.1.x/">https://flask.palletsprojects.com/en/1.1.x/</a></p>
<p><strong>(4) 기타</strong>
<strong>beautifulsoup4</strong>
beautifulsoup4는 html 또는 xml 문서를 파싱(원하는 데이터를 특정 패턴이나 순서로 추출해 가공하는 것)해 주는 라이브러리입니다. 보통 웹에서 원하는 데이터를 긁어 오는 작업인 웹 스크레이핑 (web scraping)에 많이 사용됩니다.</p>
<p>공식 웹사이트: <a href="https://www.crummy.com/software/BeautifulSoup/bs4/doc/">https://www.crummy.com/software/BeautifulSoup/bs4/doc/</a></p>
<p><strong>selenium</strong>
selenium은 웹 브라우저 동작을 자동화해 주는 패키지입니다. selenium을 사용하면 클릭, 로그인, 검색, 스크롤링 등을 자동화할 수 있습니다. 웹 애플리케이션 테스팅 자동화와 웹 스크레이핑에 많이 사용됩니다.</p>
<p>공식 웹사이트: <a href="https://github.com/SeleniumHQ/selenium/">https://github.com/SeleniumHQ/selenium/</a></p>
<p>가이드: <a href="https://selenium-python.readthedocs.io/">https://selenium-python.readthedocs.io/</a></p>
<p><strong>requests</strong>
requests는 파이썬의 간편한 http 라이브러리입니다. requests 라이브러리를 통해 쉽게 http 요청을 보낼 수 있습니다.</p>
<p>공식 웹사이트: <a href="https://requests.readthedocs.io/en/master/">https://requests.readthedocs.io/en/master/</a></p>
<p><strong>opencv</strong>
(설치: opencv-python 임포트: import cv2)</p>
<p>opencv는 컴퓨터 비전에 많이 사용되는 라이브러리입니다. 이미지 프로세싱, 얼굴 인식, 문자 인식 등 많은 기능을 제공합니다.</p>
<p>공식 웹사이트: <a href="https://opencv.org">https://opencv.org</a></p>
<h3 id="04-외부-패키지-실습---yt_dlp">04 외부 패키지 실습 - yt_dlp</h3>
<ol>
<li>유튜브 영상 다운로드 : yt_dlp 파이썬에서 설치</li>
<li>파일에서  해당 패키지 import 하고 실행하기 </li>
</ol>
<pre><code>import yt_dlp    


with yt_dlp.YoutubeDL() as ydl:   
    ydl.download([다운받고 싶은 영상 주소])</code></pre><ol start="3">
<li>PyPI를 보며 필요한 옵션 적용하기 </li>
</ol>
<h3 id="05-외부-패키지-실습---selenium">05 외부 패키지 실습 - selenium</h3>
<p>```
import time
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By</p>
<p>#웹드라이버 생성
driver = webdriver.Chrome()
driver.implicitly_wait(3)</p>
<p>#페이지 최대화
driver.maximize_window()</p>
<h1 id="httpsworkeycodeitkrcostagram-접속"><a href="https://workey.codeit.kr/costagram">https://workey.codeit.kr/costagram</a> 접속</h1>
<p>time.sleep(1)
driver.get(&#39;<a href="https://workey.codeit.kr/costagram&#39;">https://workey.codeit.kr/costagram&#39;</a>)</p>
<p>#로그인버튼 클릭
time.sleep(1)
driver.find_element(By.CSS_SELECTOR,&quot;.top-nav__login-link&quot;).click()
    #css형식으로, &quot;&quot;안의 요소를 찾아서, 클릭해라!
    #find_element( ).click()은 짝꿍처럼 기억하기</p>
<p>#ID입력
time.sleep(1.5)
driver.find_element(By.CSS_SELECTOR, &quot;.login-container__login-input&quot;).send_keys(&#39;codeit&#39;)
    # css형식으로, &quot;&quot;안의 요소를 찾아서, &#39;&#39;안의 값을 입력해라!
    #find_element( ).send_keys()은 짝꿍처럼 기억하기</p>
<p>#비밀번호 입력
time.sleep(1.5)
driver.find_element(By.CSS_SELECTOR, &quot;.login-container__password-input&quot;).send_keys(&#39;datascience&#39;)</p>
<p>#로그인
time.sleep(1.5)
driver.find_element(By.CSS_SELECTOR,&quot;.login-container__login-button&quot;).click()</p>
<h1 id="웹-페이지-가장-밑으로-스크롤">웹 페이지 가장 밑으로 스크롤</h1>
<h1 id="scrollheight-가져오기">scrollHeight 가져오기</h1>
<p>last_height = driver.execute_script(&quot;return document.body.scrollHeight&quot;)
    #&quot;&quot;안의 코드가 스크롤 높이 불러오는 코드
    #driver.execute_script는 Selenium의 한계를 극복해 자바스크립트 코드를 실행시키는 도구</p>
<p>while True:</p>
<pre><code>driver.execute_script(&quot;window.scrollTo(0, document.body.scrollHeight);&quot;)
    #window.scrollTo가 스크롤을 아큐먼트까지 내리라는 코드
time.sleep(1)

new_height = driver.execute_script(&quot;return document.body.scrollHeight&quot;)
    #끝까지 내린 후 추가 로딩되어 바뀐 스크롤 높이 규정

if new_height == last_height:
    break
last_height = new_height</code></pre><h1 id="모든-썸네일-요소-가져오기">모든 썸네일 요소 가져오기</h1>
<p>posts = driver.find_elements(by=By.CSS_SELECTOR, value=&#39;.post-list__post&#39;)
    #by=By.CSS_SELECTOR: 요소를 찾는 방식을 CSS 선택자로 지정합니다
    #value=&#39;.post-list__post: 찾고자 하는 요소의 CSS 클래스 이름을 &#39;.post-list__post&#39;로 지정합니다. 즉, HTML 코드에서 class=&quot;post-list__post&quot; 속성을 가진 모든 요소들을 찾는다는 의미입니다.</p>
<p>image_urls = []
    #posts 리스트에서 이미지 url에 해당하는 정보만 뽑아서 다시 리스트 만들거임</p>
<p>for post in posts:
    # 썸네일 클릭
    post.click() #<strong>post.click()</strong>은 Selenium WebDriver를 이용하여 웹 페이지에서 특정 요소를 클릭하는 명령입니다. 여기서 post는 .post-list__post 클래스를 가진 HTML 요소를 나타내는 WebElement 객체입니다. 즉, 이 코드는 해당 요소를 마치 사람이 마우스로 클릭하듯이 시뮬레이션하여, 그 요소가 연결된 페이지나 기능을 실행하는 효과를 냅니다.
    time.sleep(1)</p>
<pre><code># 이미지 주소 가져오기
style_attr = driver.find_element(by=By.CSS_SELECTOR, value=&#39;.post-container__image&#39;).get_attribute(&#39;style&#39;) # 특정 HTML 요소의 속성 값을 가져오는 데 사용. 여기서는 style을 가져옴
image_path = style_attr.split(&#39;&quot;&#39;)[1] #split은 특정 문자열(style_attr)에서  &quot;을 기준으로 나눈 후 []번째 숫자를 불러오는 함수
image_url = &#39;https://workey.codeit.kr&#39; + image_path
image_urls.append(image_url)

# 닫기 버튼 클릭
driver.find_element(by=By.CSS_SELECTOR, value=&#39;.close-btn&#39;).click()
time.sleep(1)</code></pre><p>driver.quit() #이제 브라우저에서 드라이버를 사용하는 것은 끝!</p>
<h1 id="이미지-다운받기">이미지 다운받기</h1>
<p>for i in range(len(image_urls)):
    image_url = image_urls[i]
    response = requests.get(image_url) #request.get은 해당 url에 접속해서 그 페이지 내용을 가져오는 기능
    filename = &#39;image{}.jpg&#39;.format(i) #파일 이름 동적으로 자동화~
    with open(filename, &#39;wb+&#39;) as f: #filename의 이름을 가진 빈 바이너리 파일을 새로 만들어서 f라 지정한다.
        f.write(response.content) #wite는 파일객체에 문자열을 쓰는, 즉 데이터 값을 기록하는 매서드로 f에 response의 값을 넣는 다는 뜻
                                #특히 response.content는 response.get으로 얻은 정보의 바이트 형태```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[1. 실용적 유닉스 커맨드 ]]></title>
            <link>https://velog.io/@rune_kkk/%EC%BD%94%EB%94%A9%EA%B8%B0%EC%B4%88-%EC%8B%A4%EC%9A%A9%EC%A0%81-%EC%9C%A0%EB%8B%89%EC%8A%A4-%EC%BB%A4%EB%A7%A8%EB%93%9C</link>
            <guid>https://velog.io/@rune_kkk/%EC%BD%94%EB%94%A9%EA%B8%B0%EC%B4%88-%EC%8B%A4%EC%9A%A9%EC%A0%81-%EC%9C%A0%EB%8B%89%EC%8A%A4-%EC%BB%A4%EB%A7%A8%EB%93%9C</guid>
            <pubDate>Sat, 21 Sep 2024 15:35:13 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/rune_kkk/post/73165a9d-c5d0-4306-b8b9-edf4e2dee555/image.png" alt=""></p>
<h2 id="0-기초">0. 기초</h2>
<p><strong>Command = 명령어</strong> : 검은화면에 복잡하게 쳐지는 코딩방식... 
<strong>Command Line Interface (command line)</strong> : 명령어로만 컴퓨터를 사용하는 방식
    &lt;-&gt; <strong>Graphical User Interface</strong> : 우리가 흔히 사용하는 화면과 마우스로 작업하는 방식 </p>
<p>어떤 커맨드를 사용하던 커맨드를 꼭 마주하게 됨</p>
<p><strong>Unix 유닉스</strong> = 1970년대에 개발된 운영 체제
    * 소프트웨어를 개발하고 실행할 수 있는 편리한 플랫폼
    * 쉽게 수정해서 다른 컴퓨터에 적용가능
    * 유닉스 기반의 다양한 운영체제 탄생 : MAC OS, LINUX 등 윈도우 제외의 대부분이 유닉스 운영체제를 기반으로 만들어짐 = 사용하는 커맨드가 모두 비슷함
    <img src="https://velog.velcdn.com/images/rune_kkk/post/0079cd97-f9bd-4c68-a6cf-d0f0ca8dbfdd/image.png" alt="">
    <img src="https://velog.velcdn.com/images/rune_kkk/post/7df64174-9bb1-4384-8e38-2d72dfbdc38a/image.png" alt=""></p>
<ul>
<li>수많은 상황에서 유닉스가 사용됨 : 인터넷에 웹사이트를 올리는 웹사이트 배포, 인공지능을 위한 파워풀한 서버 컴퓨터 사용시 등<ul>
<li>1000개가 넘은 것 중 핵심은 10-20개 학습 예정: 사용법, 파일과 폴더 다루기, 프로그램 설치 </li>
</ul>
</li>
</ul>
<p><strong>WSL</strong>  Windows Subsystem for Linux(리눅스용 윈도우 하위 시스템). 리눅스 커맨드와 커맨드라인 앱을 윈도우에서 실행할 수 있게 하는 가벼운 툴</p>
<p><strong>가상머신</strong>  사용하는 컴퓨터 안에 있는 &#39;또 다른 가상의 컴퓨터&#39;
윈도우를 쓰고 있더라도 그 안에서 가상 머신을 만들고 그 가상 머신에 리눅스 배포판 중 하나를 설치하면 리눅스 환경을 사용할 수 있다.
이를 가능하게 해주는 것이 &quot;가상화프로그램&quot; 예) VirtualBox</p>
<h2 id="1-시작하기">1. 시작하기</h2>
<p><strong>터미널</strong> 커멘드를 입력하는 검은 창, 인풋을 받고, 아웃풋을 출력해 주는 프로그램</p>
<p><strong>shell</strong>  커맨드를 해석해 주는 프로그램, date, cal 과 같은 커멘드를 컴퓨터는 이해 못함. 그래서 이런 커맨드들을 컴퓨터가 이해할 수 있는 형태로 바꿔줘야 하는데, 그게 바로 shell이 하는 역할이죠. shell이 date같은 커맨드를 컴퓨터가 이해할 수 있는 형태로 바꿔서 전달해 주면, 컴퓨터가 실제로 커맨드를 &#39;실행&#39;하고 결과를 되돌려 줌.
shell은 여러 종류가 있고, 종류에 따라 커맨드를 해석하는 방식이나 제공하는 인터페이스가 조금은 다를 수 있지만 대부분의 경우 아주 비슷하거나 똑같이 작동.
검은 화면&#39;을 그냥 shell이라고 부르는 경우도 많음. </p>
<p><strong>bush</strong> shell 종류 중 하나가 바로 bash(Bourne again shell)인데요. 가장 보편적이고, 많은 유닉스 운영 체제에서 기본 shell로 사용됩니다. 많은 분들이 사용하고 계실 Ubuntu의 기본 shell이기도 하고요. macOS는 10.15 Catalina 이전 버전에는 bash를 기본으로 썼었는데, 10.15 버전 이후부터는 zsh(Z shell)을 기본으로 쓰기 시작</p>
<hr>
<p><strong>프롬프트</strong> [사용자이름]@[컴퓨터 이름] ~ $
            ~의 위치는 폴더위치를 뜻하는데 ~는 배경화면임
            $ 또는 %는 프롬프트의 끝을 알려주는 기호</p>
<p><strong>커멘드</strong> 명령 
예)
date --- 현재 년월일 요일 시간이 나옴
cal --- 현재가 속한 월 달력이 나옴 </p>
<p><strong>argument 또는 인자</strong> 커멘드가 어느 대상에 대해 실행할지 지정해주는 것. 
예) 
cal 10 2024 --- 2024년 10월 달력이 출력됨</p>
<p><strong>option</strong> 커멘드가 실행되는 방식 바꾸기 / -뒤에 알파벳으로 
예)
cal -j 10 2024 --- 그냥 달력이 아닌 1월 1일부터의 D+ 날짜로 달력이 출력됨 </p>
<p>**커멘드 기본 형태 : 커멘드 + 옵션 + 아규먼트</p>
<p><strong>man = 커멘드 메뉴얼을 보는 커멘드</strong> 커멘드에 대해 알아볼때 인터넷 검색과 함께 매뉴얼도 활용할 것! 
예) ~ $ man cal
구성)
    <strong>NAME</strong> 커멘드 이름, 그리고 비슷한 커멘드의 이름과 정의
    <strong>SYNOPSIS</strong> 커멘드에 붙을 수 있는/붙어야하는 옵션과 아규먼트의 갈래
        []대괄호 속에 있으면 선택사항, 아니면 필수로 들어가야하는 옵션/아규먼트임
        [-A numbers] 라고 적혀 있으면 -A 옵션은 숫자로된 아규먼트가 필요하다는 뜻임 
    <strong>DESCRIPTION</strong> 커멘드에 대한 자세한 설명과 함께 각 옵션들에 대한 설명! 
    <strong>SEE ALSO</strong> 비슷한 커멘드 
    <strong>STANDARD</strong>
    <strong>HISTORY</strong>
    <strong>AUTHORS</strong>
    <strong>BUGS</strong></p>
<p>긴 창 보는 방법)** 방향키 위, 아래** = 한칸씩 오르내리기 / <strong>F, B</strong> = 한 페이지씩 오르내리기 </p>
<p><strong>나가기) Q</strong> 누르기</p>
<p><strong>위쪽 방향키</strong> 프롬프트에 커서를 두고 위쪽 방향키를 누르면 바로 전에 입력한 커멘드가 자동 입력된다. 계속 위쪽 방향키를 누르면 계속 그 전에 전전의 커멘드가 나온다. 매우 유용</p>
<p><strong>커서 이동 단축키</strong> 커멘드가 긴 경우 커서 위치를 빠르게 옮기는 꿀팁
    ctrl + a = 줄 가장 앞으로
    ctrl + e = 줄 가장 뒤로
    alt + 오른쪽, 왼쪽 방향키 = 앞뒤의 단어간으로 커서 이동 </p>
<p><strong>종료 = ctrl + c</strong> 커멘드를 쓰다가 ctrl+c하면 바로 아래의 새 프롬프트가 뜨며 커멘드를 새로 쓸 수 있게 해주고, 커멘드가 실행되는 중이라면 실행을 멈추고 새 프롬프르가 나오게 해준다. </p>
<p><strong>clear</strong>  프롬프트에 clear를 커멘드를 실행하면, 터미널에 이전 명령과 실행값들을 안보이게 깨끗하게 해줌. 단, 안보일뿐 기록은 남아있음. 위쪽 방향키를 누르면 이전 명령들을 불러올 수 있다</p>
<p><strong>tap</strong> 커멘드와 아규먼트 자동완성! 
    커멘드를 쓰다가 도중에 tap을 치면 자동완성되거나, 자동완성될 후보들을 나열해서 보여줌
    폴더 경로 등 기<del>~</del>인 아규먼트를 가져올때도 매우 유용</p>
<hr>
<h2 id="2-디렉토리와-파일-다루기">2. 디렉토리와 파일 다루기</h2>
<h4 id="유닉스-폴더-구조와-파일-경로">유닉스 폴더 구조와 파일 경로</h4>
<p><strong>디렉토리</strong> = 유닉스의 폴더 구조, 나무 뿌리 모양
    최상위 root 폴더
    하위/자식 폴더, 상위/부모 폴더
    home = 사용자별 개인 파일 / 
    컴퓨터에 깔려있는 프로그램 등 일반적으로 필요한 파일들은 home 바깥에 
<img src="https://velog.velcdn.com/images/rune_kkk/post/f38e4b3b-63f6-4df7-b482-6545b53c4fdc/image.png" alt=""></p>
<p>*<em>파일경로 쓰기 *</em>: 디렉토리의 위치를 문자열로 표기하기 
    백슬래쉬로 나눠서 씀 root/usr/bin
    최초의 root는 그냥 /로 생략 가능
    지금 현 사용자의 home 디렉토리는 ~로 생략가능 : ~codeit/desktop/</p>
<hr>
<h4 id="디렉토리-파일-둘러보는-법">디렉토리 파일 둘러보는 법</h4>
<p><strong>PWD</strong> 현재 위치(WORKING DIRECTORY) 알려줘!  PRINT WORKING DIRECTORY
<strong>CD</strong> CHANGE DIRECTORY, 
    cd / = 루트 디렉토리로 
    cd ~ 또는 그냥 cd = 홈디렉터리로
    cd - = 이전에 있던 디렉토리로 
<strong>LS</strong> list, 디렉토리의 내용물을 리스트해서 알려줌 
    ls = 현재의 디렉토리
    ls + 원하는 디렉토리를 아규먼트로! 
<img src="https://velog.velcdn.com/images/rune_kkk/post/5d97c21e-08f8-49bd-ace2-32ff89cb2660/image.png" alt="">
    ls -a  = 숨겨진 파일들까지 다 보이게 .로 시작하는 여러 숨은 파일들까지 보여줌
    <img src="https://velog.velcdn.com/images/rune_kkk/post/1b58b2c8-ccd3-4767-8d55-c49b00c9ed24/image.png" alt="">
    ls -l  = long format 즉 상세정보가 보이게
        파일종류, 권한, 연결된 링크, 파일 소유자, 소유자 그룹, 파일 바이트 크기(디렉토리 용량과 다름), 마지막 수정날짜 시간, 파일이름 
    <img src="https://velog.velcdn.com/images/rune_kkk/post/72d03148-4626-47b7-81d9-d00858544440/image.png" alt=""></p>
<hr>
<h4 id="절대경로-상대경로">절대경로 상대경로</h4>
<p><strong>절대경로</strong> 홈디렉토리부터 가고자하는 위치까지 구체적이게 나열하는법
    목표 위치가 홈과 가까운 곳, 또는 지금위치보다 먼~ 곳이라면 유리하지만, 그렇지 않으면 상대경로가 더 효율적일 수 있다. </p>
<p><strong>상대경로</strong> 현재 자신이 있는 디렉토리 기준으로 경로를 나타내는 것
    <strong>현재 디렉토리 = .</strong>
    <strong>상위 디렉토리 = ..</strong></p>
<p>예시)
     절대경로: /home/rune_kim/Documents/PycharmProjects/django
    만약 지금 내가 PycharnProject라면?
        cd ./django
    Documents로 가려면?
        cd ..
    home의 다른 하위폴더로 가려면?
        cd ../../../hy_kim    (또는) cd ~/hy_kim</p>
<blockquote>
<p>만약 파일/디렉토리 이름에 공백이 있으면 어떻게 해야 할까요?
cd hello world (오류 발생)
방법1. 작은 따옴표 cd &#39;hello world&#39;
방법2. 큰 따옴표 cd &quot;hello world&quot;
방법3. 역슬레시 사용 cd hello\ world
but 최고 좋은 방법은 파일이나 디렉토리 이름에는 애초에 공백을 안 사용하는것
<strong>공백 대신 _같은 기호</strong>를 사용하는게 좋음</p>
</blockquote>
<hr>
<h4 id="루트-디렉토리의-하위-디렉토리들">루트 디렉토리의 하위 디렉토리들</h4>
<p><strong>/bin</strong>
bin은 &#39;binaries&#39;의 약자인데요. binary는 간단히 말해서 컴퓨터가 실행할 수 있는 프로그램을 뜻합니다. 여기서 중요한 사실을 하나 알려드릴게요. 우리가 커맨드를 입력하면 마법같이 어떤 동작이 일어나는데요. 커맨드도 결국 어떤 프로그램입니다. 커맨드를 입력하면 커맨드에 해당하는 프로그램이 실행되는 거죠. 그리고 그 프로그램들의 일부는 바로 이 /bin 디렉토리 안에 있습니다.
<img src="https://velog.velcdn.com/images/rune_kkk/post/055b2297-833b-482b-8337-92ed75d46fb3/image.png" alt=""></p>
<p><strong>/sbin</strong>
sbin은 bin과 비슷한데, 관리자 전용 프로그램들이 있습니다.</p>
<p><strong>/etc</strong>
etc에는 컴퓨터 설정 파일들이 있는데요. 각종 프로그램의 설정 파일, 관리자 권한 설정 파일 같은 것들이 있습니다.</p>
<p><strong>/home 또는 /Users</strong>
/home(리눅스) 또는 /Users(맥 OS) 디렉토리에는 사용자들의 홈 디렉토리가 있습니다. 사용자의 홈 디렉토리는 사용자의 모든 파일을 저장해 놓는 곳입니다.</p>
<p>사실 맥 OS에도 /home 디렉토리가 있기는 한데요. 이 디렉토리는 사용되지 않습니다. 안을 확인해 보셔도 아무 파일도 없을 거에요.</p>
<p><strong>/usr</strong>
usr은 사용자(user)에게 필요한 파일들을 저장하고 있습니다. /usr 안에도 각종 binary(프로그램 파일)를 저장하고 있는 bin 디렉토리가 있는데요. /bin에는 컴퓨터가 시작하거나 자신을 수리하기 위해서 꼭 필요한 커맨드들이 있고, /usr/bin에는 컴퓨터가 필요하기보다는 사용자가 필요한 커맨드들이 있습니다.
그리고 /usr 안에는 local이라는 디렉토리도 있는데요. 여기에는 사용자가 직접 설치한 프로그램과 관련된 파일들이 있습니다.</p>
<hr>
<h4 id="디렉토리와-파일-만들기">디렉토리와 파일 만들기</h4>
<p><strong>mkdir</strong> 디렉토리 만들기, 아규먼트로 디렉토리 위치와 이름을 적어주면 만들어짐, 띄어쓰기로 만들고 싶은 파일 여러개를 연달아 적어줘도 됨
<img src="https://velog.velcdn.com/images/rune_kkk/post/2590d7f1-c364-4475-bcdd-1fb5522846d1/image.png" alt=""></p>
<p><strong>touch</strong> 파일에 손을 대서 마지막 접근시간 수정시간을 수정하는 코멘드지만 파일이 없을 땐 그이름으로 새로 만드는 역할도 함 
<img src="https://velog.velcdn.com/images/rune_kkk/post/3a4b8594-ab6f-4271-8fd2-0e2d78d027bd/image.png" alt=""></p>
<hr>
<h4 id="vim-사용하기">vim 사용하기</h4>
<p><strong>vim</strong>: CLI 전용 텍스트 에디터 중 가장 대표적. 엄청나게 많은 기능과 단축키 BUT 키보드만 가능해서 마스터에 오랜시간이 걸림
    프롬프트 뒤에 vim 커맨드를 사용하면 vim 실행 &gt; 첫화면 
    파일 경로를 아규먼트로 주면 해당하는 파일을 열거나, 존재하지 않으면 새로 만들어 줍니다.
        예) vim path/to/file</p>
<p><strong>4가지 사용모드</strong> : 단축키를 눌러서 모드를 변환하고, esc를 눌러서 일반모드로 돌아온다. 터미널 제일 하단에 어떤 모드인지가 써있다.
        <img src="https://velog.velcdn.com/images/rune_kkk/post/73a4b86d-de8a-4a30-98f9-d6a66ac95d95/image.png" alt="">
        <img src="https://velog.velcdn.com/images/rune_kkk/post/d6072c77-1f3c-40df-ab9d-0c587061f6ea/image.png" alt=""></p>
<p><strong>vim 단축키</strong>
    텍스트 입력: 입력 모드(i) → 텍스트 입력
    텍스트 한 줄 복사: 일반 모드 → 복사하고 싶은 줄에 커서 위치 → yy
    텍스트 한 줄 잘라내기: 일반 모드 → 잘라내고 싶은 줄에 커서 위치 → dd
    특정 영역 복사: 비주얼 모드(V는 줄 단위, v는 글자 단위) → 복사하고 싶은 영역 커서로 설정 → y
    특정 영역 잘라내기: 비주얼 모드(V는 줄 단위, v는 글자 단위) → 잘라내고 싶은 영역 커서로 설정 → d
    텍스트 붙여넣기: 일반 모드 → 붙여넣고 싶은 위치에 커서 위치 → p
    파일 저장: 명령 모드(:) → w + enter
    파일 저장 + vim 종료: 명령 모드(:) → wq + enter
    vim 종료 (내용 저장되지 않음): 명령 모드(:) → q! + enter</p>
<hr>
<h4 id="각종-코멘드">각종 코멘드</h4>
<p><strong>cat (concatenate)</strong> 경로에 해당하는 파일들의 내용을 출력합니다. 파일이 여러 개인 경우 내용을 모두 붙여서 출력합니다.
    예) cat file1.txt</p>
<p><strong>less</strong> PATH에 해당하는 파일을 페이지 단위로 나눠서 보여줍니다.
    예) less file1.txt
    각종 단축키
        줄 이동: 위쪽 / 아래쪽 방향키
        다음 페이지: space 아니면 f
        이전 페이지: b
        마지막 페이지: G<br>        처음 페이지: g</p>
<p><strong>head</strong> PATH에 해당하는 파일의 처음 10줄을 출력합니다.
    n 옵션: 출력되는 줄 개수를 바꿉니다.
    예) head -n 5 file1.txt</p>
<p><strong>tail</strong> PATH에 해당하는 파일의 마지막 10줄을 출력합니다.
    n 옵션: 출력되는 줄 개수를 바꿉니다.
    예) tail -n 5 file1.txt</p>
<p><strong>mv (move)</strong> 디렉토리/파일을 이동하거나 이름을 변경합니다. 
    두 번째 아규먼트(DEST_PATH) 가 이미 존재하는 디렉토리의 경로일 경우 SOURCE_PATH에 해당하는 디렉토리/파일을 그 안으로 이동하고, 그렇지 않으면 DEST_PATH로 이름 변경합니다.
    i 옵션: 이동/이름 변경을 할 때 똑같은 이름의 디렉토리/파일이 있으면 덮어씌워집니다. 확인을 하면서 mv를 하려면 i 옵션을 사용하면 됩니다.
    예) mv -i file1.txt file2.txt   = file1 이름을 file2로 바꾼다
        mv -i file1.txt dir1   = file1을 dir1로 옮긴다. </p>
<p><strong>cp (copy)</strong> 디렉토리/파일을 복사합니다. 
    cp [-ri] SOURCE_PATH DEST_PATH
    두 번째 아규먼트(DEST_PATH) 가 이미 존재하는 디렉토리의 경로일 경우 SOURCE_PATH에 해당하는 디렉토리/파일을 그 안으로 복사하고, 그렇지 않으면(현재 디렉토리에서) DEST_PATH라는 이름으로 복사합니다.
    r 옵션: 파일이 아닌 디렉토리를 복사할 때는 꼭 r 옵션을 써야 합니다. r=제귀적이다, 즉 자기자신을 복사한다는 뜻
    i 옵션: 복사할 때 똑같은 이름의 파일이 있으면 덮어씌워집니다. 확인을 하면서 cp를 하려면 i 옵션을 사용하면 됩니다.  y/n 선택기능
    예) cp -i file1.txt file2.txt  = file1을 지금폴더에 file2.란 이름으로 복사하기 
        cp -ri dir1 dir2 = dirl1을 dirl2로 복사하거나, dirl2란 이름으로 복사하기.</p>
<p><strong>rm (remove)</strong> 경로에 해당하는 파일/디렉토리들을 지워줍니다.
    rm [-rif] PATH1 PATH2 ...    여러 파일/디렉토리를 나열하여 한번에 지울 수 있다. 
    r 옵션: 디렉토리를 삭제할 때는 꼭 r 옵션을 써야 합니다.
    i 옵션: 삭제할 때 각 파일을 정말 지울 것인지 물어봅니다.
        <img src="https://velog.velcdn.com/images/rune_kkk/post/a7e695f8-e272-4a2d-a875-779fcb3869b8/image.png" alt="">
    f 옵션: 지울 것인지 절대 확인하지 않고 바로 지웁니다.
    예) rm file1.txt file2.txt
        rm -rf dir1</p>
<hr>
<h2 id="3-외부-프로그램-설치하기">3. 외부 프로그램 설치하기</h2>
<p><strong>apt</strong> 우분투에서 외부 프로그램 설치하는 코멘드
    1. 업데이트 : <strong>sudo apt update</strong>를 먼저 해줘야한다 
        apt로 설치할 수 있는 최신 프로그램/버전들을 인터넷에서 컴퓨터로 불러와줌. 안그러면 오류남
         sudo: apt를 실행하려면 관리자 권한으로 해야함.  sudo 뒤에 command를 쓰면, 관리자 권한을 가지고 command가 실행됨. sudo를 처음 실행하면 현재 계정의 비밀번호를 물어보는데, 한 번 입력하면 10분~15분 정도는 다시 입력하지 않아도 됩니됨.  (비번을 입력할떄 * 표시 안됨 주의)
    2. 프로그램 깔기: <strong>sudo apt install (프로그램)</strong>
    3. 삭제하기: <strong>sudo apt remove (프로그램)</strong></p>
<hr>
<h2 id="4-for-window-users">4. for window users</h2>
<h4 id="wsl">WSL</h4>
<p>WSL을 사용하면 듀얼 부팅이나 가상 머신을 사용하는 것보다 더 가볍게 리눅스 환경을 이용할 수 있었습니다. 사실 WSL을 사용하는 데에는 또 다른 장점이 있는데요. 바로 윈도우에 있는 파일에 쉽게 접근할 수 있다는 겁니다. 듀얼 부팅이나 가상 머신을 사용하면 별도의 리눅스 환경이 생성되기 때문에 리눅스를 사용할 때는 윈도우에 있는 파일에 접근하기 어려운데요. WSL은 윈도우 안에 존재하는 &#39;하위 시스템&#39;이기 때문에 윈도우 파일에 쉽게 접근할 수 있습니다. </p>
<p><strong>윈도우 파일은 /mnt/c 경로에 있습니다.</strong> /mnt/c 가 윈도우의 C: 드라이브입니다.</p>
<p>사용자의 홈 디렉토리는 C: 드라이브의 Users 디렉토리 안에 있는데요. Users 뒤에 윈도우 사용자 이름을 붙이면 됩니다. 그러니까 사용자 이름이 username이라면 username 사용자의 홈 디렉토리는 /mnt/c/Users/username이 되는 거죠</p>
<h4 id="powershell">PowerShell</h4>
<p>윈도우 전용 커맨드라인 툴. 시스템 관리, 자동화, 개발 등 다양한 작업을 할 수 있고 기본 유닉스 커맨드도 지원합니다.
윈도우 유저라면 cmd(명령 프롬프트/Command Prompt)를 들어보셨을 수도 있는데요. cmd도 윈도우 전용 커맨드라인 툴입니다.하지만 PowerShell에 비해 기능이 적고 cmd에서 할 수 있는 모든 건 PowerShell에서도 할 수 있습니다. 간단한 작업을 할 때는 cmd를 써도 되지만, PowerShell이 더 복잡한 것도 아니니까 그냥 PowerShell을 쓰는게 무방합니다.</p>
<p>PowerShell을 처음 사용한다면 <strong>도움말을 업데이트하는 것을 추천</strong>드립니다. 그래야 나중에 커맨드의 도움말을 제대로 확인할 수 있습니다. 도움말 업데이트도 PowerShell에서 할 수 있습니다.
윈도우 메뉴에 &#39;powershell&#39;을 검색하고 관리자로 실행해 주세요. 여기 Update-Help라고 입력한 다음 엔터를 누르세요.</p>
<p>PowerShell에서는 아래 유닉스 커맨드를 사용할 수 있습니다:</p>
<p>man
pwd
cd
ls
mkdir
cat
mv
rm
cp
date
clear</p>
<p>PowerShell에서는 기본적으로 cmdlet이라고 하는 커맨드들을 사용하는데요. cmdlet은 보통 &quot;Action-Object  &quot; 같이 생겼습니다. 하고 싶은 동작과 대상 사이에 - 를 넣는 거죠. PowerShell에 ls같은 걸 입력하면 ls는 Get-ChildItem이라는 cmdlet을 가리키고 있기 때문에 ls를 사용할 수 있는 겁니다 (이럴 때 ls를 Get-ChildItem의 alias(에일리어스)라고 합니다). 하지만 결국 유닉스의 ls가 아닌 Get-ChildItem이 호출되는 것이기 때문에 옵션을 주는 방법과 커맨드의 동작은 조금 다를 수 있습니다.</p>
<p><strong>실제 유닉스 커맨드와 차이점</strong>
경로
우선 윈도우에서는 경로를 표시할 때 / 대신 (한국 키보드는 ₩)를 사용하는데요. PowerShell에서 /를 입력해도 되지만 프롬프트에 경로를 표시할 때나 자동완성을 활용할 경우 \가 사용됩니다.</p>
<p>옵션
cmdlet 옵션은 한 글자가 아닌 전체 단어입니다 (예: -Recurse). 유닉스 커맨드처럼 한 글자(예: -r)로 줄여 쓸 수 있는 옵션들도 있지만 그럴 수 없는 옵션들도 많고, 일일이 외워야 하기 때문에 PowerShell 옵션을 그대로 사용하는 것을 추천드립니다. </p>
]]></description>
        </item>
    </channel>
</rss>