<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>_leehyeryeong.log</title>
        <link>https://velog.io/</link>
        <description>배운 거 대충 정리하는 블로그</description>
        <lastBuildDate>Thu, 04 Apr 2024 13:21:49 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>_leehyeryeong.log</title>
            <url>https://velog.velcdn.com/images/_leehyeryeong/profile/6bbd48bf-5fd2-4e80-81b8-895a2bb74e93/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. _leehyeryeong.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/_leehyeryeong" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[우분투 리눅스] VMware Player unrecoverable error: (vcpu-1)]]></title>
            <link>https://velog.io/@_leehyeryeong/%EC%9A%B0%EB%B6%84%ED%88%AC-%EB%A6%AC%EB%88%85%EC%8A%A4-VMware-Player-unrecoverable-error-vcpu-1</link>
            <guid>https://velog.io/@_leehyeryeong/%EC%9A%B0%EB%B6%84%ED%88%AC-%EB%A6%AC%EB%88%85%EC%8A%A4-VMware-Player-unrecoverable-error-vcpu-1</guid>
            <pubDate>Thu, 04 Apr 2024 13:21:49 GMT</pubDate>
            <description><![CDATA[<p>오류 해결 기념 글 작성하기✌️</p>
<p>이번 학기에 듣는 수업 중 서버 운영 실습이란 수업에서 우분투 리눅스를 배우며 학교 컴퓨터에는 우분투 리눅스를 설치해봤는데 개인 노트북에서는 아직 설치 안 해봐서 직접 해보던 참이었습니다.</p>
<p>VMware 설치하고 가상 머신 만들고 CD에 iso 파일 넣어주고... 수업에서 했던 그대로, 책에서 시키는 그대로 다 했으나</p>
<p><strong>절 맞이한 건 오류였습니다.</strong></p>
<p>해결하기 급급해서 에러 창 캡쳐도 안 해놨네요... 대신 아래에 에러 메세지 전문을 첨부합니다.
<br/></p>
<pre><code>VMware Player unrecoverable error: (vcpu-1)

Exception 0xc0000005 (access violation) has occurred.

A log file is available in &quot;C:\2024800014_UbuntuLinux\vmware.log&quot;.  

You can request support.  

To collect data to submit to VMware technical support, run &quot;vm-support&quot;.

We will respond on the basis of your support entitlement.
</code></pre><p><del>살다살다이런거처음봄</del>
<br/></p>
<p>뭐 대충 뭐가 제외가 되고 어쩌고 저쩌고...</p>
<p>아무튼 오류가 났으니 뭘 해야하겠는가.
<br/></p>
<p><strong>구글링을 해야겠죠?</strong>
<br/></p>
<p><a href="https://communities.vmware.com/t5/VMware-Workstation-Pro/vmware-workstation-unrecoverable-error-vcpu-1-Only-On-New-Laptop/td-p/2962025">그래서 같은 오류가 난 사람을 찾았습니다.</a></p>
<p>댓글까지 살펴보니 <strong>비활성화해야 하는 Windows Defender 설정, 특히 코어 격리 설정(메모리 무결성을 비활성화해야 함)으로 인해 발생한 것 같습니다.</strong> 라는 말이 있었습니다.</p>
<p>그래서 메모리 무결성을 비활성화 했습니다. 참고로 저는 Window 11 사용합니당.</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/36cb031c-e86d-49e5-9663-4d1e6078868f/image.png" alt="">
아래 검색창에 Windows 보안 검색해서 들어가줍니다.</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/dcd187bf-2255-4b1d-a282-7e108f67c0b8/image.png" alt="">
들어가면 이런 화면이 나옵니다. 여기에서 장치 보안으로 가줍니다.</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/2f637b70-573f-4a20-b530-7954b4fae321/image.png" alt="">
코어 격리 밑에 코어 격리 세부 정보가 보이시나요? 클릭해주세요.</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/4d30ab69-83fb-4242-835c-6c6dda24ed80/image.png" alt="">
들어와서 여기 이 메모리 무결성을 꺼주면 됩니다. 저는 이미 끈 상태입니다.
<br/></p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/4ab44a36-a235-4fa5-be28-1ef91474df97/image.png" alt="">
그렇게 저는 오류를 해결했고 지금 우분투를 설치중입니다. 참 별거 없죠?</p>
<p>하지만 전에 했을 때는 됐는데! 같은 생각과 구글링 했는데 죄다 영어만 나오면 <del>사실 당장 많이들 쓰는 스택 오버플로우만 해도 영어 천진데 그래도 영어 싫어서 괜히 한국인 없나 벨로그나 티스토리 글 찾아보는 사람 마음...</del> 괜히 복잡해보이고 심란해지는 게 사람 속인가 봅니다...</p>
<p>그러니 제가 여러분의 한국인이 되어 드릴게요^^ 장난.
<br/></p>
<p>어쨌든 이렇게 오류 기록을 마칩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[운영체제] 운영체제의 개요]]></title>
            <link>https://velog.io/@_leehyeryeong/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%9D%98-%EA%B0%9C%EC%9A%94</link>
            <guid>https://velog.io/@_leehyeryeong/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%9D%98-%EA%B0%9C%EC%9A%94</guid>
            <pubDate>Thu, 21 Mar 2024 12:42:11 GMT</pubDate>
            <description><![CDATA[<h1 id="생활-속-운영체제">생활 속 운영체제</h1>
<h2 id="운영체제operating-system-os">운영체제(Operating System; OS)</h2>
<p>: 일반 컴퓨터, 노트북, 스마트폰의 전원을 켜면 가장 먼저 만나는 소프트웨어</p>
<blockquote>
<p>PC: Window, Mac OS, Unix, Linux...
모바일: iOS, Android...</p>
</blockquote>
<h2 id="임베디드-운영체제">임베디드 운영체제</h2>
<p>: CPU의 성능이 낮고, 메모리 크기도 작은 시스템에 내장하도록 만든 운영체제</p>
<h2 id="운영체제란">운영체제란?</h2>
<p>: 컴퓨터 전체를 관리/운영하는 소프트웨어 위에 존재하는 <strong>최고 소프트웨어</strong></p>
<ul>
<li>컴퓨터를 관리하기 위한 기본 규칙/절차를 규정하여 컴퓨터 내의 모든 하드웨어와 응용 프로그램을 관리한다.</li>
<li>컴퓨터 자원 보호를 위해 응용 프로그램과 사용자에게서 모든 컴퓨터 자원을 숨길 수 있다. → 직접 접근이 불가능해진다. (+ 대신 다양한 인터페이스(interface) 제공)</li>
<li>하드웨어의 도움 없이 작동하기가 어려워, 소프트웨어&amp;하드웨어를 모두 갖춘 형태로 운영한다. (펌웨어(firmware))<br/>

</li>
</ul>
<h1 id="운영체제의-정의">운영체제의 정의</h1>
<ul>
<li>인터페이스를 이용해 커널에 명령을 내리면 인터페이스가 결과를 전달한다.</li>
<li>컴퓨터 인터페이스 중 일부는 사용자 인터페이스이다. (UI; User Interface)
ex) 디렉토리 만들기, 파일 복사 등등... 운영체제가 제공하는 UI이다.<br/>

</li>
</ul>
<h1 id="운영체제의-역할">운영체제의 역할</h1>
<h2 id="자원-관리">자원 관리</h2>
<p>: 컴퓨터 시스템 자원을 응용 프로그램에 나눠주어 사용자가 원활히 작업하게 한다.</p>
<h2 id="자원-보호">자원 보호</h2>
<p>: 비정상적 작업으로부터 컴퓨터 자원을 보호한다.</p>
<h2 id="하드웨어-인터페이스-제공">하드웨어 인터페이스 제공</h2>
<p>: 사용자가 복잡한 과정 없이 다양한 장치를 사용할 수 있도록 하드웨어 인터페이스를 제공한다.</p>
<h2 id="사용자-인터페이스-제공">사용자 인터페이스 제공</h2>
<p>: 사용자가 운영 체제를 편리하게 사용하도록 지원한다.
  ex) 윈도우의 GUI(Graphin User Interface)
<br/></p>
<h1 id="운영체제의-목표">운영체제의 목표</h1>
<table>
<thead>
<tr>
<th align="center">역할</th>
<th align="center">목표</th>
</tr>
</thead>
<tbody><tr>
<td align="center">자원 관리</td>
<td align="center">효율성</td>
</tr>
<tr>
<td align="center">자원 보호</td>
<td align="center">안정성</td>
</tr>
<tr>
<td align="center">하드웨어 인터페이스 제공</td>
<td align="center">확장성</td>
</tr>
<tr>
<td align="center">사용자 인터페이스 제공</td>
<td align="center">편리성</td>
</tr>
<tr>
<td align="center"><br/></td>
<td align="center"></td>
</tr>
</tbody></table>
<h1 id="운영체제의-발전">운영체제의 발전</h1>
<h2 id="에니악">에니악</h2>
<p>: 최초의 컴퓨터</p>
<ul>
<li>진공관 소자가 켜지면 1, 꺼지면 0으로 판단한다.
→ 이는 컴퓨터가 2진법을 사용하는 계기가 된다.</li>
</ul>
<h2 id="초기의-컴퓨터">초기의 컴퓨터</h2>
<ul>
<li>키보드, 마우스, 모니터 같은 주변 장치가 없다.</li>
<li>전선을 이용해 논리회로를 구성하는 하드 와이어링(hard wiring) 방식이다.</li>
<li>운영체제가 존재하지 않는다.</li>
</ul>
<h2 id="일괄-작업-시스템">일괄 작업 시스템</h2>
<p>: 모든 작업을 한꺼번에 처리하는 시스템</p>
<ul>
<li>필요한 프로그램과 데이터를 동시에 입력해야 가능하다.</li>
<li>일괄 작업/처리 시스템(batch job/processing system)</li>
</ul>
<h2 id="대화형-시스템">대화형 시스템</h2>
<p>: 컴퓨터와 사용자의 대화를 통해 작업이 이루어지는 시스템</p>
<ul>
<li>키보드와 모니터가 등장, 작업 중간에 입력이 가능해졌다.</li>
<li>중간 결과값을 확인할 수 있다.</li>
</ul>
<h2 id="시분할-시스템time-sharing-system">시분할 시스템(Time Sharing System)</h2>
<p>: 여러 작업을 조금씩 처리하여 작업이 동시에 이루어지는 것처럼 보이게 하는 것</p>
<ul>
<li>잘게 나뉜 시간 한 조각을 타임 슬라이스(time slice) 혹은 타임 퀀텀(time quantum)이라고 한다.</li>
<li>오늘날 컴퓨터는 대부분 시분할 시스템이다.</li>
</ul>
<h3 id="시분할-시스템의-단점">시분할 시스템의 단점</h3>
<ul>
<li>여러 작업을 동시에 처리하기 위해 추가 작업이 필요하다.</li>
<li>많은 양의 작업이 공존할 경우, 중요한 작업이 일정 시간 안에 끝나는 것을 보장하지 못한다.</li>
</ul>
<h3 id="멀티-프로그래밍">멀티 프로그래밍</h3>
<p>: 하나의 CPU로 여러 작업을 동시에 실행하는 기술</p>
<h3 id="실시간-시스템">실시간 시스템</h3>
<p>: 특정 시스템에서 일정 시간 안에 작업이 처리되도록 보장하는 것</p>
<h2 id="분산-시스템distributed-system">분산 시스템(Distributed System)</h2>
<p>: 개인용 컴퓨터와 인터넷이 보급되어 값이 싸고, 크기가 작은 컴퓨터를 하나로 묶어 대형 컴퓨터의 능력에 버금가게 만든 것</p>
<ul>
<li>네트워크 상에 분산되어 있는 여러 컴퓨터로 작업을 처리, 그 결과를 상호 교환하도록 구성되어 있다.</li>
</ul>
<h2 id="클라이언트서버-시스템clientserver">클라이언트/서버 시스템(Client/Server)</h2>
<p>: 작업을 요청하는 클라이언트와 요청 받은 작업을 처리하는 서버의 이중 구조</p>
<ul>
<li>웹 시스템이 보급된 이후에 알려졌다.</li>
<li>모든 요청이 서버로 집중 돼, 서버 과부화가 생긴다는 문제점이 존재한다.
→ 해결 방법으로는 많은 서버, 큰 용량의 네트워크가 있다.</li>
</ul>
<h2 id="p2p-시스템">P2P 시스템</h2>
<p>: 클라이언트/서버 구조의 단점인 서버 과부화를 극복하기 위해 만든 시스템</p>
<ul>
<li>서버를 거치지 않고 사용자들을 직접 연결한다.(사용자-사용자)</li>
<li>냅스터(mp3 공유 시스템)에서 시작되어, 현재는 메신저/토렌트 시스템에서 사용되고 있다.
ex) 카카오톡
  : 사용자가 서버에서 인증을 마치면 상대방과 P2P로 직접 연결한다.</li>
</ul>
<h3 id="서버가-없는-완전한-p2p-시스템-블록체인">서버가 없는 완전한 P2P 시스템, 블록체인</h3>
<p>: P2P 서버 전체에 거래 장부를 분산해, 전체 시스템의 50% 이상이 동의시 거래 장부 변경이 가능하다.</p>
<h2 id="클라우드-컴퓨팅">클라우드 컴퓨팅</h2>
<p>: 하드웨어와 소프트웨어를 클라우드라고 불리는 중앙 시스템에 숨기고 사용자는 필요한 서비스만 그때그때 이용하는 방식의 컴퓨팅 환경</p>
<ul>
<li>기존 컴퓨터에서만 이루어지던 여러 서비스를 확장된 형태로 발전시킨 것이다.</li>
<li>클라우드 환경으로 옮겨오면서 더 이상 저장장치에 데이터를 저장해서 들고 다닐 필요가 없어졌다.</li>
</ul>
<h2 id="사물-인터넷iot-internet-of-things">사물 인터넷(IoT; Internet of Things)</h2>
<p> : 사물이 인터넷에 연결된 시스템</p>
<ul>
<li>다양한 사물이 센서와 통신 기능을 내장, 스스로 통신하여 지능적 서비스를 제공하는 기술이다.<br/>

</li>
</ul>
<h1 id="운영체제-주요-기능">운영체제 주요 기능</h1>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/baf77700-f5bd-49e1-9f48-da1ee6ba610b/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[컴퓨터 구조] 문자 집합]]></title>
            <link>https://velog.io/@_leehyeryeong/%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EB%AC%B8%EC%9E%90-%EC%A7%91</link>
            <guid>https://velog.io/@_leehyeryeong/%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EB%AC%B8%EC%9E%90-%EC%A7%91</guid>
            <pubDate>Wed, 20 Mar 2024 12:34:07 GMT</pubDate>
            <description><![CDATA[<h1 id="문자-집합">문자 집합</h1>
<p>: 컴퓨터가 인식할 수 있는 문자 모음을 말한다. 인코딩하여 0과 1로 표현이 가능하다.</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/04f930de-8a13-4b03-a0c0-80426a331fe9/image.png" alt=""></p>
<p>인코딩: 사람의 언어를 컴퓨터가 이해할 수 있게끔 변환
디코딩: 컴퓨터의 언어를 사람이 이해할 수 있게끔 변환...</p>
<h2 id="아스키-코드">아스키 코드</h2>
<p>: ASCII(American Standard Code For Information Interchange), 미국 정보 교환 표준 부호를 말한다.</p>
<h2 id="euc-kr">EUC-KR</h2>
<p>: 한글을 2바이트 크기로 인코딩 해 만들어진 한글 완성형 인코딩이다.</p>
<h2 id="유니코드">유니코드</h2>
<p>: 여러 나라의 문자들을 표현할 수 있는 통일된 문자 집합</p>
<blockquote>
<p>UTF-8, UTF-16, UTF-32...</p>
</blockquote>
<h2 id="문자-집합의-등장-흐름">문자 집합의 등장 흐름</h2>
<ol>
<li>기계어로 문자 인식이 되지 않음</li>
<li>이미 약속된 문자표를 정함</li>
<li>대표적 문자표, 아스키 코드를 사용</li>
<li>영어권이 아닌 컴퓨터 사용자가 등장하게 됨</li>
<li>영어 아닌 문자는 인식이 되지 않는 문제 발생</li>
<li>한글을 위해 EUC-KR 등장</li>
<li>한글 뿐 아니라 여러 나라별 문자 호환성 문제 발생</li>
<li>토일된 방식의 유니코드 등장</li>
<li>영어는 1 바이트, 한글을 2 바이트로 지정</li>
<li>문자 앞에 바이트 정보 표를 넣어 저장하게 됨, 이를 인코딩이라 함<br/>

</li>
</ol>
<h1 id="기계어-단위">기계어 단위</h1>
<ul>
<li>기계어
: 말 그대로 컴퓨터가 쓰는 언어</li>
<li>저급언어
: 기계어와 비슷한 컴언어(ex. 어셈블리어...)</li>
<li>고급언어
: 사람의 언어와 비슷한 컴언어(ex. C언어, JAVA, PYTHON...)</li>
<li>사람의 언어
: 말 그대로 사람이 쓰는 언어<br/>

</li>
</ul>
<h1 id="진법">진법</h1>
<p>: 0부터 n개의 숫자를 사용해 수를 표현하는 방법. 0~(n-1) 만큼 표현이 가능하다.</p>
<p>2진수, 8진수, 10진수, 16진수 등 다양하게 존재한다.</p>
<h2 id="10진수">10진수</h2>
<p>: 0부터 9까지 숫자를 사용해 수를 표현하는 방법. 사람이 사용한다.
왜? 손가락은 열 개니까...</p>
<h2 id="2진수">2진수</h2>
<p>: 0부터 1까지 숫자를 사용해 수를 표현하는 방법. 컴퓨터가 사용한다.
왜? 컴퓨터는 꺼짐과 켜짐만으로 대화하니까...</p>
<h2 id="10진수-→-2진수">10진수 → 2진수</h2>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/79ceed66-6517-4208-a6d9-0c614f168a1d/image.png" alt="">
이미지로 대체합니다...</p>
<h2 id="2의-보수">2의 보수</h2>
<p>: 어떤 수를 커다란 2의 제곱수에서 빼서 얻은 이진수이다.</p>
<ul>
<li>모든 0과 1을 뒤집고 1을 더하면 보수를 구할 수 있다.<br/>

</li>
</ul>
<h1 id="명령어">명령어</h1>
<p>: 특정 작업을 수행하기 위한 컴퓨터 프로그램의 명령
<img src="https://velog.velcdn.com/images/_leehyeryeong/post/9ced5024-8f45-452d-96c2-2279d9d01b68/image.png" alt="">
여기서 변환할 때 쓰는 문장 또한 명령어이다.</p>
<h2 id="변환-방식">변환 방식</h2>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/4f99b844-505e-4468-8c24-6d33e8cfbb7e/image.png" alt=""></p>
<p>컴파일 언어의 예씨로는 C언어, 인터프리터 언어의 예시로는 파이썬이 있다.
컴파일 언어는 파일을 통째로 변환, 인터프리터 언어는 한 줄씩 변환한다는 차이가 있겠다.</p>
<h3 id="어셈블리어를-알아야-할까">어셈블리어를 알아야 할까?</h3>
<p>: 하드웨어와 맞닿아 있는 프로그램 개발에 사용되기에 알아두면 좋긴 하다.</p>
<ul>
<li>임베디드 개발<ul>
<li>게임 개발</li>
<li>정보 보안 분야...<br/>

</li>
</ul>
</li>
</ul>
<h1 id="연산코드와-오퍼랜드">연산코드와 오퍼랜드</h1>
<h2 id="연산코드opcode">연산코드(opcode)</h2>
<p>: 명령어가 수행할 연산을 의미한다. 아래와 같이 이루어져있다.</p>
<ul>
<li>데이터 전송</li>
<li>산술/논리 연산</li>
<li>제어 흐름 변경</li>
<li>입출력 제어<br/>

</li>
</ul>
<h2 id="오퍼랜드주소필드">오퍼랜드(주소필드)</h2>
<p>: 연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치를 의미한다. 아래와 같이 이루어져있다.</p>
<ul>
<li>즉시 주소 지정방식</li>
<li>직접 주소 지정방식</li>
<li>간접 주소 지정방식</li>
<li>레지스터 주소 지정방식</li>
<li>레지스터 간접 주소 지정방식</li>
<li>묵시적 주소지정 방식, 스택 주소 지정방식</li>
<li>변위 주소 지정방식 - 상대 주소 지정방식</li>
<li>변위 주소 지정방식 - 베이스 레지스터 주소 지정방식<br/>

</li>
</ul>
<h2 id="자료-구조">자료 구조</h2>
<h3 id="스택stack">스택(STACK)</h3>
<p>: 최근에 저장한 데이터를 먼저 사용하는 구조, LIFO(Last In First Out) 구조라고 부른다.</p>
<p>사용의 예시로는</p>
<ul>
<li>웹 브라우저 뒤로 가기
: 가장 나중에 열린 페이지부터 뒤로 가기를 실행한다.</li>
<li>문서 작업에서 Ctrl+Z
: 가장 나중에 수정한 내역부터 되돌린다.</li>
<li>역순 문자열 만들기
: 맨 끝의 문자열부터 차례대로 만들어진다.</li>
<li>후위 표기법 계산</li>
<li>재귀적 알고리즘</li>
</ul>
<p>등등이 있다.</p>
<h3 id="큐queue">큐(QUEUE)</h3>
<p>: 먼저 저장한 데이터를 먼저 사용하는 구조, FIFO(First In First Out) 구조라고 부른다.</p>
<ul>
<li>선형 큐(Linear Queue), 환형 큐(Circular Queue)로 이루어져있다.</li>
</ul>
<p>사용의 예시로는</p>
<ul>
<li>은행창구 번호표 대기
: 빠른 번호표를 가진 사람이 먼저 업무를 본다.</li>
<li>프린터 출력
: 가장 먼저 대기열에 오른 프린트가 먼저 출력된다.</li>
<li>너비 우선 탐색(BFS) 알고리즘</li>
</ul>
<p>등등이 있다.</p>
<br/>

<p><a href="https://velog.io/@hyunji015/%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EB%AA%85%EB%A0%B9%EC%96%B4%EC%9D%98-%EA%B5%AC%EC%A1%B0">참고한 글</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[컴퓨터 구조] 컴퓨터 기본 구성]]></title>
            <link>https://velog.io/@_leehyeryeong/%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B8%B0%EB%B3%B8-%EA%B5%AC%EC%84%B1</link>
            <guid>https://velog.io/@_leehyeryeong/%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B8%B0%EB%B3%B8-%EA%B5%AC%EC%84%B1</guid>
            <pubDate>Wed, 20 Mar 2024 11:53:44 GMT</pubDate>
            <description><![CDATA[<h1 id="컴퓨터-구조하드웨어">컴퓨터 구조(하드웨어)</h1>
<p>컴퓨터의 4가지 핵심 부품</p>
<ul>
<li>중앙처리장치(CPU)</li>
<li>기억장치<ul>
<li>RAM(휘발성)</li>
<li>ROM(비휘발성)</li>
</ul>
</li>
<li>보조기억장치</li>
<li>입출력장치(ex. 모니터, 마우스, 키보드...)</li>
</ul>
<p>System Fan, Floppy, Heat Sink, Hard Drive, Opital Drive, Ram Modules, Mother Board(Main Board), Process(CPU), Power Supply...</p>
<h2 id="메인-보드main-board">메인 보드(Main Board)</h2>
<p>마더 보드(Mother Board)라고도 불린다.
<img src="https://velog.velcdn.com/images/_leehyeryeong/post/92920c9f-129f-440f-9699-80406c972e1a/image.png" alt=""></p>
<h2 id="cpucentral-processing-unit">CPU(Central Processing Unit)</h2>
<p>: 메모리에 저장된 값을 읽고 해석하는 장치
<img src="https://velog.velcdn.com/images/_leehyeryeong/post/07464304-9989-477b-9bf2-b95abe84afba/image.png" alt=""></p>
<h3 id="alu">ALU</h3>
<p>산술논리연산장치, 즉 계산하는 장치. 컴퓨터 내부에서 수행되는 대부분의 계산을 도맡아 수행한다.</p>
<h3 id="레지스터">레지스터</h3>
<p>CPU 내부의 작은 임시 저장 장치. 프로그램을 실행하는 데 필요한 값들을 임시로 저장한다.</p>
<h3 id="제어장치">제어장치</h3>
<p>제어 신호를 발생시키고 명령어를 해석하는 장치.</p>
<h3 id="cpu의-실행-원리">CPU의 실행 원리</h3>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/ae82a47a-fa1e-45e8-b1f6-85d43d1cf53a/image.png" alt="">
나름대로 그림으로 정리해보았다...</p>
<ol>
<li><p>제어장치에서 메모리의 1번지에 저장된 명령어를 읽어 들이기 위하여 메모리에 &#39;메모리 읽기&#39; 제어 신호를 보낸다.</p>
</li>
<li><p>메모리에서 1번지에 저장된 명령어를 CPU에 건네주면, 이 명령어가 레지스터에 저장된다. 읽어 들인 명령어를 제어장치에서 해석 후, 메모리의 3번지와 4번지의 데이터의 필요를 판단, 읽어들이기 위해 &#39;메모리 읽기&#39; 제어 신호를 보낸다.</p>
</li>
<li><p>메모리에서 3번지와 4번지에 저장된 데이터를 CPU에 건네주면 이들을 서로 다른 레지스터에 저장된다. ALU는 이렇게 읽어 들인 데이터로 연산을 수행 후, 결괏값은 레지스터에 저장이 된다.</p>
</li>
<li><p>메모리의 1번지 명령어를 실행했으니, 2번지에 저장된 다음 명령어를 읽어 들이기 위해 다시 &#39;메모리 읽기&#39; 제어 신호를 보낸다.</p>
</li>
<li><p>메모리에서 2번지에 저장된 명령어를 CPU에 건네주면, 이 명령어가 레지스터에 저장된다. 제어장치는 명령어를 해석 후, 메모리에 계산 결과를 저장해야 한다 판단, &#39;메모리 쓰기&#39; 제어 신호와 함께 계산 결과를 보낸다. 메모리가 계산 결과를 저장하면 두 번째 명령어 실행 또한 끝이 난다.</p>
</li>
</ol>
<h2 id="메모리">메모리</h2>
<p>: 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품</p>
<ul>
<li>프로그램 실행을 위해선 반드시 메몰에 저장되어야 한다.</li>
<li>메모리에 저장된 값의 위치는 주소로 알 수 있다.</li>
</ul>
<h2 id="보조기억장치">보조기억장치</h2>
<p>: 메모리보다 크기가 크고 전원이 꺼져도 저장된 내용을 잃지 않는 메모리 보조 저장 장치</p>
<blockquote>
<p>하드 디스크, SSD, USB 메모리, DVD, CD-ROM...</p>
</blockquote>
<ul>
<li>메모리는 현재 실행되는 프로그램을, 보조기억장치는 보관할 프로그램을 저장한다는 차이점이 있다.</li>
</ul>
<h2 id="입출력장치">입출력장치</h2>
<p>: 컴퓨터 외부에 연결되어 컴퓨터 내부의 정보를 교환하는 장치</p>
<blockquote>
<p>모니터, 키보드, 마우스...</p>
</blockquote>
<h2 id="시스템-버스system-bus">시스템 버스(System Bus)</h2>
<p>: 컴퓨터의 핵심 4가지 부품을 연결하는 가장 중요한 버스</p>
<blockquote>
<p>버스(bus)란?
정보를 주고 받는 통로</p>
</blockquote>
<ul>
<li>주소 버스(address bus)
: 주소를 주고 받는 통로</li>
<li>데이터 버스(data bus)
: 명령어와 데이터를 주고 받는 통로</li>
<li>제어 버스(control bus)
: 제어 신호를 주고 받는 통로</li>
</ul>
<h2 id="마무리">마무리</h2>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/943e0ff4-004e-4e00-b942-9912d48634e8/image.png" alt=""></p>
<p>컴퓨터가 이해하는 구조에 대해서 간단하게 말하고 정리하겠다.
언어의 구조는 주어 + 동사로 이루어졌으나, 컴퓨터는 데이터 + 명령어의 구조를 이해하기에 사람과 컴퓨터의 언어의 확연한 차이가 드러난다.
<br/></p>
<p><a href="https://hongong.hanbit.co.kr/%EC%BB%B4%ED%93%A8%ED%84%B0%EC%9D%98-4%EA%B0%80%EC%A7%80-%ED%95%B5%EC%8B%AC-%EB%B6%80%ED%92%88cpu-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%B3%B4%EC%A1%B0%EA%B8%B0%EC%96%B5%EC%9E%A5/">참고한 글</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Docker에 Jenkins 설치]]></title>
            <link>https://velog.io/@_leehyeryeong/Docker%EC%97%90-Jenkins-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@_leehyeryeong/Docker%EC%97%90-Jenkins-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Wed, 06 Sep 2023 06:20:37 GMT</pubDate>
            <description><![CDATA[<p>설치하기 전에, 설치하는 방법을 찾아보면서 도커에 젠킨스를 설치하는 것이 어떤 면에서 좋은지 고찰하는 글을 보았다. 글 내용은 그냥 한 마디로 정리하자면</p>
<p><strong>젠킨스 플러그인, 구성 설정 등을 매번 설치하는게 귀찮다면 도커에 설치해라, 아니면 그냥 매번 수동으로 해라.</strong></p>
<p>였다. 근데 나는 실습해야 하니까 그냥 설치할 거다.</p>
<p>저번 글을 보면 알겠지만 나는 이미 도커를 깔았으니 젠킨스 설치로 바로 들어가겠다.</p>
<h1 id="1-jenkins-image-내려-받기">1. Jenkins Image 내려 받기</h1>
<p>아래의 명령어를 터미널에 입력한다. 작성자는 window powershell을 쓰고 있다.</p>
<pre><code>docker pull jenkins/jenkins:lts</code></pre><p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/14ea2c2f-4717-4a8b-8253-2d5372ef6474/image.png" alt="">
시작부터 순탄치 않다. 에러가 난다.</p>
<p>&nbsp;
그냥 혹시나 해서 관리자 권한으로 실행시켜서 다시 입력했더니 된다. <del>뭐지? 이유는 모르겠다...</del>
<img src="https://velog.velcdn.com/images/_leehyeryeong/post/0de2d6c0-6e20-4886-9f9e-bdd719587dab/image.png" alt=""></p>
<h1 id="2-jenkins-container-설치-및-실행">2. Jenkins Container 설치 및 실행</h1>
<p>이미지 내려받았으니 컨테이너에 올릴 차례다.</p>
<pre><code>docker run -d -p 8085:8080 -v /jenkins:/var/jenkins_home -u root jenkins/jenkins:lts</code></pre><p> <img src="https://velog.velcdn.com/images/_leehyeryeong/post/77e62f3f-cd32-4067-b670-bb0b58787a0b/image.png" alt="">
컨테이너에 올리기까지 성공했다.</p>
<p>위에 명령문을 간단히 정리해보자.</p>
<ul>
<li>-d: detached mode, 흔히 말하는 백그라운드 모드</li>
<li>-p: 호스트와 컨테이너의 포트를 연결(포워딩)</li>
<li>-v: 호스트와 컨테이너의 디렉토리를 연결(마운트)</li>
<li>-u: 실행할 사용자 지정</li>
</ul>
<p>마지막에 jenkins/jenkins:lts는 실행할 이미지의 레포지토리 이름이다.</p>
<h1 id="3-jenkins-브라우저로-접속">3. Jenkins 브라우저로 접속</h1>
<p>위에서 포트 번호를 8085로 줬으니까 localhost:8085로 들어간다.
<img src="https://velog.velcdn.com/images/_leehyeryeong/post/078629be-2437-48f9-8288-ea4bf50b74a8/image.png" alt=""></p>
<p>위 화면에 input창을 보면 Administrator password라고 써있다. 비밀번호 입력창으로, 초기 비밀번호는 컨테이너에 저장되어 있다고 한다.</p>
<p>그런데 구글링 해서 나온 글 참고해서 하던 도중, 또 오류가 떠서 대체 뭐가 문젠가 했는데 정말 별 거 아니었다. 정말 별 거 아니었으나 혹시나 해서 기록한다.</p>
<pre><code>docker exec -it wizardly_goldwasser /bin/bash</code></pre><p>먼저 저 명령어를 입력해줘서 실행중인 젠킨스 컨테이너에 접근해야 한다. 명령어를 부분부분 뜯어서 보자.</p>
<pre><code>docker exec [OPTIONS] CONTAINER COMMAND [ARG...]</code></pre><p>괄호친 부분은 자신의 경우에 맞게 넣으면 된다.</p>
<p>나는 참고해서 한답시고 명령어 그대로 긁어가는 바람에 컨테이너 부분에 남의 컨테이너 이름을 넣었다. <del>그러니까 안 되지</del>
<img src="https://velog.velcdn.com/images/_leehyeryeong/post/e85f458d-5a09-4ee1-8b70-ef4eb6a1a432/image.png" alt="">
잘 돌아가던 내 컨테이너 왜 안 돌아간다고 뜨는지만 고민했지만 중요한 건 그 부분이 아니었다.</p>
<p>여튼 저렇게 치면 명령어를 입력하는 부분이 아래와 같이 변한다.
<img src="https://velog.velcdn.com/images/_leehyeryeong/post/0f2dc9b4-2d44-43d2-ba30-2dd21125914e/image.png" alt=""></p>
<p>이제 여기서</p>
<pre><code>cat /var/jenkins_home/secrets/initialAdminPassword</code></pre><p>입력해주면 초기 비밀번호를 확인할 수 있다.</p>
<h1 id="4-jenkins-플러그인-설치">4. Jenkins 플러그인 설치</h1>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/fd734038-a1d5-4124-851d-de55a40d7e55/image.png" alt="">
초기 비밀번호를 입력해주고 다음으로 넘어가면 위와 같은 화면이 뜬다.
이제 플러그인을 설치해야 하는데 나는 기본 권장 플러그인을 설치할 것이다.</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/39e49af0-1ff7-4406-9aa0-d235f98cf2d1/image.png" alt="">
설치가 잘 되고 있는 모습.</p>
<h1 id="5-jenkins-초기-계정-생성">5. Jenkins 초기 계정 생성</h1>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/1a3b7405-da38-42fe-8238-49da42b99698/image.png" alt="">
그냥 알아서 적당히 입력해주고 넘기면 이렇게 설치가 완료되며 젠킨스 메인 페이지로 넘어가게 된다.</p>
<h1 id="번외-jenkins-삭제하는-법">번외. Jenkins 삭제하는 법</h1>
<p>사실 처음에 Jenkins 설정 잘못해서 지웠다 다시 했다. 혹시나 해서 이것도 적어둔다.</p>
<ol>
<li><p>현재 실행중인 컨테이너 확인하기</p>
<pre><code>docker ps</code></pre></li>
<li><p>Jenkins 컨테이너 종료하기</p>
<pre><code>docker stop [CONTAINER ID]</code></pre></li>
<li><p>Jenkins 컨테이너 삭제</p>
<pre><code>docker rm [CONTAINER ID]</code></pre></li>
</ol>
<p>이 방법으로 깔끔하게 지우고 다시 만들어서 실행했다.</p>
<p>&nbsp;
참고한 글
<a href="https://narup.tistory.com/202">https://narup.tistory.com/202</a>
<a href="http://jmlim.github.io/docker/2019/02/25/docker-jenkins-setup/">http://jmlim.github.io/docker/2019/02/25/docker-jenkins-setup/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Docker 설치]]></title>
            <link>https://velog.io/@_leehyeryeong/Docker-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@_leehyeryeong/Docker-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Tue, 05 Sep 2023 08:27:45 GMT</pubDate>
            <description><![CDATA[<p>Docker를 설치하려고 합니다.</p>
<p>먼저 Docker 사이트에 들어가, 저는 윈도우를 쓰고 있으니 Download for Windows로 받아줬습니다.
<img src="https://velog.velcdn.com/images/_leehyeryeong/post/935a6d74-04c5-4428-bada-4b661ad7fdb2/image.png" alt="">
<a href="https://www.docker.com/">여기를 클릭하시면 Docker 사이트로 이동하실 수 있습니다.</a>
&nbsp;
이제 위에 방식대로 다운로드를 받고 exe 파일을 열어 next만 누르며 순조롭게 설치를 진행하고 있었는데</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/4912401b-c5f1-42e0-a354-d730577b71b7/image.png" alt=""></p>
<p>이런 메세지 창이 등장했습니다. 적당히 읽어보면 wsl 버전이 낮아 Docker를 설치하는데 문제가 생긴 것 같습니다.</p>
<p>그래서 Window Powershell을 관리자 권한으로 실행시키고 다음과 같은 명령어를 입력해주었습니다.</p>
<pre><code>$ wsl --update</code></pre><pre><code>$ wsl --set-default-version 2</code></pre><p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/6b554036-20f2-494f-9832-16207d1481a9/image.png" alt="">
잘 실행되는 것을 볼 수 있습니다.</p>
<p>&nbsp;
참고로 저는 wsl을 이미 깔아둔  상태였습니다. wsl이 설치돼 있지 않은 상태라면 Window Powershell을 관리자 권한 실행으로 여신 다음</p>
<pre><code>$ wsl --install</code></pre><p>입력해주시길 바랍니다.</p>
<p>&nbsp;
참고한 글
<a href="https://www.lainyzine.com/ko/article/a-complete-guide-to-how-to-install-docker-desktop-on-windows-10/">https://www.lainyzine.com/ko/article/a-complete-guide-to-how-to-install-docker-desktop-on-windows-10/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Docker]]></title>
            <link>https://velog.io/@_leehyeryeong/Docker</link>
            <guid>https://velog.io/@_leehyeryeong/Docker</guid>
            <pubDate>Tue, 05 Sep 2023 07:49:03 GMT</pubDate>
            <description><![CDATA[<h1 id="docker">Docker</h1>
<p>Go 언어로 작성된 리눅스 컨테이너를 기반으로 하는 오픈소스 가상화 플랫폼이다.</p>
<ul>
<li>컨테이너에 기술을 넣으면, 모든 기술들의 실행 방법이 다 같아진다.</li>
<li>OS와 CPU에 상관없이 컨테이너를 사용 가능하다.</li>
<li>Spring, Node.js, Django, Next.js 등등 관련 없이 컨테이너에만 넣으면 모두 동일하게 실행이 가능하다.</li>
<li>컨테이너를 삭제하면 내부의 데이터가 모두 삭제되기 때문에 중요한 데이터는 외부 스토리지에 저장이 필요하다.</li>
</ul>
<h2 id="가상화를-사용하는-이유">가상화를 사용하는 이유</h2>
<ul>
<li>활용도가 낮은 서버들이 존재한다면 CPU 측면에선 리소스 낭비일 수밖에 없다. </li>
<li>그렇다고 해서 모든 서비를 한 서버 안에 올리면 안전성에 문제가 생길 수도 있다.</li>
<li>그래서 <strong>안전성을 높이면서 리소스도 최대한 활용할 수 있는 방법</strong>으로 서버 가상화가 나타나게 됐다.</li>
</ul>
<h2 id="컨테이너container">컨테이너(Container)</h2>
<p> 논리적인 공간(컨테이너)을 만들어 다양한 어플리케이션을 설치해 하나의 서버처럼 사용할 수 있는 패키지</p>
<p>한 마디로 하나의 공간(컨테이너)에 다양한 물건들을 담아서 옮기면, 옮긴 곳에서 그 물건들을 사용할 수 있게 되는 것과 같다.</p>
<blockquote>
<p>각 서버에서 컨테이너를 구동해 그 안에 존재하는 어플리케이션을 별도의 설정 없이 쉽게 사용할 수 있다.</p>
</blockquote>
<h3 id="컨테이너를-왜-사용하는가">컨테이너를 왜 사용하는가?</h3>
<p>개발을 하기 위해 하나의 환경을 구축하기란 간단하지 않다.</p>
<ul>
<li>서버가 있어야 되고</li>
<li>OS를 구축해야 하며</li>
<li>개발을 위한 네트워크 통신 포트 구성과</li>
<li>개발 툴들의 설치</li>
<li>서로의 연동 환경 구성 등등...</li>
</ul>
<p>이런 환경을 매번 일일이 설치하기란 반복적인 일들을 여러 번 해야 하는 것은 물론, 환경 구성이 잘못되거나 에러가 발생하면 처음부터 다시 해야한다는 불편함이 존재한다.</p>
<blockquote>
<p>이런 반복적이고 불편한 세팅을 한 번 해놓고, 쉽게 그 설정을 배포하기 위해 우리는 컨테이너를 사용한다.</p>
</blockquote>
<h2 id="컨테이너-오케스트레이션container-orchestration">컨테이너 오케스트레이션(Container Orchestration)</h2>
<p>여러 대의 서버와 여러 개의 서비스를 관리하여 자동화 하는 기술</p>
<p>대표적인 예시로는 kubernetes가 있다.</p>
<ul>
<li>스케줄링
: 컨테이너를 스케줄링해서 가상 머신에 배치하는 역할을 한다. 배치시 컨테이너 스택에 매칭되는 가상 머신을 자동으로 선택하고, 문제 발생시 자동으로 다시 배치를 한다고 할 수 있다.</li>
<li>서비스 디스커버리
: 수많은 컨테이너들이 생성과 종료를 반복한다. 이 때 매번 IP, Port 정보를 알 수가 없기 때문에 이를 자동으로 매칭한다.</li>
</ul>
<h2 id="docker-swarm">Docker Swarm</h2>
<p>Docker에서 개발한 컨테이너 오케스트레이션 툴이다.</p>
<ul>
<li>기능이 단순하여 쉽게 사용 가능하나</li>
<li>대용량 분산 환경과 같은 복잡한 시스템에서는 적합하지 않아 Kubernetes를 많이 사용한다.</li>
</ul>
<h2 id="kubernetes">Kubernetes</h2>
<p>Google에서 개발한 컨테이너 오케스트레이션 툴이다.</p>
<ul>
<li>대규모 분산 환경에 최적화된 기능을 제공한다.</li>
<li>넓은 생태계가 구축이 되어 있다.</li>
</ul>
<h2 id="docker의-기초-개념">Docker의 기초 개념</h2>
<p>Docker는 Immutable Infrastructure(불변 인프라) 패러다임을 실현하는 기술로, 서버 구축 후에는 변경이 불가능하다. 따라서, 변경이 필요하다면 삭제 후 다시 구축을 해야 한다.</p>
<ul>
<li>Image
: image는 프로그램이라고 생각하면 된다. image layer들의 집합으로 image를 만들기도 가능하다. 읽기만 가능(read-only)하고 변할 수 없다.(immutable)</li>
<li>Container
: container는 프로세스라고 생각하면 된다. 쓰기가 가능하며, 휘발성으로 메모리에 상주한다.</li>
<li>Dockerfile
: instruction set으로 도커 이미지를 만드는 설명서라고 생각하면 좋다.</li>
<li>Registry
: Github와 같은 이미지 저장소이고, 대표적인 public registry로 DockerHub가 있다.</li>
</ul>
<h2 id="docker-compose">Docker Compose</h2>
<p>여러 개의 컨테이너로부터 이루어진 서비스를 구축, 실행하는 순서를 자동으로 하여, 관리를 간단히 하는 기능</p>
<p>Docker Compose에서는 compose 파일을 준비하여 커맨드를 1회 실행하는 것으로, 그 파일로부터 설정을 읽어들여 모든 컨테이너 서비스를 실행시키는 것이 가능하다.</p>
<h3 id="docker-compose를-사용하기까지의-주요한-단계">Docker Compose를 사용하기까지의 주요한 단계</h3>
<ol>
<li>각각의 컨테이너의 Dockerfile을 작성한다.(기존 이미지를 사용하는 경우는 필요하지 않음)</li>
<li>docker-compose.yml를 작성하고, 각각 독립된 컨테이너의 실행 정의를 실시(경우에 따라는 구축 정의도 포함)</li>
<li>&quot;docker-compose up&quot; 커맨드를 실행하여, docker-compose.yml으로 정의한 컨테이너를 개시</li>
</ol>
<p>Docker Compose는 start, stop, status, 실행 중의 컨테이너의 로그 출력, 약간의 커맨드 실행이과 같은 기능도 가지고 있다.</p>
<h3 id="docker-composeyml">docker-compose.yml</h3>
<p>yaml으로 Docker 컨테이너에 관한 실행 옵션(build 옵션도 포함되어 있는 경우도 있음)을 기재한 파일이다.</p>
<h3 id="yaml">yaml</h3>
<p>yaml 문법으로 작성한다는데 모르는 문법이라 또 찾아봤다.</p>
<p>yaml 문법은 들여쓰기와 함께 key, value를 중심으로 작성된다.
해당 문법은 기본적으로 숫자형, 문자형, Boolean 자료형을 지원한다.</p>
<p>기본 문법</p>
<ul>
<li>&nbsp;# : 해당 라인을 주석처리</li>
<li>--- : 문서의 시작을 알림(옵션)</li>
<li>... : 문서의 끝을 알림(옵션)</li>
<li>key : 딕셔너리 자료형의 key 값과 동일 개념</li>
<li>value : 딕셔너리 자료형의 value 값과 동일 개념</li>
</ul>
<p>&nbsp;
참고한 글
<a href="https://han-py.tistory.com/494">https://han-py.tistory.com/494</a>
<del>사실 공부하면서 정리한 거라 이 글 저 글 많이 참고하고 갖고 왔지만... 많은 도움이 됐다 생각하는 글의 링크를 첨부합니다.</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CI, CD]]></title>
            <link>https://velog.io/@_leehyeryeong/CI-CD</link>
            <guid>https://velog.io/@_leehyeryeong/CI-CD</guid>
            <pubDate>Tue, 05 Sep 2023 07:22:34 GMT</pubDate>
            <description><![CDATA[<h1 id="ci">CI</h1>
<p>CI(Continuous Integration)
: 빌드/테스트 자동화 과정. 개발자를 위한 자동화 프로세스인 지속적인 통합을 의미한다.</p>
<blockquote>
<p>한 마디로 여러 개발자들의 코드를 계속해서 통합하는 것이다.</p>
</blockquote>
<h2 id="ci를-왜-사용하는가">CI를 왜 사용하는가?</h2>
<ul>
<li>CI를 성공적으로 구현할 경우 애플리케이션에 대한 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트되어 공유 레포지토리에 통합된다.</li>
<li>여러 명의 개발자가 동시에 애플리케이션 개발과 관련된 코드 작업을 할 경우 서로 충돌할 수 있는 문제를 해결할 수 있다.</li>
<li>소스/버전 관리 시스템에 대한 변경 사항을 정기적으로 커밋하여 모든 사람에게 동일 작업 기반을 제공하는 것으로 시작한다.</li>
<li>커밋할 때마다 빌드와 일련의 자동 테스트가 이루어져 동작을 확인하고, 변경으로 인해 문제가 생기는 부분이 없도록 보장한다.</li>
</ul>
<h1 id="cd">CD</h1>
<p>CD(Continuous Delivery)
: 배포 자동화 과정. 지속적인 서비스 제공 or 지속적인 배포를 의미한다.</p>
<blockquote>
<p>한 마디로 지속적으로 배포 가능한 상태를 유지하는 것이다.</p>
</blockquote>
<h2 id="cd를-왜-사용하는가">CD를 왜 사용하는가?</h2>
<ul>
<li>지속적인 서비스 제공, 지속적인 배포. 이 두 용어는 사옿 교환적으로 사용된다.</li>
<li>두 용어 모두 파이프라인의 추가 단계에 대한 자동화를 뜻하지만 때로는 얼마나 많은 자동화가 이루 어지고 있는지를 설명하기 위해 별도로 사용되기도 한다.</li>
<li>지속적 배포는 빌드, 테스트 및 배포 단계를 자동화하는 DevOps 방식을 논리적 극한까지 끌어올립니다.</li>
<li>코드 변경이 파이프라인의 이전 단계를 모두 성공적으로 통과하면 수동 개입 없이 해당 변경 사항이 프로덕션에 자동으로 배포된다. 품질 저하 없이 최대한 빨리 사용자에게 새로운 기능을 제공할 수 있게 된다.</li>
<li>입증된 지속적 통합 및 지속적인 전달 단계를 기반으로 한다. </li>
<li>간단한 코드 변경이 정기적으로 마스터에 커밋되고, 자동화된 빌드 및 테스트 프로세스를 거치며 다양한 사전 프로덕션 환경으로 승격되며, 문제가 발견되지 않으면 최종적으로 배포된다.</li>
</ul>
<h1 id="cicd-파이프-라인">CI/CD 파이프 라인?</h1>
<p>CI/CD를 정리하다 보니 계속 나오는데 무슨 말인지 몰라서 찾아봤다.</p>
<p>파이프 라인(Pipe Line)은 코드를 빌드, 테스트, 배포하는 과정을 거쳐 소프트웨어 개발을 추진하는 프로세스이다.</p>
<ul>
<li>프로세스를 자동화함으로써 인적 오류를 최소화하고 소프트웨어 출시 방식에 일관된 프로세스를 유지하는 것을 목표로 한다.</li>
<li>파이프 라인에 포함된 툴에는 코드 컴파일, 유닛 테스트, 코드 분석, 보안, 바이너리 생성 등이 있다.</li>
</ul>
<p>둘이 그냥 비슷한 의미였다.(아니면 알려주세요 저도 잘 모릅니다...)</p>
<h1 id="cicd의-종류">CI/CD의 종류</h1>
<ul>
<li>Jenkins</li>
<li>CircleCI</li>
<li>TravisCI</li>
<li>Github Actions</li>
</ul>
<p>이 외에도 다양한 CI/CD가 있다.</p>
<h1 id="jenkins">Jenkins</h1>
<p>Java Runtime 위에서 동작하는 자동화 서버이다.</p>
<ul>
<li>다양한 플러그인들을 활용해서 각종 자동화 작업을 처리할 수 있다.</li>
<li>AWS 배포, 테스트, Docker 빌드 등 각각의 컴포넌트들이 하나의 플러그인으로 모듈화 되어 있어, 이를 사용하면 된다.</li>
<li>가장 핵심적인 파이프 라인, 시크릿 키마저도 플러그인으로 동작시킬 수 있다.</li>
<li>즉 일련의 자동화 작업의 순서들의 집합인 파이프 라인을 통해 CI/CD 파이프 라인을 구축한다.</li>
<li>플러그인들을 잘 조합해서 돌아가게 하는 게 파이프 라인이라고 할 수 있다.</li>
</ul>
<h2 id="jenkins의-대표-플러그인">Jenkins의 대표 플러그인</h2>
<ul>
<li><p>Credentials Plugin</p>
<ul>
<li>Jenkins는 그냥 단지 서버이기 때문에 배포에 필요한 각종 리소스에 접근하기 위해서는 여러 가지 중요 정보들을 저장하고 있어야 한다.</li>
<li>AWS token, Git access token, secret key, ssh(username, password) 등의 정보들을 저장할 때 사용한다.</li>
<li>위와 같은 중요한 정보들을 저장해주는 플러그인이다.</li>
</ul>
</li>
<li><p>Git Plugin
: Jenkins에서 git에 대한 소스 코드를 긁어와서 빌드할 수 있도록 도와주는 플러그인이다.</p>
</li>
<li><p>Pipeline
: 핵심 기능인 파이프 라인마저 플러그인이다.</p>
</li>
<li><p>Docker plugin and Docker Pipelin
: Docker agent를 사용하고 Jenkins에서 Docker를 사용하기 위한 플러그인</p>
</li>
</ul>
<h2 id="jenkins의-pipeline">Jenkins의 Pipeline</h2>
<p>Pipeline</p>
<ul>
<li>pipeline이란 CI/CD 파이프라인을 젠킨스에 구현하기 위한 일련의 플러그인들의 집합이자 구성</li>
<li>즉 여러 플러그인들을 이 파이프라인에서 용도에 맞게 사용하고 정의함으로써 파이프라인을 통한 서브시가 배포된다.</li>
<li>pipeline DSL(Domain Specific Language)로 작성된다.</li>
<li>Jenkins가 동작되기 위해서는 여러 플러그인들이 파이프라인을 통해 흘러가는 과정이라고 할 수 있다.</li>
</ul>
<h2 id="pipeline의-section">Pipeline의 Section</h2>
<p>Agent Section</p>
<ul>
<li>Jenkins는 많은 일을 해야 하기 때문에 혼자 하기 버겁기에, 여러 slave node를 두고 일을 시킬 수 있다.</li>
<li>이처럼 어떤 Jenkins가 일을 하게 할 것인지를 지정한다.</li>
<li>Jenkins node만 넣을 수 있는 것이 아니라 Jenkins 안에 있는 docker container에 들어가서 일을 시킬 수도 있다.</li>
</ul>
<p>Post Section</p>
<ul>
<li>스테이지가 끝난 이후의 결과에 따라서 후속 조치를 취할 수 있다.</li>
<li>작업 결과에 따른 행동을 취할 수 있다.</li>
</ul>
<p>Stage Section</p>
<ul>
<li>어떤 일들을 처리할 것인지 일련의 stage를 정의하는 것으로, 일종의 카테고리라고 보면 된다.</li>
</ul>
<p>Steps Section</p>
<ul>
<li>한 스테이지 안에서의 단계로 일련의 스텝을 보여준다.</li>
<li>Steps 내부는 여러 가지 step들로 구성되며 여러 작업들을 실행 가능하다.</li>
<li>플러그인을 깔면 사용할 수 있는 step들이 생겨난다.</li>
<li>빌드를 할 때, 디렉토리를 옮겨서 빌드를 한다거나, 다른 플러그인을 깔아서 해당 플러그인의 메서드를 활용해서 일을 처리한다던지 하는 작업들을 할 수 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git]]></title>
            <link>https://velog.io/@_leehyeryeong/Git-CI-CD</link>
            <guid>https://velog.io/@_leehyeryeong/Git-CI-CD</guid>
            <pubDate>Tue, 05 Sep 2023 06:05:10 GMT</pubDate>
            <description><![CDATA[<h1 id="git">Git</h1>
<p>2005년에 리누스 토르발스에 의해 개발된 분산 버전 관리 시스템(Distributed Version Control Systems - DCVS)</p>
<ul>
<li>컴퓨터 파일의 변경 사항을 추적하고 여러명의 사용자들 간에 파일에 대한 작업을 조율하는데 사용 된다.</li>
<li>주로 여러명의 개발자가 하나의 소프트웨어 개발 프로젝트에 참여할 때, 소스 코드를 관리하는데 주로 사용한다.</li>
</ul>
<h2 id="git의-장점">Git의 장점</h2>
<ul>
<li>인터넷 연결이 되지 않은 곳에서도 개발을 진행할 수 있으며, 분산 버전 관리이기 때문에 중앙 저장소가 삭제되어도 원상 복구가 가능</li>
<li>각각의 개발자가 Branch에서 개발한 뒤, 본 프로그램에 합치는 merge 방식을 통한 병렬 개발 가능</li>
</ul>
<h2 id="git의-기본-용어">Git의 기본 용어</h2>
<table>
<thead>
<tr>
<th>용어</th>
<th>기능</th>
</tr>
</thead>
<tbody><tr>
<td>Repository</td>
<td>저장소, 작업자가 변경한 모든 히스토리를 확인 가능</td>
</tr>
<tr>
<td>Working Tree</td>
<td>저장소를 어느 한 시점을 바라보는 작업자의 현재 시점</td>
</tr>
<tr>
<td>Staging Area</td>
<td>저장소를 커밋하기 전에 커밋을 준비하는 위치</td>
</tr>
<tr>
<td>Commit</td>
<td>변경된 작업 상태를 저장소에 저장하는 작업</td>
</tr>
<tr>
<td>Merge</td>
<td>다른 Branch의 내용을 현재 Branch로 가져와 병합하는 작업</td>
</tr>
<tr>
<td>Head</td>
<td>현재 작업중인 Branch</td>
</tr>
</tbody></table>
<h2 id="git의-기본-명령어">Git의 기본 명령어</h2>
<table>
<thead>
<tr>
<th>명령어</th>
<th>기능</th>
</tr>
</thead>
<tbody><tr>
<td>git help</td>
<td>도움말, &#39;git help 명령어&#39;로 입력시, 해당 명령어에 대한 도움말을 출력</td>
</tr>
<tr>
<td>git init</td>
<td>git 저장소를 초기화</td>
</tr>
<tr>
<td>git status</td>
<td>저장소 상태 체크, 저장소 안에 있는 파일, 커밋이 필요한 변경 사항,<br/>현재 작업하고 있는 브랜치 등 상태 정보 출력</td>
</tr>
<tr>
<td>git branch</td>
<td>새로운 브랜치 생성</td>
</tr>
<tr>
<td>git add</td>
<td>staging 영역에 변경 내용 추가</td>
</tr>
<tr>
<td>git commit</td>
<td>staging 영역에 있는 변경 내용 묶음 및 정의</td>
</tr>
<tr>
<td>git log</td>
<td>commit 내역 확인</td>
</tr>
<tr>
<td>git push</td>
<td>로컬 컴퓨터에서 서버로 변경 사항 보냄</td>
</tr>
<tr>
<td>git pull</td>
<td>서버 저장소로부터 최신 버전을 끌고옴</td>
</tr>
<tr>
<td>git clone</td>
<td>서버 저장소의 데이터를 로컬 컴퓨터로 복사</td>
</tr>
<tr>
<td>git checkout</td>
<td>원하는 브랜치로 이동</td>
</tr>
<tr>
<td>git merge</td>
<td>개별 branch에서 마친 작업을 master branch로 병합</td>
</tr>
</tbody></table>
<h2 id="git과-코드-저장소">Git과 코드 저장소</h2>
<h3 id="github"><a href="https://github.com/">Github</a></h3>
<p>2008년에 시작한 최초의 git 저장소 호스팅 플랫폼</p>
<ul>
<li>Git, SVN, Mercurial(HG), TFS를 지원한다.</li>
<li>CI/CD(Github Actions)</li>
<li>Vue.js, Dokcer, Tensorflow, React 등 많은 라이브러리가 Github에서 배포하고, 유지 보수를 하고 있다.</li>
</ul>
<h3 id="gitlab"><a href="https://about.gitlab.com/">GitLab</a></h3>
<p>Gitlab사에서 개발한 2014년에 시작한 git 저장소 및 CI/CD, 이슈 추적, 보안성 테스트 등의 기능을 갖춘 웹 기반의 데브옵스 플랫폼</p>
<ul>
<li>Git을 지원한다.</li>
<li>개발 외 DevOps 환경 구축에 용이하다.(이슈 추적, 테스트, CI/CD 파이프 라인)</li>
<li>3rd party 플러그인/툴 없이 자체 CI/CD를 사용한다.</li>
<li>Kubernetes 기반 배포 및 모니터링</li>
</ul>
<h3 id="bitbucket"><a href="https://bitbucket.org/">Bitbucket</a></h3>
<p>Atlassian이 개발/제공한 git 버전 관리 시스템을 사용하는 소스 코드 및 개발 프로젝트를 대상으로 하는 웹 기반 버전 관리 저장소 호스팅 서비스</p>
<ul>
<li>Jira와의 연동성이 좋다.</li>
<li>Jenkins, CircleCI 같은 CI/CD 도구를 제공한다.</li>
<li>코드 리뷰, 테스트, 분석 도구를 활용한 Pull Request 단계에서의 Code insights가 가능하다.</li>
<li>계정의 비공계 컨텐츠 clone, push 작업시 2단계 인증 절차를 거친다.</li>
</ul>
<h3 id="github-gitlab-bitbucket">Github, GitLab, Bitbucket?</h3>
<p>Github</p>
<ul>
<li>가장 많은 Integration을 지원한다.</li>
<li>가장 많은 오픈 소스 저장소 보유하고 있다.</li>
<li>가장 안정적인 서버 상태를 제공, Github Status에서 실시간 확인 가능하다.</li>
<li>한 프로젝트에는 1GB, 파일은 100개라는 용량 제한이 있다.</li>
</ul>
<p>GitLab</p>
<ul>
<li>가격면에서 합리적이다.</li>
<li>Private Repo 무료, 인원 제한이 없다.</li>
<li>Disk space per Repo가 10GB다.(LFS 용량 포함)</li>
<li>설치형이 무료며, 대부분의 필요한 기능을 제공한다.</li>
</ul>
<p>Bitbucket</p>
<ul>
<li>Jira, Hipchat과의 연동이 편하다.</li>
<li>Private Repo를 무료 제공한다.</li>
<li>한 레포지토리당 1GB라는 용량 제한이 있다.</li>
</ul>
<p>각각의 장단점에 맞춰 본인의 상황에 맞는 것을 사용하면 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter]]></title>
            <link>https://velog.io/@_leehyeryeong/Flutter</link>
            <guid>https://velog.io/@_leehyeryeong/Flutter</guid>
            <pubDate>Mon, 04 Sep 2023 06:36:21 GMT</pubDate>
            <description><![CDATA[<h1 id="flutter">Flutter</h1>
<p>Google에서 개발하고 관리하는 오픈 소스 크로스 플랫폼 모바일 애플리케이션 개발 프레임워크</p>
<ul>
<li>Dart라는 언어를 사용해 개발한다.</li>
<li>기본적으로 C언어나 Java 문법과 거의 같다.</li>
<li>기존 프로그래밍 언어들의 특징들이 많이 보인다.</li>
<li>기존 ui를 버리고 자체적으로 ui를 렌더링 해, 안드로이드 앱에서 iOS 디자인을, 반대로도 가능하다.</li>
<li>플러터의 ui는 모두 위젯으로 이루어져 있다.</li>
</ul>
<h2 id="dart">Dart</h2>
<p>Google이 JavaScript를 대체하기 위해 2011년에 개발한 웹 프로그래밍 언어이다.</p>
<ul>
<li>Native 코드로 안드로이드나 iOS용 앱을 동시에 개발할 수 있다.</li>
<li>Java랑 유사한 문법으로, 몇 가지 특징만 숙지하면 쉽게 개발할 수 있다.</li>
</ul>
<h2 id="크로스-플랫폼-프레임워크cross-platform-framework">크로스 플랫폼 프레임워크(Cross Platform Framework)</h2>
<p>하나의 코드 베이스로 두 플랫폼에서 제공되는 서비스를 개발할 수 있다.</p>
<p>하나의 코드베이스로 Native 코드를 호출할 수 있고, 각각의 플랫폼에 대해서 많이 공부하지 않아도 자바스크립트, C#, Dart에 대해서 안다면 개발을 시작할 수 있다.</p>
<h2 id="flutter의-장점">Flutter의 장점</h2>
<ul>
<li>Material 디자인과 Cupertino
: Flutter는 Android와 iOS의 대표 디자인 가이드를 기본적으로 제공한다. Android와 iOS에서 같은 material 디자인을 사용하더라도 플랫폼에 따라 다르게 출력되는 부분을 각각 디자인 가이드에 맞게 화면을 그립니다.</li>
<li>Dart를 사용하나 Native 코드도 사용할 수 있다.
: 크로스 플랫폼이기에 해당 OS에 최적화된 앱을 만들기 위해 Native와 Dart를 섞어서 사용한다.</li>
<li>Hot reload를 제공한다.
: 코드 변경/수정 후 저장하면 변경사항을 즉각적으로 확인할 수 있는 기능으로, 실시간으로 앱을 테스트 및 디버깅, 빠른 개발을 할 수 있게 도와준다.</li>
<li>다양한 플랫폼 개발이 가능하다. </li>
</ul>
<h2 id="flutter의-단점">Flutter의 단점</h2>
<ul>
<li>코드를 고치려면 새 버전을 배포해야 한다.</li>
<li>웨어러블 디바이스 앱에 약하다.</li>
<li>C/C++ 라이브러리 호출이 안 된다.</li>
<li>지원되는 플러그인이 부족하다.</li>
</ul>
<h2 id="flutter를-사용하는-이유">Flutter를 사용하는 이유</h2>
<p><strong>1. 시간 내에 좋은 성능의 앱을 개발할 수 있다.</strong>
하나의 언어에 대해서만 학습하면 되기 때문에, 빠른 시간에 iOS, Android 앱을 개발할 수 있다.</p>
<p><strong>2. 디버깅과 크로스 플랫폼</strong>
Flutter는 컴파일 할 때부터 에러 여부를 판단해서 알려주기 때문에 문법적인 오류로 인한 디버깅을 줄일 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js]]></title>
            <link>https://velog.io/@_leehyeryeong/Node.js</link>
            <guid>https://velog.io/@_leehyeryeong/Node.js</guid>
            <pubDate>Mon, 04 Sep 2023 05:46:08 GMT</pubDate>
            <description><![CDATA[<h1 id="nodejs">Node.js</h1>
<p>Chrome V8 JavaScript 엔진으로 빌드 된 JavaScript 런타임</p>
<ul>
<li>Node.js는 JavaScript를 서버에서도 사용할 수 있도록 만든 프로그램이다.</li>
<li>Node.js는 V8이라는 JavaScript 엔진 위에서 동작하는 자바스크립트 런타임(환경)이다.</li>
<li>Node.js는 서버사이드 스크립트 언어가 아니다. 프로그램(환경)이다.</li>
<li>Node.js는 웹 서버와 같이 확장성 있는 네트워크 프로그램을 제작하기 위해 만들어졌다.</li>
</ul>
<h2 id="nodejs의-장점">Node.js의 장점</h2>
<ul>
<li>Javascript 언어로 프론트엔드 뿐만 아니라 백엔드 개발 환경을 구성할 수 있기에 생산성이 좋다.</li>
<li>C/C++로 개발된 V8 엔진을 사용하여 확장성이 좋다.</li>
<li>다양한 패키지 매니저(npm: node Package Manager)를 기반으로 다양한 모듈(패키지)을 제공하며 필요 라이브러리에 대해 설치하고 사용할 수 있기에 효율성이 좋다.</li>
<li>이벤트 기반 Non-Blocking 및 비동기 처리가 가능하다.
: event loop는 비동기 I/O를 사용하므로 스레드가 block 되지 않고 싱글 스레드로 다수의 요청 처리 가능(I/O 예시: 저장장치(SSD, HDD), 데이터베이스, 네트워크 접근), 멀티스레드보다 자원을 효율적으로 사용</li>
<li>간단한 확장 모듈 관리가 가능하다.(NPM)</li>
<li>http 서버 모듈을 내장하고 있어서 아파치와 같은 별도의 웹 서버를 설치할 필요가 없다.</li>
</ul>
<h2 id="nodejs의-단점">Node.js의 단점</h2>
<ul>
<li>싱글 스레드 모델이기 때문에, 하나의 작업이 지연되면 전체 시스템의 성능도 같이 떨어진다.</li>
<li>스크립트 언어의 특성상 해당 언어가 수행되어야 에러가 나는지 확인할 수 있어서 에러가 날 경우 프로세스가 종료된다.</li>
<li>이벤트 기반 비동기 방식이라 서버의 로직이 복잡한 경우에 ‘콜백 함수 늪(callback hell)&#39;에 빠질 수 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring, Spring Boot]]></title>
            <link>https://velog.io/@_leehyeryeong/Spring-Spring-Boot</link>
            <guid>https://velog.io/@_leehyeryeong/Spring-Spring-Boot</guid>
            <pubDate>Mon, 04 Sep 2023 05:30:36 GMT</pubDate>
            <description><![CDATA[<h1 id="spring">Spring</h1>
<p>: 엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 애플리케이션 <strong>프레임워크</strong></p>
<ul>
<li>Java 프로그래밍을 더 빠르고, 쉽고, 안전하게(속도, 단순성 및 생산성 중점)</li>
<li>Java 엔터프라이즈 애플리케이션을 쉽게 만들 수 있음</li>
<li>자바 객체와 라이브러리들을 관리, 톰캣과 같은 WAS가 내장되어 있어 자바 웹 어플리케이션을 구동</li>
</ul>
<ol>
<li><p>경량 컨테이너로서 Java 객체를 직접 관리한다.
: 각각의 객체 생성, 소멸과 같은 Life Cycle을 관리하며 Spring으로부터 필요한 객체를 얻어올 수 있다.</p>
</li>
<li><p>제어 역행(IoC)
: 컨트롤의 제어권이 사용자가 아니라 프레임워크에게 있어, 필요에 따라 Spring에서 사용자의 코드를 호출한다.</p>
</li>
<li><p>의존성 주입(DI)
: 각각의 계층이나 서비스들간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.</p>
</li>
<li><p>관점 지향 프로그래밍(AOP)
: 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.</p>
</li>
<li><p>트랜잭션 관리 프레임워크
: 추상화 된 트랜잭션 관리를 지원하며, 설정 파일(xml, java, property 등)을 이용한 선언적인 방식 및 프로그래밍을 통한 방식을 모두 지원한다.</p>
</li>
<li><p>MVC(Model View Controller)
: 웹 프로그래밍 개발시 거의 표쥰적인 방식인 Model-View-Controller 패턴을 사용한다.</p>
</li>
</ol>
<h2 id="iocinversion-of-control">IoC(Inversion of Control)</h2>
<ul>
<li>보통의 자바 프로그램은 각 객체들이 프로그램의 흐름을 결정하고 각 객체를 직접 생성, 조작하는 작업(객체를 직접 생성, 메소드 호출)을 했으나, IoC는 객체의 생성을 특별한 관리 위임 주체에게 맡긴다. 이를 곧, 제어의 역전이라고 한다.</li>
</ul>
<p>일반 자바 프로그램</p>
<blockquote>
<p>클래스 내부의 객체 생성 -&gt; 의존성 객체의 메소드 호출</p>
</blockquote>
<p>Spring(IoC)</p>
<blockquote>
<p>Spring에게 제어를 위임, Spring이 만든 객체를 주입 -&gt; 의존성 객체의 메소드 호출</p>
</blockquote>
<h2 id="didependency-injection">DI(Dependency Injection)</h2>
<ul>
<li>객체를 외부(Spring)에서 생성해서 사용하려는 주제 객체에 주입시켜주는 방식</li>
</ul>
<h2 id="ioc와-di의-차이">IoC와 DI의 차이</h2>
<p>IoC는 프로그램 제어권을 역전시키는 <strong>개념</strong>, DI는 해당 개념을 구현하기 위해 사용하는 디자인 패턴 중 하나로, 이름 그대로 객체의 의존관계를 외부에서 주입시키는 <strong>패턴</strong>을 말한다.</p>
<h2 id="aopaspect-oriented-programming">AOP(Aspect-Oriented Programming)</h2>
<p>관점 지향 프로그래밍(프로젝트 구조를 바라보는 관점을 바꿔보자), 핵심 로직과 부가 기능을 분리하여 애플리케이션 전체에 걸쳐 사용되는 부가 기능을 <strong>모듈화</strong>하여 재사용할 수 있도록 지원하는 것</p>
<h2 id="mvcmodel-view-controller">MVC(Model View Controller)</h2>
<p>애플리케이션을 개발할 때 사용하는 디자인 패턴으로, 애플리케잇견의 개발 영역을 MVC로 구분하여 각 역할에 맞게 코드를 작성하는 개발 방식</p>
<h3 id="model">Model</h3>
<p>MVC 기반의 웹 애플리케이션이 클라이언트의 요청을 전달받으면 요청 사항을 처리하기 위한 작업을 하는데, 이 때 클라이언트에게 응답으로 돌려주는 <strong>작업의 처리 결과 데이터를 Model</strong>이라고 한다.</p>
<h3 id="view">View</h3>
<p>Model을 이용하여 웹 브라우저와 같은 애플리케이션의 화면에 보이는 리소스(Resource)를 제공하는 역할</p>
<h3 id="controller">Controller</h3>
<p>컨트롤러는 클라이언트 측의 요청을 직접적으로 전달 받는 엔드 포인트(End Point)로써 Model과 View 중간에서 상호작용을 해주는 역할을 한다.</p>
<h1 id="spring-boot">Spring boot</h1>
<p>Spring으로 애플리케이션을 만들 때에 필요한 설정을 간편하게 처리해주는 별도의 프레임워크</p>
<h1 id="spring-spring-boot">Spring, Spring boot?</h1>
<ul>
<li>Spring Boot는 내부에 Tomcat이 포함되어 있어 따로 설치하거나 매번 버전을 관리해야 하는 수고로움을 덜어준다.</li>
<li>Spring Boot는 starter를 통해 dependency를 자동화 해준다.</li>
<li>Spring Boot는 XML 설정을 하지 않아도 된다.</li>
<li>jar 파일을 통해 자바 옵션만으로 손쉽게 배포가 가능하다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[git에 대용량 파일 올렸을 때]]></title>
            <link>https://velog.io/@_leehyeryeong/git%EC%97%90-%EB%8C%80%EC%9A%A9%EB%9F%89-%ED%8C%8C%EC%9D%BC-%EC%98%AC%EB%A0%B8%EC%9D%84-%EB%95%8C</link>
            <guid>https://velog.io/@_leehyeryeong/git%EC%97%90-%EB%8C%80%EC%9A%A9%EB%9F%89-%ED%8C%8C%EC%9D%BC-%EC%98%AC%EB%A0%B8%EC%9D%84-%EB%95%8C</guid>
            <pubDate>Fri, 24 Feb 2023 13:35:30 GMT</pubDate>
            <description><![CDATA[<p>작년 혼공단 활동 이후로 적지도 않았던 벨로그를 켰다.
정말 골머리 앓다 못해 짜증나 죽겠던 거 해결하고 잔디도 채운 기념 벨로그를 쓰기 위해...^^👍👍</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/3a701de3-15e4-45b7-82f8-2a4276516e0c/image.png" alt="">
깃허브를 쓰는 사람들이라면 알겠지만 깃허브에 100MB 이상 파일은 올라가지 않는다. 그렇지만 알고 있다고 해서 저런 에러 메세지를 피할 수 있다고는 하지 않았다.</p>
<p>나의 경우에는 최근 node.js 강의를 듣고 조금씩 공부하며 그 파일들을 저장해두기 위해 깃허브에 올리고 있었다. 저 에러 메세지가 떴던 당시에도 강의를 따라하며 대략 1GB 정도의 파일을 만드는 코드를 작성했다.</p>
<p>근데 앞서 말했지만 깃허브는
<br/>
100MB 이상 파일은 올라가지 않는다.
<img src="https://velog.velcdn.com/images/_leehyeryeong/post/46d68df3-f2a2-47a5-b085-1079dbd70a5f/image.png" alt="">
<br/></p>
<p>그 결과 나는 앞서 올렸던 사진들의 에러와 마주치게 된다...
<img src="https://velog.velcdn.com/images/_leehyeryeong/post/8a994e09-d6d7-455f-aef8-3f2716a8f603/image.png" alt=""></p>
<p>이런 경우에는 해결책이 두 가지가 있다.</p>
<ol>
<li>git lfs를 사용하기</li>
<li>그냥 대용량 파일을 지워 버리기</li>
</ol>
<h2 id="git-lfs">git lfs</h2>
<p>위 에러 메세지를 보면
<br/>
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - <a href="https://git-lfs.github.com">https://git-lfs.github.com</a>.
<br/>
이 메세지가 있는데, 여기서 권하는 방법이 바로 git lfs를 사용하는 것이다.</p>
<p>여기서 말하는 git lfs란?</p>
<blockquote>
<p>100MB 이상의 파일이 있을 때 지정한 파일을 작게 조각내어 커밋을 할 수 있도록 도와준다.</p>
</blockquote>
<p>하지만 나는 문제가 된 대용량 파일이 꼭 올려야 하는 중요한 파일이 아니었기에 지우는 방법을 택했다.
<br/></p>
<h2 id="그냥-대용량-파일-삭제-하기">그냥 대용량 파일 삭제 하기</h2>
<p>여기서부터 내 시행착오가 시작된다.</p>
<p>나는 그냥 문제가 되는 파일을 지우면 되겠거니 했고, 실제로도 그 파일들만 지우고 커밋 후 다시 푸시했지만 똑같은 에러 메세지를 마주했다. 그렇게 내 고생길이 시작됐다.</p>
<h3 id="bfg">bfg</h3>
<p>보통 검색해보면 bfg를 사용하는 방법을 얘기할 것이다. </p>
<p><a href="https://rtyley.github.io/bfg-repo-cleaner/">https://rtyley.github.io/bfg-repo-cleaner/</a></p>
<p>하지만 나는 다운로드를 해야한다는 말에 다운로드 안 하고 해결하는 방법은 없나? 싶어서 다른 방법을 찾아보았다.</p>
<h3 id="git-filter-branch">git filter-branch</h3>
<p><strong>나의 문제점은 파일만 지워졌지 커밋 히스토리에는 대용량 파일의 기록이 그대로 남아있다는 것이었다.</strong></p>
<p>근데 커밋 히스토리 지울 줄을 몰라서... 정말 고생했다.</p>
<pre><code>git filter-branch --force --index-filter &#39;git rm --cached --ignore-unmatch 경로/경로/파일명.확장자&#39; --prune-empty --tag-name-filter cat -- --all</code></pre><p><del>길다...</del></p>
<p>문제가 생긴 폴더에서 git bash를 통해 위 명령어를 작성하고</p>
<pre><code>git push origin --force --all</code></pre><p>를 통해 푸시를 해주었다. 정말 감쪽같이, 아무 일도 없었던 것처럼 푸시가 잘 되었다.
<br/></p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/34530263-6054-410d-a21d-cbf80e584ae3/image.png" alt="">
머리 쥐어 뜯었던 시간은 길었지만 실제 문제 해결은 정말 얼마 걸리지도 않았다. 억울하지만 어떡하겠나요 제가 잘 몰랐기에 생긴 문제들을...</p>
<p>이렇게 시행착오 기록 겸 반성용 포스팅을 마친다...
<br/><br/><br/></p>
<p><a href="https://velog.io/@yoogail/GitHub%EC%97%90-%EC%9D%B4%EB%AF%B8-%EC%98%AC%EB%A6%B0-%ED%8C%8C%EC%9D%BC-history%EC%97%90%EC%84%9C-%EC%82%AD%EC%A0%9C%ED%95%98%EA%B8%B0">참고한 글</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공JS] 6주차]]></title>
            <link>https://velog.io/@_leehyeryeong/%ED%98%BC%EA%B3%B5JS-6%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@_leehyeryeong/%ED%98%BC%EA%B3%B5JS-6%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Tue, 16 Aug 2022 15:11:57 GMT</pubDate>
            <description><![CDATA[<p>마지막 유종의 미를 거두기 위해... 마지막은 제대로 이튿날에 시작~!!!</p>
<h1 id="6주차-미션">6주차 미션</h1>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/ca2b280b-c7d5-4ef6-8d0d-e810aa6cbaa7/image.png" alt=""></p>
<hr>
<h2 id="p-315의-직접-해보는-손코딩을-실행한-후-출력되는-고양이-이미지-캡쳐하기">p. 315의 &lt;직접 해보는 손코딩&gt;을 실행한 후 출력되는 고양이 이미지 캡쳐하기</h2>
<p>오늘 해야 할 일은 p. 315에 &lt;직접 해보는 손코딩&gt; 실행하기입니다. 하지만 하기 전에 교재의 코드에서 무엇을 배우는지 짚고 넘어가면 좋겠죠?</p>
<p>이번 페이지는 Chapter 7의 문서 객체 모델 안에 있는 속성 조작하기 관련 내용입니다. 문서 객체의 속성을 조작할 때는 다음과 같은 메소드를 사용합니다. </p>
<table>
<thead>
<tr>
<th>메소드 이름</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>문서 객체</strong>.setAttribute(<strong>속성 이름</strong>, 값)</td>
<td>특정 속성에 값을 지정합니다.</td>
</tr>
<tr>
<td><strong>문서 객체</strong>.getAttribute(<strong>속성 이름</strong>)</td>
<td>특정 속성을 추출합니다.</td>
</tr>
</tbody></table>
<p>그리고 이번 코드에서는 img 태그의 src 속성으 조작해서 이미지를 출력합니다. 다음과 같은 URL을 입력하면 적절한 크기의 이미지를 얻을 수 있습니다.</p>
<pre><code>http://placekitten.com/너비/높이</code></pre><p>그럼 정리도 끝났겠다 이제 타이핑을 신나게 해볼까요?</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/ed65115c-6a5d-4a4a-ba9d-a79d3186db9a/image.png" alt=""></p>
<pre><code>&lt;script&gt;
    document.addEventListener(&#39;DOMContentLoaded&#39;, () =&gt; {
    const rects = document.querySelectorAll(&#39;.rect&#39;)

    rects.forEach((rect, index) =&gt; {
        const width = (index + 1) * 100
        const src = `http://placekitten.com/${width}/250`
        rect.setAttribute(&#39;src&#39;, src)
    })
})
&lt;/script&gt;
&lt;body&gt;
    &lt;img class=&quot;rect&quot;&gt;
    &lt;img class=&quot;rect&quot;&gt;
    &lt;img class=&quot;rect&quot;&gt;
    &lt;img class=&quot;rect&quot;&gt;
&lt;/body&gt;</code></pre><p>별로 안 길어 보이는데 왜 타이핑 하는데 오래 걸렸는지 모르겠습니다...^^;</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/51f2e919-d6fb-45fc-9c21-eb253d115e9f/image.png" alt="">
귀여운 고양이 출력에 성공했습니다. 하지만 여기서 만족하자니 어떻게 고양이 사진이 나오게 됐는지 궁금해지지 않나요?</p>
<p>코드를 뜯어와서 간단하게만 보자면...</p>
<pre><code>const src = `http://placekitten.com/${width}/250`</code></pre><p>여기서 src 값을 설정해줍니다. 가로 세로 길이 또한 여기서 설정합니다.</p>
<pre><code>rect.setAttribute(&#39;src&#39;, src)</code></pre><p>setAttribute 속성을 사용해 rect라는 이름을 가진 클래스에게 7번째 줄에서 설정한 src 값을 삽입해줍니다.</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/46cf8b45-efa7-44a8-9ab5-d72605b8f93d/image.png" alt="">
분명 본문 코드에선 img 태그에 클래스만 줬었는데 개발자 도구에서는 src 속성이 잘 들어간 것을 볼 수 있습니다. setAttribute 속성을 통해 특정 속성에 값을 지정했습니다.</p>
<hr>
<h2 id="p-352에-누적-예제를-활용하여-본인의-할-일-목록을-만들어-캡쳐하기">p. 352에 누적 예제를 활용하여 본인의 할 일 목록을 만들어 캡쳐하기</h2>
<pre><code>&lt;body&gt;
    &lt;h1&gt;할 일 목록&lt;/h1&gt;
    &lt;input id=&quot;todo&quot;&gt;
    &lt;button id=&quot;add-button&quot;&gt;추가하기&lt;/button&gt;
    &lt;div id=&quot;todo-list&quot;&gt;

    &lt;/div&gt;
&lt;/body&gt;
&lt;script&gt;
    document.addEventListener(&#39;DOMContentLoaded&#39;, () =&gt; {
        //문서 객체를 가져옵니다.
        const input = document.querySelector(&#39;#todo&#39;)
        const todoList = document.querySelector(&#39;#todo-list&#39;)
        const addButton = document.querySelector(&#39;#add-button&#39;)

        //변수를 선언합니다.
        let keyCount = 0

        //함수를 선언합니다.
        const addTodo = () =&gt; {
            //입력 양식에 내용이 없으면 추가하지 않습니다.
            if(input.value.trim() === &#39;&#39;){
                alert(&#39;할 일을 입력해주세요.&#39;)
                return
            }

            //문서 객체를 설정합니다.
            const item = document.createElement(&#39;div&#39;)
            const checkbox = document.createElement(&#39;input&#39;)
            const text = document.createElement(&#39;span&#39;)
            const button = document.createElement(&#39;button&#39;)

            //문서 객체를 식별할 키를 생성합니다.
            const key = keyCount
            keyCount += 1

            //item 객체를 조작하고 추가합니다.
            item.setAttribute(&#39;data-key&#39;, key)
            item.appendChild(checkbox)
            item.appendChild(text)
            item.appendChild(button)
            todoList.appendChild(item)

            //checkbox 객체를 조작합니다.
            checkbox.type = &#39;checkbox&#39;
            checkbox.addEventListener(&#39;change&#39;, (event) =&gt; {
                item.style.textDecoration
                    = event.target.checked ? &#39;line-through&#39; : &#39;&#39;
            })

            //text 객체를 조작합니다.
            text.textContent = input.value

            //button 객체를 조작합니다.
            button.textContent = &quot;제거하기&quot;
            button.addEventListener(&#39;click&#39;, () =&gt; {
                removeTodo(key)
            })

            //입력 양식의 내용을 비웁니다.
            input.value = &#39;&#39;
        }

        const removeTodo = (key) =&gt; {
        //식별 키로 문서 객체를 제거합니다.
            const item = document.querySelector(`[data-key=&quot;${key}&quot;]`)
            todoList.removeChild(item)
        }

    //이벤트 연결
    addButton.addEventListener(&#39;click&#39;, addTodo)
    input.addEventListener(&#39;keyup&#39;, (event) =&gt; {
        //입력 양식에서 Enter 키를 누르면 바로 addTodo() 함수를 호출합니다.
        const ENTER = 13
        if(event.keyCode === ENTER){
            addTodo()
        }
    })
})
&lt;/script&gt;</code></pre><p>코드가... 왜 이렇게 긴가요? 보자마자 눈이 튀어나올 뻔 했습니다. 너무 길어서 비주얼 스튜디오 창도 캡쳐 못했습니다... 사소한 오타에 에러까지 나서 정말 절망적이었습니다... 하지만 이겨냈습니다.</p>
<p>위 코드를 대충 몇 가지의 과정으로 정리하자면</p>
<ol>
<li>querySelector 이용해서 html에 있는 태그를 JS로 가져오기</li>
<li>할 일 목록을 추가하는 함수 만들기
→ 문서 객체 생성하기(가져오기?)
→ checkbox를 눌렀을 때, 글자에 선이 그어지게 하기
→ &#39;제거하기&#39; button을 눌렀을 때, 항목 지우기
→ &#39;추가하기&#39; button을 눌렀을 때, 항목 추가하기(+enter 눌렀을 때도 마찬가지로 항목 추가)</li>
</ol>
<p>가 되겠습니다. 사실 저도 뭐라 말하고 있는지 잘 모르겠어요... 틀린 부분이 있다면 알려주시길 바랍니다.</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/1d161713-bee6-47cf-9c68-cb24c21940ed/image.png" alt="">
하지만 코드는 정확합니다. 교재를 따라쳤으니까요. <del>오타를 이겨내고...</del></p>
<p>이렇게 선택 미션까지 6주차의 모든 미션을 완료했습니다.</p>
<hr>
<h1 id="혼공단-후기">혼공단 후기</h1>
<p>작고 아담한 내 자바스크립트 실력을 위해... 시작했던 혼공단이었는데 솔직하게 말하자면 6주 동안이나 매주 미션하는 게 귀찮기도 했지만 동시에 재밌기도 했습니다. 포스팅을 하면 읽어주고 거기에 대해 말해주는 사람이 있다는 게 제일 재밌었습니다. 혼공족장님 댓글을 이제 못 볼 생각을 하니 눈물이 핑<del>~</del> 덕분에 좋은 추억(+조금 더 업그레이드 됐을 자바스크립트 실력?!)을 업고 갑니다.^^
<br/>
마지막으로 한 마디 하자면... <strong>정말로 화요일에 포스팅 시작했습니다.</strong> 그런데 정신 차리고 보니 자정이 넘었을 뿐입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공JS] 5주차]]></title>
            <link>https://velog.io/@_leehyeryeong/%ED%98%BC%EA%B3%B5JS-5%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@_leehyeryeong/%ED%98%BC%EA%B3%B5JS-5%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Thu, 11 Aug 2022 18:43:48 GMT</pubDate>
            <description><![CDATA[<p>[속보] 이혜령, 5주차에 대하여 &quot;사실은 늦어도 둘째날에는 하려고 했었다&quot; 발언... 네티즌들, &quot;무슨 소리냐 지금 벌써 금요일이다!&quot; 맹렬한 비난이 이어져...</p>
<h1 id="5주차-미션">5주차 미션</h1>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/08977c4c-6511-4361-8f26-525a749f9a5f/image.png" alt=""></p>
<hr>
<h2 id="객체-속성-메소드가-무엇인지-설명하기">객체, 속성, 메소드가 무엇인지 설명하기</h2>
<h3 id="객체">객체</h3>
<p>객체란(Object)? 자바스크립트에서의 데이터 타입 중 하나로, 여러 자료를 다룰 때 사용하는 것입니다. </p>
<p>객체는 <strong>&#39;객체 생성자&#39;</strong> 문법과 <strong>&#39;객체 리터럴&#39;</strong> 문법이 있습니다.</p>
<pre><code>let key = new Object()</code></pre><p><strong>객체 생성자</strong> 문법입니다. Object() 생성자를 사용하여 객체를 만드는 방법입니다.</p>
<pre><code>let key = {key: value}</code></pre><p><strong>객체 리터럴</strong> 문법입니다. 중괄호 안에 key: value로 구성된 한 쌍의 속성을 넣어 객체를 만드는 방법입니다.</p>
<p>교재도 한 번 따라해볼까요?</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/541ff4d4-7a1e-48ae-b9b3-6535556849e8/image.png" alt=""></p>
<pre><code>&lt;script&gt;
    const product = {
        제품명: &#39;7D 건조 망고&#39;,
        유형: &#39;당절임&#39;,
        성분: &#39;망고, 설탕, 메타중아황산나트륨, 치자황색소&#39;,
        원산지: &#39;필리핀&#39;
    }
&lt;/script&gt;</code></pre><p>여기서 생성한 객체를 표로 나타낼 수 있습니다.</p>
<table>
<thead>
<tr>
<th align="center">키</th>
<th align="center">속성</th>
</tr>
</thead>
<tbody><tr>
<td align="center">제품명</td>
<td align="center">7D 건조 망고</td>
</tr>
<tr>
<td align="center">유형</td>
<td align="center">당절임</td>
</tr>
<tr>
<td align="center">성분</td>
<td align="center">망고, 설탕, 메타중아황산나트륨, 치자황색소</td>
</tr>
<tr>
<td align="center">원산지</td>
<td align="center">필리핀</td>
</tr>
</tbody></table>
<p>위에 코드에서는 중괄호 안에 키: 값으로 구성된 한 쌍의 속성을 쉼표로 연결해, 여러 개 썼음을 알 수 있습니다. <strong>객체 리터럴</strong> 문법이죠.
<br/></p>
<p>또한 이러한 방법 이외에도 온점(.)을 사용할 수 있습니다.
<img src="https://velog.velcdn.com/images/_leehyeryeong/post/35236d97-3c1b-488f-8ffa-f059a66c3686/image.png" alt=""></p>
<pre><code>&lt;script&gt;
    product.제품명(&#39;7D 건조 망고&#39;);
    product.유형(&#39;당절임&#39;)
    product.성분(&#39;망고, 설탕, 메타중아황산나트륨, 치자황색소&#39;)
    product.원산지(&#39;필리핀&#39;)
&lt;/script&gt;</code></pre><h3 id="속성">속성</h3>
<p>객체 내부에 있는 값을 속성(property)라고 합니다. 모든 형태의 자료형을 가질 수 있습니다.</p>
<p>교재에 나와있는 코드를 따라 쳐보며 이해해보겠습니다.</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/604efa13-118c-4fb1-b814-89aeaa1d55ab/image.png" alt=""></p>
<pre><code>&lt;script&gt;
    const object = {
        number: 273,
        string: &#39;구름&#39;,
        boolean: true,
        array: [52, 273, 103, 32]
    }
&lt;/script&gt;</code></pre><p>임의로 console.log(object) 한 줄만 더 입력해서 결과를 보면
<img src="https://velog.velcdn.com/images/_leehyeryeong/post/847eb3c0-ca72-42c7-8248-e845c6a27b89/image.png" alt="">
모든 형태의 자료형을 가질 수 있다는 것을 두 눈으로 똑똑히 볼 수 있습니다.</p>
<h3 id="메소드">메소드</h3>
<p>객체의 속성 중에서도 함수 자료형인 속성을 특별히 메소드(method)라고 부릅니다. </p>
<p>이번에도 교재에 나온 코드를 보며 이해해 봅시다.
<img src="https://velog.velcdn.com/images/_leehyeryeong/post/8c543a4c-4546-4bd4-a8e1-2bd18b1f2856/image.png" alt=""></p>
<pre><code>&lt;script&gt;
    const pet = {
        name: &#39;구름&#39;,
        eat: function (food) { }
    }

    //메소드를 호출합니다.
    pet.eat()
&lt;/script&gt;</code></pre><p>pet 객체는 name과 eat라는 속성을 가지고 있습니다. 여기서 eat 속성은 입력값을 받아 무언가를 한 다음 결과를 도출해내는 함수 자료형입니다. 따라서 eat 속성을 특별히 eat() 메소드라고 부르게 되는 것입니다.</p>
<blockquote>
<p>객체는 사람, 속성은 사람의 이름, 나이, 성별, 생일 등의 정보, 메소드는 사람이 밥을 먹는다던지 잠을 잔다 등의 행동으로 이해하면 쉽다.</p>
</blockquote>
<hr>
<h2 id="p-288-확인-문제-3번-풀고-풀이-과정-설명하기">p. 288 확인 문제 3번 풀고, 풀이 과정 설명하기</h2>
<ol start="3">
<li><p>모질라 문서에서 Math 객체와 관련된 내용을 읽고 사인 90도의 값을 구해보세요. 참고로 사인 90도는 1입니다. 아주 단순하게 생각해서 구현하면 0.89399666360005579라는 결과가 나옵니다. 0.89399666360005579가 나왔다면 왜 그런지, 그리고 이를 어떻게 해야 제대로 사용할 수 있는지 구글 검색 등을 활용해서 알아보고 코드를 수정하세요.</p>
<pre><code>&lt;script&gt;
 //변수를 선언합니다.
 const degree = 90

 //출력합니다.


</code></pre></li>
</ol>
<p></script></p>
<pre><code>Math 객체를 사용해 사인 90도의 값을 구하라기에 단순하게 생각했습니다. 그래서 아래와 같이 풀었습니다.
![](https://velog.velcdn.com/images/_leehyeryeong/post/a87df585-73f8-455d-b5e3-1e94dbec04db/image.png)</code></pre><script>
    //변수를 선언합니다.
    const degree = 90

    //출력합니다.
    console.log(Math.sin(degree))
</script>
<pre><code>그리고 실행 결과를 보는데...

![](https://velog.velcdn.com/images/_leehyeryeong/post/c8077da5-e8b9-4d8a-983d-472fdd5fb208/image.png)
숫자가... 너무 길어요. 나오라는 1은 안 나오고, 차라리 안 나오느니만 못한 숫자가 ~~뻥임 이런 숫자라도 나와줬음 좋겠음~~... 문제에서 말한 숫자가... 그대로 나왔습니다.

하지만 문제에서는 이미 예상했는지... 이 숫자가 나왔다면 왜 그런지와, 어떻게 해야 제대로 된 숫자가 나올지를 잘 찾아보고 코드를 수정하라네요.

그래서 불꽃 구글링으로 나름의 답안을 찾아냈습니다. [참고한 블로그](https://m.blog.naver.com/scyan2011/221604956473)들 [링크들을](https://ui-tricks.tistory.com/16) 걸어놓았습니다. (두 개 다 다른 링크임!!!)

여튼 제가 알아낸 것은... Math.sin() 함수의 인자로 주어지는 값은 우리가 흔히 알고 있는 각도가 아닌 라디안 값이라는 사실이었습니다. 따라서 일반각으로 sin을 구하고 싶다면 **구하고 싶은 각 * (Math.PI/180)**으로 써야 라디안 값이 아닌, 각도로 구해지는 것입니다.

![](https://velog.velcdn.com/images/_leehyeryeong/post/e8d937fa-f2f3-46f7-b2c0-f03133ab7846/image.png)</code></pre><script>
    //변수를 선언합니다.
    const degree = 90

    //출력합니다.
    console.log(Math.sin(degree*(Math.PI/180)))
</script>
<p>```
그래서 배운대로 응용해보았습니다. 이제 실행을 하면...</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/7b21e998-16d4-44b1-8af7-dd50ed5b52bd/image.png" alt="">
와!!! 1이다!!! 영점어쩌고저쩌고가 아니라 1이다!!! 선택 미션 끝이다!!!</p>
<hr>
<p>미루고 미루다 금요일까지 미루다니... 믿기지 않습니다. 그래도 나름 시험 기간만 빼면 일찍일찍 써서 올리는 편이었는데... 방학이 사람을 나태하게 만듭니다. 나태해진 정신 머리에 포스팅까지 하려니 너무 힘들었지만 이겨냈습니다. 제가 이김^^ 이제 마지막까지 아자아자!!!!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공JS] 4주차]]></title>
            <link>https://velog.io/@_leehyeryeong/%ED%98%BC%EA%B3%B5JS-4%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@_leehyeryeong/%ED%98%BC%EA%B3%B5JS-4%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Tue, 26 Jul 2022 15:22:58 GMT</pubDate>
            <description><![CDATA[<p>4주차 딱 시작하는 날에 힘차게!!! 시작하려 했지만 힘차게!!! 실패해서 지금에서야 포스팅 시작~!!!</p>
<h1 id="4주차-미션">4주차 미션</h1>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/9c4c7541-29a3-4e02-a032-4ae5db8a910c/image.png" alt=""></p>
<hr>
<h2 id="202쪽의-윤년을-확인하는-함수-만들기-예제를-실행하여-2022년-윤년인지-확인하는-결과-인증샷">202쪽의 &lt;윤년을 확인하는 함수 만들기&gt; 예제를 실행하여 2022년 윤년인지 확인하는 결과 인증샷</h2>
<p>문제를 풀기 전에 윤년이 뭔지 먼저 집고 넘어갑시다. 윤년이란?</p>
<ul>
<li>몇 년에 한 번 있는, 2월이 29일까지 있는 해이다.</li>
<li>4로 나누어 떨어진다.</li>
<li>하지만 100으로 나누어 떨어지면 윤년이 아니다.</li>
<li>그런데? 400으로 나누어 떨어지면 윤년이다.</li>
</ul>
<p><a href="https://youtu.be/-O9RbU_gsEI">이랬다 저랬다 정말 알 수 없는 <del>너</del></a> 윤년... 참 까다롭습니다. 괜히 몇 년에 한 번씩 돌아오고 그런 게 아닌가봐요. 하지만 벌써 혼공단 4주차. 이 정도에 지지 않는다. 아자아자!!!</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/a851602e-f0ec-4fdf-801d-00919f36edd0/image.png" alt=""></p>
<pre><code>&lt;script&gt;
    function isLeapYear(year) {
        return (year % 4 === 0) &amp;&amp; (year % 100 != 0) || (year % 400 === 0)
    }

    console.log(`2020년은 윤년일까? === ${isLeapYear(2020)}`)
    console.log(`2010년 윤년일까? === ${isLeapYear(2010)}`)
    console.log(`2000년은 윤년일까? === ${isLeapYear(2000)}`)
    console.log(`1900년은 윤년일까? === ${isLeapYear(1900)}`)
&lt;/script&gt;</code></pre><p>예제에 있는 코드입니다. 사실 저는 예제를 보기 전까지 대충 떠올려보며 if문 여러 번 쓸 생각을 하고 있었습니다. 아직도 저는 한참 멀었다는 것을 이렇게 다시 한 번 실감합니다. 2주차에 그렇게 열심히 정리했던 논리 연산자를 쓰면 한 방인 것을...
<br/></p>
<blockquote>
<p>윤년은 4로 나누어 떨어져야 하지만 100으로는 나누어 떨어져서는 안 된다. 그러나 400으로 나누어 떨어지는 해는 윤년이 될 수 있다.</p>
</blockquote>
<p>여기서 우리는 제일 먼저 4로 나누어 떨어지지만, 100으로는 나누어 떨어지지는 말아야 하는 조건을 충족해야함을 알 수 있습니다. 둘 다 참을 반환해야 한다는 소리겠죠? 400으로 나누어 떨어지는 해가 윤년인 것은 그 다음에 해도 괜찮으니 둘 중 하나만 참으로 반환해도 괜찮겠고요.</p>
<pre><code>(year % 4 === 0) &amp;&amp; (year % 100 != 0) || (year % 400 === 0)</code></pre><p>위에서 쓴 코드 중 일부를 뜯어왔습니다. 다시 한 번 보겠습니다. 4로 나누어 떨어지지만, 100으로 나누어 떨어지지 않는다는 조건에 &amp;&amp; 연산자를 써서 둘 다 참이 아닐 경우 거짓을 반환하게 했으며, 그 뒤 400으로 나누어 떨어지는 수가 없을 경우에는 || 연산자를 씀으로써 둘 중 하나만 참이어도 참을 반환하게 하였습니다.</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/86b620bb-e0d5-40c0-acef-063e8e8750d7/image.png" alt="">
결과입니다. 책에 나온 실행 결과 그대로 예쁘게 잘 나왔습니다. 4주차 기본 미션 끝~!!!</p>
<hr>
<h2 id="p-240-확인-문제-1번-풀고-풀이-과정-설명하기">p. 240 확인 문제 1번 풀고, 풀이 과정 설명하기</h2>
<ol>
<li><p>filter 함수의 콜백 함수 부분을 채워서 ① 홀수만 추출, ② 100 이하의 수만 추출, ③ 5로 나눈 나머지가 0인 수만 추출해주세요.
<img src="https://velog.velcdn.com/images/_leehyeryeong/post/60a64536-c2c5-4023-8a0b-d57b6429aa5e/image.png" alt=""></p>
<pre><code>&lt;script&gt;
 //변수를 선언합니다.
 let numbers = [273, 25, 75, 52, 103, 32, 57, 24, 76]

 //처리합니다.

</code></pre></li>
</ol>
<pre><code>//출력합니다.
console.log(numbers)</code></pre><p></script></p>
<pre><code>가운데 //처리합니다. 부분을 구현하면 되는 문제입니다. filter 함수를 사용해

 * 홀수만 추출하기
 * 100 이하의 수만 추출하기
 * 5로 나눈 나머지가 0인 수만 추출하기

를 처리하면 되겠습니다.

일단 우리가 사용해야할 filter 함수에 대해 먼저 알고 가겠습니다. 사실 저도 배웠을 텐데도 불구하고 지금 처음 듣는 것 같아서 공부가 좀 필요합니다...

### filter 함수

배열이 갖고 있는 함수입니다. 이름에서 볼 수 있듯이 거르다, 즉 조건에 일치하는 요소를 모아 새로운 배열을 반환하는 함수입니다. 조건에 일치하지 못한 함수들은 걸러지는 셈이죠.</code></pre><p>arr.filter(function(value, index, array)) { }</p>
<pre><code>기본 형태입니다.

![](https://velog.velcdn.com/images/_leehyeryeong/post/dc12cd78-f059-498a-aef6-410d2905141a/image.png)</code></pre><script>
    //변수를 선언합니다.
    let numbers = [273, 25, 75, 52, 103, 32, 57, 24, 76]

    //처리합니다.
    //1. 홀수만 추출
    numbers = numbers.filter((x) => x % 2 === 1)
    //2. 100 이하의 수만 추출
    numbers = numbers.filter((x) => x <= 100)
    //3. 5로 나눈 나머지가 0인 수만 추출
    numbers = numbers.filter((x) => x % 5 === 0)

    //출력합니다.
    console.log(numbers)
</script>
<pre><code>filter 함수를 이용해 풀어본 예제입니다. 위에서 설명한 기본 형태와 모습이 다른데요?! 라고 말씀하신다면... 맞습니다. 더 간단하게 할 수 있을 것 같아서 수정해보았습니다. 

저는 function 키워드 대신 **화살표 함수**를 사용했습니다. 다음과 같은 형태로 사용할 수 있습니다.</code></pre><p>(매개변수) =&gt; {</p>
<p>}</p>
<pre><code>하지만 여기서 더 줄일 수 있습니다.</code></pre><p>(매개변수) =&gt; 리턴값</p>
<pre><code>저는 두 번째 형태의 화살표 함수를 사용하였습니다. 타이핑도 쉽고, 코드 길이도 짧아지고. 이것이 바로 일석이조.

위에 제가 짠 코드를 보면 화살표 뒤에 조건을 줘, 바로 리턴 되게 한 것을 볼 수 있습니다.

1번은 2로 나눈 나머지 수가 1일 경우 리턴, 즉 홀수일 경우 리턴.
2번은 비교 연산자를 사용해 100 이하일 경우 리턴.
3번은 5로 나눈 나머지가 수가 0일 경우 리턴, 즉 5로 나누어 떨어질 때 리턴.

출력할 때, numbers를 출력하니 그 리턴 값은 numbers가 받을 수 있도록 numbers에 대입까지 해주면서 4주차 선택 미션까지 끝냈습니다.
***
좀 있어 보이는 척 하고 있었는데... 막바지에 다다르니 제 한계도 벌써 다다른 듯 싶습니다. 선택 미션 6주차까지 성실하게 하겠다 해놓고 어려워서 하지 말까... 하기까지 했습니다...^^ 근데 어찌저찌 또 하긴 했네요. 오늘도 열심히 포스팅한 나에게 박수~^^</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공JS] 3주차]]></title>
            <link>https://velog.io/@_leehyeryeong/%ED%98%BC%EA%B3%B5JS-3%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@_leehyeryeong/%ED%98%BC%EA%B3%B5JS-3%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Mon, 18 Jul 2022 12:14:09 GMT</pubDate>
            <description><![CDATA[<p>2주차를 너무 늦게 끝냈더니 글 쓴 지 얼마나 됐다고 벌써 다시 포스팅을 하고 있네요...^^ 하루 쉬고 다시 힘차게 시작!!!^^</p>
<h1 id="3주차-미션">3주차 미션</h1>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/28255360-4f2a-4cbb-94a1-89c84d2e5d79/image.png" alt=""></p>
<hr>
<h2 id="비파괴적-처리와-파괴적-처리의-의미와-장단점-설명하기">비파괴적 처리와 파괴적 처리의 의미와 장단점 설명하기</h2>
<p>자바스크립트는 자료 처리를 위해 다양한 연산자, 함수, 메소드를 제공합니다. 이들을 크게 <strong>비파괴적 처리</strong>와 <strong>파괴적 처리</strong>로 구분할 수 있습니다.</p>
<p>뭘 그렇게 과격하게 처리하길래 이름이 비파괴적 처리와 파괴적 처리인가요? </p>
<blockquote>
<p>비파괴적 처리: 처리 후에 원본 내용이 변경되지 않습니다.
파괴적 처리: 처리 후에 원본 내용이 변경됩니다.</p>
</blockquote>
<p>그렇습니다. 하지만 이것만 봐선 뭔 소린지 잘 모르겠지 않나요? 일단 저는 그랬습니다. 저와 같은 사람이 저 하나 뿐일 거라 생각하지 않고 설명을 더 이어나가겠습니다.</p>
<h3 id="비파괴적-처리">비파괴적 처리</h3>
<p>본문에 나온 코드를 실행해보며 알아봅시다.</p>
<pre><code>&lt;script&gt;
    const a = &#39;안녕&#39;
    const b = &#39;하세요&#39;

    const c = a + b

    console.log(c)

    console.log(a)
    console.log(b)
&lt;/script&gt;</code></pre><p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/c6dc4f32-5693-401a-a7c2-de254ded28ba/image.png" alt=""></p>
<p>결과입니다. + 연산자를 사용해 a와 b를 연결하여 c를 만들고 콘솔 창에 출력해 보았습니다. 원본 내용인 a와 b 또한 콘솔 창에 출력해줍니다. 결과는 순서대로 &#39;안녕하세요&#39;, &#39;안녕&#39;, &#39;하세요&#39;가 나옵니다. c에서 문자열 연결 처리를 하고도 원본 내용인 a와 b가 변경되지 않은 것을 볼 수 있습니다.</p>
<h3 id="파괴적-처리">파괴적 처리</h3>
<p>마찬가지로 본문에 나온 코드를 실행해보며 알아봅시다.</p>
<pre><code>&lt;script&gt;
    const array = [&quot;사과&quot;, &quot;배&quot;, &quot;바나나&quot;]

    array.push(&quot;귤&quot;)

    console.log(array)
&lt;/script&gt;</code></pre><p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/ed84edca-c883-42d6-8d31-582f2d00e01a/image.png" alt=""></p>
<p>결과입니다. 분명 array는 사과, 배, 바나나가 들어있는 길이가 3인 배열이었는데 push() 메소드를 사용했더니 사과, 배, 바나나에 귤까지 추가되면서 배열의 길이가 4로 변했습니다. push() 메소드 처리 후, 원본과 달라진 것을 알 수 있습니다.</p>
<h3 id="각각의-장단점">각각의 장단점</h3>
<p>컴퓨터 메모리가 많이 부족했던 과거에는 배열처럼 크기가 어느 정도인지 모르는 대상의 원본과 결과를 모두 메모리에 저장하는 것은 위험할 수 있었기에, <strong>메모리를 절약할 수 있게</strong> 대부분 파괴적 처리를 했습니다.</p>
<p>하지만 파괴적 처리는 <strong>원본이 사라지기 때문에</strong> 위험할 수 있습니다.</p>
<p>그렇기에 메모리가 여유로윤 현대의 프로그래밍 언어와 라이브러리는 <strong>자료 보호를 위해</strong> 대부분 비파괴적 처리를 합니다.</p>
<hr>
<h2 id="p-173-확인-문제-3번-풀고-풀이-과정-설명하기">p. 173 확인 문제 3번 풀고, 풀이 과정 설명하기</h2>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/c1cc9576-8b16-41fa-b7ba-8328d8911169/image.png" alt=""></p>
<p>1번은 비파괴적 처리입니다. 출력했을 때 원본 내용과 다름이 없는 모습을 볼 수 있습니다. 따라서 비파괴적 처리입니다.</p>
<p>2번은 파괴적 처리입니다. push() 메소드를 사용했을 때, 배열이 사과, 배, 바나나, 귤에서 끝나지 않고 감이 추가되었습니다. 원본과 내용도, 길이도 다른 것을 볼 수 있습니다. 따라서 파괴적 처리입니다.</p>
<p>3번은 비파괴적 처리입니다. 출력했을 때 원본 내용과 다름이 없는 모습을 볼 수 있으므로 비파괴적 처리임을 알 수 있습니다.</p>
<p>4번은 비파괴적 처리입니다. 출력했을 때 원본 내용과 다름이 없는 모습을 볼 수 있으므로 비파괴적 처리입니다.</p>
<hr>
<p>3주차도 기본 미션부터 선택 미션까지 완료했습니다~ 가면 갈수록 어려워지지만... 지지 않고 끝까지 꼭. 기필코. 완주하겠습니다. 파이팅~</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공JS] 2주차]]></title>
            <link>https://velog.io/@_leehyeryeong/%ED%98%BC%EA%B3%B5JS-2%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@_leehyeryeong/%ED%98%BC%EA%B3%B5JS-2%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Sun, 17 Jul 2022 11:14:10 GMT</pubDate>
            <description><![CDATA[<p>시험 끝나고 집 가면 바로 하려고 했지만... 조금만 논다는 게 정신 차려보니 벌써 일요일이더라고요^^ 사족 붙일 시간 없이 빨리빨리 2주차 시작!!!</p>
<h1 id="2주차-미션">2주차 미션</h1>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/7a1a561a-37bd-4e4d-bd6a-ade04cc61861/image.png" alt=""></p>
<hr>
<h2 id="p-139-확인-문제-3번-문제-풀고-완전한-코드-만들어-비주얼-스튜디오-코드에서-실행-결과-인증샷">p. 139 확인 문제 3번 문제 풀고 완전한 코드 만들어 비주얼 스튜디오 코드에서 실행 결과 인증샷</h2>
<ol start="3">
<li>중첩 조건문은 2장에서 배운 논리 연산자를 적용해 하나의 if 조건문으로 만들 수 있습니다. 빈칸에 어떤 논리 연산자가 들어가야 할까요?</li>
</ol>
<p>오늘 풀어야 할 문제도 써뒀으니 이제 진짜진짜로 시작~!!!</p>
<hr>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/78fbab6a-d5bf-412b-9d03-58df38bb2005/image.png" alt=""></p>
<pre><code>&lt;script&gt;
    if(x &gt; 10) {
        if(x &lt; 20) {
            console.log(&#39;조건에 맞습니다.&#39;)
        }
    }
&lt;/script&gt;</code></pre><p>먼저 문제에 나와있는 코드입니다. x가 10보다 크거나 20보다 작을 경우 &#39;조건에 맞습니다.&#39; 라는 문장을 console에 띄워주는 코드인데, 중첩 조건문을 사용한 것을 볼 수 있습니다. 잘못 짠 코드는 아니나... if를 한 번만 쓰고도 저 두 개의 조건을 충족시킬 줄 안다면 정말 간지나지 않을까요?!?!?!</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/12cb9e8c-4ef2-4dc6-a68f-55c4631f9839/image.png" alt=""></p>
<pre><code>&lt;script&gt;
    if(x &gt; 10 ___ x &lt; 20) {
        console.log(&#39;조건에 맞습니다.&#39;)
    }
&lt;/script&gt;</code></pre><p>빈 칸에 어떠한 논리 연산자만 사용한다면 이제 굳이 if를 두 번씩 쓰지 않아도 됩니다. 그렇다면 저 빈 칸에 사용할 논리 연산자는?</p>
<h3 id="논리-연산자">논리 연산자</h3>
<p>논리 연산자에는 <strong>&amp;&amp;</strong>과 <strong>||</strong>이 있습니다. 두 개씩이나 있는 이유는 둘의 쓰임새가 다르기 때문이겠죠. 그럼 이제부터 어떻게 다른지 설명해보겠습니다.</p>
<h3 id="논리곱-연산자">논리곱 연산자 &amp;&amp;</h3>
<p>&amp;&amp;은 논리곱 연산자입니다. 두 개의 값을 비교했을 때, 둘 다 참이라면 참을 반환하지만 둘 중 하나라도 거짓이라면 거짓을 반환합니다. <strong>AND</strong>라고 생각하면 됩니다.</p>
<h3 id="논리합-연산자-">논리합 연산자 ||</h3>
<p>||은 논리합 연산자입니다. 논리곱 연산자 &amp;&amp;과의 가장 큰 차이점은 <strong>두 개의 값 중, 하나만 참이더라도 참을 반환한다는 것입니다.</strong> 둘 다 참이라면 참을 반환, 둘 중 하나만 참이라면 참을 반환, 둘 다 거짓이라면 거짓을 반환합니다. <strong>OR</strong>라고 생각하면 됩니다.
<br/>
둘 중 우리가 써야할 논리 연산자는 무엇인지 감이 오나요? 우리는 위에서 말한 것처럼 x가 10보다 크거나 20보다 작을 경우 해당 코드가 작동하도록 만들어야 합니다. 그러면 x &gt; 10 조건과 x &lt; 20 조건을 둘 다 만족시켜야겠죠. 즉, 두 개의 값 모두 참을 반환해야 합니다. 따라서 사용해야 할 연산자는 <strong>&amp;&amp;</strong>이 되겠습니다.</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/e1aa92cf-ce2a-4c49-b804-88113313ded4/image.png" alt=""></p>
<pre><code>&lt;script&gt;
    if(x &gt; 10 &amp;&amp; x &lt; 20) {
        console.log(&#39;조건에 맞습니다.&#39;)
    }
&lt;/script&gt;</code></pre><p>수정 완료!!! 실행!!!</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/8797de9d-0075-40c1-887f-e93b598d8856/image.png" alt=""></p>
<p>될 줄 알았으나 나를 반겨주는 오류. 6번째 줄에 오류가 있다는데요. x is not defined... x is... not defined...? x를... 찾을 수 없어...? 그렇습니다. 우리는 아직 x를 선언하지 않았습니다. 그러니 x를 찾을 수 있겠습니까.</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/fde146e4-5117-4354-affa-95f3562d2d87/image.png" alt=""></p>
<pre><code>&lt;script&gt;
    let x = 11;

    if(x &gt; 10 &amp;&amp; x &lt; 20) {
        console.log(&#39;조건에 맞습니다.&#39;)
    }
&lt;/script&gt;</code></pre><p>x를 선언하고, 임의로 11을 넣어주었습니다. 이제 진짜 실행!!!</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/94e6d974-c889-49dd-8001-06173c8212e9/image.png" alt=""></p>
<p>와!!! 실행 성공!!!</p>
<p>10과 20 사이 수인 11을 넣어 조건에 만족하여 조건에 맞다는 문장까지 출력이 됐습니다. 이렇게 2주차 기본 미션 끝~</p>
<hr>
<h2 id="p-152의-태어난-연도를-입력-받아-띠-출력하기-예제-실행하여-본인의-띠-출력한-화면-캡쳐하기">p. 152의 &lt;태어난 연도를 입력 받아 띠 출력하기&gt; 예제 실행하여 본인의 띠 출력한 화면 캡쳐하기</h2>
<p>오늘도 선택 미션까지 하는 성실한 나의 모습. 기왕 성실해본 거 6주차까지 성실해보려고요~^^</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/d107fa94-7aad-4a13-a6b2-33a9b9ee66ae/image.png" alt=""></p>
<pre><code>&lt;script&gt;
    const rawInput = prompt(&#39;태어난 해를 입력해주세요.&#39;, &#39;&#39;)
    const year = Number(rawInput)
    const e = year % 12

    let result
    if(e == 0) {result = &#39;원숭이&#39;}
    if(e == 1) {result = &#39;닭&#39;}
    if(e == 2) {result = &#39;개&#39;}
    if(e == 3) {result = &#39;돼지&#39;}
    if(e == 4) {result = &#39;쥐&#39;}
    if(e == 5) {result = &#39;소&#39;}
    if(e == 6) {result = &#39;호랑이&#39;}
    if(e == 7) {result = &#39;토끼&#39;}
    if(e == 8) {result = &#39;용&#39;}
    if(e == 9) {result = &#39;뱀&#39;}
    if(e == 10) {result = &#39;말&#39;}
    if(e == 11) {result = &#39;양&#39;}
    alert(`${year}년에 태어났다면 ${result} 띠입니다.`)
&lt;/script&gt;</code></pre><p>예제 코드를 열심히 타이핑 해 주었습니다. 이제 실행!!!</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/609d3137-06a5-4afd-bff2-87266931d1a2/image.png" alt=""></p>
<p>태어난 연도를 입력해주고 확인을 누르면</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/c155d3c0-1cfc-47b6-9323-29cbbb355c8d/image.png" alt=""></p>
<p>짜잔~ 이렇게 제가 닭띠라는 사실을 알려줍니다. 2주차 선택 미션도 끝~ 2주차 끝~!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공JS] 1주차]]></title>
            <link>https://velog.io/@_leehyeryeong/%ED%98%BC%EA%B3%B5JS-1%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@_leehyeryeong/%ED%98%BC%EA%B3%B5JS-1%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Mon, 04 Jul 2022 17:14:09 GMT</pubDate>
            <description><![CDATA[<p>학교에서도 배우지만 그럼에도 불구하고 작고 아담하고 하찮은... 제 자바 스크립트 실력을 위해 시작한 혼공단!!! 열심히 하겠습니다 아자아자 파이팅~</p>
<hr>
<h2 id="1주차-미션">1주차 미션</h2>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/fb4ecc20-7d2c-4bed-af1f-ddf93ace2d87/image.png" alt=""></p>
<hr>
<h2 id="p-54의-파일-만들고-저장해-실행하기에서-hello-world-출력하기">p. 54의 &lt;파일 만들고 저장해 실행하기&gt;에서 &#39;Hello World&#39; 출력하기</h2>
<p>&#39;Hello World&#39;가 출력되기까지 필요한 과정을 정리해보자.
&nbsp;&nbsp;&nbsp; 1. 파일 만들기(HTML 페이지 생성)
&nbsp;&nbsp;&nbsp; 2. 파일 작성(HTML 페이지 작성)
&nbsp;&nbsp;&nbsp; 3. 파일 실행하기(HTML 페이지 실행)</p>
<hr>
<h3 id="1-파일-만들기html-페이지-생성">1. 파일 만들기(HTML 페이지 생성)</h3>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/96609ae3-27ba-450b-a98b-5a2790b29402/image.png" alt="">
상단의 메뉴에서 [파일] → [새 파일]을 선택해서 파일을 만들 수 있습니다.
탐색기에 마우스 오버시 뜨는 첫 번째 아이콘을 클릭 또한 새 파일을 만들어줍니다.
Ctrl+N 단축키로도 파일 생성이 가능합니다.</p>
<h3 id="2-파일-작성html-페이지-작성">2. 파일 작성(HTML 페이지 작성)</h3>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/b77dcd40-d8ee-4178-99c8-c60910f87503/image.png" alt="">
HTML의 기본적인 형태 코드를 입력해보았습니다.</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/49597451-5f36-4da7-8632-cefba69efdd9/image.png" alt="">
하지만 제가 할 일은? HTML이 아닌 자바 스크립트입니다. 그런고로 코드를 간략하게 만들고, 자바 스크립트 사용시 필수인 script 태그를 head 태그 안에 삽입해줬습니다.</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;head&gt;
    &lt;title&gt;&lt;/title&gt;
    &lt;script&gt;

    &lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><p>파일 기본 형태 작성 끝~ 예제를 작성하기 위한 모든 준비가 끝났습니다.
이제 &#39;Hello World&#39;를 한 번 출력해보겠습니다.</p>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/68697eb0-2be4-4a03-af74-eb0a32e64c08/image.png" alt="">
script 태그 안에 alert라는 메소드를 사용해 Hello World를 출력합니다.</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;head&gt;
    &lt;title&gt;&lt;/title&gt;
    &lt;script&gt;
        alert(&#39;Hello World&#39;)
    &lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre><h3 id="3-파일-실행하기html-페이지-실행">3. 파일 실행하기(HTML 페이지 실행)</h3>
<p><img src="https://velog.velcdn.com/images/_leehyeryeong/post/faaeecb6-5c7a-45e2-9d54-57d3e6f8ef56/image.png" alt="">
출력에 성공했습니다. 이렇게 1주차 기본 미션이 마무리 되었습니다.</p>
<hr>
<h2 id="chapter-0101-1-확인-문제-1번-상세하게-적고-인증샷">Chapter 01(01-1) 확인 문제 1번 상세하게 적고 인증샷</h2>
<p>여기서 끝날 줄 알았나요? 전혀 아닙니다. 선택 미션까지 하는 성실한 나의 모습.
<img src="https://velog.velcdn.com/images/_leehyeryeong/post/a73dfe1b-f324-416d-8adb-13b88cbada44/image.png" alt=""></p>
<h3 id="1-인터넷을-돌아다니면서-보았던-쉽게-사용할-수-있고-기능이-많다고-느꼈던-웹-사이트를-5개-정도-적어-보세요">1. 인터넷을 돌아다니면서 보았던 쉽게 사용할 수 있고, 기능이 많다고 느꼈던 웹 사이트를 5개 정도 적어 보세요.</h3>
<table>
<thead>
<tr>
<th>사이트</th>
<th>기능</th>
</tr>
</thead>
<tbody><tr>
<td>벨로그<br/>(velog.io)</td>
<td>지금도 이 글을 작성하기 위해 쓰고 있다. 게시물을 마크다운으로 작성해, 여러 효과를 줄 수 있어서 좋다.</td>
</tr>
<tr>
<td>유튜브 (youtube.com)</td>
<td>세계 각국에서 올라오는 여러 카테고리의 영상을 볼 수 있는 사이트. 어느 영상이든 검색만 하면 대부분이 존재한다는 점이 유용하다.</td>
</tr>
<tr>
<td>인스타그램(instagram.com)</td>
<td>모두에게 일상을 공유할 수 있는 소설 네트워크 서비스. 멀리 떨어져 있더라도 인스타그램 하나면 근황을 확인할 수 있다는 장점이 있다.</td>
</tr>
<tr>
<td>yes24 (yes24.com)</td>
<td>언제 어디서든 사용할 수 있는 인터넷 서점. 공연 예매 서비스도 제공한다. 오프라인 매장에 가지 않아도 책을 구매할 수 있어 유용하다.</td>
</tr>
<tr>
<td>unsplash (unsplash.com)</td>
<td>저작권 무료 이미지 사이트. 프레젠테이션을 제작할 때 등의 경우에 유용하다.</td>
</tr>
<tr>
<td>&nbsp;</td>
<td></td>
</tr>
<tr>
<td>### 2. Statcounter에서 책을 보고 있는 현재 시점의 웹 브라우저 점유율(Browser Market Share Worldwide)을 확인해보세요.</td>
<td></td>
</tr>
<tr>
<td><img src="https://velog.velcdn.com/images/_leehyeryeong/post/171ec9f5-5dbe-4352-b559-e83611e9b283/image.png" alt=""></td>
<td></td>
</tr>
<tr>
<td><img src="https://velog.velcdn.com/images/_leehyeryeong/post/6d47a798-ea61-4de9-a47f-70fafee9c123/image.png" alt=""></td>
<td></td>
</tr>
<tr>
<td>Chrome의 점유율이 압도적인 것을 확인할 수 있습니다. 그 다음으로 많은 브라우저는 순서대로 Edge와 Whale Browser이며, 나머지의 점유율은 대부분 비슷한 것을 볼 수 있습니다.</td>
<td></td>
</tr>
<tr>
<td>&nbsp;</td>
<td></td>
</tr>
<tr>
<td>이로써 선택 미션까지 1주차 미션을 마무리하였습니다. 갈 길이 멉니다... 6주차까지 아자아자~!!!</td>
<td></td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PHP] 실습]]></title>
            <link>https://velog.io/@_leehyeryeong/PHP-%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@_leehyeryeong/PHP-%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Thu, 21 Apr 2022 14:34:35 GMT</pubDate>
            <description><![CDATA[<h2 id="wamp">WAMP</h2>
<p>: Window, Apach, MySQL, PHP의 약자
→ WAMP를 통해 PHP를 사용하면 따로 하나하나 깔지 않아도 위에 네 가지 항목을 모두 사용할 수 있다.</p>
<blockquote>
<p>PHP는 서버 사이드 언어기 때문에 돌아가려면 웹 서버가 필요하다. 그렇기에 Apach가 필요하다.</p>
</blockquote>
<h3 id="웹-서버의-루트">웹 서버의 루트</h3>
<p>→ C:\Bitnami\wampstack-8.1.4-0\apache2\htdocs</p>
<h2 id="php">PHP</h2>
<ul>
<li><strong>대소문자를 구분</strong>한다.</li>
<li>변수 앞에 <strong>$</strong>를 붙여야 한다.</li>
<li>출력문은 <strong>echo</strong>를 사용한다.</li>
<li>if, while, for, array는 <strong>자바와 동일한 문법</strong>이다.</li>
<li>확장자는 <strong>php</strong>이다.</li>
<li>코드의 기본 구조는 아래와 같다.</li>
</ul>
<pre><code>&lt;?php ... ?&gt;</code></pre><ul>
<li>클라이언트에서 실행시: 탐색기에서 실행(주소창: C:\test\1.php)</li>
<li>서버에서 실행시: 서버에서 실행(주소창: <a href="http://localhost/1.php">http://localhost/1.php</a>)</li>
<li>설정을 바꾸고 싶다면 <strong>php.ini</strong>에서 바꿀 수 있다.</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>