<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>e_rho.log</title>
        <link>https://velog.io/</link>
        <description>Hello!</description>
        <lastBuildDate>Wed, 08 Jun 2022 07:56:30 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>e_rho.log</title>
            <url>https://images.velog.io/images/e_rho/profile/c515c90f-2580-46c1-aef0-d0e47b0aa85c/social.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. e_rho.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/e_rho" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[TS] 0. 개요]]></title>
            <link>https://velog.io/@e_rho/TS-0.-%EA%B0%9C%EC%9A%94</link>
            <guid>https://velog.io/@e_rho/TS-0.-%EA%B0%9C%EC%9A%94</guid>
            <pubDate>Wed, 08 Jun 2022 07:56:30 GMT</pubDate>
            <description><![CDATA[<p>이번 세번째 프로젝트에서 타입스크립트를 써보기로 했기에,, 공부를,, 해야한다.. </p>
<h1 id="js-vs-ts">JS vs TS</h1>
<p>너무나도 역동적인 당신.. 자바스크립트.. 의 한계를 극복하고자 도입된 타입스크립트! 
자바스크립트가 실행 단계에 가서야 확인할 수 있었던 타입에러를 코드단에서 확인하고 잡을 수 있다는 장점이 있다고 한다.</p>
<p>우리가 타입스크립트를 사용했다면, 자바스크립트로 변환하는 컴파일 과정이 필요하다. </p>
<h4 id="js-사용">JS 사용</h4>
<pre><code class="language-js">(1)
let a;

a = 1000;
a = &#39;string&#39;;

(2)
const sum = (a, b) =&gt; {
    return a + b
}
sum(1, &quot;5&quot;) // 12</code></pre>
<h4 id="ts-사용">TS 사용</h4>
<pre><code class="language-ts">(1)
let a : number;

a = 1000;
a = &#39;string&#39;;
// Type &#39;string&#39; is not assignable to type &#39;number&#39;.ts(2322)

(2) 
const sum = (a :number, b:number) =&gt; {
    return a + b
}
sum(1,5) // 6</code></pre>
<h1 id="ts의-type">TS의 Type</h1>
<p>타입스크립트는 결국 변수에 &quot;타입&quot;을 정의하겠다는 것인데, 이는 타입표기(Type Annotation)을 사용해서 나타낼 수 있다.</p>
<h2 id="기본-자료형">기본 자료형</h2>
<p>object와 reference 형태가 아닌 실제 값을 저장하는 자료형이다.</p>
<ul>
<li>string, boolean, number, null, undefined, symbol</li>
</ul>
<p>사용 방법 </p>
<pre><code class="language-ts">let 변수명 : type = value;

// null과 undefined는 type 과 value에 모두 null 또는 undefined를 작성
// null == undefined (true)
// null === undefined (false) </code></pre>
<h2 id="참조-자료형">참조 자료형</h2>
<p>객체, 배열, 함수 등과 같은 object 형식의 타입이다. 참조 즉 reference 방식을 사용한다는 것은 곳 메모리에 값을 저장하고, 메모리 주소를 참조하여 연산을 수행한다고 보면 된다. </p>
<ul>
<li>object, array, function </li>
</ul>
<pre><code class="language-ts">let arr: number[] = [1, 2, 3]
let arr: Array&lt;number&gt; = [1, 2, 3] // 제네릭을 사용한 표기법</code></pre>
<h2 id="추가-자료형">추가 자료형</h2>
<p>타입스크립트에서 추가로 제공하는 타입이 있다. </p>
<ul>
<li>tuple, enum, any, void, never </li>
</ul>
<h3 id="튜플">튜플</h3>
<p>길이와 각 요소의 타입이 정해진 배열을 저장하는 타입이다. tuple은 이전에 파이썬을 하면서 배운 적이 있는데, 중복이 안되고 <code>[]</code> 보다는 <code>()</code>을 사용했던 그 개념과는 약간 다른 것 같다. </p>
<pre><code class="language-ts">let arr: [string, number] = [&quot;Hi&quot;, 6]</code></pre>
<p>따라서 만약에 number인 요소에 <code>.concat()</code>을 시도하려고 했다거나, 정의되지 않은 인덱스 값을 호출하려고 하면 에러가 난다는 것이다. </p>
<h3 id="enum">enum</h3>
<p>enum은 특정 값(상수)들의 집합을 저장하는 타입이다. 인덱싱이 가능하고, 인덱스를 변경하기까지 할 수 있다!</p>
<pre><code class="language-ts">enum Hey {Hi=1, Hello=2, Cheers=3};

let greeting: Hey = Hey.Hi; 
let greeting: Hey = Hey[1];</code></pre>
<p>흠 개인적으로 enum은 Class랑 비슷한 느낌이 들었다.
enum을 사용하면 코드가 단순해지고, 인스턴스 생성과 상속을 방지한다고 되어있다. 이 친구에 대해 좀더 궁금해졌다.</p>
<h3 id="any">any</h3>
<p>any는 말 그대로 정말 그 어떤 타입이 와도 된다. 컴파일 중 타입 검사를 하지 않는다는 것을 의미한다.</p>
<h3 id="void">void</h3>
<p>텅 비었다는 void. 함수에서 반환 값이 없을 때 사용하며, any의 반대라고도 볼 수 있다. 변수의 undefined, null과 비슷하지만 void는 변수에 사용할 수 없다. </p>
<h3 id="never">never</h3>
<p>발생할 수 없는 타입으로, 항상 오류를 발생시키거나 절대 반환하지 않는 반환 타입이다. 함수에서 return이 곧 종료를 의미했던 것을 생각해본다면, 반환되지 않는다는건 함수가 종료되지 않음을 의미한다. 예시로 무한 루프를 도는 함수에 never type을 작성할 수 있다는 것이다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[오류에 당황하지 않기]]></title>
            <link>https://velog.io/@e_rho/eslint-prettier</link>
            <guid>https://velog.io/@e_rho/eslint-prettier</guid>
            <pubDate>Wed, 08 Jun 2022 07:15:57 GMT</pubDate>
            <description><![CDATA[<p>prettier 는 저번 프로젝트때 써봤는데, eslint는 이번이 처음이었다.
eslint는 오류가 있을 때 빨간 줄을 죽죽 그어주는, 마치 한글이나 워드의 맞춤법 오류기같은 존재로 대강 생각하고있었다.</p>
<p>그.런.데
서버 구축을 위해 필요한 npm 패키지들을 깔고 나니
갑자기 모든 파일의 모든 줄에서 빨간색 줄이 팍! 떠버렸다.</p>
<p>eslint랑 prettier가 서로 충돌이 난 것 같긴 했는데 애초에 설정 파일을 팀원한테서 받아온 것이다보니.. 나는 진정 아무것도 모르겠는 것.. </p>
<p>구글링으로 다른 분의 velog를 읽어보니 eslint가 npm과 얽히면 뭔가 문제가 생기는 듯 했다.</p>
<p><img src="https://velog.velcdn.com/images/e_rho/post/1ad5dc34-9a8b-48e4-b060-a380c9eed0d5/image.png" alt="Delete `␍` eslint(prettier/prettier)"></p>
<p>아래 velog에서 제시해주신 방법대로 해보니 일단은 엄청난 빨간색 줄을 멈출 수 있었다. </p>
<p>멈춰!! ✋
<a href="https://velog.io/@realsong/VS-Delete-prettierprettier-해결-방법">참고한 해결 방법!</a></p>
<p>그런데도 나의 오류창은 여기서 멈추지 않았다. </p>
<p>자세히 보니 string 을 감싸는 quote, 즉 따옴표에 뭔가 문제가 있었다. 
아무래도 &quot;&quot; double과 &#39;&#39; single이 어디선가 충돌이 나는 것 같았다.
왜냐하면 더블도 싱글도 모두 에러가 났거덩 🤔</p>
<p>그래서 prettier 와 eslint 파일을 뜯어보기로 했다.
그랬더니 어머나 prettier 는 <code>singlequote: true</code> 로 되어있었고, eslint는 <code>quote: [&#39;warn&#39;, &#39;double&#39;]</code> 로 되어있는게 아닌가.</p>
<p>prettier는 single로 바꿔주는데, eslint는 double이 옳고 singel이 그른 것이라 하니 문제가 생긴 것이다.</p>
<p>우리 팀은 prettier를 전역으로 쓰고, eslint는 프론트팀과 백엔드팀이 각각 지정해서 쓰고 있기에 전역인 prettier에 따라,, eslint를 바꿔주었더니 완전 해결 완료다!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Node.js] 3. 서비스로 모듈 간 연결하기 (번역)]]></title>
            <link>https://velog.io/@e_rho/translated-Tao-of-Node-3</link>
            <guid>https://velog.io/@e_rho/translated-Tao-of-Node-3</guid>
            <pubDate>Tue, 07 Jun 2022 08:00:16 GMT</pubDate>
            <description><![CDATA[<h1 id="structure--coding-practices">Structure &amp; Coding Practices</h1>
<h2 id="🗨-use-services-to-communicate-between-modules">🗨 Use services to communicate between modules</h2>
<p>MVC 구조를 갖는 어플리케이션에서는 앱 내의 기술적인 역할들(ex. service, schema...)을 기준으로 경계가 나누어졌었다. 즉, 로직이 다른 것에 대해서는 딱히 구분선이 명확하지 않은 것이다. 이전에도 언급했다시피, 나는 각 모듈이 도메인의 한 부분을 담당하는 형태의 모듈화된 구조를 굉장히 선호한다.</p>
<p>예를들어, (유저,품목,주문으로 이루어진 예시 어플리케이션에서) 인증 라우터와 계정 라우터를 위한 핸들러를 가지고있는 <strong>유저 모듈</strong>을 생각해보자. 또, 주문과 관련된 모든 것을 처리하는 <strong>주문 모듈</strong>도 가지고 있을 것 같다. <span style="color:#E83A14">그런데 유저가 주문을 하는 동안 주소를 업데이트하는 그런 경우도 생길 수 있지 않겠는가?</span></p>
<p>이 로직은 언급한 두 모듈이 사용되는데, 우리는 <strong>이걸 정확히 어디서 처리를 해야하는가</strong>에 대한 난제에 직면하게 된다. 우리는 배달 모듈에 사용자의 상세 정보를 업데이트하는 데이터베이스 쿼리를 짤 수 있겠지만 이는 곧 우리가 유저와 관련된 로직을 유저모듈 밖에 두게 된다는 것을 의미하고, 만들어둔 경계를 흐트러트리는 셈이다.</p>
<p>이 사태를 피하기 위해서 <strong>유저와 관련된 로직들을 유저 모듈의 서비스에서 실행</strong>하는 것이 가장 좋다. 그 다음 배달(딜리버리) 모듈에서 함수를 부르면 된다. 경계를 유지하고 필요한 곳에 로직을 위치시키는 방법을 쓰자는 것이다. 배달(딜리버리) 모듈은 유저 정보가 업데이트 되었는지는 모르고, 단지 추상화(abstraction)에 의존한다.</p>
<pre><code class="language-js">// 👎 Don&#39;t break the boundaries of the domain modules
const placeOrderHandler = (req, res) =&gt; {
  const { products, updateShippingAddress } = req.body

  if (updateShippingAddress) {
    // Update the user&#39;s default shipping address
    const { user } = res.locals.user
    const { shippingAddress } = req.body
    knex(&#39;users&#39;).where(&#39;id&#39; &#39;=&#39;, user.id).update({ shippingAddress })
  }
}

// 👍 Communicate using services
const placeOrderHandler = (req, res) =&gt; {
  const { products, updateShippingAddress } = req.body

  if (updateShippingAddress) {
    // Update the user&#39;s default shipping address
    const { user } = res.locals.user
    const { shippingAddress } = req.body
    userService.updateShippingAddress(user.id, shippingAddress)
  }
}</code></pre>
<p>만약 메인 application 밖으로 서비스를 추출해야한다면, 배달(딜리버리) 모듈은 그 어떤 변화도 없이 같은 기능을 호출해올 수 있다. 같은 방식으로, 유저 서비스에도 배달 모듈에 변화를 주지 않고도 같은 일을 할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Monolith VS. Microservice Architecture]]></title>
            <link>https://velog.io/@e_rho/Monolith-VS.-Microservice-Architecture</link>
            <guid>https://velog.io/@e_rho/Monolith-VS.-Microservice-Architecture</guid>
            <pubDate>Tue, 07 Jun 2022 06:36:05 GMT</pubDate>
            <description><![CDATA[<p>노드를 이용한 앱 구조에 대해 다룬 글을 읽었는데,
만들 application이 Monolitic한지, Microservice 기반인지를 생각하는 것이 중요하다는 글이 있었다.</p>
<p>그래서 두 architecture에 어떤 차이가 있는지 지금부터 살펴보도록 하겠다. </p>
<h1 id="monolith-vs-microservice">Monolith vs. Microservice</h1>
<hr>
<p><img src="https://velog.velcdn.com/images/e_rho/post/a9722586-cf03-40c5-85b7-589aa682884f/image.png" alt="Monolithic Architecture vs. Microservice Architecture"></p>
<h4 id="참고문헌-references">참고문헌 References</h4>
<p><a href="https://www.mulesoft.com/resources/api/microservices-vs-monolithic">1. Microservices vs Monolithic Architecture</a> (text)
<a href="https://www.youtube.com/watch?v=R939UZzJO1c">2. MONOLITH VS MICROSERVICES ARCHITECTURE</a> (youtube)</p>
<h2 id="🗨-monolith">🗨 Monolith</h2>
<p>monolith는 한글로 돌기둥이다.</p>
<h4><span style="color:#FF8080">즉, app이 하나의 단위(single unit)로 돌아가면 monolith이다.</span></h4>

<p>대체로 <strong>database</strong>, <strong>client-side</strong>(HTML, JS 등 유저 인터페이스), <strong>server-side</strong>(HTTP 요청응답, 도메인별 로직, 등등)으로 구성되며 시스템을 변경하려면 개발자가 업데이트된 버전의 server-side app을 빌드하고 배포해야한다.</p>
<p>이런 시스템은 작은 팀에서 cost-effectively, 직관적으로 사용할 수 있다. 초기 단계에서 손쉽게 개발이 가능함을 의미하기도 한다. </p>
<p>그러나 단점도 존재한다!
모든 레이어가 너무 타이트하게(촘촘히) 연결되어있고, 재사용성이 낮다.</p>
<h2 id="🗨-microservice">🗨 Microservice</h2>
<h4><span style="color:#FF8080">독립적인 모듈 단위로 코드가 나눠져있다.</span></h4>


<p>보통 IT 대기업들이 선호하고 지향하는 방향이라고 하니 보통 장점 위주로 나와있는 것 같다. monolith와 대비되는 특징들(어쩌면 장점)을 살펴보자. </p>
<p>이러한 아키텍쳐에서는 코드들이 독립적이기에 개발자들이 서로 다른 기술 스택을 사용해도 된다. 즉 전체 코드베이스를 이해하지 않아도 개발이 가능하다는 것이다! 하드웨어와 데이터베이스가 달라도 가능하다. AWS와 같은 클라우드 기술이 이러한 방식을 이끌어 나갈 것이라고 한다.</p>
<p>monolith보다는 큰 규모의 프로젝트에 유용하게 사용될 수 있다. 계속해서 프로젝트를 스케일업 해나갈 때, 클린 코드를 사용하고 싶을 때, 장기적인 수완을 생각했을 때 이러한 접근이 가능하다. 또, 외주(아웃소싱)를 맡기는 프로젝트에도 찰떡같이 쓰일 수 있다. </p>
<p>물론 microservice 아키텍쳐에도 단점은 있다. (그러니까 monolith를 쓰는데도 있겠지?)
기능이 모듈화 되어야한다. 또 서로 다른 기술 스택은 자동화에서 어려움을 겪을 수 있다. 데이터를 전송하는 과정에서 추가적인 computing power가 필요하다. </p>
<p>monolith에 비해 초기 단계가 쉬운 건 아니지만, 테스트와 코드 업데이트가 용이하다. 
또, 기업(enterprise) 수준에서는 monolith보다 더 경제적인 솔루션이 될 수 있다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Node.js] 2. 핸들러, 서비스, 레포지토리 구조로 만들기 (번역)]]></title>
            <link>https://velog.io/@e_rho/translated-Tao-of-Node-2</link>
            <guid>https://velog.io/@e_rho/translated-Tao-of-Node-2</guid>
            <pubDate>Tue, 07 Jun 2022 01:06:58 GMT</pubDate>
            <description><![CDATA[<h5 id="이-블로그-글은-제시된-원문을-직접-번역한-것입니다-오역이-있을-수-있으니-꼭-원문을-참고하시길-바라요">이 블로그 글은 제시된 원문을 직접 번역한 것입니다. (오역이 있을 수 있으니 꼭 원문을 참고하시길 바라요!)</h5>
<p>This article will give you a translated version of <a href=https://alexkondov.com/tao-of-node target=blank >Original Article</a>.</p>
<h1 id="structure--coding-practices">Structure &amp; coding Practices</h1>
<h2 id="🗨-start-with-a-modular-monolith-br-모듈화된-monolitharchitecture로-시작하기">🗨 Start with a modular monolith <br>:: 모듈화된 monolith(architecture)로 시작하기</h2>
<p>새로운 app을 만들기 전에 반드시 app이 monolith인지 microservice 기반인지를 생각해보는 것이 가장 중요할 것이다. <a href="https://velog.io/@e_rho/Monolith-VS.-Microservice-Architecture" target="_blank" style="color:grey">(monolith architecture vs. microservice architecture 정리한 글 링크)</a> </p>
<p>최근 대부분의 개발자와 아키텍터들은 microservice achitecture를 선택하고있다. 서비스를 확장하기에도 좋고, (코드) 독립성을 가질 수 있으며 큰 규모의 프로젝트를 진행시키면서 나오는 조직적인 어려움을 해결하기 때문이다. </p>
<p>Microservice는 하나의 어플리케이션을 작은 서비스들로 쪼개고 서로 다른 것끼리 communication하는 패턴으로, 널리 쓰이고 있다. 가장 간단한 예시는 사용자(user), 물품(product), 주문(order)에 대한 컴포넌트를 가지고 있는 시스템을 들 수 있다. 각각의 독립체(컴포넌트)사이의 경계가 잘 정의된 이커머스가 종종 언급되는 예시이다. (항상 그런 것은 아니다!)</p>
<p>개발하고 있는 도메인에 따라서 그 경계는 아주 모호할 수도 있다. 이런 모호함으로 어떤 서비스에서 어떤 운영 방식이 도입되어야하는지 구별하기 어려워진다. 서비스를 분리하는 것은 많은 이점을 제공하지만, 분배 시스템의 문제를 가져온다. 그래서 나(필자)는 항상 <span style="color:#FF8080">모듈로 된 monolith로 시작</span>해서 어플리케이션의 진화를 가능케 하라고 조언하는 편이다. </p>
<p>나는 <span style="color:#FF8080">monolith 구조가 저평가되고 있다</span>는 마이너한 의견을 지지한다(ㅋㅋ). monolith는 개발자로하여금 더 빨리 움직이게 하고, 특정한 모듈 하나에 초점을 맞추면서 반-독립(고립)된 상태에서 일할 수 있게 한다. 모든게 같은 레포지토리에 있기때문에 이리저리 옮겨다니기에도 편하고, 만약 모듈성(modularity)을 잘 유지한다면, monolith에서 서비스를 추출해내는건 그리 어렵지 않을 것이다. </p>
<p><span style="color:#FF8080">각 모듈이 잠재적으로 분리된 서비스라고 생각</span>하고, 그 <span style="color:#FF8080">모듈들 사이를 연결(communication)</span>할 약속(contracts)에 의존해보라. </p>
<h2 id="🗨-split-the-implementation-in-layers-br--층으로-나누기">🗨 Split the implementation in layers <br> :: 층으로 나누기</h2>
<p>대부분의 Node 서비스 디자인에서 가장 큰 결함은 <span style="color: #bb005c ">핸들러 기능에서 너무 많은 것을 한다</span>는 것이다. 이것은 MVC 구조를 사용하는 app에서 컨트롤러 클래스가 경험하는 문제이다. 전송(transport), 데이터 액세스, 및 비즈니스 로직을 단일 기능으로 처리함으로써 긴밀하게 결합된 기능들을 만들어낼 수 있다. </p>
<p>유효성 검사(validation), 비즈니스 로직, 요청 객체(request object)에서 값을 직접적으로 사용하는 데이터베이스 호출을 볼 일은 잘 없긴 하다. 아래 예시는 매우 간단한 예시다!</p>
<pre><code class="language-js">// 👎 Avoid creating handlers with too many responsibilities
// unless the scope of the application is small
const handler = async (req, res) =&gt; {
  const { name, email } = req.body

  if (!isValidName(name)) {
    return res.status(httpStatus.BAD_REQUEST).send()
  }

  if (!isValidEmail(email)) {
    return res.status(httpStatus.BAD_REQUEST).send()
  }

  await queryBuilder(&#39;user&#39;).insert({ name, email })]

  if (!isPromotionalPeriod()) {
    const promotionalCode = await queryBuilder
      .select(&#39;name&#39;, &#39;valid_until&#39;, &#39;percentage&#39;, &#39;target&#39;)
      .from(&#39;promotional_codes&#39;)
      .where({ target: &#39;new_joiners&#39; })

    transport.sendMail({
      // ...
    })
  }

  return res.status(httpStatus.CREATED).send(user)
}</code></pre>
<p>위의 예시는 많은 유지보수를 요구하지 않는 작은 app에서는 수용가능한 접근법이다. 그러나 이런 결정으로 인해 더 큰 규모의 확대가 어려워진다. </p>
<p>핸들러들은 더 길고, 읽기 어려워지고, 테스트하기 어려워진다. 기능이 한 가지에 집중해야하는 것은 아주 흔한 이해이지만, 이 경우, 핸들러 기능은 너무 많은 일을 하고 있다. 핸들러에서 validation, business logic, data fetching을 처리해서는 안된다. </p>
<p>대신에, <strong>핸들러 기능은 전송(HTTP) 층에 초점을</strong> 맞춰야 한다. 데이터 불러오기(fetching)와 외부 연결(communication)에 관한 모든 것은 그 자체의 기능이나 모듈에서 추출되어야 한다.</p>
<pre><code class="language-js">// 👍 Handlers should only handle the HTTP logic
const handler = async (req, res) =&gt; {
  const { name, email } = req.body

  if (!isValidName(name)) {
    return res.status(httpStatus.BAD_REQUEST).send()
  }

  if (!isValidEmail(email)) {
    return res.status(httpStatus.BAD_REQUEST).send()
  }

  try {
    const user = userService.register(name, email)
    return res.status(httpStatus.CREATED).send(user)
  } catch (err) {
    return res.status(httpStatus.INTERNAL_SERVER_ERROR).send()
  }
}</code></pre>
<p>위에서 언급한 <span style="color:#bb005c">데이터 불러오기와 외부적인 연결을 처리하는 모듈은 &quot;서비스&quot;</span>라고 불린다. 이 배경에 어떤 역사적인 이유가 있는지는 확실치 않지만, 우리가 말한 뜻을 모두가 이해하기 위해서 용어를 자세히 들여다보자. </p>
<p>이러한 로직을 &quot;서비스&quot;로 묶음으로써 우리는 층으로 움직이는 시스템(layer-driven system)을 구축하게 된다. 핸들러는 전송에 관련된 것을 처리하고, 우리의 서비스는 HTTP 요청에 응답하는 것인지, 이벤트로 부터 발생된 메시지인지 알지 못한 채 도메인과 데이터에 접근하는 로직을 다룬다. </p>
<p>이렇게 하는 이유는 <strong>app 내에서 쓰임이 다른 것끼리 구분하고, 경계선을 그으려고 하는 것</strong>이다.조금 덜 복잡한 app의 경우 이 단계만으로도 큰 개선이 될 것이다.</p>
<p>그러나 서비스가 계속해서 유저, 프로모션 코드, 이메일과 관련된 로직을 처리한다는 것을 깨닫게 될 것이다. 우리가 이미 전송 로직과 다른 것들 사이에 경계를 두었음에도 불구하고 역할(책임; responsibilities)의 측면에서는 <span style="color:#bb005c">서비스가 아직도 너무 많은 일을 하고있다</span>.</p>
<pre><code class="language-js">// user-service.js
export async function register(name, email) {
  const user = await queryBuilder(&#39;user&#39;).insert({ name, email })]  // 아래와 차이점

  if (!isPromotionalPeriod()) {
    const promotionalCode = await promotionService.getNewJoinerCode()
    await emailService.sendNewJoinerPromotionEmail(promotionalCode)
  }

  return user
}</code></pre>
<p>유저와 직접 관련되지 않은 로직을 따로 추출함으로써 이 서비스를 스스로 모든 것을 다하는것 대신 대표자(delegate)로 만들 수 있다. 하지만 말할 수 있는 것은, 서비스의 역할이 아직도 너무 방대하다. </p>
<p>넓게 통용되는 패턴은 <span style="color:#bb005c">데이터 접근 로직을 &quot;레포지토리(repository)&quot;로 빼는 것</span>이다. </p>
<pre><code class="language-js">// user-service.js
export async function register(name, email) {
  const user = await userRepository.insert(name, email)  // 위와 차이점

  if (!isPromotionalPeriod()) {
    const promotionalCode = await promotionService.getNewJoinerCode()
    await emailService.sendNewJoinerPromotionEmail(promotionalCode)
  }

  return user
}</code></pre>
<p>데이터 접근을 레포지토리로 요약함으로써 서비스는 오직 비즈니스 로직을 위한 것이 된다. 게다가 테스트와 가독성이 높아진다. 가장 중요한건, 비즈니스와 데이터 사이를 기능적으로 구분할 수 있게 된 것이다. </p>
<p>이제 app의 로직이 전송, 도메인, 그리고 데이터 접근 층으로 나눠졌다. 각각을 바꿀 때 다른 것을 조금 바꾸거나 혹은 전혀 바꾸지 않아도 된다.만약 app이 Kafka 메세지를 소화시킬 필요가 있다면 우리는 다른 수송 층을 추가하고, 도메인과 데이터는 재사용하면 된다. </p>
<p>REST에서 gPRC 또는 messaging으로 옮겨가는건 정말 잘 일어나지 않는 일이다. 데이터 베이스를 바꾸는 경우는 더 희박하다. 그러나 그러한 가능성들을 인정함으로써 우리는 확장성, 가독성, 테스트가능성을 매우 향상시킬 수 있다. </p>
<p>아직 이러한 구조는 Node에서 유명하지는 않다. 모든 app이 이런 구조가 도움이 되는 것은 아니기 때문이다. 내가 주는 충고는 복잡성이 커지면 층을 추가하라는 것이다. 처음에는 핸들러만 가지고 시작해보다가 구조를 추가하는 위의 단계를 따라가보라. </p>
<blockquote>
<p><strong>My comment</strong>
이전에도 3계층으로 나누는걸 했었던 것 같은데... 이전에는 db(schema, models로 구성), routers, service, (필요시 middlewares)로 구성했었다. </p>
</blockquote>
<ol>
<li>schema는 데이터 베이스에 저장되는 필드 값의 속성을 지정해줄 수 있었다. </li>
<li>router에서는 HTTP 요청과 응답이 이루어지는 층이었다. </li>
<li>service는 라우터와 연결되어 에러메시지가 작성되고 여러가지 기본적인 로직들이 작성되는 곳이었다. </li>
<li>model은 데이터베이스에 접근해서 직접 query가 일어나는 곳이었다.
아마도 위 글에서 읽었던 handler-service-repository가 router-service-model 인걸까..? 이건 여쭤봐야겠당</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Node.js] 1. 모듈로 앱 구조 짜기 (번역)]]></title>
            <link>https://velog.io/@e_rho/translated-Tao-of-Node-1</link>
            <guid>https://velog.io/@e_rho/translated-Tao-of-Node-1</guid>
            <pubDate>Mon, 06 Jun 2022 16:40:51 GMT</pubDate>
            <description><![CDATA[<h5 id="이-블로그-글은-제시된-원문을-직접-번역한-것입니다-오역이-있을-수-있으니-꼭-원문을-참고하시길-바라요">이 블로그 글은 제시된 원문을 직접 번역한 것입니다. (오역이 있을 수 있으니 꼭 원문을 참고하시길 바라요!)</h5>
<p>This article will give you a translated version of <a href=https://alexkondov.com/tao-of-node target=blank >Original Article</a>.</p>
<h1 id="서론">서론</h1>
<p>  자바스크립트의 가장 큰 이점은 바로 브라우저와 서버에서 모두 동작한다는 것이다. 엔지니어로서 하나의 언어를 마스터할 필요가 있다. 그러면 우리는 갈고 닦은 기술을 다양하게 적용해볼 수 있을 것이다. 필자 또한 이런 이유로 2015년 노드에 입문했다. 
  Node는 프론트엔드와 백엔드 어플리케이션 사이에서 라이브러리, 로직, 타입을 재사용할 수 있다. 풀스택 개발자의 전형적인 예시가 될 수 있는 것이다! 
  Node 생태계는 처음 구축된 당시의 무거운 프레임워크에서 탈피하여 자유로움과 유연함에 초점을 맞추고 있다. 엄격한 코딩 기준이나 어플리케이션 구조를 따지지 않아도 된다! 대신.. 유연함엔 대가가 따르긴 한다. 
  JS를 처음 접했다면 Node 앱을 작성하는데 있어서 규칙과 원리를 찾기 어려울 것이다. OOP(객체지향프로그래밍)를 다뤄봤던 개발자들은 이전에 사용했던 언어에서 빠르게 관습들을 차용해올 수는 있다. </p>
<p>  필자가 Node app을 개발하며 세웠던 몇 가지 규칙들을 간략히 보여주려고 한다.</p>
<h1 id="structure--coding-practices">Structure &amp; Coding Practices</h1>
<p>앱 구조를 짜는 것은 전략적이고 전술적인 결정을 합친 것이다. 개발자들은 폴더 정렬, 층, 그 사이의 연결(communication)뿐만 아니라 낮은 수준의 디테일까지 생각해야한다. 하나라도 무시하면 디자인에 흠이 발생하게 된다. </p>
<h2 id="structure-the-applicaion-in-modules">Structure the applicaion in modules</h2>
<blockquote>
<p>모듈로 앱 구조 짜기</p>
</blockquote>
<p>백엔드 개발에서 가장 유명한 구조 디자인 패턴(structural design pattern)은 MVC이다. MVC는 대부분의 상황에 적용할 수 있고, 사용하기로 했다면 일이 잘못되는 일은 없다. MVC가 중점으로 다루고자 하는 것은 app의 기술적인 책임감들을 중점으로 구조화하는 것이다. HTTP 요청과 응답을 다루는 <strong>컨트롤러</strong>(controllers), 데이터베이스에서 데이터를 가져오는 <strong>모델</strong>(models), 응답을 시각화하는 <strong>뷰</strong>(views)로 구성된다.</p>
<p>이러한 접근법의 이점은 아직 크지 않다. 요즘에 대부분의 Node app은 JSON으로 통신해서 view 층이 필요하지 않은 REST한 서비스이다. 모델과 ORM을 사용하는 것도 항상 바람직한 것은 아니다.  데이터의 일부를 가지고있는 마이크로 서비스에 접근하는데 복잡한 도구들이 필요하지는 않기 때문이다. 그리고 컨트롤러 층은 종종 개발자들이 모든 종류의 로직을 컨트롤러에 쏟아내면서 복잡함 그 자체가 되기도 한다.</p>
<p>걱정을 나누는건 기술적 책임(역할)을 나누는 것과는 다른 얘기다. </p>
<p><strong>MVC 구조</strong>의 장점은 MVC를 사용하는 각각의 app이 같은 방식으로 구성되어있다는 점이다. 하지만 나는 이것을 &#39;결점&#39;으로 보았다. app의 구조는 이것이 무엇을 하는 건지 보여줄 수 있어야하고, 도메인에 대한 정보를 제공해야한다. 컨트롤러로 가득찬 폴더를 열어보는 것은 서비스 내의 로직이 어떻게 구분되는 것인지 그 어떤 맥락도 제공하지 않는다. 모델의 긴 목록으로도 모델 간의 관계를 나타내지는 않는다. </p>
<p><span style="color: #bb005c">노드 앱을 더 잘짜는 방식</span>은 도메인의 한 부분을 대표하는 <strong><span style="color: #bb005c">모듈들(modules)</span></strong>에 있다. 각각은 <strong><span style="color: #bb005c">핸들러, 모델, 테스트, 비즈니스 로직을 포함한 구분된 폴더</span></strong>이다. 이러한 구조는 <span style="color: #bb005c">서비스가 하는 일을 한 눈에 들여다보기 편하게 하고</span> 개발자로서 각 모듈의 모든 것에 대해 자신감을 갖게 한다. 놓친 것이 없는지 확인하기 위해 코드단에서 깊게 파볼 일이 없게 되는 것이다! </p>
<pre><code class="language-JavaScript">// 👎 Don&#39;t structure by technical responsibilities
├── src
|   ├── controllers
|   |   ├── user.js
|   |   ├── catalog.js
|   |   ├── order.js
|   ├── models
|   |   ├── user.js
|   |   ├── product.js
|   |   ├── order.js
|   ├── utils
|   |   ├── order.js
|   ├── tests
|   |   ├── user.test.js
|   |   ├── product.test.js

// 👍 Structure by domain modules
├── src
|   ├── user
|   |   ├── user-handlers.js
|   |   ├── user-service.js
|   |   ├── user-queries.js
|   |   ├── user-handlers.test.js
|   |   ├── index.js
|   ├── order
|   |   ├── order-handlers.js
|   |   ├── order-service.js
|   |   ├── order-queries.js
|   |   ├── order-handlers.test.js
|   |   ├── calculate-shipping.js
|   |   ├── calculate-shipping.test.js
|   |   ├── index.js
|   ├── catalog
|   |   ├── catalog-handlers.js
|   |   ├── product-queries.js
|   |   ├── catalog-handlers.test.js
|   |   ├── index.js</code></pre>
<p>모듈 구조에 대해서는 따라야 할 특정한 패턴은 없다. 도메인 파트에 따라서 다른 내용들이 있을 수 있다. 예를 들어 핸들러, 모델 수가 다를 수도 있고, 비즈니스 로직의 크기가 다를 수 있다. </p>
<p>금융업계와 의학계에서 운영되는 app은 다른 방식으로 구조를 짜야한다. 도메인이 작동하는 방식의 차이점이 코드단에서 보여야한다. 즉, 우리의 소프트웨어가 해결하고자하는 실제 문제에 따라서 다르게 구조를 짜야할 필요가 있다. 모든 비즈니스 도메인은 다른 어려움에 직면하므로 우리는 어플리케이션을 모두 같게 디자인해서는 안된다. </p>
<blockquote>
<p><strong>My comment</strong>
실제로 나는 controller, model 등을 따로 구분해서 그 안에 user, function1, function2가 계속 반복된 형태의 스트럭쳐를 사용했었다. 그냥 파일을 여는 것 자체가 좀 귀찮..고 어려웠는데 이렇게 모듈로 만들면 관리가 편할 것 같다!</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발문서에 대하여]]></title>
            <link>https://velog.io/@e_rho/%EA%B0%9C%EB%B0%9C%EB%AC%B8%EC%84%9C%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</link>
            <guid>https://velog.io/@e_rho/%EA%B0%9C%EB%B0%9C%EB%AC%B8%EC%84%9C%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</guid>
            <pubDate>Tue, 05 Apr 2022 01:22:28 GMT</pubDate>
            <description><![CDATA[<p>개발에 대해서 배우고 있는데, 자신에 대한 기준이 엄격하기 때문인지 구현이 두렵다. 또한, 나는 기획하고 프로젝트를 총괄하며 원활히 진행되도록 일조하는 일을 좋아하고 잘한다고 생각하기때문에 이 단계부터 알아가보려고 한다. </p>
<p>우선 프로젝트 순서를 이해하고, 내가 담당하여 작성할 개발문서에 대해 이해해보는 시간을 갖기로 했다. 
이하의 내용들은 내 생각과 더불어 인터넷 세상의 많은 경험들을 참고하여 작성했다.</p>
<h1 id="기획단계에서-필요한-프로젝트-문서">기획단계에서 필요한 프로젝트 문서</h1>
<h2 id="기획문서">기획문서</h2>
<p>기획문서는 프로젝트 시작 &quot;전&quot; 단계에서 정의해야할 내용을 작성한다. </p>
<h4 id="개발-범위-및-전체-일정">개발 범위 및 전체 일정</h4>
<p>어떤 프로젝트를 진행하건 프로젝트의 최종 목표가 무엇인지, 워크 플로우와 일정은 어떻게 되는지 수립하는 것은 프로젝트가 잘 굴러가도록 하는 요소 중 하나라고 생각한다. 많은 사람들이 협업하여 일하는 만큼 자신이 지금 어떤 트랙에서 어딜향해 달려가고 있는지를 잘 아는 것이 중요하다는 것이다. </p>
<h4 id="시스템-구성도">시스템 구성도</h4>
<p>개발, QA 관련 인스턴스 테스트 DB 정보 등을 식별하는 것으로, 이를 통해 추가 장비나 예산을 정할 수 있다고 한다. </p>
<h4 id="이해관계자">이해관계자</h4>
<p>커뮤니케이션할 담당자(책임자..)를 지정한다. </p>
<h4 id="rr-정의">R&amp;R 정의</h4>
<p>업무분장은 프로젝트 진행에서 정말 중요하다. 앞서 말했듯, 내가 무엇을, 네가 무엇을, 우리가 무엇을 하고있는지 아는게 중요하기 때문이다. </p>
<h2 id="시스템-흐름도">시스템 흐름도</h2>
<p>기획자와 개발자 간 원활한 소통을 위해 PPT 한 장에 전체적인 흐름을 정의한다. </p>
<h2 id="화면-정의서">화면 정의서</h2>
<p>기획자와 개발자가 같은 도면을 생각하고 일할 수 있도록 돕기에 확정된 상태여야 한다. 이를 기반으로 DB 설계와 프로세스를 정의할 수 있기 때문이다. </p>
<h2 id="프로세스-정의서">프로세스 정의서</h2>
<p>화면에서 데이터가 어떻게 처리되는지, 어떤 이벤트가 발생하는지 식별한다. 화면 이외의 CRUD 과정에서 어떤 데이터가 처리되는지도 정의해야 한다. </p>
<h2 id="용어사전">용어사전</h2>
<p>DB 테이블 명과 칼럼 명을 생성해야한다. - 클래스명, 변수명도 함께 결정되기 때문이다.</p>
<h2 id="공통-코드-정의">공통 코드 정의</h2>
<p>필요한 공통코드 정보를 API에서 제공하고 공통 화면에서 AJAX를 통해 가져다 쓰게 정의하여 사용하는 등 개발 소스를 관리한다. </p>
<h2 id="code-convention">Code convention</h2>
<p>네이밍 규칙 및 변수 생성 등은 사전에 정의하고 공유해야한다. </p>
<h1 id="기술-문서-작성-5단계">기술 문서 작성 5단계</h1>
<h2 id="1-문서-기획">1. 문서 기획</h2>
<p>PM과 함께 테크니컬 라이터는 <strong>문서 작성 범위, 문서 이해관계자, 프로세스, 문서 작성 도구, 파일 형식, 문서 일정</strong>을 정의한다.
문서는 개발 Phase나 산출국가에 따라 언어나 콘텐츠가 다양해질 수 있기에 작성 범위를 정의하는 것이 중요하다.
위에서 언급한 개발 이해관계자에는 책임자라고 적어뒀지만, 문서에 관련해서는 초안 작성자, 테크니컬 라이터, 문서 검토자, 피어리뷰 진행자, 문서 최종 승인자, 문서 배포자 등 다양한 역할이 존재할 수 있다. 또한 여기서의 프로세스는 프로젝트 특성에 따른 문서 작성의 프로세스를 의미한다. 문서 작성 도구는 회사의 규모나 조직 문화에 따라 달라질텐데, 이는 한 회사 내에서도 부서별로 사용하는 문서 도구가 구글 닥스인지, 노션인지, 마크다운인지에 따라서 다르기때문에 하나로 정하는 협의 과정이 필요한 것이다. 파일 형식 역시도 export할 것을 고려하여 pdf, html 5 등을 정해야한다. 만일 web으로 제공하면 보안 사항도 함께 정의해야 한다. 문서 일정은 문서 작성도 하나의 프로젝트이기에 문서 자체가 어떤 디벨롭 과정을 거쳐야하는지 그 일정이 수립되어야 효율적으로 작업할 수 있기에 정해야한다. </p>
<h2 id="2-목차-구조화">2. 목차 구조화</h2>
<p>초안 작성자와 테크니컬 라이터는 회의를 통해 문서의 목차를 함께 구성한다. 시작이 반이라는 말이 이때 쓰이는데, 목차만 잘 구성해도 문서 작업의 절반이 끝난 것과 다름 없다. </p>
<p>문서를 구조화할 때 레퍼런스 문서를 분석하고, 독자의 평의성을 고려해야하는 등 고려할 점이 많다. </p>
<p>카카오엔터프라이즈의 테크니컬라이팅 팀에서는 자체 용어 정리, 템플릿, 기술 문서 규칙, 목차 구성 방법 및 요청을 서로 공유하고 있다. </p>
<h2 id="3-문서-작성">3. 문서 작성</h2>
<p>본격적으로 문서를 작성하는 방법은 초안 작성과 리라이팅이다. 문서 작성은 개발 세부 단계마다 작성될 필요가 있다. 만일 개발을 모두 완료한 뒤 문서를 작성하면, 개발과 관련된 다양한 이유(이슈 대응, 긴급 프로젝트 투입 등)로 쉽게 부실한 문서가 되기 때문이다. </p>
<h3 id="초안-작성">초안 작성</h3>
<p>카카오엔터프라이즈의 글에 의하면 ISO/IEC 표준에 따르면<del>(글 작성에도 ISO표준이 있는지 몰랐다.)</del> 문서 한 페이지의 초안을 작성하는 데 1시간이 소요된다. 하지만 우리는 시간을 글쓰는데 투자하지 않는 경향이 있다. 개발도 하면서 문서도 작성하려고 한다면, 문서 작성 일정을 지키지 않는게 계속해서 쉬워질 것이다. 우리는 이러한 딜레이 현상을 최대한 지양하고, 다음 단계인 리뷰 단계에 할애할 충분한 시간을 보장하여 문서의 품질을 높이는 것이 중요하다. </p>
<h3 id="리라이팅">리라이팅</h3>
<p>테크니컬 라이터는 개발자가 생략한 &quot;개발자라면 알 것&quot;이라 생각한 내용을 보완 및 수정하여 회사 외부의 초급 개발자들도 쉽게 따라 할 수 있도록 상세히 작성한다. 또한 테크니컬 라이팅은 명확성, 간결성, 정확성, 일관성이라는 4대 원칙이 있다. 테크니컬 라이터는 작성된 초안을 원칙에 입각하여 가독성과 사용성이 높은 문서로 만들어낸다. 이때 기술적인 내용을 정확히 알아야 초안을 수정할 수 있기 때문에 초안 작성자에게 관련 교육을 요청하고, QnA를 주고받는 작업이 진행된다. ISO 표준에 따르면 수정/편집은 각각 0.5시간과 ~2.5시간이 소요된다고 한다.</p>
<h2 id="4-리뷰">4. 리뷰</h2>
<p>리뷰 단계에서는 기술적인 측면과 스타일적인 측면에서 문서를 점검한다. 기술적인 리뷰는 초안 작성자와 다른 개발자가 함께 진행하여 문서의 기술적인 내용에 오류가 없는지에 초점을 맞춰 진행한다. 스타일적인 리뷰는 피어 리뷰라고도 하는데, 동료 테크니컬 라이터와 문서의 표현, 용어, 스타일 가이드, 맞춤법 등을 리뷰하는 과정이다.</p>
<p>만일 수정 보완 사항이 발견되면, 다시 &quot;작성&quot; 단계로 돌아간다. </p>
<p>ISO 표준에 따르면 페이지 당 내용 리뷰는 30분, 단순 교정 작업은 약 15분이 소요된다. </p>
<h2 id="5-배포">5. 배포</h2>
<p>요즘에는 웹으로 문서를 배포하는 것이 추세이다. 누구나 쉽게 URL로 문서에 접근할 수 있기 때문이다. 만일 접근에 제한이 필요한 경우 PDF 포맷이나 Google Docs를 이용하여 권한을 제한하기도 한다. 테크니컬라이팅 딤에서는 문서 배포 이후의 문서 데이터베이스, 버전 관리도 진행한다. </p>
<h2 id="예시-포맷">예시 포맷</h2>
<p>제목 
목차 
    목차 별 페이지 제공
문서 정보 
    문서명, 
    작성일,
    버전
저작권</p>
<h1 id="🔻-how">🔻 How</h1>
<ol>
<li>친절한 설명</li>
</ol>
<p>README를 읽어보기. </p>
<ol start="2">
<li><p>Markdown 문법으로 작성
보다 간편한 마크업 페이지 구성을 위해 Markdown 으로 작성한다. 
Typora라는 에디터는 렌더링된 화면(프리뷰)을 보여주기 때문에 효율적으로 문서를 작성할 수 있다. </p>
</li>
<li><p>표와 이미지를 잘 사용하기 
카카오 개발자 문서 페이지에 들어가보면 친절한 설명과 다수의 표와 이미지를 볼 수 있다. 사람을 글을 읽기 귀찮아한다. 적어도 나는 그렇다. 따라서 긴 정보는 표와 이미지를 이용해서 압축하는 것이 좋다. </p>
</li>
</ol>
<h1 id="reference">Reference</h1>
<p><a href="https://eblo.tistory.com/8">개발자 관점에서 필요한 프로젝트 문서</a>
<a href="https://tech.kakaoenterprise.com/65">카카오엔터프라이즈-기술문서작성 5단계</a>
<a href="https://developers.kakao.com/docs/latest/ko/kakaologin/common">Kakao Developers 문서</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python :: 모듈과 패키지]]></title>
            <link>https://velog.io/@e_rho/Python-module-package</link>
            <guid>https://velog.io/@e_rho/Python-module-package</guid>
            <pubDate>Thu, 03 Mar 2022 03:10:10 GMT</pubDate>
            <description><![CDATA[<h1 id="🔻-모듈">🔻 모듈</h1>
<h2 id="🌊-필요성">🌊 필요성</h2>
<ul>
<li><p>코드의 길이가 길어질 때, 다른 사람이 만들어놓은 함수나 변수를 활용할 수 있도록 하는 것이 바로 모듈! </p>
<h2 id="🌊-모듈이-뭔데">🌊 모듈이 뭔데?</h2>
</li>
<li><p>특정 목적을 가진 함수, 자료의 모임 </p>
<h2 id="🌊-모듈-사용법">🌊 모듈 사용법</h2>
</li>
<li><p><strong>import 하기</strong></p>
<pre><code class="language-python">import module_name</code></pre>
</li>
<li><p><strong>사용법 확인하기</strong></p>
<ul>
<li>함수의 인자와 결과값을 알아야겠지!</li>
</ul>
<p>ex. random.randrange(start,stop[, step])
→ Return a randomly selected element from range(start, stop, step) 
: 범위(시작, 끝)에서 무작위로 선택된 요소를 반환</p>
<ul>
<li>** 사용법** 
.(dot)을 이용한 뒤 모듈 속 함수/변수를 사용할 수 있다. <h2 id="🌊-모듈-만들기">🌊 모듈 만들기</h2>
</li>
<li><strong>.py 파일</strong>에서 만들 수 있음! </li>
<li>파일 내에서 함수와 변수를 만들고나면, py파일명.함수명(또는 .변수명)으로 사용할 수 있다!<h2 id="🌊-모듈-활용하기">🌊 모듈 활용하기</h2>
사용 전에는 <code>import</code>로 부르는 것을 잊지 말자!
아래에는 대표적인 모듈과 모듈 내 대표적인 변수 및 함수를 간단히 정리했다. <h3 id="◼-math-모듈">◼ math 모듈</h3>
</li>
<li><code>math.pi</code> 와     <code>math.e</code> 를 사용해서 파이값과 자연상수 값을 받을 수 있다. </li>
<li><code>math.log(b, a)</code> : log a b 표현할 수 있다!  <h3 id="◼-random-모듈">◼ random 모듈</h3>
</li>
<li><code>random.randrange(a,b)</code> : a 이상 b 미만의 숫자 중 하나 반환<h3 id="◼-time-모듈">◼ time 모듈</h3>
</li>
<li><code>time.ctime()</code>  : 현재 시간을 알려주는 함수</li>
</ul>
</li>
</ul>
<h1 id="🔻-패키지">🔻 패키지</h1>
<h2 id="➰-패키지가-뭐고-">➰ 패키지가 뭐고 ?</h2>
<ul>
<li>모듈을 폴더(디렉토리)로 구분하여 관리하는 것 </li>
<li>슬래시(/)를 이용하여 디렉토리를 구분하고, 각 디렉토리 안에 .py(모듈)을 저장하여 계층적인 관리가 가능하게 함<h2 id="➰-패키지-사용법">➰ 패키지 사용법</h2>
</li>
<li>예를 들어, user 디렉토리(패키지) 속 info 라는 모듈에 personal이라는 함수가 있는 경우 <blockquote>
<h3 id="1">[1]</h3>
</blockquote>
<pre><code class="language-python">import user.info
print(info.personal(3, 4))</code></pre>
<h3 id="2">[2]</h3>
<pre><code class="language-python">from user.info import personal
print(personal(3, 4))</code></pre>
두 가지 방식으로 아용할 수 있다. 
2번의 경우, 함수/변수 사용시 dot을 사용하지 않아도 된다!</li>
</ul>
<h1 id="🔻-urllib-url-라이브러리">🔻 urllib (url 라이브러리)</h1>
<h2 id="urllibrequesturlopen"><code>urllib.request.urlopen</code></h2>
<ul>
<li>urllib 패키지 내의 request 모듈에 포함된 urlopen 함수 </li>
<li>해당 url의 html 파일을 가져오는 함수! </li>
<li><code>.read()</code>와 <code>.decode()</code> 메서드를 이용해서 결과를 문자열로 반환하고, 반환한 문자열을 특정 인코딩 방식으로 해독할 수 있다!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[flex를 공부해보자]]></title>
            <link>https://velog.io/@e_rho/pj-portfolio-2</link>
            <guid>https://velog.io/@e_rho/pj-portfolio-2</guid>
            <pubDate>Thu, 20 Jan 2022 17:33:45 GMT</pubDate>
            <description><![CDATA[<p>다른 조에서는 배운 것 같은데, 나는 아니니 혼자 공부해보는 수 밖에! 
참고 사이트는 다음과 같다. </p>
<ol>
<li><a herf="https://d2.naver.com/helloworld/8540176" target="_blank">Naver D2</a></li>
<li><a herf="https://studiomeal.com/archives/197" target="_blank">1분코딩</a></li>
</ol>
<h1 id="🔻flex에-대한-진실">🔻flex에 대한 진실</h1>
<ul>
<li>flex와 grid는 함께 언급되는 친구인 것 같다. flex보다 grid를 이용하는 경우가 많고 심지어는 이보다는 float을 아직 많이 사용한다고 한다. 그렇지만 flex의 편리함은 최강이라고 한다. </li>
<li>flex item은 가로 방향으로 배치되고, 자신의 width만큼만 차지한다. height은 컨테이너의 높이만큼 늘어난다(알아서 늘어난다는 뜻!, of course, height 조정도 가능)</li>
</ul>
<h1 id="🔻flex-구성">🔻flex 구성</h1>
<h2 id="◼-flexbox-만드는-방법">◼ flexbox 만드는 방법</h2>
<p>flex 사용의 시작은 flex를 적용하는 것! </p>
<ul>
<li>정렬하고자 하는 요소의 부모요소에 display:flex 속성을 선언 → 그러면 flex container가 되고, 자식들은 flex item이 됨!<pre><code class="language-css">.flex_container {
  display: flex;
}</code></pre>
</li>
<li>inline-flex도 있는데 이건 컨테이너가 주변 요소와 어떻게 어우러질지 결정하는 값! 아무래도 item width만큼 container가 크기가 조정된다는걸까..? 내 추측이다. </li>
</ul>
<h2 id="◼-item과-container">◼ item과 container</h2>
<ul>
<li>flex container: 부모 요소 </li>
<li>flex item: 자식 요소 (복수) <blockquote>
<p>큰 컨테이너 박스 안에 flex item이 배치되어 있다고 보면 된다! 
컨테이너의 가로 축은 main axis, 세로 축은 cross axis이다.</p>
</blockquote>
</li>
</ul>
<h3 id="부모요소와-자식-요소의-속성이-다르다">부모요소와 자식 요소의 속성이 다르다!</h3>
<ul>
<li>(부모) flex container 속성: flex-direction, flex-wrap, justify-content, align-items, align-content </li>
<li>(자식) flex item 속성: flex, flex-grow, flew-shrink, flex-basis, order</li>
</ul>
<h2 id="◼-flex-main-axis">◼ flex main axis</h2>
<ul>
<li>flex-derection 속성으로 주축 방향이 결정되고, 이 방향에 따라 flex item이 정렬된다. </li>
<li>속성값으로 row(default) 또는 column이 있다. </li>
</ul>
<h1 id="🔻flex-속성">🔻flex 속성</h1>
<h2 id="◼-flex-container-속성">◼ flex container 속성</h2>
<h3 id="1-flex-direction-배치방향-설정">1. flex-direction 배치방향 설정</h3>
<pre><code class="language-css">.container {
    flex-direction: row; 
}</code></pre>
<ul>
<li>row: 왼쪽에서부터 층층</li>
<li>row-reverse: 오른쪽에서부터 층층</li>
<li>column: 위에서 아래 방향으로 층층</li>
<li>column-reverse: 아래에서 위로 층층 쌓인다!<h3 id="2-flex-wrap-줄넘김-처리-설정">2. flex-wrap 줄넘김 처리 설정</h3>
컨테이너에 여유 공간이 없을 때, 아이템 줄바꿈을 어떻게 할 지 결정하는 속성<pre><code class="language-css">.container {
  flex-wrap: nowrap;
}</code></pre>
</li>
<li>nowrap: 기본값, 여유 없는거 무시하고 밖으로 삐져나감</li>
<li>wrap: item이 아랫줄로 이동</li>
<li>wrap-reverse: item이 윗줄로 이동</li>
</ul>
<h3 id="3-flex-flow--direction과-wrap을-한번에-지정">3. flex-flow : direction과 wrap을 한번에 지정</h3>
<pre><code class="language-css">.container {
    flex-flow: row wrap;
}</code></pre>
<h3 id="4-justify-content">4. justify-content</h3>
<p>여기서 <strong>justify</strong>란 메인 축을 따라 정렬(이동)하는 것!
반대로 메인 축의 수직으로 정렬(이동)하는 것은 <strong>align</strong>이다. </p>
<pre><code class="language-css">.container {
    justify-content: flex-start;</code></pre>
<ul>
<li>flex-start: 기본값, 아이템을 시작점으로 정렬<ul>
<li>flex-direction이 row이면 왼쪽, column이면 위</li>
</ul>
</li>
<li>flex-end: 아이템을 끝점으로 정렬<ul>
<li>flex-direction이 row이면 오른쪽, column이면 아래 </li>
</ul>
</li>
<li>center: 아이템을 가운데로 정렬</li>
<li>space-between: 아이템들의 사이에 균일한 간격을 생성 </li>
<li>space-around: 아이템들의 둘레에 균일한 간격 생성</li>
<li>space-evenly: 아이템 사이와 양 끝에 균일한 간격 생성 <ul>
<li>IE와 Edge는 지원되지 않음! </li>
</ul>
</li>
</ul>
<h3 id="5-align-items">5. align-items</h3>
<pre><code class="language-css">.container {
    align-items: stretch;
}</code></pre>
<ul>
<li>stretch: 아이템들이 수직축 방향으로 끝까지 늘어남 </li>
<li>flex-start: 아이템들을 시작점으로 정렬<ul>
<li>flex-direction이 row면 위, column이면 왼쪽</li>
</ul>
</li>
<li>flex-end: 아이템을 끝으로 정렬 <ul>
<li>flex-direction이 row면 아래, column이면 오른쪽</li>
</ul>
</li>
<li>center: 아이템을 가운데로 정렬</li>
<li>baseline: 아이템을 텍스트 베이스라인 기준으로 정렬</li>
</ul>
<h3 id="6-align-content-여러-행-정렬">6. align-content 여러 행 정렬</h3>
<ul>
<li>flex-wrap이 wrap 으로 설정된 상태에서, 아이템 행이 2줄 이상 되었을 때 수직축 방향 정렬을 결정<pre><code class="language-css">.container {
  flex-wrap: wrap;
  align-content: stretch;
}</code></pre>
</li>
<li>stretch : 아이템들이 수직축 방향으로 늘어남 </li>
<li>flex-start: 아이템을 시작점으로 정렬 (내용물만큼만 height 설정) </li>
<li>flex-end: 아이템을 끝점으로 정렬 (row인 경우 아래) </li>
<li>center: 가운데정렬 </li>
<li>space-between : 두 줄로 내려갔을 때 사이 너비 동일하게 </li>
<li>space-around : 각 줄의 around 너비가 동일 </li>
<li>space-evenly : 밖과 안이 너비 동일 (MS 계열 브라우저에서 실행x) </li>
</ul>
<h2 id="◼-flex-item-속성">◼ flex item 속성</h2>
<h3 id="1-flex-basis-아이템-기본-크기-설정">1. flex-basis 아이템 기본 크기 설정</h3>
<p>flex-direction이 row면 너비, column이면 높이</p>
<ul>
<li>flex-basis: 100px 하면 100px 넘는 아이템은 그대로 넘는 수준에서 유지됨 </li>
<li>width 쓰면 100px보다 큰 아이템도 100px로 맞춰짐 </li>
</ul>
<h3 id="2-flex-grow">2. flex-grow</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[반응형 웹사이트 만들기]]></title>
            <link>https://velog.io/@e_rho/PJ-portfolio-1</link>
            <guid>https://velog.io/@e_rho/PJ-portfolio-1</guid>
            <pubDate>Fri, 14 Jan 2022 17:53:19 GMT</pubDate>
            <description><![CDATA[<p>나는 너무너무 궁금했었다.. 어떻게 글자가 자동으로 줄바꿈이 되게하고,, 가독성을 높일 수 있는건지.. </p>
<p>방법은 여러개가 있는듯 해서 배운 것을 위주로 정리를 해보려고 한다!</p>
<h1 id="🔻grid-사용하기">🔻grid 사용하기</h1>
<h2 id="◼-html-살펴보자">◼ html 살펴보자</h2>
<pre><code class="language-html">&lt;html&gt;
    &lt;body&gt;
        &lt;style&gt;
            #container {
                display: grid;
                grid-template-columns: 1fr 2fr 1fr;
            }
            div {
                border: 3px solid red; 
            }
        &lt;/style&gt;
        &lt;div&gt;TOP&lt;/div&gt;
        &lt;div id=&quot;container&quot;&gt;
            &lt;div&gt;LEFT&lt;/div&gt;
            &lt;div&gt;CENTER&lt;/div&gt;
            &lt;div&gt;RIGHT&lt;/div&gt;
        &lt;/div&gt;
        &lt;div&gt;BOTTOM&lt;/div&gt;

    &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>이 코드를 해석해보면,</p>
<h4 id="구조">구조</h4>
<p>영역은 총 TOP, container(LEFT, CENTER, RIGHT), BOTTOM으로 크게보면 3개 유심히 보면 5개로 구성되어있다.</p>
<h4 id="배치">배치</h4>
<p>css를 해석해보면, main이라고도 볼 수 있는 container 영역을 grid로 지정하고, grid-template-colums를 통해 같은 행 안에서 열 배치를 1fr, 2fr, 1fr로 주었다. 
그 아래 div에 대한 css는 각 영역을 눈에 보이게 하기 위한 장치이므로 무시하자. </p>
<h4 id="결과">결과</h4>
<p>정말 감동적인 결과가 나온다.. 내가 원했던 바로 그것,, 그치만 여기서 더 공부해야할 부분이 생긴다. 바로 fr, em, rem, px 등 수치에 대한 값을 이해할 필요가 있다. 그리고 grid를 더 폭 넓게 보기 위해 다른 속성을 알면 좋을 것 같다. </p>
<blockquote>
<p><a href="#" target="_blank">Grid 더 알아보기</a> 
 <a href="#" target="_blank">fr, em, rem, px 등.. 무슨 말일까?</a> </p>
</blockquote>
<h1 id="🔻media-사용하기">🔻@media 사용하기</h1>
<p>미디어쿼리를 사용하는 방법이 있다.
미디어쿼리의 기본 원리는 특정 조건 하에서 css를 대체 또는 추가하는 것이다. 
마우스를 갖다 대면~ 이라는 조건이 가능해서 이 기능에 한정하여 주로 실습하였는데, 조건부 성질과 <code>float</code>를 이용하면 잘 해볼 수 있다. 
공부하던 당시 <a href="https://www.w3schools.com/cssref/css3_pr_mediaquery.asphttps://www.w3schools.com/cssref/css3_pr_mediaquery.asp" target="blank">w3school의 웹사이트</a> 에서 참고하여 필기해둔 내용을 적어두었다. </p>
<h2 id="◼-media-query-알아보기">◼ media query 알아보기</h2>
<ul>
<li>you can apply styles to only those screens that are greater, or smaller, than a certain width.<h3 id="적용-방법">&gt; 적용 방법</h3>
</li>
</ul>
<pre><code class="language-css">@media not/only mediatype and (mediafeature and/or/not/ mediafeature) { CSS -code; 
}</code></pre>
<ul>
<li>only는 현대 브라우저에서는 no effect</li>
<li><strong>media types</strong><ul>
<li>all: 디폴트</li>
<li>print: 프린터기</li>
<li>screen: computer screen, tablets, smart-phones etc.</li>
<li>speech: screenreaders that reads the page out loud</li>
</ul>
</li>
<li>media features<ul>
<li>aspect-ratio: the ratio betwen the width and the height of the viewport</li>
<li>color</li>
<li>hover height width 등등등</li>
</ul>
</li>
</ul>
<h2 id="◼-폭-줄였을-때-층지게-만들기">◼ 폭 줄였을 때 층지게 만들기</h2>
<p>아무튼 위에서 언급한 건 하나도 중요하지 않고, 그래서 어떻게 웹사이트를 디자인할 수 있냐는거다. 
위에서 이미 언급했다시피, float 성질을 이용하면 된다.</p>
<ul>
<li>float은 둥둥 떠다니는 속성이 있는데, 여러 div나 article의 width 합이 100%를 넘어가면 아래로 깨져버리는 현상이 나타난다. 바로 이 점을 이용하여 햄버거 메뉴 style을 만들 수 있다. </li>
<li>예제코드는 없다^^</li>
</ul>
<h1 id="🔻boostrap-사용하기">🔻boostrap 사용하기</h1>
<p><a href="https://getbootstrap.com/docs/5.1/getting-started/introduction/" target="_blank">boostrap</a>은 라이브러리로, 생활코딩 이고잉 선생님의 <a href="https://www.youtube.com/watch?v=4o7FbB7hba0" target="_blank">영상</a>에도 아주 친절하게 나와있다. </p>
<ul>
<li>정확히는 Layout &gt; Grid 를 참고하면 된다. </li>
<li>먼저 같은 행의 각 열로 배치할 <code>&lt;article&gt;</code>을 &quot;col&quot; class로 정의하고</li>
<li>같은 행이 될 <code>&lt;div&gt;</code>를 &quot;row&quot; class로 정의한다 </li>
<li>그리고 이것이 모두 .container에 담는다! <blockquote>
<p>엇 그렇다면 혹시 1 container 안에 many rows가 가능한가? 궁금.</p>
</blockquote>
</li>
<li>boostrap은 기본적으로 화면을 12칸으로 나누어두고있기 때문에 간격 조정은 더했을 때 12가 되도록 col을 세분화함으로써 가능하다.
<code>&lt;article class=&quot;col-2&quot;&gt;&lt;/article&gt;</code>
<code>&lt;article class=&quot;col-10&quot;&gt;&lt;/article&gt;</code></li>
<li>그리고 우리는 <code>col-sm-2</code>, <code>col-md-2</code> 처럼 코드에 breakpoint를 심을 수 있는 기능까지 누릴 수 있다. </li>
</ul>
<blockquote>
<p>boostrap과 <code>&lt;head&gt;</code>내 <code>&lt;style&gt;</code> 태그를 사용한 css의 효과는 둘다 반영될 수 없는 것으로 보인다. 내 경우, dev tool을 봐도 기본 css는 boostrap을 이기지 못하고 취소선 행을 면치 못했다. 이 이유에 대해서는 인터넷에 일부 소개가 된 것 같고, boostrap에서 기본으로 제공하는 컬러명 이외의 것을 커스토마이징할 수 있는 방법을 올려두긴 했으나 나에겐 여전히 너무 어려워 추가 조사와 공부가 필요하다. </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[python] PBA (3) :: 연산, 문자열]]></title>
            <link>https://velog.io/@e_rho/python-PBA-3</link>
            <guid>https://velog.io/@e_rho/python-PBA-3</guid>
            <pubDate>Sun, 09 Jan 2022 14:29:23 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="pba--python-basic-all-alone">PBA : Python Basic All Alone</h2>
<p>이로의 첫 시리즈.</p>
</blockquote>
<h1 id="🔻연산에-대하여">🔻연산에 대하여</h1>
<h2 id="✔is와-is-not으로-객체-비교">✔is와 is not으로 객체 비교</h2>
<p>같다 (=), 다르다 (!=)가 있지만 is와 is not도 있다는 사실!
= 또는 != 은 값 자체를 비교하고, is와 is not은 <strong>객체(object)를 비교</strong>하는 것이다 </p>
<pre><code class="language-python">1 == 1.0    
↪ True            # 정수와 실수라는 차이점은 있지만 값이 같기에 True

1 is 1.0  
↪ False           # 1은 정수 객체, 1.0은 실수 객체이므로 두 객체는 다르다      

1 is not 1.0
↪ True</code></pre>
<ul>
<li>객체를 확인하는 함수는 <code>id</code> 함수이다. <code>id</code>는 객체의 고유값(메모리 주소)를 구한다! 
예로, id(1) 또는 id(1.0)를 해보면 고유 값이 다르다! (값 자체를 신경쓸 필요는 없음) </li>
</ul>
<h2 id="✔논리연산자">✔논리연산자</h2>
<h3 id="and">.and.</h3>
<p>두 값이 모두 True 여야 True 이다. </p>
<pre><code class="language-python">True and False 
↪ False</code></pre>
<h3 id="or">.or.</h3>
<p>두 값 중 하나라도 True 이면 True 이다. </p>
<h3 id="not">.not.</h3>
<p>not은 논릿값을 뒤집는다! </p>
<h4 id="not-and-or-순으로-판단하기">not, and, or 순으로 판단하기</h4>
<pre><code class="language-python">not True and False or not False
↪ True     #False and False or True 이다. F&amp;F는 F이므로 F or T로 바뀜 → True! </code></pre>
<h4 id="비교연산자를-먼저-판단하고-논리-연산자를-판단한다">비교연산자를 먼저 판단하고 논리 연산자를 판단한다.</h4>
<h3 id="단락-평가">.단락 평가.</h3>
<p>첫 번째 값만으로 결과가 확실할 때 두번째 값은 확인(평가)하지 않는 방법 </p>
<ul>
<li>False and → 무조건 False
그래서 <code>False and 함수</code>가 온 경우 함수가 실행되지 <strong>않</strong>는다. </li>
<li>True or → 무조건 True
그래서 <code>True and 함수</code>가 온 경우 함수가 실행된다</li>
<li>★ True and &#39;Python&#39; → &#39;Python&#39; : 파이썬에서 논리연산자는 마지막으로 단락 평가 실시한 값을 그대로 반환하기 때문에 <pre><code class="language-python">True and &#39;Python&#39; 
↪ &#39;Python&#39;
</code></pre>
</li>
</ul>
<p>&#39;Python&#39; and True
↪ True</p>
<p>&#39;Python&#39; or True  # Python은 True이다. True or은 두 번째 값을 평가하지 않는다. 
↪ &#39;Python</p>
<p>&#39;Python&#39; and False
↪ False</p>
<p>0 and &#39;Python&#39; # 0 은 False다. False and는 두 번째 값을 평가하지 않는다 
↪ 0</p>
<pre><code>
## ✔bool()
* 정수 0과 실수 0.0 이외의 모든 숫자는 True 
* 빈 문자열 &#39;&#39;, &quot;&quot;을 제외한 모든 문자열은 True 
``` python 
bool(1) 
↪ True 
bool(0) 
↪ False
bool(&#39;False&#39;)
↪ True</code></pre><h1 id="🔻문자열에-대하여">🔻문자열에 대하여</h1>
<h2 id="✔여러-줄로-된-문자열">✔여러 줄로 된 문자열</h2>
<pre><code class="language-python">여러 줄은 &#39;&#39;&#39;(또는 &quot;&quot;&quot;)로 묶어서 표현할 수 있다. 
hello = &#39;&#39;&#39; Hello, world!
안녕하세요
Python입니다. &#39;&#39;&#39; 
↪ 
Hello, world! 
안녕하세요
Python입니다. </code></pre>
<ul>
<li>사실 여러 줄로 된 문자열을 print 할 때 <code>\n</code> 을 넣는 방법도 살펴보았었다! <h2 id="✔이스케이프-">✔이스케이프 <code>\</code></h2>
</li>
<li>문자열 안에 &#39;, &quot; 등의 특수문자를 포함하기 위해 앞에 <code>\</code>를 붙이는 방법</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[python] PBA (2) :: 변수, 입력, 출력]]></title>
            <link>https://velog.io/@e_rho/python-PBA-2</link>
            <guid>https://velog.io/@e_rho/python-PBA-2</guid>
            <pubDate>Thu, 06 Jan 2022 17:07:54 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="pba--python-basic-all-alone">PBA : Python Basic All Alone</h2>
<p>이로의 첫 시리즈.</p>
</blockquote>
<h2 id="몰랐던-사실을-위주로-작성-中">몰랐던 사실을 위주로 작성 中</h2>
<h2 id="✔-변수에-관하여">✔ 변수에 관하여</h2>
<h3 id="➰변수-여러개-한-번에-만들기">.➰변수 여러개 한 번에 만들기.</h3>
<p><code>=</code>을 활용하여 변수에 특정 값을 할당할 수 있음은 알고 있었으나, 여러 변수를 한꺼번에 할당할 수 있다는 사실을 알게되었다. </p>
<h4 id="단순히-span-stylecolorcadetblue-변수s--값s-순서대로-span으로-하면-된다는-것">단순히 <span style="color:CadetBlue"> 변수s = 값s (순서대로) </span>으로 하면 된다는 것!</h4>
<p> for example, </p>
<pre><code class="language-python">&gt;&gt;&gt; x, y, z = 10, 20, 30 
&gt;&gt;&gt; x
10 
&gt;&gt;&gt; y
20
&gt;&gt;&gt; z
30</code></pre>
<h3 id="➰변수와-값의-개수는-같도록">.➰변수와 값의 개수는 같도록.</h3>
<p>여러 변수의 값을 한 번에 할당할 때, 변수와 값의 개수가 맞지 않으면
(n개 필요한데 m개 주어진 경우) 
<code>not enough values to unpack (expected n, got m)</code> 오류가 뜬다</p>
<h3 id="➰여러-변수의-값이-같은-경우">.➰여러 변수의 값이 같은 경우.</h3>
<p>여러 변수의 값이 같을 때 다음과 같이 할당할 수 있다. </p>
<pre><code class="language-python">x = y = z = 10</code></pre>
<h3 id="➰두-변수의-값-바꾸기">.➰두 변수의 값 바꾸기.</h3>
<p>두 변수의 값을 바꿀 때는 <code>변수 1, 변수 2 = 변수 2, 변수 1</code>의 방식을 사용한다. </p>
<pre><code class="language-python">x, y = 10, 20 
x, y = y, x  # 변수 1, 변수 2 = 변수 2, 변수 1</code></pre>
<h3 id="➰변수-삭제하기--del-x">.➰변수 삭제하기. : del x</h3>
<h3 id="➰빈-변수-만들기--x--none">.➰빈 변수 만들기. : x = None</h3>
<hr>
<h2 id="✔-input에-대하여">✔ input()에 대하여</h2>
<h3 id="🖋입력-값을-변수-두-개에-저장">.🖋입력 값을 변수 두 개에 저장.</h3>
<blockquote>
</blockquote>
<pre><code class="language-python">변수1, 변수2 = input().split() # 공백을 기준으로 분리 
변수1, 변수2 = input().split(&#39;기준문자열&#39;) # 기준문자열을 기준으로 분리</code></pre>
<h3 id="🖋map을-사용하여-정수로-변환하기">.🖋map을 사용하여 정수로 변환하기.</h3>
<p>input은 문자열을 받기 때문에 int로 변환해주어야 하는데, 이때  <span style="color:IndianRed"> map</span>을 쓸 수 있다. 
= <span style = "color:Crimson"> 깔끔한 코드 작성이 가능해진다!</span> </p>
<h4 id="map에-int또는-float와-inputsplit을-넣으면-split-결과를-모두-int로-변환해준다">map에 int(또는 float)와 input().split()을 넣으면 split 결과를 모두 int로 변환해준다</h4>
<blockquote>
<pre><code class="language-python">변수1, 변수2 = map(int, input().split()) 
변수1, 변수2 = map(int, input().split(&#39;기준문자열&#39;))</code></pre>
</blockquote>
<hr>
<h2 id="✔출력에-관하여">✔출력에 관하여</h2>
<p>print() 내의 콤마는 공백이다! </p>
<h3 id="🔻sep-값-사이-문자-넣기">.🔻sep: 값 사이 문자 넣기</h3>
<p>↪ sep을 사용하면 여러 값 사이에 동일한 문자를 넣을 수 있다. </p>
<pre><code class="language-python">print(값1, 값2, sep=&#39;문자 or 문자열&#39;) #값 대신 변수 가능 

print(1, 2, 3, sep = &#39;,&#39;) 
#↪ 1, 2, 3

print(&#39;Hello&#39;, &#39;Python&#39;, sep=&#39;&#39;) #sep=&#39;&#39;은 값이 붙어서 나옴
#↪ HelloPython 

print(1, 2, 3, sep = &#39;\n&#39;) # \n은 개행문자라고 부른다 (다음 줄에 출력) 
#↪
1
2
3</code></pre>
<h3 id="🔻end-n을-삭제하고-문자열-지정-가능">.🔻end: <code>\n</code>을 삭제하고 문자열 지정 가능</h3>
<p>↪ end를 사용하면 <code>\n</code>을 대체하는 것이기 때문에 한 줄로 붙고, end에 할당한 값을 이어 붙일 수 있다.  </p>
<pre><code class="language-python">print(1, end=&#39;&#39;) 
print(2, end=&#39;&#39;)
print(3)
#↪ 123 

print(1, end=&#39;과 &#39;) 
print(2, end=&#39;와 &#39;) 
print(3) 
#↪ 1과 2와 3</code></pre>
<blockquote>
<h5 id="sep과-end의-차이점을-알-수-있는-코드">sep과 end의 차이점을 알 수 있는 코드</h5>
</blockquote>
<p> ``` python 
 print(16, 9, sep=&#39;:&#39;) # 16:9
 print(16, 9, end=&#39;:&#39;) # 16, 9:</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[python] PBA (1) :: 王기초]]></title>
            <link>https://velog.io/@e_rho/python-PBA-1</link>
            <guid>https://velog.io/@e_rho/python-PBA-1</guid>
            <pubDate>Thu, 30 Dec 2021 01:19:13 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="pba--python-basic-all-alone">PBA : Python Basic All Alone</h3>
<p>이로의 첫 시리즈.</p>
</blockquote>
<p>엘리스 AI 트랙을 준비하면서 파이썬 기초 이론에 대해서 &quot;대.강.&quot; 공부했다.
하지만 나는 파이썬의 가로획 하나 정도 알면 많이 쳐준 거라고 생각하기 때문에,
다시말해 지식보다는 열정으로 무장한 사람이기에
본격적으로 수업에 들어가기 전까지 python과 JS에 대해서 살펴보려고 한다.</p>
<p><strong>비전공 졸업예정자의 도전을 지켜봐 주시길!</strong>  (컴퓨터 수업은 교양으로 한 두개 들음)</p>
<hr>
<p>첫 내용은 책을 skimming하면서 아는 내용은 건너뛰고, 모르거나 헷갈릴만한 내용 위주로 넣어보겠다!</p>
<h1 id="📂window-python-실행">📂Window python 실행</h1>
<blockquote>
<h2 id="①-idle">① IDLE</h2>
</blockquote>
<ul>
<li>IDLE의 파이썬 셸에서 가능 (파이썬 셸: 파이썬 코드를 직접 입력해서 실행하는 프로그램)</li>
<li><code>&gt;&gt;&gt;</code> 부분은 파이썬 프롬프트 </li>
<li>소스 코드를 저장하는 <strong>스크립트 모드</strong>는 <code>ctrl+s</code> &gt; C:\project&gt; &quot;~.py&quot;로 저장
F5 누르면 IDLE 파이썬 셸 창에서 실행됨 <h2 id="②-명령-프롬프트">② 명령 프롬프트</h2>
<h4 id="a-파이썬-사용하기">A. 파이썬 사용하기</h4>
<ol>
<li><code>window+R</code> &gt; <code>cmd</code> &gt;&gt; 명령 프롬프트 실행 </li>
<li><code>python</code> 입력하여 파이썬 셸 실행 <h4 id="b-스크립트-파일-실행하기">B. 스크립트 파일 실행하기</h4>
</li>
<li><code>window+R</code> &gt; <code>cmd</code> &gt;&gt; 명령 프롬프트 실행 </li>
<li><code>C:\project</code> 폴더로 이동</li>
<li><code>python ~.py</code> 입력하여 스크립트 파일 실행<h5 id="중요한건-난-여기서-제시해주는--쓰다-말았는데-안쓰겠다는-말이다">중요한건.. 난,, 여기서 제시해주는  ..쓰다 말았는데 안쓰겠다는 말이다..</h5>
</li>
</ol>
</li>
</ul>
<h1 id="👩-💻computational-thinking">👩 💻Computational Thinking</h1>
<blockquote>
<h4 id="비정형화된-문제를-컴퓨터로-해결하는-과정">비정형화된 문제를 컴퓨터로 해결하는 과정</h4>
<p>구성은 다음과 같다. </p>
</blockquote>
<ol>
<li>분해: 복잡한 문제 → 작은 문제 </li>
<li>패턴 인식: 문제 안에서 유사성 발견 </li>
<li>추상화: 핵심에 집중, 부차적인 것은 제외 </li>
<li>알고리즘: 정의한 문제를 해결하는 절차 </li>
</ol>
<hr>
<h1 id="🧮-숫자-계산하기">🧮 숫자 계산하기</h1>
<h2 id="-🌊-자료형-">. 🌊 자료형 .</h2>
<p>자료형은 이미 공부한 것이지만! 복습차원에서~ </p>
<pre><code class="language-python">* 정수: int 
* 실수: float 
* 복소수: complex  # 복소수는 처음이다! 허수부는 i 대신 j를 사용하여 표현 
   &gt; complex (1.2, 1.3) # (1.2 + 1.3j) 
* 문자: str </code></pre>
<h2 id="-🌊-사칙연산-">. 🌊 사칙연산 .</h2>
<h4 id="1-버림나눗셈-">1. 버림나눗셈 <code>//</code></h4>
<ul>
<li><p>나눗셈 후 소수점 이하를 버림 = <span style="color:IndianRed">몫(정수) 구하는 연산자 </span></p>
</li>
<li><p>파이썬 3에서는 정수끼리 <span style="color:IndianRed"> 나눈(/)</span> 몫이 정수여도 2.0 처럼 <span style="color:IndianRed"> 실수로 표현</span>되는데, 
이때 / 대신 //을 쓰면 소수점 이하가 버려진다. </p>
<pre><code class="language-python">5//2
출력: 2
4//2
출력: 2</code></pre>
<h4 id="2-모듈로연산자-">2. 모듈로연산자 <code>%</code></h4>
</li>
<li><p>나눗셈 후 나머지를 구하는 연산자 </p>
</li>
</ul>
<h4 id="3-거듭제곱-연산자-">3. 거듭제곱 연산자 <code>**</code></h4>
<ul>
<li>거듭제곱을 해준다^&lt;^.. </li>
</ul>
<h4 id="4-몫과-나머지를-함께-구하는-divmod-★">4. 몫과 나머지를 함께 구하는 divmod ★</h4>
<h6 id="이-친구는-처음-보는-친구지-말입니다-내가-몰랐던-튜플의-속성도-엿볼-수-있는-문장이었다">이 친구는 처음 보는 친구지 말입니다! 내가 몰랐던 튜플의 속성도 엿볼 수 있는 문장이었다.</h6>
<pre><code class="language-python">divmod(5,2) 
출력: (2,1)    # 튜플 안에 (몫, 나머지)가 표현됨. 튜플은 값 여러 개를 모아서 표현할 때 사용. 

  # 튜플은 변수 여러 개에 저장할 수 있는데 divmod의 결과가 튜플이므로

  &gt;&gt;&gt; quotient, remainder = divmod(5,2) 
  &gt;&gt;&gt; print(quotient, remainder) 
  출력: 2 1 </code></pre>
<h4 id="5-정수를-2진수-8진수-16진수로-나타내기-★">5. 정수를 2진수, 8진수, 16진수로 나타내기 ★</h4>
<ul>
<li>2진수: 숫자 앞에 <code>0b</code> 붙이기, 0과 1 사용 </li>
<li>8진수: 숫자 앞에 <code>0o</code> 붙이기, 0~7 사용 </li>
<li>16진수: 숫자 앞에 <code>0x</code> 붙이기, 0<del>9 &amp; A</del>F까지 사용<pre><code class="language-python">0b11 # 6
0o10 # 8 
0xF # 15 
</code></pre>
</li>
</ul>
<h1 id="🗨-e-ρrhos-comment-16진수-10진법으로-바꾸기-검색했는데-겁나-복잡하다-난-이관데-이과-아니다">🗨 e-ρ(rho)&#39;s Comment: 16진수 10진법으로 바꾸기 검색했는데 겁나 복잡하다 난 이관데 이과 아니다</h1>
<pre><code>&lt;span style=&quot;color:CadetBlue&quot;&gt;**6. 실수계산에는 오차가 존재한다!**&lt;/span&gt;
``` python
4.3 - 2.7 # 1.599999999999</code></pre><p>기이한 현상이 벌어진다. <em>출력 값이 1.6이 아니다.</em>
이는 컴퓨터가 실수를 표현할 때 오차가 발생하기 때문이다.</p>
<ul>
<li>파이썬은 부동소수점 방식으로 실수를 표현하기 때문!</li>
<li>실수는 유한개의 비트로 숫자를 정확히 표현할 수 없어서 근삿값으로 표현한다. 
👉 called &quot;부동소수점 반올림 오차&quot;</li>
</ul>
<p>어떻게 하면 보정할 수 있는지는 따로 공간을 내어 작성하도록 하겠다 +_+ </p>
<h2 id="-🌊-객체의-자료형-알아내기-">. 🌊 객체의 자료형 알아내기 .</h2>
<p>객체 지향.. 이런 용어로 객체가 등장하는 것 같은데, 아직은 모르겠고 ㅎ 
자료형을 찾는 코드는 다음과 같다. </p>
<pre><code class="language-python">&gt;&gt;&gt; type(10) 
# &lt;class &#39;int&#39;&gt;</code></pre>
<ul>
<li>type은 객체의 타입(자료형)을 알아내는 함수, &lt;class &#39;int&#39;&gt;는 정수 클래스라는 뜻 </li>
<li>파이썬에서는 숫자도 객체(object)이며, 객체는 클래스(class)로 표현합니다. </li>
<li>ex. int(3.3)하면 실수 3.3을 int 클래스로 된 객체로 만든다는 뜻  </li>
</ul>
<hr>
<p><span style = "color:DarkSlateGrey"> 🗨 휴 이렇게 첫 공부 겸 포스팅이 끝났는데 생각보다 진짜 오래걸렸다.. 세시간 정도? ㅎ,, 
앞으로 벨로그도 잘 쓰는 코린이가 될 거에요! (제발!) 그럼 다음에 봅시다. </span> </p>
]]></description>
        </item>
    </channel>
</rss>