<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>beyond_developer.log</title>
        <link>https://velog.io/</link>
        <description>개발자라는 틀에 얽매이지 않는 성장</description>
        <lastBuildDate>Thu, 17 Oct 2024 11:39:47 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>beyond_developer.log</title>
            <url>https://velog.velcdn.com/images/beyond-developer/profile/57df9aa5-e632-4e86-8e84-a48a640bbff8/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. beyond_developer.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/beyond-developer" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[괄호를 Tab으로 건너뛰고 싶을 때 - VScode Tabout 익스텐션]]></title>
            <link>https://velog.io/@beyond-developer/VScode-Tabout-%EC%9D%B5%EC%8A%A4%ED%85%90%EC%85%98-%EA%B4%84%ED%98%B8%EB%A5%BC-Tab%EC%9C%BC%EB%A1%9C-%EA%B1%B4%EB%84%88%EB%9B%B0%EA%B3%A0-%EC%8B%B6%EC%9D%84-%EB%95%8C</link>
            <guid>https://velog.io/@beyond-developer/VScode-Tabout-%EC%9D%B5%EC%8A%A4%ED%85%90%EC%85%98-%EA%B4%84%ED%98%B8%EB%A5%BC-Tab%EC%9C%BC%EB%A1%9C-%EA%B1%B4%EB%84%88%EB%9B%B0%EA%B3%A0-%EC%8B%B6%EC%9D%84-%EB%95%8C</guid>
            <pubDate>Thu, 17 Oct 2024 11:39:47 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/beyond-developer/post/dd9097e4-f125-4c02-aca4-40f553ed5b11/image.gif" alt=""></p>
<p>VScode는 <code>( { [</code> 등의 여는 브라켓이나 <code>&#39;  &quot;</code> 등의 따옴표를 입력하면 
친절하게 닫는 기호를 자동으로 입력해준다.</p>
<p>하지만 몇몇 IDE에서 제공하는 편의기능이 기본적으로 없는데,
바로 <strong>Tab 키로 괄호 밖으로 커서를 옮기는 것</strong>이다.</p>
<p>나는 Tab키로 괄호 밖으로 이동하는 데 익숙해져 위 영상과 같은 실수를 하며 살짝 짜증을 낸다.</p>
<p>타이핑에 바쁜 우리의 손가락을 방향키나 마우스에 쓰기는 안타깝다.</p>
<p>이 때 우리에게 유용한 확장프로그램이 있다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/e1754af4-a1a7-49c8-a596-d320d397399e/image.png" alt=""></p>
<p>VScode Extension해서 Install 하면 별 다른 설정 없이 적용되고,</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/5d943674-f911-4d0a-8135-0c2c4017edc5/image.gif" alt="">
일반적인 상황에서는 Tab키가 Tab 공백으로 작동하면서,
브라켓이나 따옴표 기호에 사용했을 때, 커서가 다음으로 이동하는 기능이 추가된다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/d5b9bb60-9111-42e8-a0a8-a816ed241ed0/image.gif" alt="">
기호 내부에 내용을 작성한 경우 통째로 건너뛰기가 되며,
기호에 맞닿아 있지 않은 공간에 커서를 두고 Tab키를 누르면 역시 일반적인 Tab 공백을 추가한다.!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데브코스 풀스택과정] 11-12월 회고]]></title>
            <link>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-11-12%EC%9B%94-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-11-12%EC%9B%94-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Sun, 31 Dec 2023 14:40:48 GMT</pubDate>
            <description><![CDATA[<p>풀스택 데브코스 과정에 참여한 지 벌써 2달차,
연말을 맞아 그간의 회고를 작성해보고자 한다.</p>
<p>지난 7주 동안 Git, HTML/CSS, Express, MariaDB의 문을 열어보았다.</p>
<p>온라인 강의와 실습으로 진행되는 데브코스의 과정을 짧게 돌아보며 개인적으로 느낀 소감들을 짚어보겠다.</p>
<h3 id="좋았던-점">좋았던 점</h3>
<ul>
<li><p>일정을 유연하게 조절할 수 있다.</p>
</li>
<li><blockquote>
<p>비실시간 온라인 위주의 강의를 수강하기 때문에, 특별한 일이 있는 경우 스케쥴을 유연하게 조율할 수 있다는 점이 좋았다.</p>
</blockquote>
</li>
<li><p>필요한 강의를 다시 볼 수 있다.</p>
</li>
<li><blockquote>
<p>벌써 7주동안 큰 테마들로의 입문을 경험했는데, 한 번 강의로 학습한 내용이 충분히 헷갈리기 마련인데, 이를 원할 때 다시 돌려볼 수 있도록 되어있기 때문에 좋았다.</p>
</blockquote>
</li>
<li><p>대면이 없는 온라인의 제한점을 보완할 수 있는 이벤트가 있다.</p>
</li>
<li><blockquote>
<p>일주일에 한 번 팀 복습발표 시간과 멘토링을 진행하여, 같이 학습하고 있다는 소속감을 불어넣고, 동료학습을 지향하는 문화를 만들고자 한다.</p>
</blockquote>
</li>
</ul>
<h3 id="아쉬운-점">아쉬운 점</h3>
<p>아쉬운 점은 사실 개인적인 문제이다.</p>
<ul>
<li><p>온라인 강의의 장점 때문에 나태해지는 상황</p>
</li>
<li><blockquote>
<p>12월에 많은 일들이 있었다는 핑계로 학습과 TIL 작성에 소홀했다.
강의를 언제든 돌려볼 수 있기 때문이라는 이유로 강의만 시청하고 이후 학습에 시간 투자가 많이 적어졌다.</p>
</blockquote>
</li>
<li><p>집에만 너무 있게 된다.</p>
</li>
<li><blockquote>
<p>지난 기간동안 업무/학습 공간과 생활공간을 분리하는 것이 나의 생활 패턴에 맞다는 생각이 들었다.
데스크탑을 두고 집에서 학습하니 생활 패턴을 지키기가 힘들고, 처음으로 집에서 일주일 내내 있는 생활을 해 보게 되었다.
나의 체질에는 이런 패턴이 건강하지 않다는 것을 알게 되었다.</p>
</blockquote>
</li>
</ul>
<h3 id="개선할-점">개선할 점</h3>
<ul>
<li><p>TIL 작성을 꾸준히 하자!</p>
</li>
<li><blockquote>
<p>처음부터 TIL작성을 매일 수행하다 어느 시점에서 끊어지게 되었는데, 1월부터 다시 TIL작성을 성실히 수행할 것이다.</p>
</blockquote>
</li>
<li><p>학습 공간을 분리하자!</p>
</li>
<li><blockquote>
<p>1월부터는 공유오피스를 끊어 매일 출근하며 학습공간과 생활공간을 분리하고, 조금 더 효율적인 학습시간 관리와 질을 찾기 위해서 노력할 것이다.</p>
</blockquote>
</li>
</ul>
<p>아직 많이 부족한 부분이 많은 것 같다. 신년 맞이와 함께 새롭게 시작해보자!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데브코스 TIL] 4주차 Day 3 / Express.js - 웹 풀 사이클 데브코스 TIL]]></title>
            <link>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-4%EC%A3%BC%EC%B0%A8-Day-3-Express.js-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</link>
            <guid>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-4%EC%A3%BC%EC%B0%A8-Day-3-Express.js-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</guid>
            <pubDate>Wed, 06 Dec 2023 14:32:16 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>Express 모듈 입문!</strong></p>
</blockquote>
<p>&#39;23.12.06(수) 웹 풀 사이클 데브코스 TIL</p>
<h2 id="express">Express</h2>
<ul>
<li><code>Express.js</code> 모듈은 <code>http</code> 모듈을 사용해 서버를 구성할 때 필요한 함수나 설정들을 미리 적용해 보다 간단하게 js로 서버를 만들고 관리할 수 있게 도움을 주는 모듈이다.</li>
</ul>
<pre><code class="language-javascript">const express = require(&#39;express&#39;)
const app = express()

app.get(&#39;/&#39;, function (req, res) {
  res.send(&#39;Hello World&#39;)
})

app.listen(3000)</code></pre>
<p><code>npm</code> document에 적혀있는 예제이다.</p>
<p><code>함수(경로, 콜백함수)</code> 의 구조로</p>
<p><code>app.get()</code>
<code>app.post()</code>
<code>app.put()</code>
<code>app.delete()</code></p>
<p>의 기본적인 CRUD 기능을 사용할 수 있다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/82ef4807-0388-4f0f-b6d1-6fd54f7b9357/image.png" alt=""></p>
<p><code>http</code> 모듈의 <code>write</code> 기능과 달리
<code>express</code>의 <code>res.send()</code> 는 argument의 타입을 자동으로 인식한다.</p>
<p><code>res.json()</code> 처럼 json으로 확정하여 전송할 수 있는 메서드도 있으나,
성능 자체에 큰 차이가 있는 것은 아니다.</p>
<p><code>res.send()</code>나 <code>res.json()</code> 모두 더 이상 응답이 없다면 자동으로 end 하기 때문에
<code>http</code>와 달리 end 메서드를 굳이 사용하지 않아도 된다.</p>
<h2 id="json">JSON</h2>
<p><strong>JSON</strong>(JavaScript Object Notation)</p>
<p>JSON은 JavaScript 객체 리터럴, 배열, 스칼라 데이터를 표현하는 텍스트 기반의 방식이다.</p>
<p>JSON을 이용해 웹에서 데이터를 교환할 때, 한 번의 전송으로 동일한 범주나 다양한 데이터를 모아서 전송할 수 있다.</p>
<pre><code class="language-javascript">let person = {
    name : “Jinwhan”,
    age : 25
}

let book = {
    name : “Node.js를 공부해보자.”,
    price : 20000,
      description : &quot;Node.js 학습으로 백엔드 개발자 되기&quot; 
}</code></pre>
<p>JS의 객체를 생성하는 방식으로 JSON 데이터를 만들 수 있다.
<strong><em>위 예시는 엄밀히 말하면 JS 객체다.</em></strong></p>
<h3 id="js-객체와-json의-차이점">JS 객체와 JSON의 차이점</h3>
<p>JS 객체는 JS 엔진 메모리 내에 있는 <strong>데이터 구조</strong> 이고,
JSON은 객체의 내용을 기술하기 위한 <strong>텍스트 파일</strong>이다.</p>
<pre><code class="language-JSON">// people.json
{
    name : “Jinwhan”,
    age : 25
},
{
  name : &quot;Gildong&quot;,
  age : 581
}</code></pre>
<p>위처럼 json 데이터는 <code>.json</code>이라는 json 확장자의 텍스트 파일로 저장할 수 있고,
이를 불러와 데이터 연산에 사용할 수 있다.</p>
<p>데이터를 저장하는 구조는 JS 객체와 동일하지만 JS 프로그래밍의 데이터 타입이 아닌 별도의 데이터 묶음 정도로 생각할 수 있다.</p>
<h2 id="회고">회고</h2>
<p>지난 시간에 이어 <code>http</code>와 <code>express</code>로 백엔드 개발의 입문을 학습했다.
앞으로 <code>express</code>를 더 학습하며 개발에 사용하게 되겠지만,</p>
<p>더 높은 수준의 모듈을 사용해 개발하는 만큼 근본적인 원리에 대해 학습하는 과정이 꼭 필요할 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데브코스 TIL] 4주차 Day 2 / Node.js와 NPM - 웹 풀 사이클 데브코스 TIL]]></title>
            <link>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-4%EC%A3%BC%EC%B0%A8-Day-2-Node.js%EC%99%80-NPM-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</link>
            <guid>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-4%EC%A3%BC%EC%B0%A8-Day-2-Node.js%EC%99%80-NPM-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</guid>
            <pubDate>Tue, 05 Dec 2023 07:35:20 GMT</pubDate>
            <description><![CDATA[<p>&#39;23.12.05(화) 웹 풀 사이클 데브코스 TIL</p>
<h2 id="nodejs의-특징">Node.js의 특징</h2>
<p>Node.js는 확장성 있는 네트워크 애플리케이션(특히 서버 사이드) 개발에 사용되는 소프트웨어 플랫폼이다. 작성 언어로 자바스크립트를 활용하며 논블로킹(Non-blocking) I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있다. <small>- 위키백과</small></p>
<p>JS는 기존에 웹 브라우저에 의존하여 사용할 수 있는 웹을 위한 스크립트 언어였으나, 
Node.js 라는 플랫폼이 등장하면서 웹 브라우저 외 환경에서 JS를 실행할 수 있게 되었고, 독립적인 프로그래밍 언어의 입지를 가지게 되었다.</p>
<p>Node.js의 특징은 크게 3가지가 있다.</p>
<ul>
<li>싱글스레드</li>
<li><blockquote>
<p>CPU의 코어 당 하나의 순차적인 흐름으로 Task를 수행</p>
</blockquote>
</li>
</ul>
<ol>
<li>음식점에 한 명의 요리사가 일을 함</li>
<li>주문이 들어오면 음식을 만들고, 다른 주문은 앞 주문이 끝날 때까지 대기</li>
<li>앞 주문이 끝나면 다음 주문을 처리하고 주문이 없으면 쉼</li>
</ol>
<p>-&gt; 한 명이 순차적으로만 작업을 처리한다면 비효율적일 것
-&gt; 논블로킹 I/O 방식으로 보완</p>
<ul>
<li><p>논블로킹I/O</p>
</li>
<li><blockquote>
<p>I/O를 시작하자마자 함수를 리턴해 I/O작업 실행의 성공여부를 확인하고 다음 Task를 수행</p>
</blockquote>
</li>
<li><blockquote>
<p>라면과 볶음밥 주문이 들어왔을 때 라면 물을 끓이는 동안 밥을 볶아냄</p>
</blockquote>
</li>
<li><blockquote>
<p>앞 주문이 끝나는 것을 기다리지 않고 다음 작업을 실행해 비효율성을 극복</p>
</blockquote>
</li>
<li><p>이벤트 기반</p>
</li>
<li><blockquote>
<p>특정 이벤트가 발생할 때 지정해 둔 콜백 함수를 실행</p>
</blockquote>
</li>
<li><blockquote>
<p>볶음밥 주문이 들어오면 준비해둔 재료로 레시피에 맞게 조리</p>
</blockquote>
</li>
</ul>
<h2 id="npm">NPM</h2>
<h3 id="라이브러리-vs-프레임워크">라이브러리 vs 프레임워크</h3>
<p>라이브러리는 특정 기능 수행을 위해 만들어진 모듈을 말하며,
사용자가 직접 원하는 기능을 찾아 사용할 수 있다.</p>
<p>프레임워크는 개발자들이 소프트웨어를 개발하는 데 사용되는 구조를 제공한다.
특정 목적을 위해 여러 컴포넌트와 라이브러리를 제공하는 구조를 의미한다.</p>
<p>React.js 는 반응형 웹 FE 개발을 목적으로 개발을 위해 다양한 라이브러리와 환경을 제공하는 &quot;구조&quot;이고, React 내에 Router 기능을 위한 라이브러리를 사용할 수 있다.</p>
<p>라이브러리는 여러 개발자가 공유해 사용할 수 있는 코드 모음이고,
프레임워크는 개발환경을 만들기 위한 라이브러리들과 규칙들을 통해 만들어진 구조이다.</p>
<h3 id="npm-1">NPM</h3>
<p><strong>NPM(Node Package Manager)</strong></p>
<p>JS 라이브러리를 포함한 패키지들을 관리하는 도구이다.
<a href="https://www.npmjs.com/">https://www.npmjs.com/</a></p>
<p>NPM 웹 사이트에서 라이브러리들을 찾아볼 수 있으며,
npm 명령어로 node 환경에서 라이브러리들을 프로젝트에 바로 적용할 수 있다.</p>
<h2 id="회고">회고</h2>
<p>라이브러리, 모듈, 패키지, 프레임워크 등
비슷하지만 아리송했던 단어들의 의미관계를 알 수 있는 시간이었다.</p>
<p>NPM에 간단한 것부터 복잡한 다양한 라이브러리들이 있는데,
개발 커리어를 쌓으면서 직접 나만의 NPM 라이브러리를 만들어 공유해보고 싶다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데브코스 TIL] Day 12 / REST API - 웹 풀 사이클 데브코스 TIL]]></title>
            <link>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-12-REST-API-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</link>
            <guid>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-12-REST-API-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</guid>
            <pubDate>Sun, 03 Dec 2023 19:59:18 GMT</pubDate>
            <description><![CDATA[<p>&#39;23.12.04(월) 웹 풀 사이클 데브코스 TIL</p>
<blockquote>
<h3 id="rest-api는-무엇인가">REST API는 무엇인가?</h3>
</blockquote>
<h2 id="api">API</h2>
<p><strong>API(Application Programming Interface)</strong></p>
<p>응용 프로그램 프로그래밍 인터페이스</p>
<p>응용프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다. 주로 파일 제어, 창 제어, 화상 처리, 문자 제어 등을 위한 인터페이스를 제공한다. <small>- 위키백과</small></p>
<p><strong>Interface</strong> 
그럼 인터페이스란 무엇인가?</p>
<p>서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면이다. 즉, 사용자가 기기를 쉽게 동작시키는데 도움을 주는 시스템을 의미한다. <small>- 위키백과</small></p>
<p>Inter - &quot;사이의&quot;, &quot;상호 간의&quot;
face - &quot;마주하다&quot;, &quot;소통하다&quot;</p>
<p>웹 개발의 면에서 생각하면 </p>
<p>사용자와 프로그램, 두 가지 장치, 브라우저와 서버 등</p>
<p>데이터 연산을 요청하는 정보 요청 주체와 정보 전달 주체를 연결하는 매개체 역할을 의미한다.</p>
<p>위를 참고하면</p>
<p>API는 &quot;응용프로그램에서 다양한 기능을 이용할 수 있게 해주는 매개체&quot; 정도로 생각해 볼 수 있다.</p>
<p>일례로, 지하철 노선도 앱 개발자는, API를 통해 교통공사의 DB에 접근해 정보를 요청해 전달받아 화면에 보여준다.</p>
<h2 id="rest-api">REST API</h2>
<p>지난 학습에서 HTTP에 대해 간단하게 배웠다.</p>
<p>HTTP는 웹 상에서 원활한 통신을 위해 정한 메시지의 규약으로</p>
<p>웹에서 사용할 수 있는 API는 HTTP를 따라 보내도록 발전하였고,</p>
<p>HTTP의 조건을 잘 따르는 <strong>REST API</strong> 라는 개념이 탄생했다.</p>
<p><strong>REST(REpresentational State Transfer) API</strong></p>
<p>REST라는 아키텍쳐를 사용하여 설계한 API 라는 뜻으로,</p>
<p>HTTP의 규약을 잘 따르는 것이 이에 해당한다고 볼 수 있다.</p>
<p>HTTP 프로토콜 템플릿 중 Body에 연산을 요청하려는 데이터와 목적을 담는다.</p>
<h3 id="rest-api-url-규칙">&lt;REST API URL 규칙&gt;</h3>
<ul>
<li><p>대문자 X, 소문자 O</p>
</li>
<li><p>언더바(_) X, 하이픈(-) O</p>
</li>
<li><p>마지막에 “/” 포함 X</p>
</li>
<li><p>✨ 행위 포함 X = 목적을 포함하지 않는다.
→ POST, GET 등의 목적은 이미 API에 정의되어있으므로 표기에포함하지 않는다.</p>
</li>
<li><p>파일 확장자 포함 X</p>
</li>
<li><p><strong>복수형을 쓴다.</strong></p>
</li>
</ul>
<h3 id="http-method">HTTP Method</h3>
<p>URL주소를 통해 요청을 전송하려는 위치와 요청 내용을 담는다.</p>
<ol>
<li><strong>상품 전체 조회</strong></li>
</ol>
<p>“GET” + products</p>
<p><code>http://localhost:8888/products</code></p>
<ol start="2">
<li><strong>상품 개별 조회</strong></li>
</ol>
<p>“GET” + product</p>
<p><code>http://localhost:8888/products/[상품id]</code></p>
<ol start="3">
<li><strong>상품 개별 수정</strong></li>
</ol>
<p>“PUT” + product</p>
<p><code>http://localhost:8888/products/[상품id]</code></p>
<p><strong>복수형 표현을 사용하는 이유</strong>
<code>product/[상품id]</code>
개별 상품이기 때문에 product라는 단수를 사용할 수도 있지만,</p>
<p><code>products</code>라는 복수형 표현을 사용하여</p>
<p><code>products</code>라는 단어는 &quot;상품&quot;에 대한 모든 요청을 담당한다는 통일성을 부여할 수 있다.</p>
<h2 id="회고">회고</h2>
<p>REST, RESTful, API 등 이리저리 들어본 단어들의 머리 속의 모호한 정의들을 바로잡을 수 있는 시간이었다.</p>
<p>REST API에 대해 간단하게 이해할 수 있는 좋은 시간이었고, 얼른 직접 API를 만들면서 사용해보고 싶다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데브코스 TIL] Day 11 / 개발자 취업을 준비하는 자세 - 웹 풀 사이클 데브코스 TIL]]></title>
            <link>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-11-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%B7%A8%EC%97%85%EC%9D%84-%EC%A4%80%EB%B9%84%ED%95%98%EB%8A%94-%EC%9E%90%EC%84%B8-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</link>
            <guid>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-11-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%B7%A8%EC%97%85%EC%9D%84-%EC%A4%80%EB%B9%84%ED%95%98%EB%8A%94-%EC%9E%90%EC%84%B8-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</guid>
            <pubDate>Tue, 28 Nov 2023 14:59:23 GMT</pubDate>
            <description><![CDATA[<p>&#39;23.11.28(화) 웹 풀 사이클 데브코스 TIL</p>
<blockquote>
<h3 id="우리는-개발자-취업을-위해-무엇을-준비해야-하는가">우리는 개발자 취업을 위해 무엇을 준비해야 하는가?</h3>
</blockquote>
<p>오늘부터는 TIL을 작성하는 방법을 바꾸려고 한다.</p>
<p>기존에는 그 날 배운 내용을 가능한 <strong>예쁘고 많이 담는 것에 집중</strong>했는데, <strong>김송아 강사님</strong>의 조언에 따라</p>
<p>오늘부턴 배운 내용에 대한 요약(다시 본다면 기억이 날 만한 메모장 역할)과 학습 과정에 대한 <strong>회고</strong>를 쓰는 쪽으로 시도해 볼 것이다.</p>
<h2 id="개발자-취업을-위한-팁">개발자 취업을 위한 팁</h2>
<h3 id="1-블로그-작성">1. 블로그 작성</h3>
<ul>
<li><p>플랫폼은 자유. 다만 날짜가 로그로 남겨지는 곳에서 <strong>&quot;꾸준히&quot;</strong> 작성하기</p>
</li>
<li><p>개발과정에서 겪은 <strong>오류 경험을 공유하고, 어떻게 해결</strong>했는지 작성(Best) 👍🏻</p>
</li>
<li><p>TIL : 학습 내용에 대한 짧은 정리와 함께 <strong>잘한 점, 아쉬운 점, 개선점</strong>을 회고하기</p>
</li>
<li><p>공부한 내용을 내가 설명할 수 있는 방식으로 표현하기 </p>
</li>
<li><blockquote>
<p>결국 면접에서 대답할 수 있으려면 <strong>나의 언어로 이해</strong>할 수 있어야 한다.</p>
</blockquote>
</li>
</ul>
<p>개발에 대한 지속적인 열정을 보여주고, 다른 사람과 공유하는 자세를 보여주는 대목</p>
<hr>
<h3 id="2-프로젝트-정리포트폴리오">2. 프로젝트 정리(포트폴리오)</h3>
<ul>
<li><p>포트폴리오는 PDF와 같은 문서로 정리할 수 있는 형식이 좋다.</p>
</li>
<li><blockquote>
<p>인쇄할 경우 링크를 찾아봐야 하는 번거로움</p>
</blockquote>
</li>
<li><p>사용된 기술과 구현한 내용이 한 눈에 들어오게 표현한다.</p>
</li>
<li><blockquote>
<p><strong>GenSong</strong> (X) / <strong>Node.js</strong> 기반의 <strong>웹 작곡</strong> 플랫폼 (O) </p>
</blockquote>
</li>
<li><p>각 프로젝트가 끝날 때 그 프로젝트에서의 자신의 역할과 장점을 정리</p>
</li>
<li><blockquote>
<p>자기소개는 프로젝트 경험을 근거로 진행되면 좋음</p>
</blockquote>
</li>
<li><blockquote>
<p>ex) <strong>꼼꼼한 성격이 장점!</strong> =&gt; 예외 테스트 경험 제시</p>
</blockquote>
</li>
</ul>
<p><strong>문서로 만든 포트폴리오의 한 예시</strong> 
<img src="https://velog.velcdn.com/images/beyond-developer/post/aea92e24-4495-45cc-9190-310e06f72c76/image.png" alt=""></p>
<ul>
<li><p>한 페이지 당 하나의 프로젝트를 제시</p>
</li>
<li><blockquote>
<p>왼쪽엔 내가 작성한 <strong>한 눈에 기능이 이해되는 코드</strong> 제시</p>
</blockquote>
</li>
<li><blockquote>
<p>오른쪽엔 해당 프로젝트에서 왼쪽 코드의 설명과 함께 프로젝트 소개</p>
</blockquote>
</li>
<li><blockquote>
<p>포트폴리오는 한 페이지에 내용을 담아내는 것이 중요함.</p>
</blockquote>
</li>
<li><p>화려한 디자인(기능)의 프로젝트 vs 기본에 충실한 프로젝트</p>
</li>
<li><blockquote>
<p>어떤 쪽이 됐건 내가 <strong>구현한 내용의 원리를 정확하게 이해</strong>하고 있어야 함.</p>
</blockquote>
</li>
<li><blockquote>
<p>많은 라이브러리를 사용한 프로젝트일 수록 특히 주의</p>
</blockquote>
</li>
</ul>
<hr>
<h3 id="3-이력서-vs-포트폴리오-vs-프로젝트-기술서-vs-자기소개서">3. 이력서 vs 포트폴리오 vs 프로젝트 기술서 vs 자기소개서</h3>
<p><strong>- 이력서</strong>
<img src="https://velog.velcdn.com/images/beyond-developer/post/63adfe72-7c8d-4e9b-84ae-833a0b203e81/image.png" alt="">
영미권에서 주로 사용되는 Resume Template을 참고하여 <strong>간결하게 한 페이지</strong>로 작성한다.
자기소개, 프로젝트 구현 내용, 경력/학력을 보통 작성하며, <strong>프로젝트 경험 위주</strong>로 작성한다.</p>
<p><strong>- 포트폴리오</strong>
이미지, 설계서, 소스코드 등 프로젝트를 전반적으로 소개할 수 있는 공간</p>
<p><strong>- 프로젝트 기술서</strong>
프로젝트 하나 당 <strong>워드 반 페이지 분량, 서술형</strong>으로 작성</p>
<p>프로젝트 진행 과정 중 겪었던 이슈와 해결 방법, 어려웠던 점, 좋았던 점, 개선점 등 작성</p>
<p><strong>- 자기소개서</strong>
자신의 장점과 단점을 프로젝트 경험을 기반으로 준비</p>
<p>단점의 경우 어떻게 보완하기 위해 노력했는지까지 생각하기</p>
<p>최소 2개 이상을 준비하여 깊은 꼬리질문을 방지하기</p>
<hr>
<h2 id="회고">회고</h2>
<p>오늘은 <strong>김송아 강사님</strong>과 함께 라이브 세션에서 스프린트에 대한 피드백과, 개발자의 포트폴리오 준비에 대한 팁을 얻을 수 있었다.</p>
<p>최근 며칠 간 온라인 학습 시간보다 TIL 작성에 시간을 더 많이 들이게 됐는데,
그 내용이 기술에 대한 <strong>얕은 수준의 나열</strong> 정도여서 내가 <strong>맞게 작성하는지에 대한 의문</strong>을 가졌다.</p>
<p>오늘 좋은 기회에 질문을 드리면서 올바른 방향을 찾을 수 있었고,</p>
<p>앞으로 진행할 프로젝트와 함께 어떻게 블로그를 작성할 지, 포트폴리오를 준비할 지 머리속에 윤곽이 그려진 것 같다.</p>
<p>오늘도 멋진 풀스택 개발자가 되기 위한 큰 한 걸음을 딛었다. ✨</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데브코스 TIL] Day 10 - 스프린트 1 / 포트폴리오 페이지 구현 - 웹 풀 사이클 데브코스 TIL]]></title>
            <link>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-10-%EC%8A%A4%ED%94%84%EB%A6%B0%ED%8A%B8-1-%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4-%ED%8E%98%EC%9D%B4%EC%A7%80-%EA%B5%AC%ED%98%84-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</link>
            <guid>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-10-%EC%8A%A4%ED%94%84%EB%A6%B0%ED%8A%B8-1-%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4-%ED%8E%98%EC%9D%B4%EC%A7%80-%EA%B5%AC%ED%98%84-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</guid>
            <pubDate>Mon, 27 Nov 2023 12:52:35 GMT</pubDate>
            <description><![CDATA[<p>&#39;23.11.27(월) 웹 풀 사이클 데브코스 TIL</p>
<blockquote>
<h3 id="포트폴리오-웹-페이지-구현">포트폴리오 웹 페이지 구현</h3>
</blockquote>
<p>오늘은 그간 배운내용 중 HTML/CSS 만을 사용하여 간단한 포트폴리오 웹 페이지를 만드는 시간을 가졌습니다.</p>
<p>저는 개인적으로 좋아하는 기타리스트 <strong>Mateus Asato</strong>의 간단한 프로필과 유튜브 영상을 DP해봤습니다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/795a3291-cc32-4e43-9e95-5ad7f5e35b7b/image.png" alt=""></p>
<h3 id="구현-내용">구현 내용</h3>
<ul>
<li>메인 프로필과 컨텐츠 파트 분리</li>
<li><code>&lt;iframe&gt;</code>을 통한 유튜브 영상 <code>import</code></li>
<li>SNS 링크 아이콘 배치</li>
<li>Github Pages 배포</li>
</ul>
<p>데모 페이지
<a href="https://sodlfmag.github.io/">https://sodlfmag.github.io/</a></p>
<p>깃허브 repo
<a href="https://github.com/sodlfmag/sodlfmag.github.io">https://github.com/sodlfmag/sodlfmag.github.io</a></p>
<h3 id="스타일">스타일</h3>
<ul>
<li>배경 그라데이션</li>
<li>프로필 사진 <code>border-radius</code> 적용</li>
<li>프로필 사진 <code>drop-shadow</code> 적용</li>
<li>폰트 변경</li>
<li>요소 정렬</li>
<li>여백 설정</li>
</ul>
<p><code>index.html</code>과 <code>style.css</code> 두 파일로 나눠서 Github Pages 로 배포해 봤습니다.</p>
<p>다음에 다른 프로젝트를 진행한다면</p>
<p><code>&lt;div&gt;</code>의 중첩을 많이 사용하는 것보다 좀 더 간결하게 작성하고
<code>grid</code> 템플릿을 사용해 스타일을 효율적으로 적용해 보면 좋을 것 같습니다.</p>
<pre><code class="language-html">
&lt;!-- index.html --&gt;

&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;UTF-8&quot;&gt;
        &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
        &lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&gt;
        &lt;link rel=&quot;icon&quot; type=&quot;image/png&quot; sizes=&quot;16x16&quot; href=&quot;./img/favicon-16x16.png&quot;&gt;
        &lt;title&gt;Mateus Asato&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;div class=&quot;bodyContainer&quot;&gt; 
            &lt;p class=&quot;mainName&quot;&gt;Mateus Asato&lt;/p&gt;
            &lt;div class=&quot;mainContainer&quot;&gt;
                &lt;img class=&quot;mainImg&quot; src=&quot;./img/Mateus Asato.webp&quot;&gt;
                &lt;div&gt;
                    &lt;p class=&quot;mainBio&quot;&gt; Mateus Asato is a Brazilian guitar player who has been considered to the media one of the &quot;most influential guitar players&quot; of this modern era. &lt;br&gt;&lt;br&gt;His name is included on &lt;br&gt;&lt;br&gt; Guitar World Magazine’s list of &lt;br&gt;the TOP 10 Guitarists of the Decade (2020), &lt;br&gt; #3 TOP Guitarist Right Now (via Total Guitar 2020), &lt;br&gt;&lt;br&gt;and his latest appearance was on Guitar World Magazine in 2022, being on number #14 of the list of ‘Hottest Guitar Players In The World’.&lt;/p&gt;
                    &lt;div class=&quot;socialLinks&quot;&gt;
                        &lt;a href=&quot;https://www.youtube.com/@Mautaus&quot;&gt;
                            &lt;img class=&quot;socialLink&quot; src=&quot;./img/youtube.png&quot;&gt;
                        &lt;/a&gt;
                        &lt;a href=&quot;https://www.instagram.com/mateusasato/&quot;&gt;
                            &lt;img class=&quot;socialLink&quot; src=&quot;./img/instagram.png&quot;&gt;
                        &lt;/a&gt;
                    &lt;/div&gt;
                &lt;/div&gt;    
            &lt;/div&gt;
            &lt;hr&gt;

            &lt;div class=&quot;videoContainer&quot;&gt;
                &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/OLpSZmDiE1Y?si=Ayqql6ynjH926neq&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;
                &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/pTt04A_Gph4?si=qSgrj1A91zIiDJv1&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;
                &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/MBgAkbgTxJg?si=QWB4OAt-GC7GAQjd&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;
            &lt;/div&gt;

        &lt;/div&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre>
<pre><code class="language-css">/* sytle.css */

@import url(&#39;https://fonts.googleapis.com/css2?family=Questrial&amp;display=swap&#39;);

body{
    background-image : linear-gradient(to bottom, rgb(235, 235, 235) 20%, white 80%);
}
.mainName{
    font-family: &#39;Questrial&#39;, sans-serif;
    font-size: 50px;
}
.bodyContainer{
    padding-left: 15vw;
    padding-right: 15vw;
}

.mainImg{
    margin-left: 3vw;
    width: 400px;
    filter: drop-shadow(10px 6px 6px #c3c3c3);
    border-radius:15px;
}

.mainContainer{
    position : relative;
    display: flex;
}
.mainBio{
    margin-left: 10vw;
    font-family: &#39;Questrial&#39;, sans-serif;
    font-size:20px;
}

hr{
    margin-top: 40px;
    border: solid 1.5px rgb(215, 215, 215);

}
.socialLinks{
    display: flex;
    right: 10vw;
    position: absolute;
    bottom: 0;
    right: 20px;
}
.socialLink{
    width: 40px;
    margin-right: 20px;
}

iframe{
    margin-top: 30px;
}
.videoContainer{
    display: flex;
    flex-direction:column;
    align-items: center;

}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데브코스 TIL] Day 9 - 데이터베이스 - 웹 풀 사이클 데브코스 TIL]]></title>
            <link>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-9-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</link>
            <guid>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-9-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</guid>
            <pubDate>Fri, 24 Nov 2023 10:14:49 GMT</pubDate>
            <description><![CDATA[<p>&#39;23.11.24(금) 웹 풀 사이클 데브코스 TIL</p>
<blockquote>
<h3 id="mariadb와-데이터베이스-기초학습">MariaDB와 데이터베이스 기초학습</h3>
</blockquote>
<h2 id="데이터베이스">데이터베이스</h2>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/aed39367-7cf3-4aa7-b679-47c278592a5c/image.png" alt=""></p>
<p><strong>데이터베이스</strong>의 정의는</p>
<p>데이터를 통합하여 효율적으로 관리하기 위한 데이터 집합체이다.
데이터를 구조화하여 관리함으로써 데이터 중복을 막고, 빠른 데이터 연산을 가능하게 한다.</p>
<p>데이터를 구조적으로 저장해 조회,삽입,수정,삭제 등의 연산을 용이하게 하고 
이를 <strong>별도의 플랫폼</strong>에서 관리하여 여러 서비스와 연결해 사용할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/90bb7dba-1e1f-4755-8e37-e7f643590576/image.png" alt="">
데이터베이스를 운영하고 관리하기 위해서 DBMS(DataBase Management System)의 개념을 이해할 필요가 있다.</p>
<p>DBMS 데이터베이스를 관리하고 운영하는 소프트웨어이다.
다양한 데이터가 저장되어있는 데이터베이스 여러 명의 사용자나 응용 프로그램과 공유하고 동시에 접근이 가능하게 한다.</p>
<p>대표적으로 <strong>Oracle, MySQL, MariaDB</strong> 등의 제품이 있으며, 이들은 모두 <strong>SQL</strong> 이라는 언어를 통해 이용할 수 있다.</p>
<h2 id="sql">SQL</h2>
<p><strong>SQL(Structured Query Language)</strong>은 뜻 그대로 하면 &#39;구조화된 질의어&#39;이다.
DB는 데이터를 구조화하여 저장하므로, 이 데이터의 생성, 조회, 수정 삭제 등의 연산을 요청하기 위해 구조화된 요청을 보내는 역할을 한다.</p>
<p>앞서 언급한 대표적인 DBMS들이 <strong>SQL</strong>이라는 언어를 통해 연산을 처리하지만, 각각의 제품에 따라 세부적인 용법의 차이가 존재한다. 하지만 대표적인 연산을 수행하는 방식은 동일하다.</p>
<ul>
<li>데이터 삽입 : INSERT</li>
<li>데이터 조회 : SELECT</li>
<li>데이터 수정 : UPDATE</li>
<li>데이터 삭제 : DELETE</li>
</ul>
<p>위 질의어는 모두 동일하고, 구조나 용법에 있어 매치되는 개념이 많기 때문에, 한 제품의 질의어를 학습하면, 다른 제품의 것을 학습하는 데 어려움이 크지 않다고 한다.</p>
<p>우리는 <strong>MariaDB</strong> 라는 DBMS를 사용해 기초적인 연산을 수행해 볼 것이다.</p>
<p>필자는 Docker Container 환경으로 MariaDB를 설치해 사용했다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/d36305a6-bfd7-4614-b119-9e169b23d930/image.png" alt=""></p>
<p>DB는 기본적으로 데이터를 <strong>Table</strong> 형식으로 저장한다.</p>
<p>각 Column은 저장하려는 정보의 속성(분류)
각 Row 은 개별 데이터(레코드) 를 의미한다.</p>
<p><code>SHOW DATABASES;</code> - 현재 저장된 모든 DB를 보여준다.
<code>CREATE DATABASE [DB이름];</code> - DB 공간을 생성한다.
<code>USE [DB이름];</code> - 작업공간을 해당 DB로 이동한다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/271c3341-64d4-44d8-becc-968a211b7039/image.png" alt=""></p>
<h3 id="테이블-생성">테이블 생성</h3>
<p>처음 터미널에서 MariaDB 실행환경에 들어가면 커서가 (none)으로 아무 DB도 가리키지 않고 있는 상태이다.</p>
<p><code>CREATE DATABASE Tennis;</code> 
<code>USE Tennis</code></p>
<p>두 명령어를 사용해 <code>Tennis</code>라는 DB 공간을 만들어 작업공간을 이동해보자.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/40ce2d0a-cc7d-4528-b30a-a76f673f6b7d/image.png" alt=""></p>
<p>터미널의 커서가 <code>Tennis</code>를 가리키고 있다.</p>
<p>이제 이 예시와 같은 테이블을 만들어 보겠다.</p>
<pre><code>CREATE TABLE member
(
    id INT,
    name VARCHAR(30),
    pwd VARCHAR(30),
);</code></pre><p>위 명령어로 <code>member</code>라는 테이블을 만들어,
정수 타입의 <code>id</code>,
문자열 타입의 <code>name</code>, <code>pwd</code> 속성을 만들었다.</p>
<h3 id="데이터-삽입">데이터 삽입</h3>
<p><code>INSERT INTO [테이블명] VALUES ([각 속성에 대한 값들])</code>; - 테이블에 데이터 한 행을 추가한다.</p>
<pre><code>INSERT INTO member VALUES
(
    &#39;gameMaker&#39;,
    &#39;Gildong Hong&#39;,
    &#39;newPass3@&#39;
);</code></pre><p>위 방식으로 내부 요소만 바꾸어 세 개의 데이터를 입력해보자.</p>
<h3 id="데이터-조회">데이터 조회</h3>
<p><code>SELECT [컬럼명] FROM [테이블명];</code> 테이블 내 저장된 정보 중 지정된 컬럼의 정보를 나열한다.</p>
<p><code>SELECT id, name, pwd FROM member;</code></p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/90348a0d-5a74-4415-8883-9f90616cd04f/image.png" alt=""></p>
<p>위에서 삽입한 데이터를 확인해보면 의도한 결과대로 출력된다.</p>
<h3 id="데이터-수정">데이터 수정</h3>
<p><code>UPDATE [테이블명] SET [컬럼명] = [수정할 값] WHERE 조건;</code></p>
<p><code>UPDATE member SET pwd = &#39;ThisisPassword!@#&#39; WHERE id = &#39;sodlfmag&#39;;</code>
<img src="https://velog.velcdn.com/images/beyond-developer/post/01c7f339-f45a-4576-9070-4a21ae73e31e/image.png" alt=""></p>
<p>sodlfmag의 패스워드가 정상적으로 수정된 것을 확인할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데브코스 TIL] Day 8 - Node.js로 만드는 웹 서버 - 웹 풀 사이클 데브코스 TIL]]></title>
            <link>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-8-Node.js%EB%A1%9C-%EB%A7%8C%EB%93%9C%EB%8A%94-%EC%9B%B9-%EC%84%9C%EB%B2%84-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</link>
            <guid>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-8-Node.js%EB%A1%9C-%EB%A7%8C%EB%93%9C%EB%8A%94-%EC%9B%B9-%EC%84%9C%EB%B2%84-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</guid>
            <pubDate>Thu, 23 Nov 2023 23:31:58 GMT</pubDate>
            <description><![CDATA[<p>&#39;23.11.23(목) 웹 풀 사이클 데브코스 TIL</p>
<blockquote>
<h3 id="nodejs로-백엔드-서버-구축하기">Node.js로 백엔드 서버 구축하기</h3>
</blockquote>
<h2 id="백엔드의-구조">백엔드의 구조</h2>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/cbb7c39b-c2f0-43b0-90da-fb7690947632/image.png" alt=""></p>
<p>백엔드(Backend)는 지난 TIL에서 소개한 것처럼 프론트엔드(Frontend)의 반대 개념으로
사용자에게 보이지 않는 서버측(Server-side) 개발 분야를 의미한다.</p>
<p>백엔드는 크게 웹서버, 웹 어플리케이션 서버, 데이터 베이스로 구성되고 Client 컴퓨터와 함께 통신하는 관계로 이루어진다.</p>
<ul>
<li><p><strong>웹 서버(Web Server)</strong>
웹 서버는 화면 내 내용이나 데이터의 변동이 없는 <strong>정적 페이지</strong>에 대응하는 역할을 한다.</p>
</li>
<li><p><strong>웹 어플리케이션 서버(WAS)</strong>
웹 어플리케이션 서버는 데이터 처리/연산을 통해 화면의 내용이나 데이터가 변하는 <strong>동적 페이지</strong>를 처리한다.</p>
</li>
<li><p><strong>데이터베이스(DB)</strong>
데이터베이스는 웹에서 사용될 데이터의 저장공간으로, 내일 학습에서 자세하게 다룰 예정이다.</p>
</li>
</ul>
<h3 id="web-server와-was를-왜-분리하는가">Web Server와 WAS를 왜 분리하는가?</h3>
<p>Web Server와 WAS를 하나로 합쳐서 정적인 페이지를 보여줌과 동시에 동적인 처리를 수행하면 안되는가?
-&gt; 가능하다.</p>
<p>그럼 왜 개념적으로 이를 분리할까?</p>
<ul>
<li><p><strong>기능 분리를 통해 서버의 부하를 줄인다.</strong></p>
</li>
<li><blockquote>
<p>다양한 요청을 처리하기 위해 WAS에는 이미 부하가 큰 상태이기 때문에, Web Server를 분리해 빠르게 정적인 콘텐츠를 제공할 수 있도록 한다.</p>
</blockquote>
</li>
<li><p><strong>물리적으로 분리하여 보안을 강화한다.</strong></p>
</li>
<li><p><strong>여러 대의 WAS를 연결해 로드 밸런싱을 이용할 수 있다.</strong></p>
</li>
<li><blockquote>
<p>오류가 발생하거나 큰 트래픽으로 인한 중단을 방지할 수 있다.</p>
</blockquote>
</li>
<li><p><strong>여러 언어의 웹 어플리케이션 서비스가 가능하다.</strong></p>
</li>
<li><blockquote>
<p>하나의 서버에서 다양한 웹 어플리케이션의 활용이 가능해진다.</p>
</blockquote>
</li>
</ul>
<h2 id="nodejs">Node.js</h2>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/45cda714-1eb5-4200-81d0-803238faa527/image.png" alt=""></p>
<p>Node.js는 자바스크립트를 스크립트 언어를 넘어 프로그래밍이 가능하도록 지원하는 플랫폼이다.</p>
<p>Node.js로 <strong>Web Server와 WAS의 역할</strong>을 구현할 수 있고, 만든 WAS를 통해 DB와 통신하는 것도 가능하다.</p>
<p>즉, Node.js를 이용해 <strong>자바스크립트로 백엔드를 구현</strong>할 수 있다!</p>
<p>이제 *<em>Node.js *</em>를 통해 백엔드의 기본적인 구조와 동작을 실습해 보자.</p>
<p>Node.js 에서 사용되는 함수와 개념을 직접 코드를 통해 학습해 보겠다.</p>
<h3 id="웹-서버-만들기">웹 서버 만들기</h3>
<pre><code class="language-javascript">//server.js
let http = require(&#39;http&#39;);

function onRequest(request, response){
    response.writeHead(200, {&#39;Content-Type&#39; : &#39;text/html&#39;});
    response.write(&#39;Hello Node.js&#39;)
    response.end();
}
http.createServer(onRequest).listen(8888);
</code></pre>
<ul>
<li><p><code>require()</code> - 모듈을 불러오는 함수</p>
</li>
<li><p><code>request</code> - 클라이언트가 서버에게 전달하려는 정보나 메시지를 담는 객체</p>
</li>
<li><p><code>response</code> - 서버에서 클라이언트로 응답 메시지를 전송 시켜주는 객체</p>
</li>
<li><p><code>writeHead()</code> - http response의 header를 설정하기 위한 http 모듈의 함수</p>
</li>
<li><p><code>response.write()</code> - 서버가 브라우저에 response 객체를 전송하는 함수</p>
</li>
<li><p><code>response.end()</code> - 응답을 종료하는 함수</p>
</li>
<li><p><code>http.createServer()</code> - 서버 인스턴스를 생성하는 함수</p>
</li>
<li><p><code>listen()</code> - 서버 생성 후 접속 포트를 할당하는 함수</p>
</li>
</ul>
<p>위 코드를 해석하면</p>
<ol>
<li>node의 <code>http</code> 모듈을 <code>require()</code>함수를 통해 불러온다.</li>
<li><code>onRequest()</code>라는 함수를 만들어 http 요청에 응답한다.</li>
</ol>
<p>-&gt; 정상적으로 접속된 http 200 인 경우 <code>text/html</code> 타입의 컨텐츠를 보낸다.
-&gt; &#39;Hello Node.js&#39; 라는 컨텐츠(<code>text/html</code> 타입)를 담아 보낸다.
-&gt; 응답을 종료한다
3. <code>createServer().listen(8888)</code>을 통해 서버를 열어 8888번 포트와 연결하고, 응답을 위해 만든 <code>onRequest</code>함수를 콜백함수로 전달한다.</p>
<p>위 코드를 
터미널에 <code>node server.js</code>를 통해 실행하면</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/fc2f1597-c8a1-4097-a98e-c2a779c64de2/image.png" alt=""></p>
<p>성공적으로 접속해 응답으로 보낸 메시지를 확인할 수 있다.</p>
<h3 id="serverjs-모듈화하기">server.js 모듈화하기</h3>
<p>다른 코드에서 서버의 동작을 제어할 수 있도록 <code>server.js</code>를 모듈화 해보자.</p>
<pre><code class="language-javascript">//server.js
let http = require(&#39;http&#39;);

function start() {
    function onRequest(request, response){
        // request와 response의 값은 node가 알아서 넣어줌
        // reponse를 가지고
        response.writeHead(200, {&#39;Content-Type&#39; : &#39;text/html&#39;});
        response.write(&#39;Hello Node.js&#39;)
        response.end();
    }
    http.createServer(onRequest).listen(8888);
}
exports.openServer = start;
</code></pre>
<pre><code class="language-javascript">//index.js
let server = require(&#39;./server&#39;);

server.openServer();</code></pre>
<p><code>exports.[객체 이름] = [모듈 이름]</code>  - 객체에 모듈을 담아 내보내는 함수</p>
<p><code>server.js</code> 에서 <code>onRequest()</code>기능과 <code>createServer()</code> 기능을 합친<code>start()</code>라는 함수를 <code>openServer</code>이라는 이름에 담아 모듈로 내보낸다.</p>
<p>_-&gt; 실습을 진행하면서 관계를 명확히 이해할 수 있도록 함수 이름과 저장할 객체 이름을 다르게 설정하였다.
_
같은 디렉토리에 위치한 <code>index.js</code>에서 방금 만든 <code>server.js</code> 파일을 import해 <code>openServer</code> 메서드를 실행할 수 있는 구조로 만들었다.</p>
<p>터미널에 <code>node index.js</code>를 입력하면
아까와 같은 페이지 결과가 나오지만,</p>
<p><code>index.js</code>와 <code>server.js</code>를 분리할 수 있게 되었다.</p>
<h3 id="router-분리하기">Router 분리하기</h3>
<p>Route는 경로라는 뜻이고, Router는 경로를 잡아주는 길잡이라는 뜻이다.</p>
<p>웹에서 라우팅(Routing)은 요청에 따라 정해진 경로, 즉 요청된 페이지로 안내하는 방법이다.
일반적으로 웹 페이지를 띄워주는 동작 자체를 라우팅이라고 표현하기도 한다.</p>
<pre><code class="language-javascript">//server.js
let http = require(&#39;http&#39;);
let url = require(&#39;url&#39;)

function start(route) {
    function onRequest(request, response){
        let pathname = url.parse(request.url).pathname;
        route(pathname)

        response.writeHead(200, {&#39;Content-Type&#39; : &#39;text/html&#39;});
        response.write(&#39;Hello Node.js&#39;)
        response.end();
    }
    http.createServer(onRequest).listen(8888);
}

exports.openServer = start;</code></pre>
<pre><code class="language-javascript">//router.js
function route(pathname) {
    console.log(&#39;pathname : &#39; + pathname);
}

exports.sendPathname = route;</code></pre>
<pre><code class="language-javascript">//index.js
let server = require(&#39;./server&#39;);
let router = require(&#39;./router&#39;);

server.openServer(router.sendPathname);</code></pre>
<p>routing 하는 로직을 분리해 <code>router.js</code>에 만들어보자
우선 지금은 보여줄 페이지가 하나 이므로 router에서 URL을 콘솔에 출력할 수 있도록 <code>route()</code>함수를 만들어 테스트 해 보았다.</p>
<ol>
<li><code>router.js</code>의 <code>route()</code> 함수를 <code>sendPathname</code>이라는 객체에 담아 export 한다.</li>
<li><code>index.js</code>에서 <code>openServer</code> 객체에 <code>sendPathname</code>을 전달한다.</li>
<li><code>server.js</code>에서 <code>url.parse(request.url).pathname</code>를 통해 url을 받아올 수 있게 설정한다.</li>
</ol>
<p><code>node index.js</code>를 입력한 뒤 주소창 URL 경로에 routeTest를 입력했을 때
<img src="https://velog.velcdn.com/images/beyond-developer/post/1dba98e8-067e-47c5-a436-6f5ef0a27af6/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/bdd4277e-a599-4cab-b316-e7489372a8d3/image.png" alt=""></p>
<p>입력한 /routeTest 경로가 콘솔창에 잘 출력됨을 확인할 수 있다.</p>
<h3 id="요청에-따라-다른-페이지를-라우팅하기">요청에 따라 다른 페이지를 라우팅하기</h3>
<p>이제 실제 상용되는 웹 페이지처럼 경로에 따라 다른 페이지를 라우팅 해보자.</p>
<pre><code class="language-javascript">//requestHandler.js
//url을 통해 접속이 되면 handle을 통해 main, login 함수가 호출되므로 response를 각 함수가 받도록 함
function main(response) {
    console.log(&#39;main&#39;);

    response.writeHead(200, {&#39;Content-Type&#39; : &#39;text/html&#39;});
    response.write(&#39;Main Page&#39;)
    response.end();
}

function login(response) {
    console.log(&#39;login&#39;);

    response.writeHead(200, {&#39;Content-Type&#39; : &#39;text/html&#39;});
    response.write(&#39;Login Page&#39;)
    response.end();
}

let handle = {}; // key: value
handle[&#39;/&#39;] = main;
handle[&#39;/login&#39;] = login;

exports.handle = handle;</code></pre>
<pre><code class="language-javascript">//server.js
let http = require(&#39;http&#39;);
let url = require(&#39;url&#39;)

function start(route, handle) {
    function onRequest(request, response){
        let pathname = url.parse(request.url).pathname;
        route(pathname, handle, response)
    }
    http.createServer(onRequest).listen(8888);
}

exports.openServer = start;</code></pre>
<pre><code class="language-javascript">//router.js
function route(pathname, handle, response) {
    console.log(&#39;pathname : &#39; + pathname);

    if (typeof handle[pathname] == &#39;function&#39;) {
        handle[pathname](response);
      } else {
        response.writeHead(404, {&#39;Content-Type&#39; : &#39;text/html&#39;});
        response.write(&#39;&lt;h1&gt;404 Not found&lt;/h1&gt;&#39;)
        response.end();
      }
}

exports.sendPathname = route;</code></pre>
<pre><code class="language-javascript">//index.js
let server = require(&#39;./server&#39;);
let router = require(&#39;./router&#39;);
let requestHandler = require(&#39;./requestHandler&#39;)

server.openServer(router.sendPathname, requestHandler.handle);</code></pre>
<p><code>main</code>과 <code>login</code>이라는 페이지 두 가지를 만들어 보자.</p>
<ol>
<li>기존에 <code>server.js</code>의 <code>onRequest()</code> 함수 내에 있던 route 로직을 
<code>requestHandler.js</code>라는 파일의 각 경로 별 라우팅 함수로 옮김</li>
<li><code>reuquestHandler.js</code>의 <code>handle</code>이라는 딕셔너리에 경로가 키로 입력되면 각 라우팅 함수가 반환되도록 설정</li>
<li><code>router.js</code>에서 HTTP status가 404인 경우 Not found 메시지를 응답함.
<img src="https://velog.velcdn.com/images/beyond-developer/post/9c1aa9fe-93af-409b-8f66-c106b61b6d99/image.png" alt="">
&#39;/&#39; 경로를 입력하면 메인 페이지가 라우팅된다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/775022a9-9ea3-40d4-8ec0-108e89a7b6de/image.png" alt="">
&#39;/login&#39; 경로를 입력하면 로그인 페이지가 라우팅된다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/a698c7da-a56d-4e72-8351-865ee991c36c/image.png" alt="">
handle 딕셔너리에 존재하지 않는(라우팅 목록에 없는) 경로를 입력한 경우 404 Not Found 페이지가 라우팅된다.</li>
</ol>
<p>이제 비로소 요청에 따라 다른 웹 페이지를 띄워주는 백엔드의 기초적인 모습을 만들 수 있게 되었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데브코스 TIL] Day 7 - CSS와 Javascript - 웹 풀 사이클 데브코스 TIL]]></title>
            <link>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-7-CSS%EC%99%80-JavaScript-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</link>
            <guid>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-7-CSS%EC%99%80-JavaScript-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</guid>
            <pubDate>Wed, 22 Nov 2023 11:15:00 GMT</pubDate>
            <description><![CDATA[<p>&#39;23.11.22(수) 웹 풀 사이클 데브코스 TIL</p>
<blockquote>
<h3 id="css와-js의-시작">CSS와 JS의 시작</h3>
</blockquote>
<p>오늘은 웹을 예쁘게 꾸며주고 동작할 수 있게 하는 CSS와 JS 학습을 시작했다.</p>
<h2 id="1-css">1. CSS</h2>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/99476afe-0b20-4eb7-a5fe-fe9d4ceda1c4/image.png" alt=""></p>
<p><strong>CSS</strong>는 Cascading Style Sheets의 약자로,
지난 시간에 배운 HTML을 꾸며주는 언어이다.</p>
<p><strong>HTML의 요소(element) 단위</strong>로 하나하나 꾸며줄 수 있으며,</p>
<p>색을 바꾸고, 크기를 조정하고, 위치를 지정하는 등 </p>
<p>웹 페이지를 보기 좋게 스타일링 하는 역할을 하고, 이는 웹 페이지를 방문할 사용자의 사용자경험에 큰 영향을 미친다.</p>
<p>이 CSS를 HTML에 적용하는 방식은 세 가지다.</p>
<ul>
<li>인라인(inline): HTML 태그 안에 같이 작성</li>
<li>내부 스타일 시트(internal style sheet): HTML 문서 안에 같이 작성</li>
<li>외부 스타일 시트(external style sheet): HTML 문서 밖에 작성하고 연결</li>
</ul>
<p>아래 예시들을 통해 어떻게 적용할 수 있는 지 알아보자.</p>
<p>_예시를 간결하게 표현하기 위해 실제로 스타일을 적용하는 부분 외 HTML이나 코드는 생략했다. _</p>
<h3 id="1-인라인">1. 인라인</h3>
<p>인라인 방식은 HTML 요소 내 <code>style</code> 속성을 통해 CSS를 적용하는 방식이다.</p>
<pre><code>&lt;h1&gt;Login&lt;/h1&gt;</code></pre><p>이라는 HTML은 
<img src="https://velog.velcdn.com/images/beyond-developer/post/85fe4b2e-ac2a-433a-82ea-3b21ccc9deec/image.png" alt=""></p>
<p>위와 같이 Login 이라는 h1 텍스트 요소이다.
이 Login이라는 텍스트를 인라인 방식으로 빨간색으로 바꾸고 싶다면</p>
<pre><code>&lt;h1 style=&quot;color:red&quot;&gt;Login&lt;/h1&gt;</code></pre><p><img src="https://velog.velcdn.com/images/beyond-developer/post/d98832be-3b3a-40ce-a6b4-f2e47b485bd0/image.png" alt=""></p>
<p>h1 태그 내 style 속성에서 <code>color</code> 라는 CSS 옵션을 추가하여 적용할 수 있다.</p>
<h3 id="2-내부-스타일-시트">2. 내부 스타일 시트</h3>
<p>내부 스타일 시트는 현재 위치의 HTML에서 CSS를 분리하여 작성하는 방법이다.
<code>&lt;style&gt;</code> 이라는 element를 통해 적용할 수 있다.</p>
<pre><code>&lt;h1&gt;Login&lt;/h1&gt;
&lt;h1&gt;Logout&lt;/h1&gt;</code></pre><p><img src="https://velog.velcdn.com/images/beyond-developer/post/7b00efd4-5e33-48a5-8ed4-acbd4a52865f/image.png" alt=""></p>
<p><code>&lt;h1&gt;</code> 태그로 Login, Logout 이라는 텍스트를 만들어 보았다.</p>
<p>위와 같이 Login을 빨간 색으로 만들어 보자.</p>
<pre><code>    &lt;style&gt;
        h1{
            color:red;
        }
    &lt;/style&gt;

    ...

    &lt;h1&gt;Login&lt;/h1&gt;
    &lt;h1&gt;Logout&lt;/h1&gt;</code></pre><p><img src="https://velog.velcdn.com/images/beyond-developer/post/d60cd5c6-64cb-4ef4-bbee-17249f578ea8/image.png" alt=""></p>
<p>내부 스타일 시트를 이용할 땐
<code>&lt;style&gt;</code> 블럭 내에서
<code>h1{ ... }</code>
<code>[태그 이름] { ... }</code></p>
<p>으로 <strong>태그 단위</strong>로 CSS를 적용할 수 있다.</p>
<p> 근데 Login과 Logout이 둘 다  <code>h1</code> 태그이기 때문에 Logout 까지 스타일이 적용되는 문제가 발생했다.</p>
<h3 id="class와-id">class와 id</h3>
<p> 이 때 우리는 HTML 태그의 <strong>class</strong>와 <strong>id</strong> 속성을 이용할 수 있다.</p>
<p> <code>class</code>는 <strong>같은 분류의 속하는 요소들의 집합</strong>이다.
 <code>id</code>는 특정 한 개의 요소의 <strong>고유값</strong>이다.</p>
<p> 둘 사이의 차이점은 아래와 같다.
 <code>class</code>는 <strong>같은 class를 가진 요소에 동일한 스타일을 적용</strong>할 수 있고, 다른 페이지에서도 사용할 수 있다.
 <code>id</code>는 <strong>한 페이지 내에서 고유한 값</strong>으로, 페이지 내에서 <strong>단 하나의 요소</strong>에서만 사용이 가능하다.</p>
<p> <code>class</code>는 
HTML 태그의 <code>class=&#39;[클래스이름]&#39;</code> 이라는 옵션으로 추가할 수 있다.</p>
<p><code>&lt;style&gt;</code> 블럭에서는
<code>.[class 이름] { ... }</code> 을 통해 CSS를 적용할 수 있다. </p>
<pre><code>    &lt;style&gt;
        .loginText{
            color:red;
        }
    &lt;/style&gt;

    ...

    &lt;h1 class=&quot;loginText&quot;&gt;Login&lt;/h1&gt;
    &lt;h1&gt;Logout&lt;/h1&gt;</code></pre><p> <img src="https://velog.velcdn.com/images/beyond-developer/post/af97f8a3-8971-486f-b252-1436226b2e7b/image.png" alt=""></p>
<p>Login 텍스트만 스타일이 적용된 것을 확인할 수 있다.</p>
<p>이제 id 속성을 통해 Logout을 파란색으로 만들어 보자.
 <code>id</code>는 
HTML 태그의 <code>id=&#39;[원하는 id]&#39;</code> 이라는 옵션으로 추가할 수 있다.</p>
<p><code>&lt;style&gt;</code> 블럭에서는
<code>#[원하는 id] { ... }</code> 을 통해 CSS를 적용할 수 있다.</p>
<pre><code>    &lt;style&gt;
        .loginText{
            color:red;
        }
        #logout_id{


        }

    &lt;/style&gt;

    ...

    &lt;h1 class=&quot;loginText&quot;&gt;Login&lt;/h1&gt;
    &lt;h1 id=&#39;logout_id&#39;&gt;Logout&lt;/h1&gt;</code></pre><p><img src="https://velog.velcdn.com/images/beyond-developer/post/780a7938-115e-4272-a751-45a15badcdfb/image.png" alt=""></p>
<p>이제  Login과 Logout을 구분해 스타일을 적용할 수 있게 되었다.</p>
<h3 id="3-외부-스타일-시트">3. 외부 스타일 시트</h3>
<p>외부 스타일 시트는 CSS를 외부의 파일로 분리하여 적용하는 방식이다.
<code>[파일 이름].css</code> 라는 css파일을 따로 만들어 <code>&lt;link&gt;</code> 태그를 통해 이를 불러와 적용할 수 있고, 내용은 내부 스타일 시트와 동일하게 작성할 수 있다.</p>
<pre><code class="language-html">&lt;!--login.html--&gt;
    ...
    &lt;link href=&#39;style.css&#39;&gt;
    ...
    &lt;h1&gt;Login&lt;/h1&gt;
    &lt;h1 id=&#39;logout_id&#39;&gt;Logout&lt;/h1&gt;</code></pre>
<pre><code class="language-css">/*- style.css*/
        .loginText{
            color:red;
        }
        #logout_id{
            color:blue;
        }</code></pre>
<p>이 방식으로 적용하면 내부 스타일 시트 예시와 동일하게 스타일을 적용할 수 있다.</p>
<p>파일을 분리하는 형태이기 때문에 가독성이 높아 업무에서 자주 사용하는 방식이다.</p>
<hr>
<h2 id="2-javascript">2. Javascript</h2>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/b28d52f2-775e-429a-84be-5600ca51da53/image.png" alt="">
<strong>Javascript</strong>는 특정 <strong>HTML 요소를 선택하여 제어</strong>할 수 있는 <strong>스크립트 언어</strong>로,
사용자와의 상호작용 및 <strong>동적인 웹사이트</strong>를 만들기 위해 도입되었다.</p>
<p>여기서 스크립트 언어란
독립적인 프로그램을 개발할 수 있는 프로그래밍 언어가 아닌
(프로그램 내부의 구성 요소 중 하나로) <strong>프로그램을 제어하는 스크립트 역할</strong>을 하는 언어로 </p>
<p>뜻 그대로 프로그래밍이 아닌 HTML 요소에 <strong>동적인 기능을 부여</strong>하기 위해 사용되고,</p>
<p>현재는 Javascript가 발전하여 독립적인 프로그래밍 언어로 사용할 수 있게 되었다.</p>
<p>이제 JS의 변수, 함수, 조건문에 대해 아주 간단하게 살펴보자.</p>
<hr>
<h3 id="변수">변수</h3>
<p>JS에서 변수를 만드는 방법은 두 가지가 있다.</p>
<ul>
<li><code>let [변수명];</code></li>
<li><code>const [변수명] = [값];</code></li>
</ul>
<p><code>let</code> 은 가변한 변수를 만들기 위해 사용되는 타입이고,
<code>const</code>는 변하지 않는 변수를 만들기 위해 사용되는 타입이다.</p>
<p><code>let</code> 변수는 선언 시 값을 초기화 하지 않아도 되지만,
<code>const</code> 변수는 선언 시 반드시 초기화 해 주어야 한다.</p>
<h3 id="함수">함수</h3>
<p>JS에서 함수를 만드는 기본적인 방법은
<code>function [함수 이름] ([매개 변수(들)] { ... })</code> 이다.</p>
<p><code>[함수이름](값(필요 시))</code> -&gt; <code>getUserName(a)</code>
의 형식으로 함수를 call 할 수 있다.</p>
<p>함수 이름은 이름을 보자마자 어떤 기능을 하는 지 알 수 있도록 작성하는 것이 좋다.</p>
<h3 id="조건문">조건문</h3>
<pre><code class="language-javascript">if([조건식]){
  ...
    }
else{
  ...
    }</code></pre>
<p><code>if</code>문의 조건식에서 조건식이 참인 경우 <code>if</code>블럭을, 거짓인 경우 <code>else</code>블럭을 실행한다.
조건문은 특정 조건에 대한 동작을 위해 조건문을 사용한다.</p>
<p>함수와 조건문을 만드는 다른 방법도 있지만, 해당 내용을 학습하는 TIL에서 추가하도록 하고,
기본적인 내용을 이용해 HTML 요소에 기능을 부여하는 방법을 중점으로 작성하도록 하겠다.</p>
<hr>
<p>이제 JS를 HTML에 적용하는 방법을 살펴보자.</p>
<p>JS를 HTML에 적용하는 방법 역시
CSS와 동일하게 인라인, 내부 스타일 시트, 외부 스타일 시트 방식이 있다.</p>
<p>오늘은 메시지창을 띄우는 <code>alert()</code> 함수를 이용해 HTML에 기능을 부여해 보자.</p>
<h3 id="1-인라인-1">1. 인라인</h3>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html &gt;
    &lt;head&gt;
        &lt;meta charset=&quot;UTF-8&quot;&gt;
        &lt;title&gt;JS 테스트&lt;/title&gt;
        &lt;link rel=&quot;stylesheet&quot;&gt;
    &lt;/head&gt; 
    &lt;body&gt;
            이름 : &lt;input type=&quot;text&quot;&gt;
            &lt;input type=&quot;button&quot; value=&quot;함수 실행&quot;
            onclick=&quot;alert(&#39;너, 멋진 개발자가 될거야!&#39;)&quot;&gt;
    &lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/b41542da-e301-4495-91d4-84d857afe587/image.png" alt=""></p>
<p>위의 페이지에서
버튼 타입의 <code>input</code> 태그의 <code>onclick</code>속성에 
<code>onclick=&quot;alert(&#39;너, 멋진 개발자가 될거야!&#39;)&quot;</code></p>
<p><code>alert()</code> 함수를 넣어 버튼을 클릭할 때 메시지창이 뜨도록 설정해 보았다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/d9bfe2ca-ac8c-4273-91a7-1fd240af4fe9/image.png" alt=""></p>
<p>드디어 웹 페이지에 기능을 추가할 수 있게 되었다.</p>
<h3 id="2-내부-스타일-시트-1">2. 내부 스타일 시트</h3>
<p>내부 스타일 시트는
<code>&lt;script&gt;</code> 요소를 통해 현재 페이지에 들어갈 JS 블럭을 분리하는 방식이다.</p>
<p>입력 박스에서 사용자의 이름을 받아 메시지 창에 이름이 담긴 메시지를 띄워보자.</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html &gt;
    &lt;head&gt;
        &lt;meta charset=&quot;UTF-8&quot;&gt;
        &lt;title&gt;JS 테스트&lt;/title&gt;
        &lt;link rel=&quot;stylesheet&quot; href=&quot;login.css&quot;&gt;
    &lt;/head&gt; 
    &lt;body&gt;
            이름 : &lt;input id=&quot;input_id&quot; class=&quot;login_inputs&quot; type=&quot;text&quot;&gt;
            &lt;input id=&quot;btn_login&quot; type=&quot;button&quot; value=&quot;함수 실행&quot;
            onclick=&quot;makeMessage()&quot;&gt;

            &lt;script&gt;
                function makeMessage() {
                    let userName = document.getElementById(&#39;input_id&#39;).value
                    alert(userName + &#39;, 멋진 개발자가 될거야!&#39;)
                }
            &lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/201ae4d1-41fa-4c4c-8f79-f9dd9b60a33c/image.png" alt=""></p>
<p><code>makeMessage()</code> 라는 함수를 만들어 <code>input</code>으로 들어온 사용자 입력을 받아 메시지를 띄웠다.</p>
<h3 id="3-외부-스타일-시트-1">3. 외부 스타일 시트</h3>
<p>위 내용을 CSS와 마찬가지로 외부 파일로 분리하여 만들 수 있다.</p>
<pre><code class="language-javascript">// makeMessage.js
function makeMessage() {
    let userName = document.getElementById(&#39;input_id&#39;).value
    alert(userName + &#39;, 멋진 개발자가 될거야!&#39;)
}</code></pre>
<pre><code class="language-HTML">&lt;!--message.html--&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;UTF-8&quot;&gt;
        &lt;title&gt;JS 테스트&lt;/title&gt;
        &lt;link rel=&quot;stylesheet&quot; href=&quot;login.css&quot;&gt;
        &lt;script src=&quot;makeMessage.js&quot;&gt;&lt;/script&gt;
    &lt;/head&gt; 
    &lt;body&gt;
            이름 : &lt;input id=&quot;input_id&quot; class=&quot;login_inputs&quot; type=&quot;text&quot;&gt;
            &lt;input id=&quot;btn_login&quot; type=&quot;button&quot; value=&quot;함수 실행&quot;
            onclick=&quot;makeMessage()&quot;&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>HTML파일의 <code>head</code> 블럭 안에
<code>&lt;script src=&#39;파일경로&#39;&gt;</code> 를 통해 소스코드를 불러오면</p>
<p>내부 스타일 시트와 같은 결과를 확인할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데브코스 TIL] Day 6 - 웹이란? - 웹 풀 사이클 데브코스 TIL]]></title>
            <link>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-6-%EC%9B%B9%EC%9D%B4%EB%9E%80-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</link>
            <guid>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-6-%EC%9B%B9%EC%9D%B4%EB%9E%80-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</guid>
            <pubDate>Tue, 21 Nov 2023 08:24:22 GMT</pubDate>
            <description><![CDATA[<p>&#39;23.11.21(화) 웹 풀 사이클 데브코스 TIL</p>
<blockquote>
<h3 id="웹의-개념과-html">웹의 개념과 HTML</h3>
</blockquote>
<h2 id="1-웹의-시작">1. 웹의 시작</h2>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/2cc1ec83-6761-4f74-8cfe-28990faa9ba1/image.png" alt=""></p>
<p><small>최초의 웹사이트 WWW</small></p>
<p><strong>WWW</strong> - World Wide Web</p>
<p>우리가 알고있는 웹은 1989년 CERN의 연구원 팀 버너스 리로부터 시작되었다.</p>
<p>초기의 웹은 지금보면 굉장히 단순하고 보잘것 없어 보이지만 웹의 특징을 아주 잘 담고 있다.</p>
<p><strong>웹의 특징</strong></p>
<ul>
<li>정보를 <strong>하이퍼텍스트</strong>형식으로 표현하여, 하이페텍스트(링크)를 따라 이동하며 다양한 정보/문서들을 제공하고 연결한다.</li>
</ul>
<p><strong>하이퍼텍스트(hypertext)</strong>란, 
<strong>‘단순히 글자가 아닌 그 이상의 기능을 가진 텍스트’</strong>로 주로 링크, 참조의 역할을 하는 기술을 말한다.</p>
<p>여기까진 <strong>거미줄</strong>에 대한 개념을 찾을 수 없는데, 왜 <strong>Web</strong>이라는 이름을 붙이게 되었을까?
이에 대해서 웹의 구조를 이해할 필요가 있다.</p>
<hr>
<h2 id="2-웹의-구조">2. 웹의 구조</h2>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/9d847e53-c3d3-430c-befa-74ff11110e47/image.png" alt="">
컴퓨터를 쓰다보면 <em><strong>&quot;서버가 터졌어!&quot;</strong></em>, <em><strong>게임 클라이언트 다운로드</strong></em>
등에서 서버라는 단어와 클라이언트라는 단어를 종종 들을 수 있다.</p>
<p>음식점에 가면 주문을 하는 사람을 <strong>Client(고객)</strong>
주문을 받아 음식을 내 주는 사람을 <strong>Server(서버)</strong>
라고 한다.</p>
<p>웹의 통신은 이와 동일한 개념의 클라이언트와 서버 간 상호작용에서 시작한다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/a0810f34-6e73-49b5-85db-77f8b60de86d/image.png" alt=""></p>
<p><strong>클라이언트</strong> 컴퓨터가 서버컴퓨터에 어떤 <strong>요청</strong>을 하면,
<strong>서버컴퓨터</strong>는 로직에 맞게 이 요청을 해석하고, 요청에 대한 <strong>결과를 클라이언트에게 제공</strong>한다.</p>
<p>파일 다운로드 버튼을 <strong>클릭</strong>하면 요청을 서버가 해석해 <strong>파일을 제공</strong>하는 예시가 이에 해당한다.</p>
<p>우리는 <strong>인터넷(International Network)</strong>을 통해 전 세계의 서버와 연결되어있다.
이런 무한한 연결구조 덕분에 Web이라는 이름이 붙게 되었다.</p>
<p>포브스에 따르면 구글은 매일 약 <strong>35억개의 검색을 처리</strong>한다.
이런 무수한 요청을 해석하려면 <strong>인터넷 통신의 규칙이 필요</strong>하다.</p>
<p>인터넷으로 연결된 클라이언트와 서버는 웹 프로토콜(규칙)인 <strong>HTTP(HyperText Transfer Protocol)</strong>를 사용하고,
이 HTTP에 맞춰 요청하고, 결과를 다시 클라이언트에게 전달한다.</p>
<p>위의 예시에서 우리는 웹 브라우저가 사용자의 검색을 자동으로 HTTP에 맞게 서버에 요청하기 때문에
HTTP에 대해 알지 못하더라도 인터넷 검색을 할 수 있다.</p>
<p>이런 웹은 어떻게 개발하는 걸까?</p>
<hr>
<h2 id="3-웹-개발">3. 웹 개발</h2>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/35c6a845-35d7-44ba-98b4-49e141655b26/image.png" alt=""></p>
<p>웹을 개발하는 직무는 크게 <strong>프론트엔드와 백엔드</strong> 두 가지로 나뉜다.</p>
<p><strong>프론트엔드</strong>는 
우리가 지금 모니터 앞에서 보고 있는 당장 이 <strong>화면을 만들어내는 역할</strong>을 담당한다.
웹 사이트에서 <strong>사용자의 측면(Client-side)</strong>에서 멋진 화면, 이미지, 레이아웃 등을 보여주고, 
사용자와** 상호작용**(글자 입력, 버튼 클릭, 화면 출력 등)을 담당한다.</p>
<p><strong>백엔드</strong>는
웹 사이트에서 사용자의 눈에 보이지 않는 <strong>서버측(Server-Side)</strong>에서 
프론트엔드에서 전달받은 데이터와 <strong>요청을 내부 데이터와 연산을 활용하여 처리</strong>하고,
그 결과를 <strong>프론트엔드에 전달</strong>하는 역할을 담당한다.</p>
<p>그럼 이제 웹을 직접 만들어보자.</p>
<hr>
<h2 id="4-html">4. HTML</h2>
<p><strong>HTML(HyperTextMarkupLanguage)</strong>
<img src="https://velog.velcdn.com/images/beyond-developer/post/3361353b-3f88-493a-9729-9032bc459038/image.png" alt=""></p>
<p>앞서 웹에서는 정보를 하이퍼텍스트로 표현한다고 설명했다.</p>
<p>좀 더 세부적으로 보면, 하이퍼 텍스트이자, 웹 페이지의 구조를 명시하는 언어인
HTML을 통해 웹을 구현한다.</p>
<p>위의 사진에서 볼 수 있는 HTML은 기본적으로
<code>&lt;[태그]&gt; &lt;/태그&gt;</code> 와 같은 형태로 열고 닫는, 혹은 단독으로 쓰이는 태그들의 구조로 쓰인다.</p>
<ul>
<li><strong>자주 쓰이는 HTML 태그</strong>
<code>&lt;!DOCTYPE html&gt;</code> - 아래 파일이 html로 이루어져 있음을 알림 - Document type
<code>&lt;html&gt;</code> - Root 요소
<code>&lt;meta&gt;</code> - 해당 웹 페이지에 대한 정보를 알려줌
<code>&lt;title&gt;</code> - 페이지 제목 입력
<code>&lt;head&gt;</code> - 헤더 정보
<code>&lt;body&gt;</code> - 웹 페이지의 내용</li>
</ul>
<blockquote>
<pre><code>&lt;!DOCTYPE html&gt;</code></pre></blockquote>
<html>
<head>
    <meta charset="UTF-8">
    <title>Go</title>
</head>
<body>
    <h2>풀스택 개발자가 되는 길</h2>
    <a href="https:://programmers.co.kr">Programmers</a>
</body>
</html>
```

<p>이렇게 html 파일을 작성하고 브라우져에서 열어보면
<img src="https://velog.velcdn.com/images/beyond-developer/post/6d9c70ab-3bba-44b8-b5d8-6647b9ed58ef/image.png" alt=""></p>
<h4 id="짠-간단하게-웹이-완성되었다">짠! 간단하게 웹이 완성되었다.</h4>
<p>Programmers 라는 텍스트를 클릭하면 프로그래머스 홈페이지로 이동하며
<em>우리는 풀스택 개발자의 길을 시작한다.</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데브코스 TIL] Day 5 - Git branch 전략 - 웹 풀 사이클 데브코스 TIL]]></title>
            <link>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-5-Git-branch-%EC%A0%84%EB%9E%B5-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</link>
            <guid>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-5-Git-branch-%EC%A0%84%EB%9E%B5-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</guid>
            <pubDate>Mon, 20 Nov 2023 12:14:40 GMT</pubDate>
            <description><![CDATA[<p>&#39;23.11.20(월) 웹 풀 사이클 데브코스 TIL</p>
<blockquote>
<h3 id="git-branch와-merge를-이용해-협업하기">Git branch와 merge를 이용해 협업하기</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/b1404515-0f76-4401-9651-1b5ab0b959e3/image.png" alt=""></p>
<p>이전 시간에 Git branch의 개념에 대해 간략하게 다루었다.</p>
<p>그럼 branch는 어느 시점에 나누어야 하는가?</p>
<ul>
<li><strong>기능 개발 - 프로젝트의 새 기능 구현</strong></li>
<li><blockquote>
<p>feature/login, feature/select-product 등</p>
</blockquote>
</li>
<li><strong>출시 준비 - release-1.3</strong></li>
<li><blockquote>
<p>출시를 위한 브랜치와 개발을 위한 브랜치 구분</p>
</blockquote>
</li>
<li><strong>긴급 수정 - hotfix-1.2.1</strong></li>
<li><blockquote>
<p>배포 후 버그나 수정사항이 생겨 긴급수정하는 경우</p>
</blockquote>
</li>
</ul>
<p>위와 같은 시점에서 branch를 나누게 되고, 작업이 종료되면 일반적으로 분리된 branch를 main branch에 병합한 뒤 해당 branch를 삭제한다.</p>
<p>이 병합(merge)과정에서 여러 문제가 발생할 가능성이 있다.</p>
<ol>
<li><strong>같은 파일의 같은 위치를 다르게 변경해 merge하는 경우</strong></li>
</ol>
<p>-&gt; 파일 충돌이 직접적으로 일어나는 경우
2. <strong>1번의 경우에 해당되지 않지만 잠재적인 충돌 가능성이 존재하는 경우</strong>
-&gt; 변수명이 공유되거나, 특정 값을 변화하는 코드 등 논리적인 오류가 발생할 수 있는 경우</p>
<p>위와 같은 상황을 방지하려면 적절한 전략이 필요한데,</p>
<p>이를 <strong>Git Branch 전략</strong>이라고 한다.</p>
<hr>
<h2 id="git-branch-전략">Git Branch 전략</h2>
<p>git branch 전략은 크게 두 가지로 구분한다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/a7f469dc-6e23-4546-91e7-8d71d77ee628/image.png" alt=""></p>
<p>사진의 예시에서 <code>A</code>를 <code>main</code> branch, <code>B</code>를 추가기능 구현 branch라고 가정해보자.</p>
<ul>
<li><p><strong>Fast-Forward 전략</strong>
<code>main</code> 브랜치가 존재하는 상황에서 추가기능 <code>B</code> 브랜치를 만들어 작업 후, <code>A</code> 브랜치 바로 뒤에 병합하는 방식</p>
</li>
<li><blockquote>
<p><code>main</code> 브랜치에는 <code>B</code> 브랜치 생성 이후 커밋이 없는 상태에서 그대로 이어진다.</p>
</blockquote>
<p>Fast-Forward는 &quot;빨리감기&quot; 라는 뜻으로
직접적인 의미 보다는 빠르게, 연결해서 라는 정도의 키워드에서 따온 네이밍이지 않을까 예상한다.</p>
</li>
</ul>
<ul>
<li><p><strong>3-way 전략</strong></p>
<p><code>main</code> 브랜치에서 <code>B</code> 브랜치를 생성하고, <code>main</code>과 <code>B</code> 브랜치 둘 다 커밋을 이어나간 뒤
병합하는 방식
이 같은 경우는 <code>main</code> 브랜치가 아니라 추가적으로 더 많은 브랜치로 한 번에 병렬적으로 작업하는 형태도 해당된다.</p>
</li>
</ul>
<p>Branch는 협업이 중점인 기능이기 때문에 일반적으로 3-way 전략을 중심으로 사용한다.</p>
<p>Fast-Forward 전략은 뒤에 계속 이어붙이는 방식이기 때문에 충돌 리스크가 적고,
3-way 전략은 커밋 순서를 조정할 수 있는 구조이기 때문에 충돌 리스크가 상대적으로 크다.</p>
<hr>
<h2 id="merge">Merge</h2>
<p>두 가지 전략을 사용하기 위해 Merge(병합)라는 개념을 언급했다.
실제로 깃허브에서 merge 하는 방법에 대해서 알아보자.</p>
<p>merge의 과정은 다음과 같다.</p>
<ol>
<li><code>main</code> 브랜치 보호</li>
<li>pull request</li>
<li>로컬 환경에 동기화</li>
</ol>
<h3 id="1-main-브랜치-보호">1. main 브랜치 보호</h3>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/92b9e6a0-5d38-4e86-a92b-38bb805b83bd/image.png" alt=""></p>
<p>remote repo에서 branch를 생성하면 <code>main</code> 브랜치에 다음과 같은 경고문이 뜬다.</p>
<p>다른 사람 혹은 내가 <code>main</code> branch에 커밋을 push하게 되면 이는 이전 상태로 되돌릴 수 없기 때문에 <code>main</code> branch로의 push나 삭제 등을 방지하는 조치가 필요하다.</p>
<p>보안적인 요소 뿐만 아니라 실수를 방지하고자 하는 목적도 포함되어있다.</p>
<h3 id="2-pull-request">2. pull request</h3>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/36ea8d41-e17d-422c-948b-9142783d30c5/image.png" alt=""></p>
<p>적절히 설정을 수정해 주면 깃허브 repo에서 merge하고자 하는 브랜치에서 pull request를 보낼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/e034eede-741b-4390-82b7-d78d2fe0a980/image.png" alt=""></p>
<p>pull request를 보낼 때는 </p>
<p><strong>주요 구현 내용</strong>과 해당 <strong>구현 과정 내 이슈</strong>를 구분해 작성해 주는 것이 좋다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/04ba0bb0-7d30-42f5-85aa-d2c03737e6c6/image.png" alt="">
pull request를 보내면, 깃허브에서 자동으로 파일 충돌을 검사하고 결과를 보여준다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/12031f46-489b-4681-9aa7-7b01d19ae685/image.png" alt="">
충돌 검사를 통과한 모습이다.
Merge 권한을 가진 멤버가 <code>Merge pull request</code> 버튼을 누르면 
<img src="https://velog.velcdn.com/images/beyond-developer/post/cb618718-cd6b-4c6b-a928-c31306e82b43/image.png" alt="">
pull request가 닫히고 merge된다. 이 때 merge커밋이 추가된다.
특이사항이 없다면 작업이 끝난 branch는 delete한다.</p>
<h3 id="3-로컬-환경에-동기화">3. 로컬 환경에 동기화</h3>
<p>깃허브에서 merge가 끝났다면 로컬 환경에 동기화를 진행한다.</p>
<ol>
<li><code>git fetch -p</code> </li>
</ol>
<p>-&gt; remote repo의 브랜치 상태를 로컬환경에 업데이트 한다.
-&gt; <code>-p</code> prune 옵션 - 가지치기 </p>
<ol start="2">
<li>merge된 브랜치로 <code>checkout</code> 한다.</li>
<li>merge된 커밋을 로컬환경에 반영하기 위해 merge된 remote repo의 브랜치를 pull 한다.</li>
<li><code>git branch -d [브랜치 이름]</code> 으로 로컬 브랜치를 삭제한다.</li>
</ol>
<p>-&gt; <code>-d</code> delete 옵션</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데브코스 TIL] Day 4 - git clone과 git branch - 웹 풀 사이클 데브코스 TIL]]></title>
            <link>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-4-git-clone%EA%B3%BC-git-branch-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</link>
            <guid>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-4-git-clone%EA%B3%BC-git-branch-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</guid>
            <pubDate>Fri, 17 Nov 2023 15:23:31 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="git-clone과-git-branch로-협업하기">git clone과 git branch로 협업하기</h3>
</blockquote>
<p>&#39;23.11.17(금) 웹 풀 사이클 데브코스 TIL</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/5cdc2de2-ef50-460f-818e-ae370e8830f0/image.png" alt=""></p>
<h2 id="👥-git-clone">👥 git clone</h2>
<blockquote>
<p><strong>명령어 한 줄로 전 세계의 프로젝트를 그대로 가져올 수 있다.</strong></p>
</blockquote>
<p>지금까지 Local, Remote Repo를 만드는 방법과, 이를 연결하는 방법에 대해서 배웠다.</p>
<p>이제부턴 깃허브에 올라온 다양한 프로젝트들을 그대로- 내 로컬 환경으로 가져올 수 있다.</p>
<p><code>git clone [github repo URL]</code></p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/22f32974-4219-47bd-bd1f-6c62018fb80e/image.png" alt=""></p>
<p>난 방금 명령어 하나만으로 구글에서 만든 전 세계에서 가장 많이 쓰이고 있는 웹앱 아이콘 프로젝트 <code>material design icons</code>
의 <strong>프로젝트 전체를 내 PC에 내려받았다.</strong> <small><del><em>용량이2GB가넘어가서중간에취소했다</em></del></small></p>
<p>구글의 가장 유명한 오픈소스 프로젝트 중 하나를 내 마음대로 개조할 수 있는 것이다.<small><em><del>받아주는건구글마음이지만</del></em></small></p>
<p><code>git clone</code>은 말 그대로 클론(복제)를 만드는 것이다.</p>
<p>깃허브 서버에 저장된 remote repo를 그대로 내 로컬환경에 복제하는 명령어이다.</p>
<p>지난 시간에 배운 지식을 불러오면 로컬환경에서
<code>git init</code>
<code>git remote add</code>
<code>git pull</code>
명령어를 순차적으로 실행했을 때 목표하는 결과와 같다.</p>
<p>이미 repo가 깃허브에 올라가 있다면 <code>git clone</code>으로 처리하는 쪽이 더 효율적일 것이다.</p>
<p><code>git clone</code>으로 내가, 나의 팀이 수행하는 프로젝트를, 깃허브에 공개된 다양한 오픈소스를 언제/어디서든 내려받을 수 있<strong>텍스트</strong>는 것이다.</p>
<p>당연히 <strong>협업의 가장 중요한 시작점</strong>이 될 것 이다.</p>
<p>우린 <code>git clone</code>을 통해 팀 프로젝트를 시작하기 위한 설비를 마쳤다.</p>
<p>이제 분업을 통해 생산성을 늘릴 시간이다.</p>
<hr>
<h2 id="🌵-branch">🌵 Branch</h2>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/080be210-0131-4649-889c-99d4c414d677/image.png" alt=""></p>
<p>우리는 개발자가 되어 여러 분야의 팀원들과 협업하게 될 것이다.
직무부터 구분되는 경우가 대부분일 것이고,
같은 직무라고 하더라도 각자의 특기가 다를 것이다.</p>
<p>프로젝트를 진행하는 BE, FE, 앱 개발자가 손을 잡고 하나씩 하나씩 차근 차근 구현한다고 하면 어떨까?</p>
<p>웹 뷰를 기가막히게 만들어내는 <strong>FE 개발자가 알고리즘을 구현</strong>하는 모습이 과연 생산성이 높을까?</p>
<p>우리는 팀 프로젝트에 <strong>분업</strong>이 필요하다는 것을 당연하게 알고 있다.</p>
<p>근데 그 <strong>당연한 것을 당연하게 누릴 수 있게</strong> 만들어 주는 것이 바로 <code>branch</code>다.</p>
<p><strong>Branch는 나뭇가지</strong> 라는 뜻이다.</p>
<p>모든 나무의 나뭇가지는 하나의 줄기로부터 뻗어나간다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/93dbf27f-fa52-42e0-a777-d17dd6c74792/image.png" alt=""></p>
<p>하나의 Repo로부터, 각자 맡는 분야에 따라 줄기를 뻗어 
<strong>병렬적으로 독립적인 개발을 진행</strong>할 수 있다.</p>
<p>각자의 공간에서 충돌 위험 없이 개발할 수 있으므로 <strong>단위 기능을 훨씬 더 빠르게 개발할 수 있다</strong>는 장점이 있다.</p>
<blockquote>
<p>실제 나무와 달리 하나의 프로그램을 만들어 내기 위해서는 이 가지들이 다시 <strong>합쳐지는 과정이 필요</strong>한데, 이 때 발생할 수 있는 문제들은 병합을 학습하는 페이지에서 작성하도록 하겠다.</p>
</blockquote>
<p>단위는 기능, 직무, 테스트, 배포 등 기준에 따라 마음대로 설정할 수 있다.</p>
<hr>
<h3 id="⌨️-git-branch">⌨️ git branch</h3>
<ul>
<li><code>git branch</code> - 현재 repo의 branch 리스트 출력</li>
<li><code>git branch [branch 명]</code> - branch 만들기</li>
<li><code>git checkout [branch 명]</code> - 현재 바라보는 branch 전환</li>
</ul>
<p><code>git branch</code> 라는 명령어를 통해 
<img src="https://velog.velcdn.com/images/beyond-developer/post/666811a8-6ce7-421d-8b91-46468e569ff8/image.png" alt=""></p>
<p>현재 repo에 있는 branch를 확인할 수 있다.</p>
<p>기본적으로 하나의 줄기에서 시작되므로 기본값인 <code>main</code> branch가 존재한다.</p>
<p>여기서 <code>git branch dev</code>를 실행해 <code>dev</code>라는 이름의 새 branch를 만들어 보자.
<img src="https://velog.velcdn.com/images/beyond-developer/post/414b9614-e27c-4aeb-86ef-a34845d64bcc/image.png" alt=""></p>
<p><code>dev</code>라는 새 branch가 생성된 것을 확인할 수 있다.
<code>*</code> 표시로 현재는 <code>main</code> branch 를 바라보고 있는 것을 확인할 수 있다.</p>
<p><code>git checkout dev</code> 를 실행하면
<img src="https://velog.velcdn.com/images/beyond-developer/post/71004559-03fe-4909-b934-573feeca291a/image.png" alt=""></p>
<p>다음과 같이 현재 바라보는 branch가 <code>dev</code>로 변경되었음을 확인할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데브코스 TIL] Day 3 - Github를 활용한 원격 코드 관리 - 웹 풀 사이클 데브코스 TIL]]></title>
            <link>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-3-Github%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9B%90%EA%B2%A9-%EC%BD%94%EB%93%9C-%EA%B4%80%EB%A6%AC-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</link>
            <guid>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-3-Github%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9B%90%EA%B2%A9-%EC%BD%94%EB%93%9C-%EA%B4%80%EB%A6%AC-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</guid>
            <pubDate>Thu, 16 Nov 2023 12:31:59 GMT</pubDate>
            <description><![CDATA[<p>&#39;23.11.16(목) 웹 풀 사이클 데브코스 TIL</p>
<blockquote>
<h2 id="github-연동과-자주-쓰는-명령어">Github 연동과 자주 쓰는 명령어</h2>
</blockquote>
<p>오늘은 Github repo를 로컬 환경과 연동하는 과정과 그 사이에 자주 사용되는 명령어에 대해 학습했다.</p>
<h2 id="🖥️-파일-추적">🖥️ 파일 추적</h2>
<p>지난 시간에 <code>git init</code> 명령어를 통해 프로젝트 폴더를 git 저장소로 초기화하는 방법에 대해 알아보았다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/e61a1712-da9c-4ca0-a954-2a336e85cab7/image.png" alt=""></p>
<p><code>GitTest</code> 라는 디텍토리에 <code>text.txt</code> 라는 파일을 만든 뒤,
<code>git status</code> 명령어로 현재 git 저장소의 상태를 확인해보자.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/c53a7454-f71c-4d21-9482-a7f35fcfdd9b/image.png" alt=""></p>
<p>Untracked files 라는 목록에 <code>text.txt</code>라는 파일이 있고,
Track 하려면 <code>git add</code>를 사용해 보라는 힌트를 제공하고 있다.</p>
<p>근데 파일을 Track 한다는 것이 어떤 의미인가?</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/04013780-5eaa-4fb1-a22e-145533cb3b79/image.png" alt=""></p>
<p>Git 저장소로 초기화한 프로젝트 폴더 내의 파일들은 두 가지 상태로 분류된다.</p>
<ul>
<li><p>Tracked File</p>
</li>
<li><blockquote>
<p>디렉토리 내 파일이 Git에 의해 관리되고 있는, 또는 관리될 파일</p>
</blockquote>
</li>
<li><blockquote>
<p>파일들의 상태를 Git에 의해 추적되고 있다는 의미</p>
</blockquote>
</li>
<li><blockquote>
<p>Tracked File은 Unmodified(변동사항 x), Modified(수정됨), <strong>Staged(Stage 된 상태)</strong></p>
</blockquote>
</li>
<li><p>Untracked File</p>
</li>
<li><blockquote>
<p>Git에 의해 추적되지 않고 있는 파일
<img src="https://velog.velcdn.com/images/beyond-developer/post/c341c3a0-20d2-496c-b2f6-aa611319bf03/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<h4 id="그럼-어떻게-파일을-추적하는가">그럼 어떻게 파일을 추적하는가?</h4>
<p>위에서 Bold처리된 <strong>Stage</strong>의 개념을 이해할 필요가 있다.</p>
<p>로컬 저장소에 처음 추가된 파일은 기본적으로 Untracked 상태이다.</p>
<p>이때
<code>git add [파일명]</code> 라는 명령어를 사용하면</p>
<p>add한 파일들이 <strong>Staging Area</strong>에 속하게 된다.</p>
<p>Stage는 공연 예술에서 배치, 배열, 준비 등을 수행하는 의미로 사용되고
Git에서는 &quot;<strong>다음 커밋</strong>에 포함되기 위해 준비한다.&quot; 정도로 해석할 수 있다.</p>
<blockquote>
<p>커밋은 프로젝트의 현재 상태의 <strong>Snapshot</strong>을 찍어내 버전을 만드는 명령 정도로 볼 수 있다.
<small>간단하게 이해만 하고 자세한 내용은 후술하도록 하겠다.</small></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/99449ad4-9d4d-40ca-8672-d25e423ea8f4/image.png" alt="">
아까의 상태로 다시 돌아와</p>
<p><code>git add text.txt</code> 명령어를 입력하여 <code>text.txt</code>를 추적해 보겠다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/0cd7472d-0a35-42c8-b4cf-fd7aacbfe9ed/image.png" alt="">
파일 이름의 색깔이 초록색으로 바뀌며
Untracked File에서 <strong>Changes to be committed</strong>의 목록으로 변경된 것을 확인할 수 있다.
말 그대로 커밋할 준비가 되었다는 것이다!</p>
<p><code>git commit</code> + <strong>커밋 메시지</strong> 로 커밋을 수행할 수 있는데,
커밋 메시지는 커밋할 버전의 변경사항을 작성할 수 있다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/65ee214e-5123-49a1-a1c2-b09d83f8da05/image.png" alt="">
커밋을 하려면 커밋의 주체를 지정할 수 있도록 사용자의 정보를 입력하도록 하는데,
--global 옵션을 이용해 지정하면 최초 입력 시 다른 Git 저장소의 커밋에도 자동으로 적용된다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/865550ef-5208-4bc4-8c9e-e50e3d133d17/image.png" alt="">
커밋 메시지를 입력하는 방법은 여러 가지가 있으나,
<code>git commit -m &quot;[커밋 메시지]&quot;</code> 방법이 가장 보편적일 것이다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/80a4e67d-e4b4-4000-936a-2295af1044d5/image.png" alt="">
<code>git log</code>로 로그를 찍어보면 
고유한 커밋 id와 작성한 커밋 메시지를 확인할 수 있다.</p>
<h2 id="🤹🏻♂️-gui로-git-저장소-관리하기">🤹🏻‍♂️ GUI로 Git 저장소 관리하기</h2>
<p>이제 우리는 명령어 입력 한 번 없이 위의 일련의 과정을 수행할 수 있다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/89535133-c30f-445a-bf97-351804f1ea04/image.png" alt=""></p>
<p>우리에게 익숙한 VS code에서 바로 수행할 수 있는데,</p>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/beyond-developer/post/2d278852-fc90-4785-8827-58e889af1fc6/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/beyond-developer/post/78791c12-f1c8-4d1d-b810-f566c0738864/image.png" alt=""></th>
</tr>
</thead>
</table>
<p>좌측의 Source Control 탭을 들어가면
친절하게 저장소(Repo)를 초기화 할 수 있도록 알려준다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/c6cbee85-eda9-484b-8890-faa7365996f4/image.png" alt="">
아까 만들었던 것처럼 텍스트 파일 생성 후 다시 소스 컨트롤 탭에 들어가면,
어떤 부분이 추가되었는지, 수정되었는지, 삭제되었는지를 비교할 수 있고</p>
<p>변경사항이 있는 파일의 리스트를 볼 수 있다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/daa7cccc-a34a-4f36-a2b2-0bb8229be292/image.png" alt=""> <img src="https://velog.velcdn.com/images/beyond-developer/post/cfd461eb-02d1-4f9d-b457-10dcb8360c4a/image.png" alt=""></p>
<p><code>+</code> 버튼을 클릭했을 때 파일의 이름이 Stage Change 영역에 들어갔고, 오른쪽에 <code>U</code> - Untracked
상태가 <code>A</code> - Added 로 변경되었음을 확인할 수 있다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/4a88a841-0499-4209-bb49-59aef74fb2e8/image.png" alt="">
커밋메시지를 입력 박스에 적어 넣고 Commit 버튼을 클릭하면-
<img src="https://velog.velcdn.com/images/beyond-developer/post/2da5e3b5-f3d2-4ed7-aa56-10d84fbac9d7/image.png" alt="">
이제 아무것도 안보인다! 아마 커밋이 됐겠지?</p>
<p>내친김에 로그도 GUI로 보도록 하자
<img src="https://velog.velcdn.com/images/beyond-developer/post/b9d59e49-f696-4a69-a19f-96a2f34b4b0b/image.png" alt=""></p>
<p>Git History라는 확장프로그램을 설치한 뒤 소스 컨트롤 탭을 다시 가면</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/8916f0ce-7ca0-4ea3-98e8-0bf79cbde88b/image.png" alt=""></p>
<p>좌측 상단 시계 버튼을 클릭하면 커밋 로그를 볼 수 있고, 세부 사항도 확인할 수 있게 된다.
<strong>너무 편하잖아!</strong>
<img src="https://velog.velcdn.com/images/beyond-developer/post/403d7980-8f08-48d0-bb19-7695bdd6a400/image.png" alt="">
하지만 언제까지나 GUI는 우리의 편의를 위해 도움을 주는 것일 뿐, CLI로 동작을 수행하는 방법과
원리는 정확하게 알고 있어야 한다-!</p>
<h2 id="👼🏻-github">👼🏻 Github</h2>
<p>우린 지금까지 Git의 Local VCS 로서의 동작을 수행해 보았다.
이제 Github를 통해 분산 VCS의 기능까지 확장해보자.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/74d160b8-c261-4d54-93ee-2a7ce3b8018d/image.png" alt="">
Remote Repo를 만들어 Local 환경으로 가져오고,
Local 환경의 프로젝트를 서버 환경으로 연동해보자.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/f9fcd549-cfd9-4fe6-b0cf-e7ef4b965469/image.png" alt=""></p>
<p>Github에 가입하고 Create New Repository 버튼을 통해 
<code>GitTest</code>라는 이름의 서버 Git 저장소인 Remote Repo를 만들었다.</p>
<p>처음 Repo를 열면 친절하게 시작할 수 있는 튜토리얼을 제공한다.</p>
<p>그 중
<code>git remote add origin https://github.com/sodlfmag/GitTest.git</code></p>
<p>라는 명령어로 나의 remote repo를 로컬 환경으로 가져올 수 있다.</p>
<p><code>git remote add [repo 이름] [git repo URL]</code> 
명령어의 용법은 다음과 같다.</p>
<p>튜토리얼에서는 
<code>git remote add origin https://github.com/sodlfmag/GitTest.git</code></p>
<p>으로 나와있는데,
기본적인 repo 이름이 <code>origin</code>으로 설정되어 있기 때문이다.</p>
<p>필자는 <code>Jin</code>이라는 이름을 붙여 내려받아 보도록 하겠다.
<code>git remote add Jin https://github.com/sodlfmag/GitTest.git</code></p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/76428f91-ef92-4d1a-99d0-ce980bb71f8a/image.png" alt=""></p>
<p><code>git remote -v</code> 라는 명령어를 통해 현재 프로젝트 폴더에 있는
git repo의 이름과 URL 을 확인하면</p>
<p>Jin 이라고 설정된 것을 확인할 수 있다.</p>
<p>지금까지의 작업이** Remote Repo를 Pull** 해 오는 과정이었다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/f9fcd549-cfd9-4fe6-b0cf-e7ef4b965469/image.png" alt="">
현재 Remote Repo는 처음과 같이 빈 상태이다.</p>
<p><code>git push ([repo 명]) ([branch 명])</code>
이라는 명령어를 통해 현재 로컬 버전을 서버에 연동하는 작업을 수행하는데,
현재 branch에 push 연동을 한다고 하면 branch 명을 생략할 수 있다.</p>
<p>현 상태에서 정보를 명시해 <code>git push Jin main</code>을 입력하면 바로 연동이 되지만,
<code>git push</code>로만 push하는 방법을 살펴보자.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/1e277789-2382-47e3-b9e8-dee526135382/image.png" alt=""></p>
<p><code>git push</code>를 최초로 수행하면 위와 같은 오류가 발생한다.</p>
<p>생략된 정보에 의해 
현재 로컬에 내려받은 <code>Jin</code>이라는 원격 저장소의 <code>main</code> branch와
현재 작업중인 local 저장소와의 연결관계를 잡아주는 명령이 필요하다.</p>
<p><code>git push --set-upstream Jin main</code>
<code>git push -u Jin main</code></p>
<p>같은 작업을 수행하는 명령어이다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/627ff0f8-4e5f-4791-a7d3-116d9046cc63/image.png" alt=""></p>
<p>이제 local의 <code>main</code> branch가 <code>Jin/main</code> branch를 추적할 수 있게 되었다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/b1b2d932-b56b-4058-94e8-d93501a829e4/image.png" alt=""></p>
<p>이제부턴 커밋 후에 <code>git push</code> 만으로 <code>Jin/main</code> branch에 push할 수 있게 되었다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/e52580e0-dc49-43b6-a93a-4f28803dcce1/image.png" alt="">
깃허브의 Repo에 로컬 버전이 push된 것을 확인할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Windows PowerShell에서 ls -a 명령어가 작동하지 않는 이유]]></title>
            <link>https://velog.io/@beyond-developer/Windows-PowerShell%EC%97%90%EC%84%9C-ls-a-%EB%AA%85%EB%A0%B9%EC%96%B4%EA%B0%80-%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@beyond-developer/Windows-PowerShell%EC%97%90%EC%84%9C-ls-a-%EB%AA%85%EB%A0%B9%EC%96%B4%EA%B0%80-%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Wed, 15 Nov 2023 02:14:57 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/beyond-developer/post/8b2b386b-c0d3-40d1-8b72-025c1b3fc94f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/448e1b74-ad38-46da-99d4-7475eb077eae/image.png" alt=""></p>
<p>Unix/Linux 터미널에서 <code>ls</code> 명령어는 현재 디렉토리에 있는 디렉토리와 파일을 나열해 보여준다.</p>
<p>git bash와 Windows PowerShell에서 
<code>ls</code>, <code>ls -a</code>, <code>ls -al</code> 명령어를 실행해 보았다.</p>
<p>우선 <code>ls</code> 명령어의 결과가 다르고,
PowerShell 에서는 매개변수 옵션 명령이 동작하지 않는 것을 확인할 수 있다.</p>
<p>PowerShell에서<code>ls -a</code> 명령어가 작동하지 않는 이유는 단순히
PowerShell이 Linux의 Bash Shell과는 다른 명령어 체계를 가지고 있기 때문이다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/87ed90d2-3d50-4278-90ab-ed3495a23641/image.png" alt="">
<a href="https://learn.microsoft.com/ko-kr/powershell/module/microsoft.powershell.management/get-item?view=powershell-7.3">https://learn.microsoft.com/ko-kr/powershell/module/microsoft.powershell.management/get-item?view=powershell-7.3</a></p>
<p>document 대로라면 <code>ls</code>가 아닌 Get-Tiem 명령어를 사용해야한다.</p>
<pre><code class="language-Power">Get-Item .

Directory: C:\

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----         7/26/2006  10:01 AM            ps-test</code></pre>
<p><strong>근데 왜 <code>ls</code>는 작동할까?</strong></p>
<p>PowerShell에서는 <code>ls</code> 명령어 대신에 <code>Get-ChildItem</code> 명령어를 사용하는 것이 더 정확하고 권장되는 방법이지만, 
유닉스 및 리눅스 사용자들이 익숙한 명령어인 <code>ls</code>를 쓸 수 있도록 PowerShell에서는 <code>ls</code>에 대한 별칭(alias)을 제공한다.</p>
<h2 id="결론">결론</h2>
<h3 id="powershell-쓸거면-오류없이-언어를-잘-공부하고-쓰자">PowerShell 쓸거면 오류없이 언어를 잘 공부하고 쓰자</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데브코스 TIL] Day 2 - 프로젝트 관리의 중요성 - 웹 풀 사이클 데브코스 TIL]]></title>
            <link>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-2-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B4%80%EB%A6%AC%EC%9D%98-%EC%A4%91%EC%9A%94%EC%84%B1-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</link>
            <guid>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-Day-2-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B4%80%EB%A6%AC%EC%9D%98-%EC%A4%91%EC%9A%94%EC%84%B1-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</guid>
            <pubDate>Wed, 15 Nov 2023 01:55:10 GMT</pubDate>
            <description><![CDATA[<p>&#39;23.11.15(수) 웹 풀 사이클 데브코스 TIL</p>
<blockquote>
<h3 id="git-기본이론">Git 기본이론</h3>
</blockquote>
<p>오늘은 VCS의 종류와 Git의 시작에 대해 학습했습니다.</p>
<h2 id="🎛️-버전-관리-시스템의-종류">🎛️ 버전 관리 시스템의 종류</h2>
<p>VCS(버전 관리 시스템)의 종류는 크게 세 가지로 분류한다.</p>
<ul>
<li>로컬 VCS</li>
<li>중앙 집중식 VCS</li>
<li>분산 VCS</li>
</ul>
<blockquote>
<h4 id="vcs의-기본적인-사용-목적">VCS의 기본적인 사용 목적</h4>
<p>지난 시간에 학습한 내용이다.</p>
</blockquote>
<ul>
<li>버전 관리</li>
<li>백업 및 복구</li>
<li>협업</li>
</ul>
<h3 id="1-로컬-vcs">1. 로컬 VCS</h3>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/a931c747-2d11-4cac-aed9-8d09d2cf2544/image.png" alt="">
<small>출처: <a href="https://heekangpark.github.io/">https://heekangpark.github.io/</a></small></p>
<p>Local 환경은 다른 디바이스, 유저와 연결이 없는 <strong>내 컴퓨터 내부의 환경</strong>을 뜻한다.</p>
<p>따라서 로컬 VCS는 말 그대로 <strong>내 컴퓨터 안에서 버전 관리를 하는 시스템</strong>이다.</p>
<p>이를 통해 버전 관리와 백업/복구가 가능하지만, 별도의 연결 없이 로컬 환경으로 한정되어 있기 때문에
<strong>협업과는 거리가 먼 시스템이다.</strong></p>
<h3 id="2-중앙-집중식-vcs">2. 중앙 집중식 VCS</h3>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/1185c7a9-a1df-4337-a2ac-61b3696ca88e/image.png" alt="">
<small>출처: <a href="https://heekangpark.github.io/">https://heekangpark.github.io/</a></small></p>
<p>중앙에 하나의 중심이 되는 컴퓨터(<em>이하, 서버</em> )를 두는 구조</p>
<p>백업을 위한 내 프로젝트의 버전을 <strong>내 컴퓨터가 아닌 다른 서버에 저장</strong>하는 형태이다.</p>
<p>그 중 나의 로컬 환경에 수정이 <strong>&quot;필요한 파일만 선별적으로 가져와서 작업&quot;</strong>하는 방식이다.</p>
<p>중앙 서버에 버전을 저장했기 때문에 <strong>다른 클라이언트도 이 서버에 접근</strong>이 가능하다면, 이 <strong>프로젝트 파일을 내려받을 수 있다.</strong></p>
<p>이를 통해 버전 관리, 백업/복구, <strong>협업이 가능</strong>하다.</p>
<h3 id="delta">Delta</h3>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/44da51d3-e770-486b-9a18-16224a372ac0/image.png" alt=""></p>
<p>중앙 집중형  VCS는 각 버전의 <strong>개별 파일 내용의 변경점인 Delta</strong> 점을 저장한다.
로그 등을 통해 <strong>파일의 변경 이력을 저장</strong>하여 클라이언트가 원하는 버전 상태의 <strong>파일을 가져온다.</strong></p>
<p><strong>장점</strong></p>
<ul>
<li>모든 클라이언트가 동일하고 유일한 저장소에서 파일을 내려받고, 올리기 때문에 관리가 편하고 동기화가 가능하다.</li>
</ul>
<p><strong>단점</strong></p>
<ul>
<li><p>버전 관리에 대한 모든 동작이 서버에서 이루어지므로 <strong>서버 의존도가 크다</strong>.</p>
<ul>
<li><p>서버 부하가 크다.</p>
</li>
<li><p>서버 고장 시 리스크가 크다.</p>
</li>
<li><p>오프라인 환경에서는 버전 관리 시스템을 사용할 수 없다.</p>
<br>
</li>
</ul>
</li>
<li><p><strong>파일 단위로 작업</strong>하기 때문에 해당 파일을 새 버젼에 적용했을 때 충돌 위험이 크다.</p>
</li>
</ul>
<h3 id="3-분산-vcs">3. 분산 VCS</h3>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/214cf42d-0a0a-4a35-9d58-967553ac4e46/image.png" alt="">
<small>출처: <a href="https://heekangpark.github.io/">https://heekangpark.github.io/</a></small></p>
<p>위 중앙 집중형 VCS의 문제를 보완하기 위해 탄생한 개념이 분산 VCS이다.</p>
<p>분산 VCS는 기본적으로 중앙집중식 VCS와 동일하게 프로젝트 파일을 서버에 저장한다.</p>
<p>차이점은, 파일이 아닌 <strong>&quot;프로젝트를 통째로 내려받아 작업&quot;</strong>하고, <strong>저장 시에도 통째로 저장</strong>한다.</p>
<h3 id="snapshot">Snapshot</h3>
<p>Snapshot은 우리가 흔히 아는 캡쳐와 비슷한 단어이다.
-&gt; <strong>현 상태를 그대로 찍어낸 것.</strong>
<img src="https://velog.velcdn.com/images/beyond-developer/post/293a85e1-01fc-43c2-a010-b9df50f5379d/image.png" alt=""></p>
<p>분산 VCS 부터는 파일이 아닌 <strong>프로젝트 전체의 변경 내용을 Snapshot이라는 개념으로 저장</strong>한다.</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/728b5d24-b6ab-4da8-b40c-38fa3b5d1b55/image.png" alt=""></p>
<p>대표적인 분산 VCS인 <strong>Git</strong>은 최종 스냅샷을 저장하고, <strong>스냅샷과 스냅샷 사이의 차이를 기록한 Delta를 저장</strong>하기 때문에 중앙 VCS보다 저장해야 하는 델타량이 적다.
또한 저장 효율을 위해 변경사항이 없는 파일들은 새로 저장하는 것이 아니라 링크를 걸어주는 등 <strong>다양한 최적화를 이용</strong>한다.
-&gt; <em><strong>가볍고 빠르다</strong></em></p>
<p>(로컬과 서버가 동기화된 상태라는 가정하에)
분산 VCS는 서버에 저장된 <strong>Snapshot과 델타가 로컬 저장소에도 동일하게 분산되어 저장</strong>된 상태이기 때문에 <strong>오프라인 상태에서도 버전 관리</strong>를 할 수 있게 된다.</p>
<p>지금의 우리는 분산 VCS 개념의 <strong>Git X Github</strong>를 이용하여 매우 편리하게 <strong>협업하며 버전 관리를 할 수 있다.</strong></p>
<hr>
<h2 id="🐈-git-설치하기">🐈‍ Git 설치하기</h2>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/c058880f-b5f8-4614-9880-e71d01a15a2e/image.png" alt=""></p>
<p><a href="https://git-scm.com/">https://git-scm.com/</a></p>
<p>위 링크에 접속하여 최신 버전을 설치할 수 있다.</p>
<p>다양한 옵션은 유저의 입맛에 맞게 설정하면 된다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/937014cd-6a64-420a-b860-4b70f1f5c504/image.png" alt="">
각 OS의 터미널에서,
 <code>git --version</code> 을 입력하여 버전이 표시된다면 설치 완료를 확인할 수 있다.
 필자는 CMD를 사용해 보았다.</p>
<h2 id="🍻-git과-친해지기">🍻 Git과 친해지기</h2>
<h3 id="1-cli-vs-gui">1. CLI vs GUI</h3>
<p>Git에 대해 이해하기 앞서 CLI와 GUI의 개념에 대해 살펴 볼 필요가 있다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/b3095bbb-8bfe-46f2-b1ee-a8d1529e06da/image.png" alt=""></p>
<ul>
<li>CLI - Command Line Interface</li>
<li><blockquote>
<p>Shell에 글자(명령어)를 입력해 컴퓨터에게 명령을 내리는 방식의 인터페이스
<small><em>cf. Shell -&gt; 조개 껍질(명령 프롬포트)을 열어 내용물(운영체제)에 접근한다~</em></small></p>
</blockquote>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/a933a9e0-e295-4235-82eb-a110458ebd57/image.png" alt=""></p>
<ul>
<li>GUI - Graphic User Interface </li>
<li><blockquote>
<p>그래픽으로 컴퓨터에게 명령을 내릴 수 있도록 사용자 친화적인 화면을 제공하는 인터페이스</p>
</blockquote>
</li>
</ul>
<p>개발자가 아닌 일반 사용자를 위해, 또는 전반적인 편의성을 위해 사용이 편한 버튼 등으로 복잡한 명령을 대신 내려주는 형태</p>
<p>우리는 Git을 통해 <del><em>칙칙한</em></del> CLI 환경에 입문해 볼 것이다.</p>
<h3 id="2-자주-쓰이는-기본-명령어">2. 자주 쓰이는 기본 명령어</h3>
<ol>
<li><code>ls</code> - list segmentation - 현재 디렉토리에 어떤 파일이 있는지 나열함</li>
<li><code>ls -a</code> - 숨긴파일을 포함한 경로 안의 모든 파일과 디렉토리 나열</li>
</ol>
<p>-&gt; 매개변수 옵션
-&gt; <strong><a href="https://velog.io/@beyond-developer/Windows-PowerShell%EC%97%90%EC%84%9C-ls-a-%EB%AA%85%EB%A0%B9%EC%96%B4%EA%B0%80-%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EC%9D%B4%EC%9C%A0">윈도우 PowerShell에서 동작하지 않는다!</a></strong>
3. <code>mkdir [폴더명]</code> - make directory - 폴더 만들기
4. <code>cd [경로]</code> - change directory - 터미널 실행 경로를 변경한다. 
-&gt; .은 상대적으로 현재경로, ..은 상위경로를 뜻한다.
5. <code>git init</code> - git initialize - 현재 디렉토리를 git 저장소로 초기화함
-&gt; <code>git init</code>을 통해 현재 프로젝트 폴더 내에 <code>.git</code>이라는 폴더를 생성하여 프로젝트 폴더를 git 저장소로 관리함.
6. <code>git status</code> git 저장소의 현재 상태를 확인</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데브코스 TIL] Day 1 - 프로젝트 관리의 중요성 - 웹 풀 사이클 데브코스 TIL]]></title>
            <link>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B4%80%EB%A6%AC%EC%9D%98-%EC%A4%91%EC%9A%94%EC%84%B1-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</link>
            <guid>https://velog.io/@beyond-developer/%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B4%80%EB%A6%AC%EC%9D%98-%EC%A4%91%EC%9A%94%EC%84%B1-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-TIL</guid>
            <pubDate>Tue, 14 Nov 2023 09:43:06 GMT</pubDate>
            <description><![CDATA[<p>&#39;23.11.14(화) 웹 풀 사이클 데브코스 TIL</p>
<blockquote>
<h2 id="프로젝트-관리의-중요성"><strong>프로젝트 관리의 중요성</strong></h2>
<p><strong>우리의 프로젝트가 포트폴리오가 되기 까지</strong></p>
</blockquote>
<p>프로젝트 관리라는 개념에 앞서 <strong>프로젝트</strong> 라는 것은 무엇인가?</p>
<h2 id="📝-프로젝트란">📝 프로젝트란?</h2>
<p>일상에서 <strong>프로젝트</strong> 라는 단어의 뜻을 정확히 이해하지는 않지만 다들 어떤 추상적인 이미지를 떠올리며 사용할 것이다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/ec98266a-6237-41d8-9ac4-3ac34ddfc526/image.png" alt=""> </p>
</blockquote>
<p><small>출처: 위키백과</small></p>
<p>이를 소프트웨어 개발의 측면에서 생각하면
어떤 <strong>&#39;마구잡이&#39;</strong> 라는 이름의 MMORPG 게임을 개발하려고 할 때</p>
<p>마구잡이 개발 <strong>프로젝트</strong> 로 명명할 수 있다.</p>
<p>이 때 게임 개발 자체 내에서 채팅 시스템을 구현하려고 하면,</p>
<p>마구잡이 채팅 시스템 개발 <strong>프로젝트</strong></p>
<p>가 될 수 있다.</p>
<blockquote>
<p><strong>마구잡이 개발 프로젝트</strong></p>
<blockquote>
<ol>
<li>채팅 시스템 개발 프로젝트</li>
<li>퀘스트 수행 관리 프로젝트</li>
<li>고객문의 플랫폼 개발 프로젝트
...</li>
</ol>
</blockquote>
</blockquote>
<p>프로젝트는 MMORPG 게임이라는 큰 개념으로 정의할 수 있고,
중간 중간 과정의 소단위의 개념으로도 정의할 수 있다.</p>
<p>또, 새로운 것을 만들어 내는 것 뿐만 아니라 <strong>이미 만들어진 프로그램을 고도화하는 업무</strong>도 프로젝트가 될 수 있다.</p>
<blockquote>
<p>*<em>버전1 -&gt; 버전 *</em></p>
</blockquote>
<p>종합하면, 
새로운 소프트웨어를 만들든, 기존의 것을 업그레이드 하든
<strong>&quot;일정한 목적을 달성&quot;</strong> 하기 위한 모든 업무 과정들을 <strong>프로젝트</strong>라고 명명할 수 있다.</p>
<hr>
<h2 id="🤝-협업">🤝 협업</h2>
<p>우리가 <strong>개발자</strong>라는 직업을 가지게 된다면
개인 프로젝트보다 팀 프로젝트로 업무가 이뤄지는 경우가 많기 때문에 개발자에게 협업 능력은 매우 중요하다.</p>
<p>그럼 협업을 잘 하려면 무엇이 중요할까?</p>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/66664dc1-66dd-4130-9556-370c20bfed30/image.png" alt="">
 바로, <strong>공유</strong> 하는 것이다.</p>
<p> 개발자가 공유한다고 하면</p>
<ul>
<li>코드 공유</li>
<li>문서 공유</li>
</ul>
<p>정도를 떠올릴 수 있다.</p>
<p>물론 개발자는 디자이너, 기획자, FE개발자, BE개발자, 클라이언트.. 들과 소통하며
아이디어 제시, 프로젝트 진행률, 버그리포트, 기획서 등 다양한 형태의 공유가 필요할 것이다.</p>
<p>그 중 첫째로 코드를 가장 밀접하게 협업할 개발자들 사이에서는 <strong>코드 공유</strong>가 중요하다.</p>
<p>우리가 코드를 공유할 때의 목표는 <strong>내가 없어도 공유된 자료만으로 이해</strong>할 수 있게 하는 것이다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/a0e26fa8-5124-4cff-94a9-76dbc4f65417/image.png" alt=""></p>
<p><small>출처: 내 repo</small></p>
<p>우리가 만약 이런 소스 코드를 별도의 설명 없이 몇 만 line을 분석하고 이를 수정해 사용해야 한다고 생각해보자. 생각만 해도 어질어질할 것이다.</p>
<p>하지만 코드가 어떤 기능을 하고, 어떤 개발환경에서 작성되었고, 쓰인 코드가 어떤 의미인지 정리된 문서가 따로 있다면 
코드를 해석하는 데 큰 도움이 될 것이다.</p>
<p>그래서 우리가 필요한 것은?</p>
<hr>
<h2 id="📖-readme">📖 Readme</h2>
<p>Readme는</p>
<ol>
<li>완성된 프로그램의 설명서</li>
</ol>
<ul>
<li>프로그램 사용 방법</li>
<li>레퍼런스</li>
</ul>
<ol start="2">
<li>구현 중인 프로젝트의 현황</li>
</ol>
<ul>
<li>구현된 주요 기능</li>
<li>구현 현황</li>
<li>해결해야 하는 문제 </li>
</ul>
<p>등을 효과적으로 공유하기 위해 작성한다.</p>
<p>가독성을 높여 참고할 수 있는 내용을 코드와 같이 전달한다면 코드를 훨씬 보기가 편할 것이다.</p>
<h4 id="결국-readme의-올바른-활용은-우리의-프로젝트의-성공과-직결될-것이다">결국 Readme의 올바른 활용은 우리의 프로젝트의 성공과 직결될 것이다.</h4>
<hr>
<h2 id="📑-markdown">📑 Markdown</h2>
<p>Markdown은 단순한 텍스트를 구조적으로 가독성을 높이도록 만드는 하나의 기술이다.</p>
<p>Markdown의 시작점은 웹.</p>
<p>웹 사이트에서 일반인들이 개발을 배우지 않더라도 글을 쉽고 예쁘게 작성할 수 있도록 
웹 전용 텍스트로 바꿀 수 있게 해 주는 기술이다.</p>
<blockquote>
<h3 id="우리는-이미-마크다운을-사용하고-있었다">우리는 이미 마크다운을 사용하고 있었다!</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/596d2c32-c2c7-4664-8acb-55bb770aa759/image.png" alt="">
<small>출처: 네이버 블로그</small></p>
<p>우리는 Markdown이라는 개념을 몰랐지만 어릴적부터 이런 텍스트 에디터와 함께
예쁘게 꾸며 글을 올릴 수 있었다.</p>
<p>이 텍스트 에디터의 여러가지 기능을 통해 우리의 Raw한 텍스트를 Markdown으로 바꾸어 업로드를 하고 있었기 때문인 것이다.
<br> 
다시 프로젝트의 논점으로 돌아와서, 
이 Markdown을 이용하면 쉽게 읽기 좋은 Readme를 만들 수 있다.</p>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/beyond-developer/post/edda0589-2d6a-4236-881b-43667903ed29/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/beyond-developer/post/b7b8077d-9739-4479-aca7-5653706b143e/image.png" alt=""></th>
</tr>
</thead>
</table>
<p><small>출처: 내 repo</small></p>
<p>위는 필자가 이전에 작성했던 Readme의 일부이다. 
같은 내용의 텍스트더라도 가독성이 높다는 것을 바로 느낄 수 있다.</p>
<p>우리는 이런 마크다운으로 작성된 <code>.md</code> 파일, 예를 들어 <code>readme.md</code> 파일을 만들어 공유하게 될 것이다.</p>
<p>우리의 Readme는 Github라는 <strong>버전 관리</strong> 플랫폼에서 활약하게 될 예정이다.</p>
<hr>
<h2 id="📋-버전-관리">📋 버전 관리</h2>
<p>버전(Version)이라는 단어는 우리에게 익숙할 것이다.</p>
<p>버전은 현재 상태에서의 완성본이라는 것을 뜻한다.</p>
<p>어떤 소프트웨어를 사용하거나, 게임을 할 때</p>
<ul>
<li>파워포인트 2021</li>
<li>윈도우 11</li>
<li><em><del>스타크래프트 1.16.1 립버젼</del></em></li>
</ul>
<p>각 소프트웨어의 이름에 붙은 숫자를 보고 판단할 수 있다.</p>
<p>자연수로 표현하기도 하고, 1.13 같은 소수처럼 보이는 형식으로도 표현하기도 한다.</p>
<p>일반적으로 . 앞에 오는 자연수 부분을 큰 업데이트로, 뒤로 갈 수록 소규모 업데이트를 위해 사용한다.</p>
<p>어떤 숫자를 바꿀 지의 기준은 프로젝트 관리자에게 달려있다.</p>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/beyond-developer/post/aa4c396f-aa2e-4005-9840-4cab5dbc6fd7/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/beyond-developer/post/b63ca74b-28dc-4b9b-a947-f30f4236b0f6/image.png" alt=""></th>
</tr>
</thead>
<tbody><tr>
<td><small>출처: 나무위키 / 내 repo</small></td>
<td></td>
</tr>
</tbody></table>
<p>우리는 이미 버전 관리에 익숙하다.
<del><em>최최종찐막제출용마지막수정1123</em></del></p>
<p>왼쪽에서 졸업 논문 파일을 만든 작성자는
제일 첫 번째의 <code>졸업논문.hwp</code> 이라는 파일에서 논문 작성을 마치고
많은 수정을 통해 <code>졸업논문최종완성본final최종2.hwp</code>에 도달했다.<em><del>마지막버전은유서인데</del></em></p>
<p>여러 표시를 통해 순서를 간신히 파악할 수 있으나
원하는 내용이 어느 파일에 있는지는 한 눈에 알기 쉽지 않다.</p>
<p>우측은 나의 커밋 로그의 일부인데
각 업데이트를 할 때 마다 어떤 부분이 추가, 수정되었는지 바로 알 수 있다.</p>
<p>이것이 <strong>VCS(Version Control System 버전 관리 시스템)</strong>을 이용하는 첫 번째 이유가 된다.</p>
<p>우리는 앞으로 Github라는 VCS를 사용하며 버전 관리를 하게 될 것이고,</p>
<p>버전 관리 뿐만 아니라 백업 복구, 협업을 위한 다양한 사용 등을 목적으로 쓰게 될 것이다.</p>
<p>깃허브 만세!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 풀스택 데브코스 1기 합격 후기]]></title>
            <link>https://velog.io/@beyond-developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%92%80%EC%8A%A4%ED%83%9D-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-1%EA%B8%B0-%ED%95%A9%EA%B2%A9-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@beyond-developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%92%80%EC%8A%A4%ED%83%9D-%EB%8D%B0%EB%B8%8C%EC%BD%94%EC%8A%A4-1%EA%B8%B0-%ED%95%A9%EA%B2%A9-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Tue, 07 Nov 2023 05:48:09 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="프로그래머스-타입스크립트로-함께하는-웹-풀-사이클-개발react-nodejs-1기-합격-후기">프로그래머스 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 1기 합격 후기</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/5fb09022-c57b-447b-b442-2c4eea743489/image.png" alt=""></p>
<p><a href="https://school.programmers.co.kr/learn/courses/19259/19259-kdt-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A1%9C-%ED%95%A8%EA%BB%98%ED%95%98%EB%8A%94-%EC%9B%B9-%ED%92%80-%EC%82%AC%EC%9D%B4%ED%81%B4-%EA%B0%9C%EB%B0%9Creact-nodejs-1%EA%B8%B0">모집공고</a></p>
<p><strong>프로그래머스</strong>에서 주관하는 <strong>풀스택 개발자 육성 부트캠프</strong>에 지원하게 되었습니다.
<strong>TypeScript로 React와 Node.js</strong>를 학습할 수 있는 풀 사이클 개발 과정이고,
&#39;23.11.14 ~ &#39;24.05.24 약 6개월의 기간동안 진행되는 부트캠프입니다.
<img src="https://velog.velcdn.com/images/beyond-developer/post/57740d7e-d28e-4e43-a978-384eb671cfb1/image.png" alt=""></p>
<p>선발과정은
<strong>서류 지원 - 코딩테스트 - 결과발표</strong> 세 단계로 진행되었습니다.</p>
<blockquote>
<p><em>하기할 내용은 모두에게 공개된 정보를 기반으로 제 경험을 가미해 작성했습니다. 혹시 문제가 있을 시 수정하도록 하겠습니다.</em></p>
</blockquote>
<hr>
<h3 id="✈️-1-지원-동기">✈️ 1. 지원 동기</h3>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/b8ab5cb0-842a-4b93-88a8-f565b1f3a679/image.png" alt=""></p>
<p>평소 &#39;웹 개발&#39;에 관심이 있어 책이나 스터디 등으로 기초를 공부하고 <strong>혼자</strong> 9개월 정도의 기간동안 React 프로젝트를 몇 번 진행했는데, 어떤 웹 개발이라는 하나의 과정이 머리 속에 있는 것이 아니라 필요한 기능이나 에러가 발생했을 경우 <strong>그때 그때 서치해서 개발과 학습을 병행</strong>했습니다.</p>
<p>9개월이라는 기간동안 위 방식으로 학습하며 개인적으로 장/단점을 몇 가지 느끼게 되었습니다. </p>
<h4 id="장점">장점</h4>
<p><strong>1. 눈으로만 보는 학습보다, 직접 프로젝트에 필요한 기능을 알맞게 구현해보며 보다 직접적인 학습이 가능하다.</strong>
-&gt; 책에서 코드와 예시를 읽어보고 단순 실습 구현 정도로 그치거나 정말 보고만 지나가는 경우 기억에 잘 남지도 않고** 실제로 구현했을 때 충돌하는 문제들을 해결**하는 경험또한 할 수 없었을 것입니다.</p>
<p>*<em>2. 혼자 개발하면서 기획, 디자인부터 배포까지 모든 파트를 직접 진행하니 시야가 확실히 넓어졌다. *</em>
-&gt; 프로젝트의 모든 부분을 직접 관리하면서 다양한 플랫폼을 경험하며 어떤 작업을 수행하게 되고, 어떤 고충이 있는지 조금은 알게 되었습니다. 이 부분은 협업을 진행할 때 매우 도움이 될 것이라고 생각합니다.</p>
<p>홀로 개발을 하면서 확실히  <strong>삽질(?)들</strong>을 통한 경험들이 도움이 많이 되었습니다.</p>
<h4 id="단점">단점</h4>
<p><strong>1. 바람직한 웹 개발 사이클에 대한 가이드의 부재</strong>
-&gt; 러프한 일정을 잡아두고 만들어야 내는 것만 집중하다 보니, 어떤 큰 그림 안에서 움직이는 것이 아니라 <strong>그때 그때 상황에 대처하는 체계적이지 않고 생산적이지 못한 방식</strong>으로 개발을 진행하게 되었습니다.</p>
<p><strong>2. 재사용 불가능한 코딩</strong>
-&gt; 1번의 상황에서 개발을 진행하다 보니 문제들을 순발력 있게 해결하는 것이 메인이었고, 일관성 없이 일단 <strong>원하는 기능대로만 작동</strong>하도록 만들었습니다. 그러다보니 나중에 돌아왔을 때 내가 작성한 코드를 이해하는데도 한참 걸렸고, 이 코드로는 절대 <strong>협업할 수 없고 성장할 수 없는 방향</strong>이라고 느꼈습니다.</p>
<p><strong>3. 동료 피드백의 부재</strong>
-&gt; 혼자 개발을 진행하다보니 올<strong>바른 방향인지 체크하기가 어렵</strong>고, 개발 과정에서 나의 기쁨과 고난을 공유(?)할 수 없다보니 꽤나 외롭고 지치는 일이었습니다.</p>
<p>위와 같은 문제를 느끼며 웹 개발의 한 사이클을 배울 수 있는 부트캠프의 필요성을 느꼈고,
<strong>1. TypeScript로 React(FE) 학습
2. Node.js로 BE 학습</strong></p>
<p>이를 기반으로 전반적인 제로부터 배포까지 <strong>큰 웹 개발 사이클을 경험</strong>할 수 있다는 점에서 지금 저에게 딱 필요한 과정이라고 생각해 망설임 없이 지원했습니다.</p>
<hr>
<h3 id="📝-2-서류-작성">📝 2. 서류 작성</h3>
<p><strong>프로그래머스 타입스크립트로 함께하는 웹 풀 사이클 개발</strong>과정 1기는
총 4개의 질문을 답하는 지원서이고, 각 질문이 300자 이상 3개, 200자 이상 1개 제한 이었기 때문에 분량에 대한 문제는 전혀 신경 쓰지 않고 써 지는 대로 편하게 써서 제출했습니다.</p>
<ol>
<li><strong>지금까지 프로그래밍 공부를 어떻게 했고, 과정에 참여해서는 어떻게 공부를 할 계획인지 알려주세요.(300자 이상)</strong></li>
</ol>
<ul>
<li>공백 포함 741자 작성
대학교 디자인과에서 컴퓨터공학과로 전과하면서 동아리 스터디나 독학했던 방법, 상기한 개발과 학습을 병행했던 경험을 작성하고, 짧은 기간동안 넓은 분야에 대해 학습할 예정이기 때문에 많은 내용을 어떻게 나의 지식으로 만들 수 있을 지 고민한 내용을 적었습니다.</li>
</ul>
<ol start="2">
<li><strong>타과정이 아닌 프로그래머스 풀스택 데브코스 과정을 선택한 이유가 무엇인가요? 명확한 신청 동기가 궁금해요. (300자 이상)</strong></li>
</ol>
<ul>
<li>공백 포함 675자 작성
타입스크립트로 React와 Node.js를 배울 수 있다는 장점과, 풀스택 과정을 수료한 후 FE나 BE 개발자가 되었을 때 다른 파트와 협업할 때 늘릴 수 있는 생산성에 대한 기대를 작성했습니다.</li>
</ul>
<ol start="3">
<li><strong>학습</strong> <strong>또는</strong> <strong>프로젝트</strong> <strong>경험을</strong> <strong>한다고</strong> <strong>가정을</strong> <strong>하면</strong> <strong>리드하는</strong> <strong>사람이</strong> <strong>없을</strong> <strong>때</strong> <strong>리더의</strong> <strong>부재로</strong> <strong>의사결정이</strong> <strong>어렵고</strong> <strong>방향성이</strong> <strong>모호해지는</strong> <strong>상황이라면</strong> <strong>어떻게</strong> <strong>행동할</strong> <strong>것입니까?(300자</strong> <strong>이상)</strong></li>
</ol>
<ul>
<li>공백 포함 527자 작성</li>
</ul>
<p>질문에 대한 문제 이전에 팀을 한 사람이 리드하는 형태보다 모든 팀원이 팀을 리드하는 문화가 더 중요하고, 나라면 어떻게 그런 문화를 조성하여 위같은 문제를 방지할 수 있을지 작성했습니다.</p>
<p><strong>4. 지원하고자하는 과정 관련하여 학습 또는 프로젝트 경험이 있다면 알려주세요.(만약 없다면, 동료학습을 통해 얻고자 하는 바를 알려주세요, 200자 이상)</strong></p>
<ul>
<li>공백 포함 499자
전에 진행했던 프로젝트에 대해 간략하게 작성하고, 기존 학습 방식의 단점에서 언급했던 것처럼 동료학습을 통해 지식을 상호보완할 수 있는 모습을 기대하며 작성했습니다.</li>
</ul>
<hr>
<h3 id="💻-3-코딩테스트">💻 3. 코딩테스트</h3>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/9668d6f9-0c25-420e-9dc8-45c763dc8767/image.png" alt=""> 
코딩테스트는 총 4시간이 주어졌고, 모집공고에 작성된 유형 그대로 출제되었습니다.</p>
<p><strong>1. 객관식(20문제)</strong>
객관식은 정말 5가지 분야 골고루 출제되었고, 기초적인 내용을 많이 묻는 것을 보아 정말 이 분야에 대한 기초적인 지식을 갖추고 있는지를 검사하는 느낌이었습니다.</p>
<p>*<em>2. SQL(1문제) *</em>
SQL은 공고 질문/답변이나 설명회에서 아주 기초적인 문법을 알고 있으면 충분히 풀 것 이라고 말씀해 주셔서 SQL 기본문법을 서치하고 프로그래머스 1레벨 문제 몇 개를 풀어 준비했습니다. 
문제는 말씀해주신 대로 쉽게 나왔으나 한 문법의 용법을 알지 못해서 10-20분이면 풀 문제를 삽질을 거쳐 2시간 만에 어떻게든 풀어냈습니다.</p>
<p><strong>3. JS 코테(1문제)</strong>
기존에 파이썬으로만 코테를 준비하다가 이번에 처음 며칠간 JS로 프로그래머스 Lv.1 문제들만 풀어 준비했습니다. 문제는 프로그래머스 기준 어려운 1레벨 또는 쉬운 2레벨 정도였다고 생각하고, 기본적인 난이도의 코딩테스트 풀이에 익숙하다면 풀이법을 떠올리기 어렵지 않았다고 생각합니다.</p>
<p>일반적으로 이런 난이도에서 4시간을 주는 경우는 드문 것 같은데, <strong>입문자의 경우에도 충분히 고민하면서 문제를 해결할 수 있도록 기회를 주는 의미</strong>인 것 같습니다. 저 역시도 객관적으로 쉽지만 익숙하지 않았던 SQL 문제에 발목이 잡혔지만 오래 고민해서 여러 시도를 통해 결국 풀어낸 것처럼요.</p>
<p>만약 아무런 지식 없이 이 코딩테스트를 위해 학습한다고 하면
기본적인 HTML/CSS 기초 학습서와
DB/SQL, js 개념 및 기초 문법을 학습하고
고지되어있는 대로 프로그래머스 1레벨 난이도의 연습문제들을 풀며 준비하는 것을 추천드립니다.</p>
<hr>
<h3 id="🎉-4-결과">🎉 4. 결과</h3>
<p><img src="https://velog.velcdn.com/images/beyond-developer/post/9c739a35-ad0c-436e-afe0-1c8745e0e998/image.png" alt=""></p>
<p>짧은 선발 과정 후 <strong>최종합격</strong> 이메일을 받게 되었습니다.
적기에 원하는 교육과정을 합격할 수 있게 되어 기쁩니다.
과정 시작 후 학습한 내용들을 기록하는 TIL 컨텐츠로 돌아오도록 하겠습니다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 스킬]]></title>
            <link>https://velog.io/@beyond-developer/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%8A%A4%ED%82%AC</link>
            <guid>https://velog.io/@beyond-developer/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%8A%A4%ED%82%AC</guid>
            <pubDate>Mon, 19 Jun 2023 06:36:21 GMT</pubDate>
            <description><![CDATA[<p>알고리즘 스킬</p>
<h3 id="1-적은-한정된-범위의-인덱스를-다룰-때는-미리-배열을-만들어-보라">1. 적은 한정된 범위의 인덱스를 다룰 때는 미리 배열을 만들어 보라</h3>
<p>이코테 315p 그리디 기출 5번 볼링공 고르기
Ex) 리스트에서 1~10 까지 등장하는 개수 세야 할 때
    미리 arr = [0] * 11 한 뒤 숫자 별로 그냥 나오는대로 1씩 증가</p>
<h3 id="2-반복되는-심볼로-비교문-수행경로탐색할-때는-리스트에-저장하는-방식을-고려하자">2. 반복되는 심볼로 비교문 수행(경로탐색)할 때는 리스트에 저장하는 방식을 고려하자</h3>
<p>이코테 110p 구현 예제 4-1 상하좌우
Ex) UDLR 문자 입력 시 이동방향 결정하는 경우 [‘U’, ‘D’, ‘L’, ‘R’]로 저장 후 꺼내 쓰기</p>
<h3 id="3-시간제한메모리-제한을-고려해-데이터-수가-충분히-적다면-완전탐색을-고려해-보자">3. 시간제한/메모리 제한을 고려해 데이터 수가 충분히 적다면 완전탐색을 고려해 보자</h3>
<p>이코테 113p 구현 예제 4-2 시각
    00:00:00 ~ N시:59:59 까지 3이 포함된 시각의 개수를 셀 때 총 시각의 수는 24<em>60</em>60 = 10만개도 되지 않으므로 선형으로 하나씩 비교해도 1초 안에 해결이 가능하다.
제한시간 1초 기준
N의 범위가 500인 경우: O(N^3) 으로 해결 가능
N의 범위가 2,000인 경우 O(N^2)으로 해결 가능
N의 범위가 100,000인 경우 O(NlogN)으로 해결 가능
N의 범위가 10,000,000인 경우 O(N)으로 해결 가능
메모리 제한
메모리 제한 128~512MB 기준 리스트 크기 1,000만 단위 이상이면 잘못. 100만도 드뭄</p>
<h3 id="4-숫자-포함-여부를-비교해야-하는-경우-문자열-변환을-고려해-보라">4. 숫자 포함 여부를 비교해야 하는 경우 문자열 변환을 고려해 보라.</h3>
<p>이코테 113p 구현 예제 4-2 시각
Ex) 03 25 49 (시간) 에서 3이 포함되는 경우를 찾는 경우 str(h) + str(m) + str(s) 해서
‘3’ in ‘032549’ 으로 비교</p>
<h3 id="5-알파벳-순서를-이용하는-경우는-아스키-코드를-사용하라">5. 알파벳 순서를 이용하는 경우는 아스키 코드를 사용하라</h3>
<p>이코테 115p 실전 문제 1 왕실의 나이트
Ex) 소문자 알파벳을 인덱싱 하고 a를 1로 간주하려는 경우
ord(x) – ord(‘a’) + 1</p>
<h3 id="6-이동경로를-따지는-경우-방향-하나하나-정보를-리스트에-넣자">6. 이동경로를 따지는 경우 방향 하나하나 정보를 리스트에 넣자</h3>
<p>이코테 115p 실전 문제 1 왕실의 나이트
Ex) 나이트의 8자 움직임을 저장하는 경우
    [(-2,-1), (-1,-2), (1,-2) ,(2, -1), (2,1), (1,2), (-1,2), (-2,1)]</p>
<h3 id="7-문자열-숫자-알파벳-대소문자-확인-시에는-문자열-내장함수를-이용하자">7. 문자열 숫자, 알파벳, 대/소문자 확인 시에는 문자열 내장함수를 이용하자</h3>
<p>이코테 322p Q.08 문자열 재정렬
<a href="https://codedragon.tistory.com/9884">https://codedragon.tistory.com/9884</a></p>
<ul>
<li>isalpha() – 알파벳인지 확인</li>
<li>isdigit(), isdecimal() – 숫자인지 확인</li>
<li>isalnum() – 알파벳 또는 숫자인지 확인</li>
<li>index() – 문자 위치 알려주기</li>
<li>count() – 문자</li>
<li>“”join(리스트) – 문자열 합치기 – “”안에 들어가는게 구분자.</li>
</ul>
<h3 id="8-방향벡터xy를-이용할-때는-두-가지-변수로-나누어-생각하자">8. 방향벡터(x,y)를 이용할 때는 두 가지 변수로 나누어 생각하자</h3>
<p>이코테 118p 실전문제 2 게임 개발
Ex) dx = [-1, 0, 1, 0] / dy = [0, 1, 0, -1] 로 두고 nx = x + dx[direction] 등으로 풀이</p>
<p> </p>
<h3 id="9-for-i-in-range는-다양한-옵션이-가능하다">9. for i in range()는 다양한 옵션이 가능하다</h3>
<p>이코테 515p A 07 럭키 스트레이트</p>
<ul>
<li>range(stop)</li>
<li>range(start, stop)</li>
<li>range(start, stop, step)</li>
</ul>
<h3 id="10-upper--lower은-알파벳-이외에-다른-것이-포함된-문자열에도-적용된다">10. upper() , lower()은 알파벳 이외에 다른 것이 포함된 문자열에도 적용된다.</h3>
<p>프로그래머스 Lv.1 카카오 2021 코테 – 신규 아이디 추천
...!@BaT#<em>..y.abcdefghijklm.lower()  -&gt;...!@bat#</em>..y.abcdefghijklm</p>
<h3 id="11-튜플을-요소로-갖는-리스트는-튜플의-12-번째-요소를-이용해-정렬이-가능하다">11. 튜플을 요소로 갖는 리스트는 튜플의 1,2 번째 요소를 이용해 정렬이 가능하다.</h3>
<p>프로그래머스 Lv.1 카카오 2019 코테 – 실패율
람다 사용법 튜플 정리하기
첫 번째 원소로 오름차순 정렬하기
     v.sort(key = lambda x : x[0])
첫 번째 원소로 내림차순 정렬하기
    v.sort(key=lambda x:-x[0])
첫 번째 원소로 오름차순 정렬 후 첫 번째 원소가 같은 경우 두 번째 원소로 오름차순 정렬하기
    v.sort(key=lambda x:(x[0],x[1]))
n 번째 문자 기준으로 문자열 리스트 정렬하기
프로그래머스 Lv.1 문자열 내 마음대로 정렬하기
    v.sort(key = lambda x : x[n])</p>
<h3 id="12-문자열을-문자별로-분리하려면-list를-쓰면-된다">12. 문자열을 문자별로 분리하려면 list()를 쓰면 된다.</h3>
<p>프로그래머스 Lv.1 문자열 내림차순으로 배치하기
Ex) list(&quot;Zbcdefg&quot;) -&gt; [‘Z’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’]
반대는 join()을 이용하면 된다.</p>
<h3 id="13-sorted를-쓰면-다양한-방법으로-정렬된-리스트를-반환할-수-있다">13. sorted()를 쓰면 다양한 방법으로 정렬된 리스트를 반환할 수 있다.</h3>
<p>프로그래머스 Lv.1 문자열 내림차순으로 배치하기
Sorted( ) 사용법
정렬된 리스트
    sorted(기존 리스트)
딕셔너리 키 기준 정렬
    sorted(딕셔너리.items())
딕셔너리 키 기준 정렬하고 키만 담아 반환
    sorted(딕셔너리.keys()  or  sorted(딕셔너리)
딕셔너리 value 기준으로 정렬
    sorted(딕셔너리.items(), key=operator.itemgetter(1))
    sorted(딕셔너리.items(), key=lambda x: x[1])</p>
<h3 id="14-알파벳-ascii-이용할-떄는-ord---chr-">14. 알파벳 ASCII 이용할 떄는 ord( ) / chr( )</h3>
<p>프로그래머스 Lv.1 시저 암호
알파벳 -&gt; 아스키
    ord(s)
아스키 -&gt; 알파벳
    chr(n)</p>
<h3 id="15-실수-리스트의-총합을-구할-때는-sum-">15. 실수 리스트의 총합을 구할 때는 sum( )</h3>
<p>프로그래머스 Lv.1 약수의 합
Ex) sum([1, 2, 3]) -&gt; 6</p>
<h3 id="16-최대공약수gcd-최소공배수lcm는-유클리드-호제법을-이용한다">16. 최대공약수(GCD), 최소공배수(LCM)는 유클리드 호제법을 이용한다.</h3>
<p>프로그래머스 Lv.1 최대공약수와 최소공배수
유클리드 호제법
N % M = R
    N = M , M = R 관계를 반복해서 나머지 계산이 0이 되는 경우 그 때의 M이 GCD
LCD == (N * M) // GCD</p>
<p>모듈을 이용하면 2개 이상 수에 대해
math.gcd( ), math.lcm( ) 이용 가능하다.</p>
<h3 id="17-입력값이-복잡한-문자열인-경우-strip-split-replace-을-적극적으로-이용하자">17. 입력값이 복잡한 문자열인 경우 strip(), split(), replace() 을 적극적으로 이용하자</h3>
<p>프로그래머스 Lv.2 카카오 2019 코테 튜플
Ex) s = &quot;{{2},{2,1},{2,1,3},{2,1,3,4}}&quot; -&gt; [‘2’,’2,1’,’2,1,3’,’2,1,3,4’]
     s = s.lstrip(‘{‘).rstrip(‘}’)
    arr = list(list(s.split(‘},{‘))</p>
<h3 id="18-여러-개의-구분자로-split-하는-경우-re-모듈-정규식을-이용하자">18. 여러 개의 구분자로 split 하는 경우 re 모듈 정규식을 이용하자</h3>
<p>프로그래머스 Lv.2 카카오 2020 인턴십 수식 최대화
re.split(‘[ | | ]’, string)
Ex) &quot;100-200<em>300-500+20&quot; -&gt; [100, 200, 300, 500, 20]
list(map(int, re.split(‘[</em> | + | - ]’, string)))</p>
<p>re.split(symbol, string, n)
    n을 쓰면 원하는 횟수만큼만 자를 수 있다.</p>
<h3 id="18-소수인지-판별할-때는-약수의-중간-값이-sqrtmathbfn에-가까움을-이용하자">18. 소수인지 판별할 때는 약수의 중간 값이 \sqrt\mathbf{N}에 가까움을 이용하자</h3>
<p>프로그래머스 Lv.1 소수 만들기
Ex) 8의 약수 1,2,4,8 에서 약수의 중간(2)은 \sqrt\mathbf{N}을 넘지 않는다.
따라서 IsPrime( )을 구현할 때는 i * i &lt;= N 조건을 만족하는 경우만 반복하면 된다.
이 때 복잡도는 \sqrt\mathbf{N}이 된다.</p>
<h3 id="19-배열에서-순열조합을-사용하는-경우는-itertools를-이용한다">19. 배열에서 순열/조합을 사용하는 경우는 itertools를 이용한다.</h3>
<p>프로그래머스 Lv.1 소수 만들기
from itertools import comibations(permutaions, product) as cb(pt, pd)
combinations(리스트, 뽑는 수)
permutations(리스트, 뽑는 수)
product(<em>리스트)
product(</em>리스트)는 각 요소의 iterable한 값들로 데카르트 곱을 반환한다.
각 메소드는 튜플을 요소로 하는 객체를 반환한다.
사용할 때 이를 적절히 매핑/리스트화해서 이용하자.</p>
<h3 id="20-약수는-sqrtmathbfn을-기점으로-좌우-곱-대칭-관계에-있다">20. 약수는 \sqrt\mathbf{N}을 기점으로 좌우 곱 대칭 관계에 있다.</h3>
<p>프로그래머스 Lv.1 약수의 개수의 덧셈
\sqrt\mathbf{N}을 기점으로 대칭되기 때문에, 제곱수인 경우 약수의 개수가 홀수고, 아니라면 짝수이다.</p>
<h3 id="21-2진수-8진수-16진수-변환하는-방법">21. 2진수, 8진수, 16진수 변환하는 방법</h3>
<p>2진수: 0b<del>~
8진수: 0o</del>
16진수: 0x<del>~</del>
숫자에서 다른 진수의 문자열로 변환하기</p>
<blockquote>
<blockquote>
<blockquote>
<p>bin(42)
&#39;0b101010&#39;
oct(42)
&#39;0o52&#39;
hex(42)
&#39;0x2a&#39;
다른 진수의 문자열을 숫자형으로 변환하기
int(&#39;0b101010&#39;, 2)
42
int(&#39;0o52&#39;, 8)
42
int(&#39;0x2a&#39;, 16)
42</p>
</blockquote>
</blockquote>
</blockquote>
<h3 id="22-range-step-옵션으로-for문을-내림차순으로-사용할-수-있다">22. range() step 옵션으로 for문을 내림차순으로 사용할 수 있다.</h3>
<p>프로그래머스 Lv.1 3진법 뒤집기
기본: for i in range(start, stop) -&gt; start ~ stop -1 까지 반복
Step: for i in range(start, stop, step) -&gt; start ~ stop -1 step 간격 반복
내림차순: for i in range(stop, start, -1) -&gt; stop ~ start +1
    범위에 신경을 써 주어야 함 start -1 을 입력해 주면 stop ~ start 까지 내림차순으로 반복
reversed(range(start, stop))
    기존의 range( )를 뒤집음.</p>
<h3 id="23-문자열을-특정-길이까지-같은-문자로-채우는-경우-rjust--ljust--zfill-을-사용한다">23. 문자열을 특정 길이까지 같은 문자로 채우는 경우 rjust( ), ljust( ), zfill( )을 사용한다.</h3>
<p>프로그래머스 Lv.1 카카오 2018 비밀지도
val = &quot;77&quot;.rjust(5, &quot;0&quot;) -&gt; 00077
    rjust(길이, 문자) 길이가 될 때까지 왼쪽에 문자 추가
val = &quot;222&quot;.ljust(5, &quot;a&quot;) -&gt; 222aa
    ljust.(길이, 문자) 길이가 될 때까지 오른쪽에 문자 추가
val = &quot;2&quot;.zfill(3)        -&gt; 002
    zfill(길이) 길이가 될 때까지 왼쪽에 0 추가</p>
<h3 id="24-특정-조건일-때-특정-값을-적용하는-경우-dictionary를-사용하자">24. 특정 조건일 때 특정 값을 적용하는 경우 dictionary를 사용하자.</h3>
<p>프로그래머스 Lv.1 카카오 2018 [1차] 다트게임
Ex) bonus가 ‘S’인 경우는 1제곱, ‘D’인 경우는 2제곱, ‘T’인 경우는 3제곱을 해 준다.
bonus = {&#39;S&#39; : 1, &#39;D&#39; : 2, &#39;T&#39; : 3}
if (option in bonus):
    value = value ** bonus[option]
    옵션의 인덱스를 따로 찾을 필요 없이 key값으로 호출할 수 있다.</p>
<h3 id="25-배열의-정렬-상태를-유지하고-가장-작은큰-값을-추출해-이용할-때는-힙을-사용하자">25. 배열의 정렬 상태를 유지하고 가장 작은/큰 값을 추출해 이용할 때는 힙을 사용하자</h3>
<p>프로그래머스 Lv.2 더 맵게
import heapq as hq
hq.heapify(list)
hq.heappush(heap,item)
hq.heappop(heap)
    힙 모듈
Max Heap을 사용하려면 list의 item을 음수로 바꿔준 뒤 heap을 구성하면 된다.
for item in list:
    hq.heappush(heap, -item)</p>
<h3 id="26-gcd는-재귀로-쉽게-구현할-수-있다">26. GCD는 재귀로 쉽게 구현할 수 있다.</h3>
<p>프로그래머스 Lv.2 N개의 최소공배수
def gcd(a, b):
    if b == 0:
        return a
    return gcd(b, a % b)</p>
<h3 id="27-여러-개의-최소공배수는-각-lcm을-누적-반복하면-구할-수-있다">27. 여러 개의 최소공배수는 각 LCM을 누적 반복하면 구할 수 있다.</h3>
<p>프로그래머스 Lv.2 N개의 최소공배수
    리스트의 앞 두 수의 최소공배수를 구한 뒤, 구한 최소공배수와 다음 수와의 최소공배수로 갱신한다.</p>
<h3 id="28-하노이-탑은-재귀함수로-구현할-수-있다">28. 하노이 탑은 재귀함수로 구현할 수 있다.</h3>
<p>프로그래머스 Lv.2 하노이의 탑</p>
<ol>
<li>n == 1이 되면 1번에서 3번으로 옮김</li>
<li>1번에서 n-1 탑을 2번에 옮기는 재귀 실행</li>
<li>1번의 n번째 판을 3번에 옮김</li>
<li>2번의 n-1 탑을 3번에 옮기는 재귀 실행</li>
</ol>
<h3 id="29-split-을-사용하면-공백이-중복되는-경우-공백-개수를-무시하고-없앤다">29. split( )을 사용하면 공백이 중복되는 경우 공백 개수를 무시하고 없앤다.</h3>
<p>프로그래머스 Lv.2 JadenCase 문자열 만들기
    공백 한 개 만을 기준으로 split하려면 split(‘ ‘)을 사용해야 한다.</p>
<h3 id="30-caplitalize-는-첫-번째-문자만-대문자화-하고-뒤는-소문자화-한다">30. caplitalize( )는 첫 번째 문자만 대문자화 하고, 뒤는 소문자화 한다.</h3>
<p>프로그래머스 Lv.2 JadenCase 문자열 만들기
“aBCdEfG”.capitalize()
    “Abcdefg”</p>
<h3 id="31-포함-여부를-확인하는-문제는-해시테이블을-이용한다">31. 포함 여부를 확인하는 문제는 해시테이블을 이용한다</h3>
<p>프로그래머스 Lv.2 전화번호 목록
    딕셔너리는 in 함수의 복잡도가 O(1)이므로 딕셔너리로 포함여부를 찾는 것이 좋다.</p>
<h3 id="32-문제를-나눌-수-있고-중복연산이-필요한-경우는-다이나믹-프로그래밍을-고려하라">32. 문제를 나눌 수 있고 중복연산이 필요한 경우는 다이나믹 프로그래밍을 고려하라.</h3>
<p>프로그래머스 Lv.2 가장 큰 정사각형 찾기
DP 테이블을 만들어 메모이제이션을 한다.</p>
<ol>
<li>점화식을 이용해 답을 구하는 경우는 연산에 필요한 만큼 초기화된(0) 배열 생성</li>
<li>이미 문제에 리스트가 있는 경우는 최종값을 구할 수 있도록 내부 요소 변경</li>
</ol>
<h3 id="33-슬라이싱을-할-때-끝-인덱스가-마지막을-넘어도-자동으로-마지막-인덱스까지-자른다">33. 슬라이싱을 할 때 끝 인덱스가 마지막을 넘어도 자동으로 마지막 인덱스까지 자른다.</h3>
<p>프로그래머스 Lv.2 가장 큰 수
temp = ‘abcd’
print(temp[:1000])</p>
<blockquote>
<blockquote>
<p>abcd
lambda 정렬 방법</p>
</blockquote>
</blockquote>
<ol>
<li>길이 순 정렬
sort(key = lambda x : len(x))</li>
<li>기존 값에 변화를 준 뒤 그 기준에 따라 정렬 (ex: 일의자리 순)
sort(key = lambda x : x % 10)</li>
</ol>
<h3 id="34-for-문에서-key-변수는-while-문과-달리-n-1로-종료된다">34. for 문에서 Key 변수는 while 문과 달리 n-1로 종료된다.</h3>
<p>프로그래머스 Lv.2 괄호 회전하기
for i in range(n):
    반복문을 끝까지 순회한 뒤 i는 n-1이 됨.</p>
<h3 id="35-두-리스트의-겹치는-요소를-찾을-때는-집합과-딕셔너리를-이용하자">35. 두 리스트의 겹치는 요소를 찾을 때는 집합과 딕셔너리를 이용하자</h3>
<p>프로그래머스 Lv.2 카카오 2018 [1차] 뉴스 클러스터링
    딕셔너리의 in 함수가 O(1) 임을 이용한다.
두 리스트 A와 B가 있는 경우
A_set = list(set(A))
for v in B:
    B_dic[v] = 1
    A_set[i] in B_dic 
    조건을 이용하여 ANB(교집합) 리스트에 append
중복 포함을 허용하는 경우는 A_dic, B_dic의 value를 증가시켜
min(A_dic[v], B_dic[v])
만큼 ANB에 v를 append하면 된다.</p>
<h3 id="36-재귀함수를-사용하면-반드시-recursion-limit을-설정하자">36. 재귀함수를 사용하면 반드시 Recursion limit을 설정하자</h3>
<p>이코테 DFS BFS 미로탈출
import sys
sys.setrecursionlimit(10**7)
    재귀함수를 사용하는 경우 이 옵션을 써야 에러를 피할 수 있다.</p>
<p>2023.05.08(월)
프로그래머스 1레벨부터 파이썬 풀이 다시 시작</p>
<h3 id="37-set-메서드">37. set 메서드</h3>
<p>프로그래머스 Lv.1 약수의 합
set( ) 선언, set([1,3,5,7]) 
리스트를 집합으로 변환 가능 -&gt; 중복요소 제거
in – ele in s – bool 값 반환
update – 여러 요소 전달 s.update([1,3,4])
remove – 제거 – 없으면 오류 발생
discard – 제거 – 없어도 오류 발생 x
|  - 합집합 , &amp; - 교집합, -  - 차집합, ^ - 대칭차집합</p>
<h3 id="38-range--는-범위의-시작과-끝이-같으면-종료된다">38. range( ) 는 범위의 시작과 끝이 같으면 종료된다.</h3>
<p>-&gt; range(1, 1) 
반복문에 넣으면 동작하지 않음.</p>
<h3 id="39-문자열을-list--로-감싸면-문자별-요소로-리스트-저장된다">39. 문자열을 list( ) 로 감싸면 문자별 요소로 리스트 저장된다.</h3>
<p>프로그래머스 Lv.1 자릿수 더하기
list(“abc”) -&gt; [‘a’,’b’,’c’]</p>
<h3 id="40-문자열-메서드는-기존-문자열-변환이-아니라-새-문자열을-반환한다">40. 문자열 메서드는 기존 문자열 변환이 아니라 새 문자열을 반환한다.</h3>
<p>프로그래머스 Lv.1 문자열 내 p와 y의 개수
a = s.lower()
    a와 s는 다른 문자열</p>
<h3 id="41-int문자열-을-수행하면-문자열을-그대로-정수로-바꾼-결과를-반환한다">41. int(문자열) 을 수행하면 문자열을 그대로 정수로 바꾼 결과를 반환한다.</h3>
<p>프로그래머스 Lv.1 문자열을 정수로 바꾸기
val = int(“1253”)
    val == 1253</p>
<h3 id="42-find--함수와-index--함수의-차이">42. find( ) 함수와 index( ) 함수의 차이</h3>
<p>프로그래머스 Lv.1 추억 점수
find( )
는 문자열에서 사용 가능하고 찾는 문자가 없으면 -1을 반환한다.
index( )
는 리스트와 튜플에서 사용 가능하고 찾는 문자가 없으면 오류를 발생시킨다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[python] 문자열에 0 또는 특정 문자를 원하는 개수만큼 추가하는 메서드 (ljust, rjust, zfill)]]></title>
            <link>https://velog.io/@beyond-developer/python-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%97%90-0-%EB%98%90%EB%8A%94-%ED%8A%B9%EC%A0%95-%EB%AC%B8%EC%9E%90%EB%A5%BC-%EC%9B%90%ED%95%98%EB%8A%94-%EA%B0%9C%EC%88%98%EB%A7%8C%ED%81%BC-%EC%B6%94%EA%B0%80%ED%95%98%EB%8A%94-%EB%A9%94%EC%84%9C%EB%93%9C-ljust-rjust-zfill</link>
            <guid>https://velog.io/@beyond-developer/python-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%97%90-0-%EB%98%90%EB%8A%94-%ED%8A%B9%EC%A0%95-%EB%AC%B8%EC%9E%90%EB%A5%BC-%EC%9B%90%ED%95%98%EB%8A%94-%EA%B0%9C%EC%88%98%EB%A7%8C%ED%81%BC-%EC%B6%94%EA%B0%80%ED%95%98%EB%8A%94-%EB%A9%94%EC%84%9C%EB%93%9C-ljust-rjust-zfill</guid>
            <pubDate>Mon, 22 May 2023 10:16:14 GMT</pubDate>
            <description><![CDATA[<blockquote>
<pre><code>&lt;문자열&gt;.ljust(&lt;길이&gt;, &lt;문자&gt;)
&lt;문자열&gt;.rjust(&lt;길이&gt;, &lt;문자&gt;)
&lt;문자열&gt;.zfill(&lt;길이&gt;)</code></pre></blockquote>
<pre><code>

파이썬에서 어떤 문자열이 존재할 때, 그 문자열이 특정 길이가 될 때 까지 추가하는 메서드가 존재한다.

예를 들어,</code></pre><p>&#39;1001&#39;
&#39;ABafge&#39;
&#39;1pr&#39;</p>
<pre><code>
이렇게 각기 다른 길이의 문자열이 있을 때,
6의 길이로 고정하여 &#39;#&#39;을 문자열의 앞에 붙여야 한다고 가정하자.</code></pre><p>&#39;##1001&#39;
&#39;ABafge&#39;
&#39;###1pr&#39;</p>
<pre><code>
원하는 결과물은 위와 같다.

이 때, 
파이썬에서는 ljust( ) 라는 메서드를 사용할 수 있다.
</code></pre><p>&lt;문자열&gt;.ljust(&lt;길이&gt;, &lt;문자&gt;)</p>
<pre><code>의 형태로 사용할 수 있으며, 
위의 예시와 같은 결과물을 내려면

```python
arr = [&#39;1001&#39;, &#39;ABafge&#39;, &#39;1pr&#39;] 

for i in range(len(arr)):
    arr[i] = arr[i].ljust(6, &#39;#&#39;)

#[&#39;##1001&#39;, &#39;ABafge&#39;,&#39;###1pr&#39;]
print(arr)
</code></pre><p>이런 방법으로 사용할 수 있다.
2번째 예시에서 이미 문자열의 길이가 6이기 때문에, &#39;#&#39;의 추가가 일어나지 않는 점에 유의하자.</p>
<p>반대로 오른쪽에 문자를 추가하고 싶은 경우는 </p>
<pre><code>&lt;문자열&gt;.rjust(&lt;길이&gt;, &lt;문자&gt;)</code></pre><p>를 사용하면 된다.</p>
<p>그 이외에, 
문자열의 앞쪽(왼쪽)에 &#39;0&#39;을 추가하고자 할 때 사용할 수 있는 zfill() 메서드가 존재한다.</p>
<pre><code>&lt;문자열&gt;.zfill(문자)</code></pre><pre><code class="language-python">val = &#39;101&#39;

#&#39;000101
print(val.zfill(6)</code></pre>
<p>이는 2진수 형태의 문자열을 처리해야 하는 경우 
문자열의 길이를 고정할 때 사용할 수 있다.</p>
]]></description>
        </item>
    </channel>
</rss>