<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://cw-yi.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://cw-yi.github.io/" rel="alternate" type="text/html" /><updated>2024-11-28T11:40:24+00:00</updated><id>https://cw-yi.github.io/feed.xml</id><title type="html">CWYI BLOG</title><subtitle>파이썬</subtitle><author><name>이채원</name><email>cwyi@gmail.com</email></author><entry><title type="html">Deployment and Monitoring</title><link href="https://cw-yi.github.io/memo/Deloyment-and-Monitoring/" rel="alternate" type="text/html" title="Deployment and Monitoring" /><published>2024-11-07T00:00:00+00:00</published><updated>2024-11-07T00:00:00+00:00</updated><id>https://cw-yi.github.io/memo/Deloyment%20and%20Monitoring</id><content type="html" xml:base="https://cw-yi.github.io/memo/Deloyment-and-Monitoring/"><![CDATA[<h1 id="deloyment-and-monitoring">Deloyment and Monitoring</h1>

<h2 id="효율적인-배포-전략">효율적인 배포 전략</h2>

<p><img src="/assets/images/Deloyment and Monitoring/image.png" alt="image.png" /></p>

<p>(롤아웃* → 발표, 생산, 출시 등을 뜻함)</p>

<h3 id="배포-전략들"><strong>배포 전략들</strong></h3>

<ul>
  <li>recreate : 이전 버전 A가 종료 된 후 신규 버전 B가 롤아웃됨</li>
  <li>rolling(ramped) :  신규 버전 B가 천천히 롤아웃되며 이전 버전 A를 교체</li>
  <li>blue/green : 신규 버전 B가 이전 버전 A와 함께 배포된 후 트래픽이 신규인 B로 교체</li>
  <li>canary : 신규 버전 B가 일부 사용자에게 배포된 후 전체 롤아웃으로 진행</li>
  <li>A/B testing : 신규 버전 B는 특정 조건에서 사용자의 하위 집합으로 배포</li>
  <li>shadow : 신규 버전 B는 이전 버전 A와 함께 실제 트래픽을 수신하지만 응답에 영향을 미치지 않고 숨어있음</li>
</ul>

<h3 id="배포-전략-요약"><strong>배포 전략 요약</strong></h3>

<ul>
  <li>recreate 방법은 서비스가 중단되기 때문에 사용X</li>
  <li>개발/스테이징 배포는 특별한 설정이 없는 rolling 방법이 좋음</li>
  <li>프로덕션 환경 배포는 rolling이나 blue/green 배포가 일반적</li>
  <li>안정성에 대한 확신이 없는 경우 canary나, A/B test, shadow 배포 방법을 사용할 수 있음</li>
</ul>

<h3 id="cicd-파이프라인을-구성할-때-고려해야하는-요소"><strong>CI/CD 파이프라인을 구성할 때 고려해야하는 요소</strong></h3>

<p><img src="/assets/images/Deloyment and Monitoring/image1.png" alt="image1.png" /></p>

<h3 id="배포-전략을-세울-때-고려해야-하는-요소"><strong>배포 전략을 세울 때 고려해야 하는 요소</strong></h3>

<p><img src="/assets/images/Deloyment and Monitoring/image2.png" alt="image2.png" /></p>

<h3 id="단계별-배포-파이프라인"><strong>단계별 배포 파이프라인</strong></h3>

<p><img src="/assets/images/Deloyment and Monitoring/image3.png" alt="image3.png" /></p>

<p>https://www.msaschool.io/operation/deployment/deployment-three/</p>

<p>https://velog.io/@appti/%EB%B0%B0%ED%8F%AC%EB%A5%BC-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EC%A0%84%EC%97%90-%EB%B0%98%EB%93%9C%EC%8B%9C-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-%EA%B2%83%EB%93%A4</p>

<hr />

<h2 id="효율적인-모니터링">효율적인 모니터링</h2>

<h3 id="클라우드-모니터링-전략"><strong>클라우드 모니터링 전략</strong></h3>

<ol>
  <li>클라우드 리소스 시각화</li>
  <li>자동화된 알림 설정 → 이벤트 알람을 통해 인시던트를 빠르고 효율적으로 관리</li>
</ol>

<h3 id="리소스-최적화를-위한-실질적인-방법"><strong>리소스 최적화를 위한 실질적인 방법</strong></h3>

<ol>
  <li>자동화된 인스턴스 관리</li>
  <li>스케일링 전략 (수직/수평)</li>
  <li>RI(Reserved Instances) SP(Saving plans) 활용</li>
</ol>

<h3 id="클라우드-비용-최적화를-위한-방법"><strong>클라우드 비용 최적화를 위한 방법</strong></h3>

<ol>
  <li>정기적인 사용량 모니터링을 통해 불필요한 리소스 파악 후 제거</li>
  <li>자동 스케일링을 설정하여 필요할 때만 리소스를 할당, 사용량이 감소할 때 자동으로 축소</li>
  <li>예약 인스턴스와 스팟 인스턴스를 활용해 비용을 절감</li>
  <li>멀티 클라우드 전략을 도입하여 각 클라우드 제공업체의 장점을 최적화</li>
  <li>태그 및 카테고리화를 통해 리소스를 체계적으로 관리하고 비용을 정확히 추적</li>
  <li>비용 관리 도구를 사용해 실시간으로 비용을 추적하고 분석하여, 예산 초과를 방지하고 비용 절감</li>
</ol>

<h3 id="모니터링-도구"><strong>모니터링 도구</strong></h3>

<ul>
  <li><strong>Splunk</strong>
    <ul>
      <li>데이터 수집, 분석 및 시각화를 위한 로그 관리 및 분석 도구로, DevOps의 환경에서 활용됨</li>
      <li>장점
        <ul>
          <li>강력한 로그 분석 기능 및 데이터 시각화</li>
          <li>확장 가능한 플랫폼 / 광범위한 데이터 소스와 통합 지원</li>
        </ul>
      </li>
      <li>단점
        <ul>
          <li>복잡한 설정과 높은 비용, 성능 최적화가 필요할 수 있음</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>BigPanda</strong></li>
  <li><strong>DynaTrace</strong>
    <ul>
      <li>애플리케이션 성능 모니터링(APM) 도구, AI 기반의 문제 진단과 자동화된 분석을 제공</li>
      <li>장점
        <ul>
          <li>AI 기반 분석으로 문제 탐지 및 해결이 빠름</li>
          <li>실시간으로 전체 스택 모니터링 / 컨테이너와 클라우드 환경 최적화</li>
        </ul>
      </li>
      <li>단점
        <ul>
          <li>상대적으로 높은 비용 / 사용 학습 곡선이 존재</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>PagerDuty</strong></li>
  <li><strong>AppDynamics</strong>
    <ul>
      <li>애플리케이션 성능 관리 도구, 성능 및 사용자 경험을 실시간으로 모니터링</li>
      <li>장점
        <ul>
          <li>애플리케이션 중심의 깊은 가시성 제공</li>
          <li>데이터 기반의 실시간 분석 / 사용자 경험 중심의 성능 관리</li>
        </ul>
      </li>
      <li>단점
        <ul>
          <li>고급 설정에 시간에 리소스가 소요 / 비용이 비교적 높음</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>Moogsoft</strong></li>
  <li><strong>Datadog</strong></li>
  <li><strong>Edgedelta</strong></li>
</ul>

<p>https://blog.kyobodts.co.kr/2024/09/03/%ED%9A%A8%EC%9C%A8%EC%A0%81%EC%9D%B8-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%EC%A0%84%EB%9E%B5%EA%B3%BC-%EB%8F%84%EA%B5%AC/</p>

<p>https://clickup.com/ko/blog/146161/aiops-tools</p>]]></content><author><name>이채원</name><email>cwyi@gmail.com</email></author><category term="Memo" /><category term="SE study" /><summary type="html"><![CDATA[Deloyment and Monitoring]]></summary></entry><entry><title type="html">Service Implementation</title><link href="https://cw-yi.github.io/memo/Service-Implementation/" rel="alternate" type="text/html" title="Service Implementation" /><published>2024-10-10T00:00:00+00:00</published><updated>2024-10-10T00:00:00+00:00</updated><id>https://cw-yi.github.io/memo/Service%20Implementation</id><content type="html" xml:base="https://cw-yi.github.io/memo/Service-Implementation/"><![CDATA[<h1 id="service-implementation">Service Implementation</h1>

<h2 id="서버-서비스-배포-방식">서버 서비스 배포 방식</h2>

<h3 id="무중단-배포"><strong>무중단 배포</strong></h3>

<ul>
  <li>서비스 장애와 배포의 부담을 최소화</li>
  <li>운영 중인 서비스를 중단하지 않고 신규 소프트웨어를 배포하는 기술</li>
</ul>

<p><img src="/assets/images/Service/image.png" alt="image.png" /></p>

<h3 id="롤링-배포rolling-deployment"><strong>롤링 배포(Rolling Deployment)</strong></h3>

<ul>
  <li>무중단 배포의 가장 기본적인 방식</li>
  <li>사용 중인 인스턴스 내에서 새 버전을 점진적으로 교체
    <ul>
      <li>서비스 중인 인스턴스 하나를 로드밸런서에서 라우팅하지 않도록 한 뒤, 새 버전을 적용하여 다시 라우팅 하도록 하는 과정을 반복 → 모든 인스턴스에 새 버전의 어플리케이션을 배포</li>
      <li>인스턴스마다 차례로 배포를 진행하기 때문에 손쉽게 롤백이 가능</li>
      <li>구버전과 신버전이 공존하기 때문에 호환성 문제 발생 가능</li>
    </ul>
  </li>
</ul>

<p><img src="/assets/images/Service/image1.png" alt="image1.png" /></p>

<h3 id="블루-그린-배포blue-green-deployment"><strong>블루-그린 배포(Blue-Green Deployment)</strong></h3>

<ul>
  <li>블루를 구버전, 그린을 신버전으로 지칭하여 붙여진 이름</li>
  <li>운영 환경에 구버전과 동일하게 신버전의 인스턴스를 구성한 후, 로드밸런서를 통해 신버전으로 모든 트래픽을 전환하는 배포 방식
    <ul>
      <li>구버전과 동일한 환경으로 인스턴스를 구성하기 때문에 실제 서비스 환경에서 신버전을 미리 테스트할 수 있고, 빠른 롤백이 가능</li>
      <li>배포가 완료된 후 남아 있는 구버전의 환경을 다음 배포에 재사용 가능</li>
      <li>시스템 자원이 두 배로 필요함</li>
    </ul>
  </li>
</ul>

<p><img src="/assets/images/Service/image2.png" alt="image2.png" /></p>

<h3 id="카나리-배포canary-deployment"><strong>카나리 배포(Canary Deployment)</strong></h3>

<ul>
  <li>옛날 광부들이 카나리아 새를 이용해 가스 누출 위험을 감지한 것에서 유래, 잠재적 문제 상황을 미리 발견하기 위한 방식</li>
  <li>신버전의 제공 범위를 늘려가면서 모니터링 및 피드백 과정을 거침
    <ul>
      <li>로드밸런서를 통해 신버전을 경험하는 사용자를 조절할 수 있는 것이 특징</li>
      <li>실제 운영 환경에서 미리 테스트한다는 점이 블루-그린 배포와 비슷함</li>
    </ul>
  </li>
  <li>단계적 전환 방식을 통해 부정적 영향을 최소화, 상황에 따라 트래픽 양 조절 가능</li>
  <li>버전 관리가 필요</li>
</ul>

<p><img src="/assets/images/Service/image3.png" alt="image3.png" /></p>

<p>https://www.samsungsds.com/kr/insights/1256264_4627.html</p>

<hr />

<h2 id="devops--agile">DevOps &amp; Agile</h2>

<ul>
  <li>소프트웨어 개발의 모든 측면에 효율성과 예측 가능성을 제공하는 두 가지 상호 보완적인 방법</li>
</ul>

<h3 id="devops">DevOps</h3>

<ul>
  <li>기존 개발 팀과 운영 팀 간의 벽을 없애는 소프트웨어 제공 접근 방식</li>
  <li>구축, 테스트 및 배포 프로세스를 최대한 자동화 → 이를 통해 새 소프트웨어 버전을 자주 릴리즈 할 수 있음</li>
  <li>배포 파이프라인을 사용하여 여러 환경에 한 번에 배포하는 방식</li>
  <li>코드형 인프라(IaC)를 사용 → 팀에서 관리 및 프로비저닝을 소프트웨어 개발 작업으로 처리할 수 있음</li>
</ul>

<p><img src="/assets/images/Service/image4.png" alt="image4.png" /></p>

<h3 id="애자일-방법론">애자일 방법론</h3>

<ul>
  <li>협업, 신속한 소프트웨어 릴리스, 고객 피드백에 초점을 맞춘 반복적인 소프트웨어 개발 접근 방식</li>
  <li>작업을 ‘스토리’라는 작은 단위로 나누고, ‘스프린트’라는 짧은 반복 기간 동안 작업
    <ul>
      <li>각 스프린트에서는 새로운 소프트웨어 빌드를 출시</li>
    </ul>
  </li>
</ul>

<p><img src="/assets/images/Service/image5.png" alt="image5.png" /></p>

<p>https://www.netapp.com/ko/devops-solutions/what-is-devops/</p>

<p>https://unity.com/kr/topics/agile-vs-devops</p>

<p>https://aws.amazon.com/ko/compare/the-difference-between-agile-devops/</p>

<hr />

<h2 id="cicd">CI/CD</h2>

<h3 id="cicd-지속적-통합과-제공">CI/CD (지속적 통합과 제공)</h3>

<ul>
  <li>CI(지속적 통합)
    <ul>
      <li>개발자가 코드 변경 사항을 자동화된 빌드 및 테스트를 실행하는 중앙 저장소에 커밋하는 개발 방법</li>
      <li>지속적 통합 파이프라인에는 코드 커밋, 기본 자동 린팅, 종속성 확인, 소프트웨어 구축 및 빌드 아티팩트 생성 등 일련의 단계가 포함됨</li>
      <li>Github, Gitlab 등과 같은 소스 코드 관리 시스템에서는 Jenkins와 같은 CI도구에서 각 코드 체크인 후 빌드 및 테스트 실행을 자동으로 시작할 수 있는 Webhook 통합을 제공</li>
    </ul>
  </li>
  <li>CD(지속적 제공)
    <ul>
      <li>지속적 통합이 마무리되는 지점</li>
      <li>애플리케이션을 클라우드 인프라 환경에 자동으로 전달</li>
      <li>새로운 코드 변경 사항과 테스트 완료된 코드 변경 사항을 클라우드 환경 전체에 적용 가능</li>
    </ul>
  </li>
</ul>

<h3 id="cicd-툴-예시">CI/CD 툴 예시</h3>

<ul>
  <li>Jenkins
    <ul>
      <li>중앙 빌드 및 지속적인 통합 프로세스 가능</li>
      <li>소프트웨어 개발 프로젝트의 빌드 파이프라인 구성, 빌드 자동화의 확립, 배포 및 테스트 자동화 등을 지원</li>
      <li>https://www.jenkins.io/</li>
    </ul>
  </li>
  <li>CircleCI
    <ul>
      <li>코드 구축, 테스트 배포에 이르기까지의 파이프라인 전반에 걸쳐 신속한 소프트웨어 개발 및 게시를 지원</li>
      <li>Github Enterprise, Bitbucket과 통합하여 사용 가능</li>
      <li>https://circleci.com/</li>
    </ul>
  </li>
  <li>TeamCity
    <ul>
      <li>Java 환경에서 실행되며 Visual Studio 및 IDE와 통합 가능</li>
      <li>Window와 Linux 모두 설치 가능하며, .Net 프로젝트도 지원</li>
      <li>https://www.jetbrains.com/teamcity/</li>
    </ul>
  </li>
  <li>Bamboo
    <ul>
      <li>https://www.atlassian.com/software/bamboo</li>
    </ul>
  </li>
  <li>Gitlab
    <ul>
      <li>https://about.gitlab.com/</li>
      <li>
        <p>gitlab vs github action</p>

        <p><img src="/assets/images/Service/image6.png" alt="image6.png" /></p>
      </li>
    </ul>
  </li>
</ul>

<p>https://www.oracle.com/kr/devops/what-is-devops/</p>]]></content><author><name>이채원</name><email>cwyi@gmail.com</email></author><category term="Memo" /><category term="SE study" /><summary type="html"><![CDATA[Service Implementation]]></summary></entry><entry><title type="html">Cloud Computing</title><link href="https://cw-yi.github.io/memo/Cloud-Computing/" rel="alternate" type="text/html" title="Cloud Computing" /><published>2024-08-26T00:00:00+00:00</published><updated>2024-08-26T00:00:00+00:00</updated><id>https://cw-yi.github.io/memo/Cloud%20Computing</id><content type="html" xml:base="https://cw-yi.github.io/memo/Cloud-Computing/"><![CDATA[<h1 id="cloud-computing">Cloud Computing</h1>

<h2 id="클라우드-컴퓨팅-개요">클라우드 컴퓨팅 개요</h2>

<h3 id="클라우딩-컴퓨팅의-정의-및-개념"><strong>클라우딩 컴퓨팅의 정의 및 개념</strong></h3>

<ul>
  <li>클라우드 컴퓨팅은 클라우드(인터넷)을 통해 서버, 스토리지, 데이터베이스, 네트워킹, 소프트웨어, 분석 등의 컴퓨팅 서비스를 제공</li>
</ul>

<h3 id="클라우드-서비스-모델의-개요">클라우드 서비스 모델의 개요</h3>

<ul>
  <li>IaaS(Infrastructure as a Service)
    <ul>
      <li>가장 기본적인 범주, 클라우드를 통해 주문형 인프라 리소스를 제공</li>
    </ul>
  </li>
  <li>PaaS(Platform as a Service)
    <ul>
      <li>클라우드를 통해 필요한 모든 리소스를 제공</li>
    </ul>
  </li>
  <li>SaaS(Software as a Service)
    <ul>
      <li>전체적인 클라우드 기반 어플리케이션을 제공</li>
    </ul>
  </li>
  <li>클라우드 IaaS, PaaS, SaaS 차이</li>
</ul>

<p><img src="/assets/images/Cloud Computing/image.png" alt="image.png" /></p>

<h3 id="클라우딩-컴퓨팅의-이점과-한계">클라우딩 컴퓨팅의 이점과 한계</h3>

<ul>
  <li>이점
    <ul>
      <li>비용 / 속도 / 뛰어난 확장성 / 생산성 / 성능 / 안정성 / 보안</li>
    </ul>
  </li>
  <li>한계
    <ul>
      <li>공급 업체 종속의 위험</li>
      <li>기본 클라우드 인프라에 대한 낮은 제어 수준</li>
      <li>데이터 개인 정보 보호 및 온라인 위협과 같은 보안 위험에 대한 우려</li>
    </ul>
  </li>
</ul>

<p>https://azure.microsoft.com/ko-kr/resources/cloud-computing-dictionary/what-is-cloud-computing</p>

<p>https://cloud.google.com/learn/advantages-of-cloud-computing?hl=ko</p>

<hr />

<h2 id="클라우드-서비스-제공업체">클라우드 서비스 제공업체</h2>

<h3 id="클라우드-서비스-제공업체-정의">클라우드 서비스 제공업체 정의</h3>

<ul>
  <li>CPS(클라우드 서비스 제공업체)
    <ul>
      <li>기업에서 네트워크를 통해 주문형으로 액세스할 수 있는 클라우드 기반 컴퓨팅 등의 확장 가능한 컴퓨터 리소스를 제공하는 제 3자 회사</li>
    </ul>
  </li>
</ul>

<h3 id="클라우드-서비스-제공업체-비교">클라우드 서비스 제공업체 비교</h3>

<ul>
  <li>AWS
    <ul>
      <li>모든 범주에서 사용자가 요구하는 기능을 제공</li>
      <li>AWS만 사용해도 전체 인프라 스트럭쳐를 통합 운영 가능</li>
    </ul>
  </li>
  <li>Azure
    <ul>
      <li>윈도우 플랫폼에 강함</li>
    </ul>
  </li>
  <li>Google Cloud
    <ul>
      <li>제공된 크레딧 안에서 자유로운 서비스 이용이 가능</li>
      <li>데이터 분석과 머신 러닝에 강함</li>
      <li>다양한 브라우저에 대한 호환성이 좋음</li>
    </ul>
  </li>
  <li>AWS, Azure, Google Cloud 비교</li>
</ul>

<p><img src="/assets/images/Cloud Computing/image1.png" alt="image1.png" /></p>

<p>https://www.apptunix.com/blog/aws-vs-azure-vs-google-cloud-platform/</p>

<hr />

<h2 id="클라우드-컴퓨팅-트렌드">클라우드 컴퓨팅 트렌드</h2>

<h3 id="서버리스-컴퓨팅-이점">서버리스 컴퓨팅 이점</h3>

<ul>
  <li>서버리스 컴퓨팅이란?
    <ul>
      <li>사용량에 따라 백엔드를 제공하는 방법</li>
    </ul>
  </li>
  <li>서버리스 컴퓨팅의 이점
    <ul>
      <li>낮은 비용 / 간편한 확장성 / 간단한 백엔드 코드 / 시간 단축</li>
      <li>https://www.cloudflare.com/ko-kr/learning/serverless/why-use-serverless/</li>
    </ul>
  </li>
  <li>AWS 서버리스 서비스
    <ul>
      <li>https://aws.amazon.com/ko/serverless/</li>
    </ul>
  </li>
  <li>Azure 서버리스 서비스
    <ul>
      <li>https://azure.microsoft.com/ko-kr/solutions/serverless</li>
    </ul>
  </li>
</ul>

<h3 id="엣지-컴퓨팅">엣지 컴퓨팅</h3>

<ul>
  <li>엣지 컴퓨팅이란?
    <ul>
      <li>정보 저장 및 컴퓨팅 능력을 해당 정보를 생성하는 디바이스와, 이를 소비하는 사용자에게 더 가까이 제공하는 프로세스</li>
    </ul>
  </li>
  <li>중요성
    <ul>
      <li>기업이 원시 데이터를 보다 효율적으로 수집하고 분석할 수 있음</li>
    </ul>
  </li>
</ul>

<h3 id="하이브리드-클라우드와-멀티-클라우드">하이브리드 클라우드와 멀티 클라우드</h3>

<ul>
  <li>하이브리드 클라우드란?
    <ul>
      <li>기업이 프라이빗 클라우드와 퍼블릭 클라우드를 결합하여 하나의 인프라처럼 사용하는 클라우드 컴퓨팅 전략</li>
    </ul>
  </li>
  <li>멀티 클라우드란?
    <ul>
      <li>여러 퍼블릭 클라우드 서비스 공급자를 동시에 사용하는 클라우드 컴퓨팅 전략</li>
    </ul>
  </li>
</ul>

<p>→ 하이브리드 클라우드는 민감한 데이터와 어플리케이션을 보호하는 데 중점을 두고 일반적인 작업은 퍼블릭 클라우드에서 처리할 수 있는 반면, 멀티 클라우드는 벤더 종속성을 최소화하고 서비스 가용성과 비용 효율성을 높이기 위해 여러 클라우드 공급자를 동시에 사용하는데 의의를 둠.</p>

<p>https://www.samsungsds.com/kr/cloud-glossary/difference-hybrid-cloud-multi-cloud.html</p>

<hr />

<h2 id="클라우드-보안">클라우드 보안</h2>

<h3 id="클라우드-보안-1">클라우드 보안</h3>

<ul>
  <li>클라우드 보인아리나?
    <ul>
      <li>클라우드 기반의 어플리케이션, 데이터, 인프라를 보호하기 위한 사이버 보안 조치의 모음.</li>
    </ul>
  </li>
  <li>클라우드 보안 작동 방식
    <ul>
      <li>데이터의 보호 보장, 규정 준수 지원 등에 대한 제어를 제공하기 위한 프로세스, 기술을 함께 구현하는 방법에 중점을 둠</li>
      <li>클라우드 서비스 제공업체(CSP)는 일반적으로 공유 책임 모델을 따름
        <ul>
          <li>보안에 관해서는 제공업체와 고객 모두의 책임</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h3 id="클라우드-보안-솔루션-종류">클라우드 보안 솔루션 종류</h3>

<ul>
  <li>ID 및 액세스 관리(IAM)</li>
  <li>데이터 손실 방지(DLP)</li>
  <li>보안 정보 및 이벤트 관리(SIEM)</li>
  <li>공개 키 인프라(PKI)</li>
</ul>

<hr />

<h2 id="컨테이너와-오케스트레이션">컨테이너와 오케스트레이션</h2>

<h3 id="컨테이너화">컨테이너화</h3>

<ul>
  <li>컨테이너화란?
    <ul>
      <li>어플리케이션의 코드를 모든 인프라에서 실행하는 데 필요한 모든 파일 및 라이브러리와 함께 제공하는 소프트웨어 배포 프로세스</li>
    </ul>
  </li>
  <li>컨테이너 오케스트레이션이란?
    <ul>
      <li>컨테이너를 자동으로 관리할 수 있는 소프트웨어 기술</li>
    </ul>
  </li>
  <li>컨테이너 기술 유형
    <ul>
      <li>Docker
        <ul>
          <li>다양한 플랫폼에서 컨테이너식 어플리케이션을 빌드 및 배포할 수 있는 오픈 소스 컨테이너 런타임 기술</li>
        </ul>
      </li>
      <li>Kubernetes
        <ul>
          <li>방대한 수의 마이크로서비스를 배포, 조정 및 관리하는 데 사용하는 오픈 소스 컨테이너 오케스트레이션 도구</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Docker vs Kubernetes
    <ul>
      <li>개발자는 Docker를 사용하여 컨테이너 이미지를 생성 및 조작하고, Kubernetes를 사용하여 여러 마이크로서비스를 대규모로 관리함</li>
    </ul>
  </li>
</ul>

<p>https://aws.amazon.com/ko/compare/the-difference-between-kubernetes-and-docker/</p>

<h3 id="클라우드-컨테이너">클라우드 컨테이너</h3>

<ul>
  <li>클라우드 컨테이너란?
    <ul>
      <li>어플리케이션 코드, 라이브러리 및 클라우드에서 실행하기 위해 필요한 기타 종속성이 포함된 소프트웨어 코드 패키지</li>
    </ul>
  </li>
  <li>클라우드 컨테이너의 이점?
    <ul>
      <li>컨테이너를 다양한 클라우드 서버 또는 인스턴스에 배포하고 관리 가능</li>
      <li>배포 간소화 / 유연성 / 복원력 / 확장성</li>
    </ul>
  </li>
  <li>클라우드 컨테이너 사용 사례
    <ul>
      <li>마이크로서비스</li>
      <li>DevOps</li>
    </ul>
  </li>
</ul>

<p>https://aws.amazon.com/ko/what-is/cloud-containers/</p>

<h3 id="kubernets">Kubernets</h3>

<ul>
  <li>쿠버네티스 개요
    <ul>
      <li>컨테이너화된 워크로드와 서비스를 관리하기 위한 오픈소스 플랫폼</li>
    </ul>
  </li>
  <li>쿠버네티스 역할
    <ul>
      <li>서비스 디스커버리와 로드 밸런싱</li>
      <li>스토리지 오케스트레이션</li>
      <li>자동화된 롤아웃과 롤백</li>
      <li>자동화된 빈 패킹</li>
      <li>자동화된 복구</li>
      <li>시크릿과 구성관리</li>
    </ul>
  </li>
</ul>

<p>https://kubernetes.io/ko/docs/concepts/overview/</p>

<hr />

<h2 id="클라우드에서의-머신러닝과-ai">클라우드에서의 머신러닝과 AI</h2>

<h3 id="클라우드-서비스를-통한-머신러닝">클라우드 서비스를 통한 머신러닝</h3>

<ul>
  <li>클라우트 컴퓨팅을 활용한 머신러닝의 장점
    <ol>
      <li>머신러닝 모델 학습에 필요한 대규모의 컴퓨팅 자원을 유연하게 제공</li>
      <li>머신러닝 모델의 개발과 배포를 간소화</li>
      <li>머신러닝 모델의 확장성과 접근성을 향상</li>
      <li>머신러닝 모델의 운영 비용 절감</li>
    </ol>
  </li>
</ul>

<h3 id="ai-및-ml-서비스">AI 및 ML 서비스</h3>

<ul>
  <li>Vertex AI
    <ul>
      <li>ML 모델과 AI 어플리케이션을 학습 및 배포하고 AI 기반 어플리케이션에서 사용할 대규모 언어모델(LLM)을 맞춤설정할 수 있게 해주는 ML 플랫폼</li>
    </ul>
  </li>
  <li>SageMarker
    <ul>
      <li>모든 사용 사례에서 ML을 지원하는 다양한 도구를 한 곳에 결합한 완전관리형 서비스</li>
    </ul>
  </li>
</ul>

<hr />

<h2 id="클라우드-자동화-및-devops">클라우드 자동화 및 DevOps</h2>

<h3 id="클라우드-환경에서-자동화의-중요성">클라우드 환경에서 자동화의 중요성</h3>

<ul>
  <li>하이브리드 환경과 멀티클라우드 환경은 사용자 관리의 복잡성을 높이기 때문에 수동으로 리소스 및 어플리케이션을 효과적으로 유지관리, 추적, 확장, 보호하기가 거의 불가능 → 자동화를 통해 일관성, 확장성, 속도 향상 가능</li>
</ul>

<h3 id="devops-관행-및-도구">DevOps 관행 및 도구</h3>

<ul>
  <li>DevOps란?
    <ul>
      <li>소프트웨어 배포의 속도와 품질을 높이기 위한 새로운 업무 방식</li>
    </ul>
  </li>
  <li>IaC(Infrastructure as Code, 코드형 인프라)란?
    <ul>
      <li>DevOps의 핵심 사례</li>
      <li>모델을 배포할 때마다 동일한 환경을 생성</li>
    </ul>
  </li>
  <li>CI/CD란?
    <ul>
      <li>DevOps의 핵심 사례</li>
      <li>지속적인 통합 및 배포를 의미, 소프트웨어 개발 라이프사이클을 간소화하고 가속화하는 것이 목표</li>
      <li>CI/CD 파이프라인이란?
        <ul>
          <li>CI/CD 프로세스를 자동화함으로써 인적 오류를 최소화하고, 프로세스에 대한 일관성을 유지하는 것이 목표</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h3 id="terraform-vs-ansible">Terraform vs Ansible</h3>

<ul>
  <li>Terraform과 Ansible은 모두 IaC를 프로비저닝 할 수 있으며, Ansible은 어플리케이션과 서비스도 가능</li>
  <li>Terraform은 원하는 상태를 정의하여 IT 인프라 구성을 유지하려 하는 선언적 프로그래밍 방식을 사용</li>
  <li>Ansible은 원하는 상태에 도달하는 단계를 정의하여 IT 인프라 구성을 유지하려고 하는 절차적 프로그래밍을 사용</li>
</ul>

<p>https://www.redhat.com/ko/topics/automation/ansible-vs-terraform</p>

<hr />

<h2 id="클라우드-비용-관리">클라우드 비용 관리</h2>

<h3 id="클라우드-비용-최적화-전략">클라우드 비용 최적화 전략</h3>

<ul>
  <li>클라우드 리소스의 규모 적정 조정</li>
  <li>사용되지 않는 리소스 제거</li>
  <li>데이터 전송 비용 절감</li>
  <li>스팟 인스턴스 활용</li>
</ul>

<p>https://www.akamai.com/ko/glossary/what-is-cloud-optimization</p>

<h3 id="클라우드-비용-모니터링-및-관리-도구">클라우드 비용 모니터링 및 관리 도구</h3>

<ul>
  <li>클라우드 모니터링 툴
    <ul>
      <li>Google Opreation</li>
      <li>Microsoft Azure Monitor</li>
      <li>Amazon CloudWatch</li>
      <li>NCI 및 NCM</li>
    </ul>
  </li>
</ul>

<p>https://www.nutanix.com/kr/info/cloud-monitoring#bestpractices</p>

<p>https://cloud.google.com/architecture/framework/cost-optimization/monitor?hl=ko</p>]]></content><author><name>이채원</name><email>cwyi@gmail.com</email></author><category term="Memo" /><category term="SE study" /><summary type="html"><![CDATA[Cloud Computing]]></summary></entry><entry><title type="html">Linux</title><link href="https://cw-yi.github.io/memo/Linux/" rel="alternate" type="text/html" title="Linux" /><published>2024-08-25T00:00:00+00:00</published><updated>2024-08-25T00:00:00+00:00</updated><id>https://cw-yi.github.io/memo/Linux</id><content type="html" xml:base="https://cw-yi.github.io/memo/Linux/"><![CDATA[<h1 id="linux">Linux</h1>

<h3 id="리눅스-개요"><strong>리눅스 개요</strong></h3>

<p>리눅스는 오픈소스 운영 체제로, 무료로 사용할 수 있는 운영 체제 중 하나
안정성, 보안성, 유연성 등의 특징으로 널리 사용됨</p>

<p>다양한 용도로 사용될 수 있으며, 주요 기능은 다음과 같다</p>

<ul>
  <li>데이터 센터에서의 서버 운영</li>
  <li>개발자들을 위한 개발 환경</li>
  <li>임베디드 시스템에 적합한 경량화된 버전</li>
</ul>

<p>안정성, 보안성, 성능 등의 이점으로 웹 서버 운영에 많이 사용</p>

<ul>
  <li>리눅스 커널은 리눅스 운영체제의 핵심 기능을 제공</li>
  <li>리눅스의 주요 배포판 → ubuntu, CentOS, RedHat, Debian 등</li>
</ul>

<h3 id="cli-command-line-interface">CLI (Command-Line Interface)</h3>

<p>터미널이나 가상 터미널을 통해 사용자와 컴퓨터가 상호 작용하는 방식</p>

<h3 id="cli-기본-명령어">CLI 기본 명령어</h3>

<ul>
  <li>pwd; 현재 위치 확인</li>
  <li>mkdir [name]; 새로운 디렉토리 생성</li>
  <li>ls [-옵션]; 현재 위치 디렉토리의 리스트 출력
    <ul>
      <li>옵션 : -a, -l, -R, -r, -h, -S등 존재하며, 2개 이상 조합하여 사용이 가능</li>
    </ul>
  </li>
  <li>cd [변경위치]; 터미널의 현재 위치 변경
    <ul>
      <li>절대경로, 상대경로, 상위 디렉토리 등으로 위치 변경 가능</li>
    </ul>
  </li>
  <li>touch [-옵션] [name]; 파일 생성하기
    <ul>
      <li>옵션 : -a, -c, -t, -d, -r, -m 등, 2개 이상 조합하여 사용이 가능</li>
    </ul>
  </li>
  <li>echo [-옵션] [텍스트]; 터미널에 텍스트 출력</li>
  <li>cat [-옵션] [파일이름]; 파일의 내용을 터미널에 출력</li>
  <li>rm [-옵션] [이름]; 디렉토리 또는 파일 삭제</li>
  <li>mv [-옵션] [파일이름] [이동할디렉토리]; 디렉토리나 파일의 이름을 변경하거나 위치 이동</li>
  <li>cp [-옵션] [기존이름] [복사할이름]; 디렉토리나 파일 복사</li>
  <li>sudo [명령어]; 관리자 권한을 획득</li>
</ul>

<p>https://wwwaloha.oopy.io/6d209bba-226e-480a-99a9-146d45b4e9e5</p>

<p>https://ittrue.tistory.com/79</p>

<hr />

<h3 id="파일-시스템-구조">파일 시스템 구조</h3>

<p>리눅스의 파일 시스템은 트리형태의 계층적 파일 시스템 구조를 제공</p>

<h3 id="파일-권한">파일 권한</h3>

<p>각 파일과 폴더마다 다른 권한을 설정 가능
이는 유저 접근 관리나 공유 폴더, 혹은 파일 생성 시에 용이</p>

<h3 id="파일-권한소유권-변경">파일 권한&amp;소유권 변경</h3>

<p><strong>파일 권한 변경</strong></p>

<ul>
  <li>chmod [파일권한] [변경할 파일 위치 or 파일명]
    <ul>
      <li>777권한은 모든 사용자가 모든 권한을 얻는다는 의미</li>
    </ul>
  </li>
</ul>

<p><strong>소유권 변경</strong></p>

<ul>
  <li>chown [소유할유저]:[소유할그룹] [소유권을 변경하고 싶은 디렉토리 or 파일명]
    <ul>
      <li>root 권한이 있어야 실행이 가능</li>
    </ul>
  </li>
</ul>

<p>https://inpa.tistory.com/entry/LINUX-📚-파일-권한-소유권허가권-💯-정리#소유권ownership</p>

<hr />

<h3 id="사용자-생성">사용자 생성</h3>

<p>사용자 계정 생성 명령어 → useradd</p>

<ul>
  <li>계정이란 시스템에 ID와 암호를 생성하여 사용권을 부여하는 것을 뜻하며, 이때 사용자의 ID를 생성하는 명령어는 useradd</li>
  <li>root 권한자가 root 이외의 사용자를 생성할 때는 명령어 adduser도 가능</li>
</ul>

<h3 id="sudosuperuser-do">sudo(superuser do)</h3>

<ul>
  <li>로그아웃 없이 root 권한으로 명령어를 실행
    <ul>
      <li>root 계정의 암호 필요</li>
    </ul>
  </li>
  <li>etc/sudoers 파일에 지정되어 있는 사용자만 사용 가능</li>
  <li>sudo -s → 현재 디렉토리 유지</li>
  <li>sudo -i → /root로 디렉토리 변경</li>
</ul>

<h3 id="패키지-관리설치제거">패키지 관리(설치/제거)</h3>

<p><strong>패키지 관리자</strong></p>

<ul>
  <li>리눅스 배포판의 일부로 제공</li>
  <li>시스템에 사용되는 소프트웨어 패키지의 설치, 업데이트, 제거를 자동화</li>
  <li>패키지에 대한 정보 유지, 다른 패키지와의 상호작용 관리</li>
</ul>

<p><strong>주요 리눅스 패키지 관리자</strong></p>

<ul>
  <li>APT : ubuntu와 Debian을 포함한 Debian 기반의 배포판에서 주로 사용</li>
  <li>DNF : Fedora와 CentOS에서 사용</li>
  <li>YUM : CentOS 이전 버전에서 사용되었으며, 현재는 DNF로 대체</li>
  <li>Pacman : Arch Linux와, Manjaro같은 Arch 기반의 배포판에서 사용</li>
</ul>

<p><strong>패키지 설치 (ex APT)</strong></p>

<p>sudo apt-get upadate → 설치 전 패키지 목록 업데이트</p>

<p>sudo apt-get install [name]</p>

<p><strong>패키지 제거 (ex APT)</strong></p>

<p>sudo apt-get remove [name]</p>

<hr />

<h3 id="시스템-자원-및-프로세스-확인">시스템 자원 및 프로세스 확인</h3>

<p><strong>시스템 자원 명령어 → top</strong></p>

<ul>
  <li>첫번째 줄 : 동작 시간, 사용자 수, 부하 평균값</li>
  <li>두번째 줄 : 전체 프로세서 수, 동작, 슬립, 중단, 좀비 프로세스의 개수</li>
  <li>세번째 줄 : CPU 가동을 백분률로 표기</li>
  <li>네번째 줄 : 메모리 정보</li>
  <li>다섯번째 줄 : SWAP 공간 정보</li>
  <li>이하  : 프로세스 정보</li>
</ul>

<p><strong>메모리 자원 명령어 → free</strong></p>

<p><strong>프로세스 명령어 → ps</strong></p>

<ul>
  <li>옵션
    <ul>
      <li>l : 긴 줄 출력</li>
      <li>u : 유저와 시간 출력</li>
      <li>j : 작업 제어 방식 출력</li>
      <li>a : 전체 유저 프로세스 현황 출력</li>
      <li>x : 터미널 제어 없이 프로세스 출력</li>
    </ul>
  </li>
</ul>

<h3 id="기본적인-로그-파일-분석">기본적인 로그 파일 분석</h3>

<p><strong>콘솔 로그(/dev/console)</strong></p>

<ul>
  <li>커널에 관련된 내용을 담은 로그</li>
</ul>

<p><strong>시스템 로그(/var/log/messages)</strong></p>

<ul>
  <li>시스템에 대한 전반적인 로그로, dmesg를 사용하여 명령어 확인 가능</li>
</ul>

<p><strong>보안 로그(/var/log/secure)</strong></p>

<ul>
  <li>모든 접속과 관련하여 기록된 로그</li>
  <li>login, tcp_wrappers, xinetd 관련 로그가 남음</li>
</ul>

<h3 id="linux-log-file"><strong>Linux Log File</strong></h3>

<table>
  <thead>
    <tr>
      <th>로그이름</th>
      <th>로그 파일명</th>
      <th>설명</th>
      <th>관련 데몬</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>커널 log</strong></td>
      <td><code class="language-plaintext highlighter-rouge">/dev/console</code></td>
      <td>콘솔에 뿌려지는 로그</td>
      <td>kernel</td>
    </tr>
    <tr>
      <td><strong>시스템 log</strong></td>
      <td><code class="language-plaintext highlighter-rouge">/var/log/messages</code></td>
      <td>리눅스 커널로그 및 주 로그</td>
      <td>sysload</td>
    </tr>
    <tr>
      <td>보안 log</td>
      <td><code class="language-plaintext highlighter-rouge">/var/log/secure</code></td>
      <td>보안 인증 관련 로그</td>
      <td>xinetd</td>
    </tr>
    <tr>
      <td>메일 log</td>
      <td><code class="language-plaintext highlighter-rouge">/var/log/maillog</code></td>
      <td>메일 로그</td>
      <td>sendmail popper</td>
    </tr>
    <tr>
      <td>크론 log</td>
      <td><code class="language-plaintext highlighter-rouge">/var/log/cron</code></td>
      <td>crond에 의한 로그</td>
      <td>crond</td>
    </tr>
    <tr>
      <td>부팅 log</td>
      <td><code class="language-plaintext highlighter-rouge">/var/log/boot.log</code></td>
      <td>시스템 부팅시의 로그</td>
      <td>kernel</td>
    </tr>
    <tr>
      <td>커널 부트 메시지 log</td>
      <td><code class="language-plaintext highlighter-rouge">/var/dmesg</code></td>
      <td>부팅될 당시의 각종 메시지들 저장</td>
      <td>kernel</td>
    </tr>
    <tr>
      <td>커널 log</td>
      <td><code class="language-plaintext highlighter-rouge">/var/log/wtmp</code></td>
      <td>시스템 전체 로그인 기록 저장</td>
      <td>kernel</td>
    </tr>
    <tr>
      <td>커널 log</td>
      <td><code class="language-plaintext highlighter-rouge">/var/log/utmp</code></td>
      <td>현재 로그인 사용자에 대한 기록, 사용자 ip를 저장</td>
      <td>kernel</td>
    </tr>
    <tr>
      <td>FTP log</td>
      <td><code class="language-plaintext highlighter-rouge">/var/log/xferlog</code></td>
      <td>ftp 로그</td>
      <td>ftp</td>
    </tr>
    <tr>
      <td><strong>웹 log</strong></td>
      <td><code class="language-plaintext highlighter-rouge">/var/log/httpd/access_log</code></td>
      <td>아파치(웹서버) 로그 저장</td>
      <td>httpd</td>
    </tr>
    <tr>
      <td>웹 log</td>
      <td><code class="language-plaintext highlighter-rouge">/var/log/httpd/error_log</code></td>
      <td>아파치(웹서버) 에러 저장</td>
      <td>httpd</td>
    </tr>
    <tr>
      <td>네임서버 log</td>
      <td><code class="language-plaintext highlighter-rouge">/var/log/named.log</code></td>
      <td>네임서버( 로그</td>
      <td>name</td>
    </tr>
  </tbody>
</table>

<p>https://azderica.github.io/00-analysis-log/</p>

<hr />

<h3 id="쉘-스크립트-작성법">쉘 스크립트 작성법</h3>

<p><strong>쉘 스크립트</strong></p>

<ul>
  <li>기본적으로 .sh 확장자로 작성</li>
  <li>맨 처음 행에 #!/bin/sh 작성</li>
</ul>

<p><strong>변수 사용</strong></p>

<ul>
  <li>변수명은 영문자, 숫자, 언더바 사용</li>
  <li>변수에 값을 대입할 때는 = 앞 뒤에 공백 없이 작성</li>
  <li>변수에 접근할 때 변수명 앞에 $를 삽입</li>
  <li>readonly를 사용하면 변수의 값 변경X</li>
  <li>unset을 사용해 변수 삭제 가능</li>
</ul>

<p><strong>조건문</strong></p>

<ul>
  <li>if문
    <ul>
      <li>if [조건] then 커맨드 fi</li>
      <li>조건과 일치하는 경우 커맨드가 실행</li>
      <li>if - elif - else 구문</li>
    </ul>
  </li>
  <li>switch문
    <ul>
      <li>case 변수 in [조건 or 값] ) 커맨드 ;; esac</li>
    </ul>
  </li>
</ul>

<p>https://engineer-mole.tistory.com/200</p>]]></content><author><name>이채원</name><email>cwyi@gmail.com</email></author><category term="Memo" /><category term="SE study" /><summary type="html"><![CDATA[Linux]]></summary></entry><entry><title type="html">Open-Source</title><link href="https://cw-yi.github.io/memo/Open-source/" rel="alternate" type="text/html" title="Open-Source" /><published>2024-08-08T00:00:00+00:00</published><updated>2024-08-08T00:00:00+00:00</updated><id>https://cw-yi.github.io/memo/Open-source</id><content type="html" xml:base="https://cw-yi.github.io/memo/Open-source/"><![CDATA[<h1 id="open-source">Open-source</h1>

<h2 id="open-source-software">Open Source Software</h2>

<ul>
  <li><strong>Definition</strong>
    <ul>
      <li>개방형 협업을 통해 개발 및 관리되는 소프트웨어</li>
    </ul>
  </li>
  <li><strong>Fundamental Principles</strong>
    <ul>
      <li>커뮤니티</li>
      <li>투명성</li>
      <li>공개 협업</li>
      <li>신속한 프로토타입 제작</li>
      <li>포용적 능력주의</li>
    </ul>
  </li>
  <li><strong>Types of Licenses</strong>
    <ul>
      <li>MIT
        <ul>
          <li>소스 코드 공개 의무 X, 동일한 라이센스 적용 X, 상업적 이용 O</li>
        </ul>
      </li>
      <li>BSD
        <ul>
          <li>소스 코드 공개 의무 X, 동일한 라이센스 적용 X, 상업적 이용 O</li>
          <li>GPL보다 덜 제한적</li>
        </ul>
      </li>
      <li>Apache
        <ul>
          <li>소스 코드 공개 의무 X, 동일한 라이센스 적용 X, 상업적 이용 O</li>
          <li>BSD와 비슷하나 특허권에 관한 내용이 포함됨</li>
        </ul>
      </li>
      <li>GPL
        <ul>
          <li>소스 코드 공개 의무 O, 동일한 라이센스 적용 O, 상업적 이용 O</li>
          <li>의무사항이 타 라이센스에 비해 엄격한 편</li>
          <li>https://wiki.kldp.org/wiki.php/OpenSourceLicenseGuide#s-3.2.1</li>
        </ul>
      </li>
      <li>MPL 2.0, LPGL, EPL, AGPL 등</li>
    </ul>
  </li>
  <li><strong>참고 자료</strong>
    <ul>
      <li>https://aws.amazon.com/ko/what-is/open-source/</li>
      <li>https://www.ibm.com/kr-ko/topics/open-source</li>
    </ul>
  </li>
</ul>

<hr />

<h2 id="open-source-project">Open Source Project</h2>

<ul>
  <li><strong>Contribution Process</strong>
    <ul>
      <li>Issue
        <ul>
          <li>프로젝트에 대한 질의응답이나 버그 제보, 개선 방안에 대한 논의가 이루어짐</li>
          <li>기여할만한 항목을 찾아 의견을 남기거나, 개선 방안을 제시하는 것이 가능</li>
        </ul>
      </li>
      <li>Fork
        <ul>
          <li>다른 프로젝트의 저장소를 깃허브의 내 계정으로 복제해 오는 것</li>
          <li>작업 사항을 내 계정으로 포크해 온 저장소에 우선 기록한 후, 수정한 내용이 원본 저장소에 반영되도록 요청(Pull Request)하는 방식으로 진행</li>
          <li>원본 저장소로부터 포크해 온 저장소를 최신화 상태로 유지하는 것도 중요</li>
        </ul>
      </li>
      <li>PR(Pull Request)
        <ul>
          <li>내 수정 사항을 원본 저장소에 pull request → 이후 승인을 통해 merge가 되었다면, 해당 프로젝트의 기여자 목록에 올라가게 됨</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>Documentation</strong>
    <ul>
      <li>오픈 소스 프로젝트를 공개할 때 필요한 문서들</li>
      <li>License 문서</li>
      <li>README 문서</li>
      <li>CONTRIBUTING 문서</li>
      <li>https://github.com/KMU-OSS-Laboratory/Github_Document_Guide</li>
    </ul>
  </li>
  <li><strong>Code Review</strong>
    <ul>
      <li>작성한 코드를 점검하고 피드백을 교환</li>
      <li>코드 리뷰 시 확인해야 할 사항들
        <ul>
          <li>유지 보수성</li>
          <li>재사용성</li>
          <li>안정성</li>
          <li>확장성</li>
          <li>테스트</li>
        </ul>
      </li>
      <li>https://github.com/meshkorea/front-end-engineering/blob/main/conventions/code-review/index.md</li>
    </ul>
  </li>
  <li><strong>Conventions</strong>
    <ul>
      <li>프로젝트의 일관성과 가독성 유지를 위한 코드 작성 규칙</li>
      <li>네이밍 컨벤션, 커밋 컨벤션 등</li>
    </ul>
  </li>
  <li><strong>참고 자료</strong>
    <ul>
      <li>https://seongjin.me/how-to-contribute-to-open-source/</li>
    </ul>
  </li>
</ul>

<hr />

<h2 id="utilizing-open-source">Utilizing Open Source</h2>

<ul>
  <li><strong>Benefits</strong>
    <ul>
      <li>비용 절감</li>
      <li>자유로운 사용과 수정</li>
      <li>커스터마이즈 가능성</li>
      <li>커뮤니티 지원</li>
      <li>투명성</li>
    </ul>
  </li>
  <li><strong>Limitations</strong>
    <ul>
      <li>기술 지원의 부족</li>
      <li>유지 보수의 어려움</li>
      <li>보안 문제</li>
      <li>기능의 제한</li>
      <li>문서화의 부족</li>
      <li>https://wikidocs.net/250639</li>
    </ul>
  </li>
  <li><strong>Examples</strong>
    <ul>
      <li>Linux → 1991년 개발된 오픈소스 운영체제</li>
      <li>Apache → 가장 널리 사용되는 웹 서버 소프트웨어 중 하나</li>
      <li>Mozilla → 모질라 재단에서 개발한 웹 브라우저 시리즈</li>
      <li>https://wikidocs.net/250638</li>
      <li>React → MIT 라이센스</li>
      <li>Flask → 백엔드</li>
      <li>VScode</li>
    </ul>
  </li>
</ul>]]></content><author><name>이채원</name><email>cwyi@gmail.com</email></author><category term="Memo" /><category term="SE study" /><summary type="html"><![CDATA[Open-source]]></summary></entry><entry><title type="html">Network</title><link href="https://cw-yi.github.io/memo/Network/" rel="alternate" type="text/html" title="Network" /><published>2024-08-01T00:00:00+00:00</published><updated>2024-08-01T00:00:00+00:00</updated><id>https://cw-yi.github.io/memo/Network</id><content type="html" xml:base="https://cw-yi.github.io/memo/Network/"><![CDATA[<h1 id="network">Network</h1>

<h2 id="network-fundamentals">Network Fundamentals</h2>

<h3 id="osiopen-systems-interconnection-model"><strong>OSI(Open Systems Interconnection) model</strong></h3>

<ul>
  <li>네트워크 통신 기능을 7개 계층으로 나누는 개념적 프레임워크</li>
  <li>컴퓨터 네트워킹을 위한 범용 언어 제공</li>
</ul>

<h3 id="tcpip-model"><strong>TCP/IP model</strong></h3>

<ul>
  <li>네트워크 프로토콜, 안전한 데이터 전송</li>
  <li>TCP/IP 4계층 → Application, Transport , Internet, Network Interface</li>
  <li>TCP/IP 5계층 → Application, Transport , Network , Data Link, Physical</li>
</ul>

<p><strong>OSI model vs TCP/IP model</strong></p>

<ul>
  <li>TCP/IP가 실질적인 통신을 위해 사용되는 것과 달리, OSI는 이론을 기반으로 설계되어 실제 통신에는 사용되지 않음</li>
</ul>

<table>
  <thead>
    <tr>
      <th>TCP/IP Model</th>
      <th>OSI Model</th>
      <th>기능</th>
      <th>PDU</th>
      <th>프로토콜</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Application Layer</td>
      <td>Application Layer</td>
      <td>사용자의 데이터와 직접 상호 작용 (인터페이스 제공)</td>
      <td>message</td>
      <td><a href="Network%20ca22c8b9b2d14a7a81c36aa5b506a352.md">HTTP</a>, <a href="Network%20ca22c8b9b2d14a7a81c36aa5b506a352.md">SMTP</a> 등</td>
    </tr>
    <tr>
      <td>Application Layer</td>
      <td>Presentation Layer</td>
      <td>데이터의 변환, 암호화, 압축 등 담당</td>
      <td>message</td>
      <td>JPG, PAP 등</td>
    </tr>
    <tr>
      <td>Application Layer</td>
      <td>Session Layer</td>
      <td>세션 형성, 유지, 종료 + 데이터 전송 동기화 담당</td>
      <td>message</td>
      <td>NFS, SMB 등</td>
    </tr>
    <tr>
      <td>Transport Layer</td>
      <td>Transport Layer</td>
      <td>패킷 보존 + 데이터 흐름/오류 제어</td>
      <td>segment</td>
      <td><a href="Network%20ca22c8b9b2d14a7a81c36aa5b506a352.md">TCP</a>, <a href="Network%20ca22c8b9b2d14a7a81c36aa5b506a352.md">UDP</a> 등</td>
    </tr>
    <tr>
      <td>Internet Layer(Network)</td>
      <td>Network Layer</td>
      <td>서로 다른 네트워크 간 데이터를 전송 + <a href="Network%20ca22c8b9b2d14a7a81c36aa5b506a352.md">라우팅</a>, 패킷 전달 및 주소 지정</td>
      <td>paket</td>
      <td><a href="Network%20ca22c8b9b2d14a7a81c36aa5b506a352.md">IP</a>, ICMP, ARP 등</td>
    </tr>
    <tr>
      <td>Network Interface(Data Link)</td>
      <td>Data Link Layer</td>
      <td>동일한 네트워크에 있는 장치 간 데이터 전송 + 데이터의 흐름/오류 제어</td>
      <td>freme</td>
      <td>Ethernet 등</td>
    </tr>
    <tr>
      <td>Network Interface(Physical)</td>
      <td>Physical Layer</td>
      <td>물리적 통신 매체(케이블 등)를 통해 비트 스트림(신호) 전송</td>
      <td>bit</td>
      <td>RS-232 등</td>
    </tr>
  </tbody>
</table>

<p><strong>데이터 송수신</strong></p>

<p><img src="/assets/images/Network/image1.png" alt="image1" /></p>

<ul>
  <li>송신 측에서는 응용 계층부터 물리 계층까지 데이터를 송신. 캡슐화를 통해 헤더/트레일러를 덧붙여 전송</li>
</ul>

<p><img src="/assets/images/Network/image2.png" alt="image2" /></p>

<ul>
  <li>수신 측에서는 물리 계층부터 응용 계층까지 데이터가 전송되어 수신. 역캡슐화를 통해 헤더를 제거하여 데이터를 수신</li>
</ul>

<h3 id="network-devices"><strong>Network devices</strong></h3>

<ul>
  <li>라우터(네트워크 계층) → <a href="Network%20ca22c8b9b2d14a7a81c36aa5b506a352.md">LAN/WAN</a>간 IP주소를 사용하여 데이터 패킷 전달, 네트워크간 데이터 전송을 위한 최적 경로 설정.</li>
  <li>스위치 → 네트워크 단위를 연결하는 통신 장비.
    <ul>
      <li>L2 :  MAC 주소를 기반으로 스위칭 (가장 기본적 스위치)</li>
      <li>L3 :  IP주소 기반으로 스위칭 + 라우팅 기능</li>
      <li>L4 :  IP주소와 Port 기반으로 스위칭,  로드 밸런싱 가능</li>
      <li>L7 : 보안에 더욱 유리한 로드 밸런싱 가능</li>
    </ul>
  </li>
  <li>모뎀 → ISP의 신호를 연결된 모든 장치에서 해석 가능한 디지털 신호로 변환하여 인터넷 연결 구축</li>
</ul>

<p><strong>라우터 vs 스위치</strong></p>

<ul>
  <li>라우터는 서로 다른 네트워크 간 전달 vs 스위치는 동일한 네트워크 간 데이터 전달</li>
</ul>

<p><strong>라우터 vs 모뎀</strong></p>

<ul>
  <li>라우터는 네트워크 형성, 해당 데이터 흐름 관리 vs 모뎀은 네트워크를 인터넷에 연결</li>
</ul>

<p>e.g. Wi-Fi 공유기</p>

<ol>
  <li>모뎀 - 인터넷 연결</li>
  <li>모뎀과 라우터 연결</li>
  <li>라우터에서 내보낸 와이파이 무선 신호를 노트북이나 핸드폰에 연결</li>
</ol>

<hr />

<h2 id="ip-addressing">IP Addressing</h2>

<h3 id="ipv4-vs-ipv6"><strong>IPv4 vs IPv6</strong></h3>

<ul>
  <li>IP(Interent Protocol) → 장치 고유의 식별자</li>
  <li>IPv4 → 점으로 구분된 네 개의 숫자(32비트)로 구성</li>
  <li>IPv6 → 하나 또는 두개의 콜론으로 구분되는 숫자와 문자(128비트)로 구성</li>
  <li>IPv6는 IPv4의 고유 IP주소의 부족 문제와 개인 정보 보호 측면에서 개선된 버전</li>
</ul>

<h3 id="subnetting-basics"><strong>Subnetting basics</strong></h3>

<ul>
  <li>서브넷팅 → IP주소 낭비 방지를 위해 네트워크를 분할하여 효율적으로 사용</li>
</ul>

<p><strong>서브넷팅의 필요성 (IPv4 기준)</strong></p>

<ul>
  <li>IP주소는 네트워크 영역/호스트 영역 두 가지로 나뉨</li>
</ul>

<p>→ 클래스에 따라 데이터가 알맞은 장치를 찾는데에 시간이 소요되기 때문에, 서브넷을 사용하여 IP주소를 장치 범위 내에서 찾도록 범위를 좁혀줌.</p>

<p>▼ 클래스 구분</p>

<p><img src="/assets/images/Network/image3.png" alt="image3" /></p>

<p><strong>서브넷 마스크</strong></p>

<ul>
  <li>IP주소에서 네트워크 주소(1)와 호스트 주소(0)를 구분하기 위해 사용됨.</li>
</ul>

<p>→ 연속된 1과 0으로 이루어짐</p>

<p>→ 서브넷 마스크와 IP를 AND연산을 한 결과가, 해당 IP의 네트워크 주소. 네트워크 주소를 제외한 나머지가 호스트 주소</p>

<h3 id="address-assignment"><strong>Address Assignment</strong></h3>

<p><strong>정적(static) IP vs 동적 IP(DHCP, Dynamic Host Configuration Protocol)</strong></p>

<ul>
  <li>인터넷에 연결된 대부분의 장치는 임시 IP주소가 할당됨. → 동적 IP 주소</li>
  <li>사용자마다 정적 IP주소를 할당하는 것보다 비용 효과적임</li>
</ul>

<p><strong>Static IP를 사용하는 이유?</strong></p>

<ul>
  <li>특정 IP로만 접속되는 웹 서버, 원격 데스크탑, DB 서버 운용하기 위한 용도</li>
</ul>

<hr />

<h2 id="network-protocols">Network Protocols</h2>

<h3 id="http-https-ftp-sftp-smtp-etc"><strong>HTTP, HTTPS, FTP, SFTP, SMTP, etc</strong></h3>

<p><strong>TCP/IP의 응용 계층 프로토콜</strong></p>

<ul>
  <li>HTTP(Hypertext Transfer Protocol) → WWW 기반, 웹에서 데이터 통신에 사용</li>
  <li>HTTPS(Hypertext Transfer Protocol Secure) → HTTP 보안 강화, 데이터를 암호화해서 전달</li>
  <li>FTP(File Transfer Protocol) → 파일 교환에 사용</li>
  <li>SFTP(Secure File Transfer Protocol) → FTP 보안 강화</li>
  <li>SMTP(Simple Mail Transfer Protocol) → 전자우편을 송수신하는데 사용</li>
</ul>

<h3 id="tcp--udp"><strong>TCP &amp; UDP</strong></h3>

<p><strong>TCP(Transmission Control Protocol)</strong></p>

<ul>
  <li>데이터 손실 없이 성공적으로 수신되기 위한 프로토콜 (데이터 무결성 보장)</li>
</ul>

<p><strong>TCP 통신 순서</strong></p>

<ol>
  <li>송신 컴퓨터가 수신 컴퓨터에게 SYN 메세지를 보내 연결을 요청</li>
  <li>수신 컴퓨터가  요청에 대한 승인으로 SYN-ACK 메세지를 전달</li>
  <li>송신 컴퓨터가 승인 메세지를 확인</li>
</ol>

<p>→ 데이터 전송 시작</p>

<p><strong>UDP(User Datagram Protocol)</strong></p>

<ul>
  <li>보안/신뢰성 보다 전송 속도와 효율을 더 중요시 하는 프로토콜</li>
</ul>

<p><img src="/assets/images/Network/image4.png" alt="image4" /></p>

<p><strong>TCP vs UDP</strong></p>

<ul>
  <li>연결 지향 프로토콜 vs 비연결 지향 프로토콜</li>
  <li>패킷 수신 여부 확인 vs 확인X</li>
  <li>패킷에 문제가 생기면 재전송 vs 재전송X</li>
  <li>1:1 통신 vs 1:1, 1:N, N:M 통신</li>
  <li>데이터의 도착 순서 보장 vs 순서 바뀜</li>
</ul>

<p><strong>활용 분야</strong></p>

<p>→ 데이터의 순서와 신뢰가 중요한 금융 거래 시스템, DB 관리 시스템에는 TCP가 적합</p>

<p>→ 실시간 비디오 스트리밍이나 온라인 게임처럼 지연 시간 최소화해야 하는 경우 UDP가 적합</p>

<h3 id="dnsdomain-name-system"><strong>DNS(Domain Name System)</strong></h3>

<ul>
  <li>웹사이트의 도메인 주소 → IP주소 변환</li>
</ul>

<p><strong>DNS의 다른 역할</strong></p>

<ul>
  <li>별칭 도메인 → IP주소 또는 정식 도메인을 여러 별칭 도메인과 연결, 여러 도메인으로 같은 IP주소에 접속 가능</li>
  <li>로드 밸런싱 → 클라우드 서비스와 분산 인터넷 서비스를 이용할 때 로드 밸런싱 역할을 함.</li>
</ul>

<p><strong>DNS 구조</strong></p>

<ul>
  <li>클라이언트-서버 모델을 이용하는 분산 계층형 DB 시스템</li>
</ul>

<hr />

<h2 id="network-architectures">Network Architectures</h2>

<h3 id="lan-wan-pan-man-ban"><strong>LAN, WAN, PAN, MAN, BAN</strong></h3>

<ul>
  <li>WAN(Wide Area Network) → 국가, 대륙 등 넓은 영역에 걸쳐 구축하는 통신망</li>
  <li>MAN(Metropolitan Area Network) → 대도시 중심으로 WAN과 LAN 연결</li>
  <li>LAN(Local Area Network) → 근거리 통신망</li>
  <li>PAN(Personal Area Network) → 사람 활동 범위 통신망 (NFC, 블루투스 등)</li>
  <li>BAN(Body Area Network) → 사람 신체 범위 통신망 (웨어러블)</li>
</ul>

<hr />

<h2 id="참고-자료">참고 자료</h2>

<ul>
  <li>https://aws.amazon.com/ko/what-is/osi-model/</li>
  <li>https://www.cloudflare.com/ko-kr/learning/ddos/glossary/open-systems-interconnection-model-osi/</li>
  <li>http://www.jidum.com/jidums/view.do?jidumId=415</li>
  <li>https://docs.tosspayments.com/resources/glossary/http-protocol</li>
  <li>https://www.checkpoint.com/kr/cyber-hub/network-security/what-is-the-osi-model-understanding-the-7-layers/osi-model-vs-tcp-ip-model/</li>
  <li>https://www.juniper.net/kr/ko/research-topics/what-is-a-router.html</li>
  <li>https://www.cloudflare.com/ko-kr/learning/network-layer/what-is-a-router/</li>
  <li>https://www.cloudflare.com/ko-kr/learning/dns/glossary/what-is-my-ip-address/</li>
  <li>https://docs.tosspayments.com/resources/glossary/dns</li>
  <li>https://ko.wikipedia.org/wiki/SSH_파일_전송_프로토콜</li>
  <li>https://www.geeksforgeeks.org/what-is-transmission-control-protocol-tcp/</li>
  <li>https://massive.io/ko/file-transfer/what-is-transmission-control-protocol-tcp/</li>
  <li>https://developer.mozilla.org/ko/docs/Glossary/UDP</li>
  <li>https://f-lab.kr/insight/tcp-udp-difference-and-use-cases</li>
  <li>https://itwiki.kr/w/네트워크</li>
</ul>]]></content><author><name>이채원</name><email>cwyi@gmail.com</email></author><category term="Memo" /><category term="SE study" /><summary type="html"><![CDATA[Network]]></summary></entry><entry><title type="html">미니프로젝트 개발문서 모델</title><link href="https://cw-yi.github.io/miniproject/" rel="alternate" type="text/html" title="미니프로젝트 개발문서 모델" /><published>2021-07-14T00:00:00+00:00</published><updated>2021-07-14T00:00:00+00:00</updated><id>https://cw-yi.github.io/miniproject</id><content type="html" xml:base="https://cw-yi.github.io/miniproject/"><![CDATA[<h3 id="-개발-소프트웨어-이름--영어단어-테스트기">■ 개발 소프트웨어 이름 : 영어단어 테스트기</h3>

<h3 id="요구사항">◈요구사항</h3>
<p>영어 단어를 외우면서 내가 얼마나 많이 외웠는지 시험을 보고 싶을 때가 있다. 
그러나 직접 단어를 써가며 시험지를 만드는 것은 오래 걸리고 번거롭기도 하다. 또한 채점 하는데에도 시간을 소요한다.
따라서 영어단어 테스트기 프로그램은 영어 단어를 외우고, 외운 단어를 스스로 테스트 하고 싶을 때 사용하기 위한 프로그램이다.
짧은 시간 안에도 영어 단어 테스트를 할 수 있고, 테스트를 마친 뒤 오답을 확인할 수 있는 기능을 통해 내가 어떤 단어를 모르는지, 어느 부분을 더 외워야하는지 알 수 있다.</p>

<p>[조건]</p>
<ul>
  <li>영어 단어와 뜻이 적혀있는 파일을 입력한다.</li>
  <li>파일에 입력된 단어 중 테스트를 볼 단어의 개수를 정한다</li>
  <li>사용자가 입력한 숫자 만큼 입력된 파일에서 랜덤으로 단어가 출력된다</li>
  <li>사용자는 출력된 단어를 보고 뜻을 입력한다</li>
  <li>단어 테스트가 종료되면, 맞은개수와 틀린개수를 알려주고, 오답을 확인할 것인지 물어본다</li>
  <li>사용자가 오답확인을 원하면, 틀린단어에서 사용자가 입력한 단어와 정답을 같이 보여준다</li>
  <li>오답확인이 끝나거나 사용자가 오답을 확인하지 않으면 프로그램을 마친다.</li>
</ul>

<h3 id="설계">◈설계</h3>
<ol>
  <li>파일에서 단어를 읽어와 리스트에 저장한다</li>
  <li>단어를 뜻과 묶어 리스트에 저장한다</li>
  <li>사용자가 입력한 단어 개수만큼 랜덤으로 문제를 낸다</li>
  <li>정답과 오답의 개수를 센다</li>
  <li>테스트가 끝난 후에는 정답, 오답의 개수를 알려주고 오답리스트를 보여준다</li>
</ol>

<h3 id="코드">◈코드</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">random</span>
<span class="n">answer_o</span><span class="o">=</span><span class="mi">0</span> <span class="c1">#정답 개수
</span><span class="n">answer_x</span><span class="o">=</span><span class="mi">0</span> <span class="c1">#오답 개수
</span><span class="n">filelist</span><span class="o">=</span><span class="nb">open</span><span class="p">(</span><span class="s">'영단어 100개.txt'</span><span class="p">,</span><span class="s">'r'</span><span class="p">).</span><span class="n">read</span><span class="p">().</span><span class="n">split</span><span class="p">()</span> <span class="c1">#파일에 있는 100개 단어 임시 저장
</span><span class="n">wordlist</span><span class="o">=</span><span class="p">[]</span> <span class="c1">#단어와 뜻을 같이 묶어서 저장
</span><span class="n">testlist</span><span class="o">=</span><span class="p">[]</span> <span class="c1">#문제에 나오는 단어를 저장
</span><span class="n">numlist</span><span class="o">=</span><span class="p">[]</span> 
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">filelist</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">)):</span>
  <span class="n">wordlist</span><span class="p">.</span><span class="n">append</span><span class="p">([</span><span class="n">filelist</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">x</span><span class="p">],</span><span class="n">filelist</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">x</span><span class="o">+</span><span class="mi">1</span><span class="p">]])</span>
 
<span class="n">num</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="nb">input</span><span class="p">(</span><span class="sa">f</span><span class="s">'원하는 영어 단어 개수를 입력하세요</span><span class="se">\n</span><span class="s">(단, </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">wordlist</span><span class="p">)</span><span class="si">}</span><span class="s">의 개수보다 많을 시에는 </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">wordlist</span><span class="p">)</span><span class="si">}</span><span class="s">개의 단어가 나온다.) '</span><span class="p">))</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">wordlist</span><span class="p">)</span><span class="o">&lt;</span><span class="n">num</span><span class="p">:</span> <span class="c1">#wordlist의 길이보다 큰지 비교
</span>  <span class="n">num</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">wordlist</span><span class="p">)</span>
 
<span class="n">ran_num</span><span class="o">=</span><span class="n">random</span><span class="p">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="nb">len</span><span class="p">(</span><span class="n">wordlist</span><span class="p">))</span> <span class="c1">#ran_num에 0부터 단어장의 길이까지 랜덤으로 숫자를 넣음
</span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num</span><span class="p">):</span> <span class="c1">#숫자 num개 뽑기
</span>  <span class="k">while</span> <span class="n">ran_num</span> <span class="ow">in</span> <span class="n">numlist</span><span class="p">:</span> <span class="c1">#뽑은 숫자들이 중복되지 않도록 numlist에 이미 있는 숫자인지 검토
</span>    <span class="n">ran_num</span><span class="o">=</span><span class="n">random</span><span class="p">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">wordlist</span><span class="p">))</span> <span class="c1">#중복되면 다시 뽑기
</span>  <span class="n">numlist</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">ran_num</span><span class="p">)</span> <span class="c1">#numlist에 숫자 추가
</span> 
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num</span><span class="p">):</span> <span class="c1">#사용자가 입력한 숫자(num)만큼 단어 출력(반복)
</span>  <span class="n">testlist</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">wordlist</span><span class="p">[</span><span class="n">numlist</span><span class="p">[</span><span class="n">x</span><span class="p">]])</span> <span class="c1">#testlist에 wordlist의 numlist[x]번째 단어를 저장
</span>  <span class="n">word</span><span class="o">=</span><span class="nb">input</span><span class="p">(</span><span class="sa">f</span><span class="s">'</span><span class="si">{</span><span class="n">wordlist</span><span class="p">[</span><span class="n">numlist</span><span class="p">[</span><span class="n">x</span><span class="p">]][</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s"> : '</span><span class="p">)</span> <span class="c1">#사용자에게 단어 뜻을 입력받음
</span>  <span class="k">if</span> <span class="p">(</span><span class="n">word</span><span class="o">==</span><span class="n">wordlist</span><span class="p">[</span><span class="n">numlist</span><span class="p">[</span><span class="n">x</span><span class="p">]][</span><span class="mi">1</span><span class="p">]):</span> <span class="c1">#만약 입력한 답안이 정답이라면 
</span>    <span class="n">answer_o</span><span class="o">+=</span><span class="mi">1</span> <span class="c1">#정답 개수 증가
</span>    <span class="n">testlist</span><span class="p">[</span><span class="n">x</span><span class="p">].</span><span class="n">append</span><span class="p">(</span><span class="s">'T'</span><span class="p">)</span> <span class="c1">#정답이면 True를 추가
</span>  <span class="k">else</span><span class="p">:</span>
    <span class="n">answer_x</span><span class="o">+=</span><span class="mi">1</span> <span class="c1">#오답 개수 증가
</span>    <span class="n">testlist</span><span class="p">[</span><span class="n">x</span><span class="p">].</span><span class="n">append</span><span class="p">(</span><span class="s">'F'</span><span class="p">)</span> <span class="c1">#오답이면 False를 추가
</span>    <span class="n">testlist</span><span class="p">[</span><span class="n">x</span><span class="p">].</span><span class="n">append</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
  <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'</span><span class="se">\n</span><span class="s">결과 / 전체-</span><span class="si">{</span><span class="n">num</span><span class="si">}</span><span class="s"> 정답-</span><span class="si">{</span><span class="n">answer_o</span><span class="si">}</span><span class="s"> 오답-</span><span class="si">{</span><span class="n">answer_x</span><span class="si">}</span><span class="s">'</span><span class="p">)</span>
  <span class="k">if</span> <span class="n">answer_x</span><span class="o">!=</span><span class="mi">0</span><span class="p">:</span> <span class="c1">#오답이 없다면 바로 종료
</span>    <span class="n">check</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="nb">input</span><span class="p">(</span><span class="s">'오답을 보시겠습니까?(1-확인, 0-종료) '</span><span class="p">))</span> <span class="c1">#오답이 있으면 오답을 볼건지 질문
</span>    <span class="k">if</span> <span class="n">check</span><span class="p">:</span>
      <span class="k">print</span><span class="p">(</span><span class="s">'</span><span class="se">\n</span><span class="s">오답리스트'</span><span class="p">)</span>
      <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">testlist</span><span class="p">:</span> 
        <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">==</span><span class="s">'F'</span><span class="p">:</span> <span class="c1">#testlist의 저장된 값이 F인것만 출력
</span>          <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'문제-</span><span class="si">{</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s"> 내가 쓴 답-</span><span class="si">{</span><span class="n">x</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="si">}</span><span class="s"> 정답-</span><span class="si">{</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s">'</span><span class="p">)</span>
  <span class="k">print</span><span class="p">(</span><span class="s">'</span><span class="se">\n</span><span class="s">영어단어 테스트를 종료합니다'</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="테스트">◈테스트</h3>
<p>영단어 100개.txt<br />
servant 하인
hunger 배고픔
tomb 무덤
taste 맛
sign 신호
stair 계단
trip 여행
brain 뇌
trumpet 트럼펫
speech 연설
thumb 엄지손가락
horn 뿔
chief 주요한
trousers 바지
prince 왕자
force 힘
sight 시야
space 우주
wool 양모
expressway 고속도로
science 과학
examination 시험
jar 단지
salt 소금
death 죽음
saw 톱
swing 그네
wish 소원
grain 곡식
eraser 지우개
alphabet 알파벳
shoulder 어깨
nephew 조카
niece 조카딸
library 도서관
factory 공장
giraffe 기린
hawk 매
pigeon 비둘기
bowl 사발
scene 장면
life 생활
earth 지구
pill 알약
math 수학
ocean 대양
price 가격
row 줄
schedule 일정
machine 기계
route 길
ivy 담쟁이덩굴
gift 선물
candle 초
joke 농담
art 예술
corn 옥수수
pet 애완동물
robber 강도
cheek 뺨
clerk 점원
cookie 쿠키
army 군대
nurse 간호사
master 주인
lock 자물쇠
moment 순간
sheet 시트
monk 승려
teenager 십대
closet 벽장
handle 다루다
guide 안내하다
bar 막대기
ostrich 타조
knee 무릎
cricket 크리켓
deck 갑판
bit 조금
silk 비단
jean 진바지
cotton 솜
drum 북
sand 모래
shock 충격
march 행진
cage 새장
whole 전부
change 교환
department 부
office 사무실
ticket 표
energy 힘
idea 생각
hospital 병원
noise 소음
sample 샘플
example 예
lesson 교훈
plenty 풍부</p>

<p>[실행결과]<br />
원하는 영어 단어 개수를 입력하세요<br />
(단, 100의 개수보다 많을 시에는 100개의 단어가 나온다.) 10<br />
office : 사무실<br />
cookie : 쿠키<br />
march : 행진하다<br />
brain : 뇌<br />
cage : 새장<br />
change : 교환<br />
cheek : 뺨 <br />
force : 힘<br />
corn : 옥수수<br />
art : 미술</p>

<p>결과 / 전체-10 정답-8 오답-2<br />
오답을 보시겠습니까?(1-확인, 0-종료) 1</p>

<p>오답리스트<br />
문제-march 내가 쓴 답-행진하다 정답-행진<br />
문제-art 내가 쓴 답-미술 정답-예술</p>

<p>영어단어 테스트를 종료합니다</p>

<h3 id="프로젝트-후-소감">◈프로젝트 후 소감</h3>
<p>단순히 생각하기만 했던 것을 직접 만들어보는 게 즐거웠다. 어떻게 해야 할지 모르겠는 기술적인 문제에 시달릴 때 인터넷에 검색도 해보고,
이것저것 넣어서 실행해보기도 하면서 원하던 방향대로 흘러갈 때 뿌듯함을 느꼈다.
다 제작하고 나서 좀 더 완성된 프로그램을 위해 추가 기능들도 생각해 보았다.
같은 단어라도 뜻이 여러 개일 수도 있는데, 현재 프로그램에서는 저장된 한 개의 뜻으로만 사용자의 입력을 판단해야 한다는 점이 아쉬웠다.
따라서 한 단어에 뜻을 여러 개 저장할 수 있도록 해보고 싶고, 문제를 낼 때 품사도 같이 적어두고 품사에 맞는 뜻을 입력하는 것도 좋을 것 같다.
또한 테스트를 보고 난 뒤 결과를 메모장에 날짜-성적으로 저장하여 나중에도 테스트 성적을 한눈에 볼 수 있도록 하고 싶다.</p>]]></content><author><name>이채원</name><email>cwyi@gmail.com</email></author><summary type="html"><![CDATA[■ 개발 소프트웨어 이름 : 영어단어 테스트기]]></summary></entry><entry><title type="html">다중 및 무한 반복문</title><link href="https://cw-yi.github.io/double_for/" rel="alternate" type="text/html" title="다중 및 무한 반복문" /><published>2021-06-09T00:00:00+00:00</published><updated>2021-06-09T00:00:00+00:00</updated><id>https://cw-yi.github.io/double_for</id><content type="html" xml:base="https://cw-yi.github.io/double_for/"><![CDATA[<h3 id="문제-상황">[문제 상황]</h3>
<p>Daum에서는 주기적으로 비밀번호를 변경하여 개인정보를 안전하게 보호하고 있습니다.
ID는 ‘알파벳+숫자’의 조합으로 만들 수 있습니다.
새로 변경하려는 비밀번호에서 연속된 3글자가 ID에 들어있다면 그것은 사용이 허락되지 않습니다.
위에서 설명한 것과 같이 비밀번호 변경 가능 여부를 체크한 후에 비밀번호를 변경하는 프로그램을 작성하시오.</p>

<h3 id="코드">[코드]</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">id</span><span class="o">=</span><span class="s">'cwyi6104'</span>
<span class="n">pw</span><span class="o">=</span><span class="nb">input</span><span class="p">(</span><span class="s">"비밀번호를 입력하세요 : "</span><span class="p">)</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">pw</span><span class="p">)</span><span class="o">-</span><span class="mi">2</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">pw</span><span class="p">[</span><span class="n">x</span><span class="p">:</span><span class="n">x</span><span class="o">+</span><span class="mi">3</span><span class="p">]</span> <span class="ow">in</span> <span class="nb">id</span><span class="p">:</span>
      <span class="k">print</span><span class="p">(</span><span class="s">"비밀번호 변경이 불가능합니다"</span><span class="p">)</span>
      <span class="k">break</span>
<span class="k">else</span><span class="p">:</span>
  <span class="k">print</span><span class="p">(</span><span class="s">"비밀번호 변경이 가능합니다"</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="출력-결과">[출력 결과]</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>비밀번호를 입력하세요 : pwer6104
비밀번호 변경이 불가능합니다
</code></pre></div></div>]]></content><author><name>이채원</name><email>cwyi@gmail.com</email></author><summary type="html"><![CDATA[[문제 상황] Daum에서는 주기적으로 비밀번호를 변경하여 개인정보를 안전하게 보호하고 있습니다. ID는 ‘알파벳+숫자’의 조합으로 만들 수 있습니다. 새로 변경하려는 비밀번호에서 연속된 3글자가 ID에 들어있다면 그것은 사용이 허락되지 않습니다. 위에서 설명한 것과 같이 비밀번호 변경 가능 여부를 체크한 후에 비밀번호를 변경하는 프로그램을 작성하시오.]]></summary></entry><entry><title type="html">조건문</title><link href="https://cw-yi.github.io/if/" rel="alternate" type="text/html" title="조건문" /><published>2021-06-02T00:00:00+00:00</published><updated>2021-06-02T00:00:00+00:00</updated><id>https://cw-yi.github.io/if</id><content type="html" xml:base="https://cw-yi.github.io/if/"><![CDATA[<h3 id="문제-상황">[문제 상황]</h3>
<p>가위, 바위, 보 게임을 만들어 봅시다.</p>

<h3 id="코드">[코드]</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">array</span> <span class="o">=</span><span class="s">"y"</span>
<span class="n">win</span><span class="o">=</span><span class="mi">0</span>

<span class="k">while</span> <span class="n">array</span><span class="o">==</span><span class="s">'y'</span><span class="p">:</span>
 <span class="n">me</span><span class="o">=</span><span class="nb">input</span><span class="p">(</span><span class="s">'me 입력(가위:s 바위:r 보:p) : '</span><span class="p">)</span>
 <span class="n">you</span><span class="o">=</span><span class="nb">input</span><span class="p">(</span><span class="s">'you 입력(가위:s 바위:r 보:p) : '</span><span class="p">)</span>
 <span class="k">if</span> <span class="n">you</span><span class="o">==</span><span class="n">me</span><span class="p">:</span>
  <span class="k">print</span><span class="p">(</span><span class="s">"비겼다"</span><span class="p">)</span>
 <span class="k">elif</span> <span class="n">you</span><span class="o">==</span><span class="s">'r'</span> <span class="ow">and</span> <span class="n">me</span><span class="o">==</span><span class="s">'p'</span> <span class="ow">or</span> <span class="n">you</span><span class="o">==</span><span class="s">'s'</span> <span class="ow">and</span> <span class="n">me</span><span class="o">==</span><span class="s">'r'</span> <span class="ow">or</span> <span class="n">you</span><span class="o">==</span><span class="s">'p'</span> <span class="ow">and</span> <span class="n">me</span> <span class="o">==</span><span class="s">'s'</span><span class="p">:</span>
  <span class="k">print</span><span class="p">(</span><span class="s">"이겼다"</span><span class="p">)</span>
  <span class="n">win</span><span class="o">=</span><span class="n">win</span><span class="o">+</span><span class="mi">1</span>
 <span class="k">else</span><span class="p">:</span>
  <span class="k">print</span><span class="p">(</span><span class="s">"졌다"</span><span class="p">)</span>

 <span class="k">print</span><span class="p">(</span><span class="s">"게임 끝!"</span><span class="p">)</span>
 <span class="n">array</span><span class="o">=</span><span class="nb">input</span><span class="p">(</span><span class="s">"다시 시작? y/n : "</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'총 </span><span class="si">{</span><span class="n">win</span><span class="si">}</span><span class="s">번 이겼습니다'</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="출력-결과">[출력 결과]</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>me 입력(가위:s 바위:r 보:p) : r
you 입력(가위:s 바위:r 보:p) : s
이겼다
게임 끝!
다시 시작? y/n : y
me 입력(가위:s 바위:r 보:p) : r
you 입력(가위:s 바위:r 보:p) : r
비겼다
게임 끝!
다시 시작? y/n : n
총 1번 이겼습니다
</code></pre></div></div>

<h3 id="코드-설명">[코드 설명]</h3>
<p>사용자에게 두번 입력하게 하고 입력 받은 값을 비김, 이김, 짐 사건으로 분류하여 if문을 만든다.
게임이 한판 끝나고 다시 하기를 원하면 한판 더 하고, 그렇지 않으면 승리한 횟수를 보여주고 게임을 끝낸다.</p>
<h3 id="문제-상황-1">[문제 상황]</h3>
<p>놀이 공원의 자유이용권 가격을 계산하는 프로그램을 작성하려고 합니다. 요금표는 아래와 같고, 고객의 나이와 입장시간에 따라 금액이 달라집니다.
출력 예를 참고하여 구입요금을 계산하는 프로그램을 작성하시오. 단, 시간은 24시간제를 착용하므로 오후 5시는 7시로 표현한다.</p>

<h3 id="코드-1">[코드]</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">time</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="nb">input</span><span class="p">(</span><span class="s">'시간을 입력하세요 : '</span><span class="p">))</span>
<span class="n">age</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="nb">input</span><span class="p">(</span><span class="s">'나이를 입력하세요 : '</span><span class="p">))</span>
<span class="k">if</span> <span class="n">time</span><span class="o">&lt;</span><span class="mi">17</span><span class="p">:</span>
  <span class="k">if</span> <span class="mi">3</span><span class="o">&lt;=</span><span class="n">age</span><span class="o">&lt;=</span><span class="mi">12</span> <span class="ow">or</span> <span class="n">age</span><span class="o">&gt;=</span><span class="mi">65</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"요금 : 25,000\ "</span><span class="p">)</span>
  <span class="k">elif</span> <span class="mi">12</span><span class="o">&lt;</span><span class="n">age</span><span class="o">&lt;</span><span class="mi">65</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"요금 : 34,000\ "</span><span class="p">)</span>
  <span class="k">else</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"무료"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
  <span class="k">print</span><span class="p">(</span><span class="s">"요금 : 10,000\ "</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="출력-결과-1">[출력 결과]</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>시간을 입력하세요 : 18
나이를 입력하세요 : 18
요금 : 10,000\
</code></pre></div></div>

<h3 id="코드-설명-1">[코드 설명]</h3>
<p>가격을 시간에 따라 분류한 후, 그 뒤에 나이에 따른 요금으로 분류한다.
오후 5시 이전에는 소인 2.5만원 대인 3.4를 if문으로 설정하고, 3세 이하 어린이는 무료로 입장한다.
오후 5시 이후에는 입장가를 만원으로 통일한다.</p>]]></content><author><name>이채원</name><email>cwyi@gmail.com</email></author><summary type="html"><![CDATA[[문제 상황] 가위, 바위, 보 게임을 만들어 봅시다.]]></summary></entry><entry><title type="html">반복문</title><link href="https://cw-yi.github.io/for_while/" rel="alternate" type="text/html" title="반복문" /><published>2021-05-26T00:00:00+00:00</published><updated>2021-05-26T00:00:00+00:00</updated><id>https://cw-yi.github.io/for_while</id><content type="html" xml:base="https://cw-yi.github.io/for_while/"><![CDATA[<h3 id="문제-상황">[문제 상황]</h3>
<p>흥덕 레스토랑은 점심식사 시간에 5팀의 예약만 받습니다.
직원이 차례로 예약을 받아 기록하는 프로그램을 작성해봅시다.
단, 예약은 고객의 이름과 전화번호 끝자리로 합니다.</p>

<h3 id="코드">[코드]</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">alist</span><span class="o">=</span><span class="p">[]</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">):</span>
  <span class="n">alist</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="nb">input</span><span class="p">(</span><span class="s">'예약하시려면 이름과 전화번호 끝자리를 남겨주세요 : '</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">'예약이 끝났습니다'</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'예약리스트 : </span><span class="si">{</span><span class="n">alist</span><span class="si">}</span><span class="s">'</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="출력-결과">[출력 결과]</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>예약하시려면 이름과 전화번호 끝자리를 남겨주세요 : 이채원 1234
예약하시려면 이름과 전화번호 끝자리를 남겨주세요 : 조민지 5678
예약하시려면 이름과 전화번호 끝자리를 남겨주세요 : 홍길동 1234
예약하시려면 이름과 전화번호 끝자리를 남겨주세요 : 히히히 5678
예약하시려면 이름과 전화번호 끝자리를 남겨주세요 : 가나다 0987
예약이 끝났습니다
예약리스트 : ['이채원 1234', '조민지 5678', '홍길동 1234', '히히히 5678', '가나다 0987']
</code></pre></div></div>]]></content><author><name>이채원</name><email>cwyi@gmail.com</email></author><summary type="html"><![CDATA[[문제 상황] 흥덕 레스토랑은 점심식사 시간에 5팀의 예약만 받습니다. 직원이 차례로 예약을 받아 기록하는 프로그램을 작성해봅시다. 단, 예약은 고객의 이름과 전화번호 끝자리로 합니다.]]></summary></entry></feed>