<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>iris-dev.log</title>
        <link>https://velog.io/</link>
        <description>👩🏻‍💻 Web Front-end Developer</description>
        <lastBuildDate>Mon, 31 Jan 2022 12:04:17 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>iris-dev.log</title>
            <url>https://images.velog.io/images/iris-dev/profile/0f2c04aa-8165-4666-bed2-b2fba0ce08fc/E251A5EB-1FE1-44EB-988A-4BF3EF0BDEF5.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. iris-dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/iris-dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[12장 타입스크립트 함수형 프로그래밍 실습 4]]></title>
            <link>https://velog.io/@iris-dev/12%EC%9E%A5-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%8B%A4%EC%8A%B5-4</link>
            <guid>https://velog.io/@iris-dev/12%EC%9E%A5-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%8B%A4%EC%8A%B5-4</guid>
            <pubDate>Mon, 31 Jan 2022 12:04:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h2 id="12-4-리액트와-부트스트랩으로-프런트엔드-웹-만들기">12-4 리액트와 부트스트랩으로 프런트엔드 웹 만들기</h2>
<h3 id="jsx란">JSX란?</h3>
<blockquote>
<p>💡 <strong>JSX</strong>
페이스북이 만든 간단한 프로그래밍 언어. 자바스크립트의 확장 기능 형태로 동작. 자바스크립트 파일은 .jsx 확장자를, 타입스크립트는 .tsx를 사용.</p>
</blockquote>
<p>JSX 코드가 있는 파일은 반드시 첫 줄에 React라는 심벌을 import문으로 불러오는 코드가 있어야 한다.</p>
<pre><code class="language-jsx">import React from &#39;react&#39;</code></pre>
<hr>
<h3 id="컴포넌트란">컴포넌트란?</h3>
<blockquote>
<p>💡 <strong>컴포넌트</strong>
JSX 코드는 아무 곳에서나 사용할 수 없고, 리액트가 컴포넌트라고 부르는 함수의 반환값으로만 사용 가능.</p>
</blockquote>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>리액트를 이용해서 실습 프로젝트를 구성하고, API 서버에서 데이터를 가져와 사용했다. 부트스트랩이 무엇인지 이해하고 사용하는 방법을 학습했다. </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[12장 타입스크립트 함수형 프로그래밍 실습 3]]></title>
            <link>https://velog.io/@iris-dev/12%EC%9E%A5-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%8B%A4%EC%8A%B5-3</link>
            <guid>https://velog.io/@iris-dev/12%EC%9E%A5-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%8B%A4%EC%8A%B5-3</guid>
            <pubDate>Sun, 30 Jan 2022 11:46:19 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h2 id="12-3-익스프레스로-api-서버-만들기">12-3 익스프레스로 API 서버 만들기</h2>
<h3 id="rest-방식-서버">REST 방식 서버</h3>
<blockquote>
<p>💡 <strong>REST</strong>
웹 서버 소프트웨어 구조의 한 형식. REST 서버는 HTTP 프로토콜의 GET, POST, PUT, DELETE와 같은 메서드를 사용해 웹 클라이언트와 통신하는 서버이다.</p>
</blockquote>
<blockquote>
<p>💡 <strong>API 서버</strong>
&#39;웹 API 서버&#39;를 간단히 부르는 용어. API 서버는 일반적인 웹 서버와 달리 서버에서 HTML을 생성해서 웹 브라우저 쪽에 제공하지 않고, JSON 포맷의 데이터만을 제공하는 서버이다. 모바일 앱이 보편화되면서 API 방식의 서버가 대중화되었다.</p>
</blockquote>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>실습에 앞서 REST와 API의 개념을 학습하고 이해했다. Express 프레임워크를 사용해 웹 서버를 구축한 뒤 MongoDB 서버에 접속하는 코드를 작성했다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[12장 타입스크립트 함수형 프로그래밍 실습 2]]></title>
            <link>https://velog.io/@iris-dev/12%EC%9E%A5-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%8B%A4%EC%8A%B5-2</link>
            <guid>https://velog.io/@iris-dev/12%EC%9E%A5-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%8B%A4%EC%8A%B5-2</guid>
            <pubDate>Fri, 28 Jan 2022 08:13:29 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h2 id="12-2-몽고db에-데이터-저장하기">12-2 몽고DB에 데이터 저장하기</h2>
<h3 id="몽고db란">몽고DB란?</h3>
<blockquote>
<p>💡 <strong>몽고DB</strong>
SQL을 사용하지 않고 다른 방식의 질의어를 사용하는
무료 오픈소스 NoSQL 데이터베이스 시스템</p>
</blockquote>
<hr>
<h3 id="몽고db-설치">몽고DB 설치</h3>
<pre><code>&gt; scoop install mongodb
&gt; mongod --install
&gt; net start mongodb</code></pre><hr>
<h3 id="컬렉션이란">컬렉션이란?</h3>
<table>
<thead>
<tr>
<th align="center">구분</th>
<th align="center">관계형 DB</th>
<th align="center">몽고DB</th>
</tr>
</thead>
<tbody><tr>
<td align="center">한 개의 데이터</td>
<td align="center">레코드</td>
<td align="center">문서</td>
</tr>
<tr>
<td align="center">관련된 데이터 전체</td>
<td align="center">테이블</td>
<td align="center">컬렉션</td>
</tr>
</tbody></table>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>몽고DB를 설치한 후 포트에 접속하고, 데이터베이스를 연결하는 방법을 학습했다. 관계형 DB와 몽고DB에서 사용하는 용어의 차이를 알아보았다. 실습을 통해 문서를 컬렉션에 저장하고, 몽고 셸에 접속해 문서를 직접 다루어보았다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[12장 타입스크립트 함수형 프로그래밍 실습 1]]></title>
            <link>https://velog.io/@iris-dev/12%EC%9E%A5-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%8B%A4%EC%8A%B5-1</link>
            <guid>https://velog.io/@iris-dev/12%EC%9E%A5-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%8B%A4%EC%8A%B5-1</guid>
            <pubDate>Wed, 26 Jan 2022 14:55:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h2 id="12-1-빅데이터-배치-프로그램-만들기">12-1 빅데이터 배치 프로그램 만들기</h2>
<p><img src="https://images.velog.io/images/iris-dev/post/bc45922c-3ea7-4728-a26c-7068f41a97f1/image.png" alt=""></p>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>지금까지 배운 전반적인 타입스크립트 프로그래밍을 토대로 빅데이터 배치 프로그램을 실습했다. 줄곧 사용해온 Node.js에 덧붙여 디렉터리의 생성과 삭제를 위한 mkdirp, rimraf 패키지, 가짜 데이터 생성을 위한 chance 패키지를 설치해서 사용했다. 파일을 처리하는 비동기 함수들을 프로미스로 구현했다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[11장 모나드 2]]></title>
            <link>https://velog.io/@iris-dev/11%EC%9E%A5-%EB%AA%A8%EB%82%98%EB%93%9C-2</link>
            <guid>https://velog.io/@iris-dev/11%EC%9E%A5-%EB%AA%A8%EB%82%98%EB%93%9C-2</guid>
            <pubDate>Mon, 24 Jan 2022 09:15:22 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h2 id="11-3-maybe-모나드-이해와-구현">11-3 Maybe 모나드 이해와 구현</h2>
<p>👉🏻 데이터의 유무에 따라 코드가 적절하게 동작</p>
<pre><code class="language-ts">class Maybe&lt;T&gt; {
  static Just&lt;U&gt;(value: U) {return new Just&lt;U&gt;(value)}
  static Nothing = new Nothing
}</code></pre>
<hr>
<h2 id="11-4-validation-모나드-이해와-구현">11-4 Validation 모나드 이해와 구현</h2>
<p>👉🏻 데이터가 유효한지 판단</p>
<pre><code class="language-ts">class Validation {
  static Success = Success
  static Failure = Failure
  static of&lt;T&gt;(fn: T): Success&lt;T&gt; {return Success.of&lt;T&gt;(fn)}
}</code></pre>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>저번 시간에 이어 Maybe, Validation, IO 모나드를 학습하고 각 클래스를 구현해 보았다. Maybe 모나드는 데이터의 유무를, Validation 모나드는 데이터의 유효성을 판단한다는 차이를 이해했다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[11장 모나드 1]]></title>
            <link>https://velog.io/@iris-dev/11%EC%9E%A5-%EB%AA%A8%EB%82%98%EB%93%9C-1</link>
            <guid>https://velog.io/@iris-dev/11%EC%9E%A5-%EB%AA%A8%EB%82%98%EB%93%9C-1</guid>
            <pubDate>Sun, 23 Jan 2022 13:49:56 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h2 id="11-1-모나드-이해하기">11-1 모나드 이해하기</h2>
<h3 id="판타지랜드-규격">판타지랜드 규격</h3>
<blockquote>
<p>💡 모나드 클래스의 조건</p>
</blockquote>
<ol>
<li>Functor : map 인스턴스 메서드를 가짐</li>
<li>Apply : Functor이면서, ap 인스턴스 메서드를 가짐</li>
<li>Applicative : Apply이면서, of 클래스 메서드를 가짐</li>
<li>Chain : Apply이면서, chain 메서드를 가짐</li>
</ol>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>모나드의 특징을 알아보고, 모나드 클래스의 조건에 대해 학습한 뒤 정리해 보았다. Identity 모나드를 이해하고 예제를 따라 구현했다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[10장 제네릭 프로그래밍 2]]></title>
            <link>https://velog.io/@iris-dev/10%EC%9E%A5-%EC%A0%9C%EB%84%A4%EB%A6%AD-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-2</link>
            <guid>https://velog.io/@iris-dev/10%EC%9E%A5-%EC%A0%9C%EB%84%A4%EB%A6%AD-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-2</guid>
            <pubDate>Wed, 19 Jan 2022 12:30:01 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h2 id="10-4-타입-가드">10-4 타입 가드</h2>
<pre><code class="language-ts">export class Bird {fly() {console.log(`I&#39;m flying.`)}}
export class Fish {swim() {console.log(`I&#39;m swimming.`)}}</code></pre>
<pre><code class="language-ts">import {Bird, Fish} from &#39;./BirdAndFish&#39;

export const flyOrSwim = (o: Bird | Fish): void =&gt; {
  if (o instanceof Bird) {
    o.fly()
  } else if (o instanceof Fish) {
    o.swim()
  }
}</code></pre>
<pre><code class="language-ts">import {Bird, Fish} from &#39;./BirdAndFish&#39;
import {flyOrSwim} from &#39;./flyOrSwim&#39;

[new Bird, new Fish]
  .forEach(flyOrSwim) // I&#39;m flying. I&#39;m swimming.</code></pre>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>instanceof 연산자를 통해 타입 가드 기능을 사용하는 방법을 학습했다. 예제를 통해 this 타입으로 인한 F-바운드 다형성과 nullable 타입에 대해 알아보았다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[10장 제네릭 프로그래밍 1]]></title>
            <link>https://velog.io/@iris-dev/10%EC%9E%A5-%EC%A0%9C%EB%84%A4%EB%A6%AD-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-1</link>
            <guid>https://velog.io/@iris-dev/10%EC%9E%A5-%EC%A0%9C%EB%84%A4%EB%A6%AD-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-1</guid>
            <pubDate>Wed, 19 Jan 2022 12:29:39 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h2 id="10-1-제네릭-타입-이해하기">10-1 제네릭 타입 이해하기</h2>
<pre><code class="language-ts">// 제네릭 인터페이스 구문
interface IValuable&lt;T&gt; {
  value: T
}

// 제네릭 함수 구문
function identity&lt;T&gt;(arg: T): T {return arg}

// 제네릭 타입 별칭 구문
type IValuable&lt;T&gt; = {
  value: T
}

// 제네릭 클래스 구문
class Valuable&lt;T&gt; {
  constructor(public value: T) {}
}</code></pre>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>제네릭 타입의 기능을 이해하고 인터페이스, 함수, 타입 별칭 그리고 클래스에 어떤 식으로 사용하는지 학습했다. 예제를 통해 제네릭 타입 제약, 대수 데이터 타입에 대해 알아보았다. </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[09장 람다 라이브러리 2]]></title>
            <link>https://velog.io/@iris-dev/09%EC%9E%A5-%EB%9E%8C%EB%8B%A4-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-2</link>
            <guid>https://velog.io/@iris-dev/09%EC%9E%A5-%EB%9E%8C%EB%8B%A4-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-2</guid>
            <pubDate>Mon, 17 Jan 2022 11:12:07 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h2 id="09-7-렌즈를-활용한-객체의-속성-다루기">09-7 렌즈를 활용한 객체의 속성 다루기</h2>
<h3 id="렌즈란">렌즈란?</h3>
<blockquote>
<p>💡 렌즈의 기능</p>
</blockquote>
<ol>
<li>R.lens 함수로 객체의 특정 속성에 대한 렌즈를 만든다.</li>
<li>렌즈를 R.view 함수에 적용해 속성값을 얻는다.</li>
<li>렌즈를 R.set 함수에 적용해 속성값이 바뀐 새로운 객체를 얻는다.</li>
<li>렌즈와 속성값을 바꾸는 함수를 R.over 함수에 적용해 값이 바뀐 새로운 객체를 얻는다.</li>
</ol>
<hr>
<h2 id="09-9-배열-다루기">09-9 배열 다루기</h2>
<h3 id="rprepend와-rappend-함수">R.prepend와 R.append 함수</h3>
<pre><code class="language-ts">import * as R from &#39;ramda&#39;

const array: number[] = [3, 4]
const newArray = R.prepend(1)(array)
console.log(array, newArray) // [3, 4] [1, 3, 4]</code></pre>
<pre><code class="language-ts">import * as R from &#39;ramda&#39;

const array: number[] = [3, 4]
const newArray = R.append(1)(array)
console.log(array, newArray) // [3, 4] [3, 4, 1]</code></pre>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>지난 스터디에 이어서 ramda 함수를 이용한 문자열 다루기, chance 패키지로 객체 만들기, 렌즈를 활용한 객체의 속성 다루기, 객체와 배열 다루기, 조합 논리 등에 대해 학습하며 이해했다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[09장 람다 라이브러리 1]]></title>
            <link>https://velog.io/@iris-dev/09%EC%9E%A5-%EB%9E%8C%EB%8B%A4-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-1</link>
            <guid>https://velog.io/@iris-dev/09%EC%9E%A5-%EB%9E%8C%EB%8B%A4-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-1</guid>
            <pubDate>Sun, 16 Jan 2022 14:37:11 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h2 id="09-1-람다-라이브러리-소개">09-1 람다 라이브러리 소개</h2>
<h3 id="ramda-패키지-구성">ramda 패키지 구성</h3>
<table>
<thead>
<tr>
<th><img src="https://images.velog.io/images/iris-dev/post/7ac41979-792b-4226-bfd1-262d6df11440/image.png" alt=""></th>
</tr>
</thead>
<tbody><tr>
<td><a href="https://ramdajs.com/docs/">Ramda Documentation</a></td>
</tr>
</tbody></table>
<hr>
<h2 id="09-3-배열에-담긴-수-다루기">09-3 배열에 담긴 수 다루기</h2>
<h3 id="사칙-연산-함수">사칙 연산 함수</h3>
<pre><code class="language-ts">import * as R from &quot;ramda&quot;;

const incNumbers = R.pipe(
  R.map(R.add(1)),
  R.tap((a) =&gt; console.log(&quot;after add(1):&quot;, a))
);
const newNumbers = incNumbers(R.range(1, 9 + 1));</code></pre>
<hr>
<h2 id="09-4-서술자와-조건-연산">09-4 서술자와 조건 연산</h2>
<h3 id="수의-크기를-판단하는-서술자">수의 크기를 판단하는 서술자</h3>
<pre><code class="language-ts">R.lt(a)(b): boolean // a &lt; b이면 true
R.lte(a)(b): boolean // a &lt;= b이면 true
R.gt(a)(b): boolean // a &gt; b이면 true
R.gte(a)(b): boolean // a &gt;= b이면 true</code></pre>
<pre><code class="language-ts">import * as R from &quot;ramda&quot;;

R.pipe(
  R.filter(R.lte(3)),
  R.tap(n =&gt; console.log(n)) // [3, 4, 5, 6, 7, 8, 9, 10]
)(R.range(1, 10 + 1);</code></pre>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>ramda 패키지를 설치하고 import로 불러온 뒤, 라이브러리 내의 함수 예제들을 따라 실습해 보았다. ramda 함수를 이용한 배열 다루기, 서술자와 조건 연산, 문자열 다루기 등을 학습했다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[08장 함수 조합의 원리와 응용]]></title>
            <link>https://velog.io/@iris-dev/08%EC%9E%A5-%ED%95%A8%EC%88%98-%EC%A1%B0%ED%95%A9%EC%9D%98-%EC%9B%90%EB%A6%AC%EC%99%80-%EC%9D%91%EC%9A%A9</link>
            <guid>https://velog.io/@iris-dev/08%EC%9E%A5-%ED%95%A8%EC%88%98-%EC%A1%B0%ED%95%A9%EC%9D%98-%EC%9B%90%EB%A6%AC%EC%99%80-%EC%9D%91%EC%9A%A9</guid>
            <pubDate>Fri, 14 Jan 2022 14:24:01 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h2 id="08-4-함수-조합">08-4 함수 조합</h2>
<h3 id="compose-함수">compose 함수</h3>
<pre><code class="language-ts">export const f = &lt;T&gt;(x: T): string =&gt; `f(${x})`
export const g = &lt;T&gt;(x: T): string =&gt; `g(${x})`
export const h = &lt;T&gt;(x: T): string =&gt; `h(${x})`</code></pre>
<pre><code class="language-ts">export const compose = &lt;T, R&gt;(...functions: readonly Function[]): Function =&gt; (x: T): (T) =&gt; R =&gt; {
  const deepCopiedFunctions = [...functions]
  return deepCopiedFunctions.reverse().reduce((value, func) =&gt; func(value), x)
}</code></pre>
<pre><code class="language-ts">import {f, g, h} from &#39;./f-g-h&#39;
import {compose} from &#39;./compose&#39;

const composedFGH = compose(h, g, f)
console.log(
  composedFGH(&#39;x&#39;) // h(g(f(x)))
)</code></pre>
<hr>
<h3 id="pipe-함수">pipe 함수</h3>
<pre><code class="language-ts">export const pipe = &lt;T&gt;(...functions: readonly Function[]): Function =&gt; (x: T): T =&gt; {
  return functions.reduce((value, func) =&gt; func(value), x)
}</code></pre>
<pre><code class="language-ts">import {f, g, h} from &#39;./f-g-h&#39;
import {pipe} from &#39;./pipe&#39;

const piped = pipe(f, g, h)
console.log(
  piped(&#39;x&#39;) // h(g(f(x)))
)</code></pre>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>함수 조합의 의미를 이해하고, compose 혹은 pipe 함수를 이용하여 함수 조합을 구현하는 방법을 학습했다. h(g(f(x))) 수식을 compose 함수는 compose(h, g, f)의 형태로, pipe 함수는 pipe(f, g, h)로 작성해야 한다는 것을 암기했다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[07장 Promise와 async/await 구문]]></title>
            <link>https://velog.io/@iris-dev/07%EC%9E%A5-Promise%EC%99%80-asyncawait-%EA%B5%AC%EB%AC%B8</link>
            <guid>https://velog.io/@iris-dev/07%EC%9E%A5-Promise%EC%99%80-asyncawait-%EA%B5%AC%EB%AC%B8</guid>
            <pubDate>Wed, 12 Jan 2022 09:50:37 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h2 id="07-1-비동기-콜백-함수">07-1 비동기 콜백 함수</h2>
<h3 id="실습-프로젝트-설정">실습 프로젝트 설정</h3>
<pre><code>&gt; npm init --y
&gt; npm i -D typescript ts-node @types/node
&gt; mkdir src</code></pre><p>🔽 tsconfig.json</p>
<pre><code class="language-json">{
  &quot;compilerOptions&quot;: {
    &quot;downlevelIteration&quot;: true
  }
}</code></pre>
<hr>
<h2 id="07-2-promise-이해하기">07-2 Promise 이해하기</h2>
<h3 id="resolve와-reject-함수">resolve와 reject 함수</h3>
<table>
<thead>
<tr>
<th><img src="https://images.velog.io/images/iris-dev/post/796a9323-281b-4da4-a56b-97a8e0b27c2e/image.png" alt=""></th>
</tr>
</thead>
<tbody><tr>
<td>출처: <a href="https://www.youtube.com/watch?v=3Ao3OroqQLQ">자바스크립트 중급 강좌 #16 프로미스(Promise) - 코딩앙마</a></td>
</tr>
</tbody></table>
<hr>
<h3 id="promiseall-메서드">Promise.all 메서드</h3>
<pre><code class="language-ts">const getAllResolvedResult = &lt;T&gt;(promises: Promise&lt;T&gt;[]) =&gt; Promise.all(promises)

getAllResolvedResult&lt;any&gt;([Promise.resolve(true), Promise.resolve(&#39;hello&#39;)])
  .then(result =&gt; console.log(result)) // [true, &#39;hello&#39;]

getAllResolvedResult&lt;any&gt;([Promise.reject(new Error(&#39;error&#39;)), Promise.resolve(1)])
  .then(result =&gt; console.log(result)) // 호출되지 않는다
  .catch(error =&gt; console.log(&#39;error:&#39;, error.message)) // error: error</code></pre>
<hr>
<h2 id="07-3-async와-await-구문">07-3 async와 await 구문</h2>
<h3 id="async-함수와-promiseall">async 함수와 Promise.all</h3>
<pre><code class="language-ts">import {readFilePromise} from &#39;./readFilePromise&#39;

const readFilesAll = async (filenames: string[]) =&gt; {
  return await Promise.all(
    filenames.map(filename =&gt; readFilePromise(filename))
  )
}

readFilesAll([&#39;./package.json&#39;, &#39;./tsconfig.json&#39;])
  .then(([packageJson, tsconfigJson]: string[]) =&gt; {
    console.log(&#39;&lt;package.json&gt;: &#39;, packageJson)
    console.log(&#39;&lt;tsconfig.json&gt;: &#39;, tsconfigJson)
  })
  .catch(err =&gt; console.log(&#39;error:&#39;, err.message))

/* 실행 결과
&lt;package.json&gt;: {
  ...생략(package.json 파일 내용)...
}

&lt;tsconfig.json&gt;: {
  ...생략(tsconfig.json 파일 내용)...
}*/</code></pre>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>동기와 비동기 방식의 차이점, resolve와 reject 함수를 매개변수로 받는 Promise의 콜백 함수 그리고 then-체인에 대해 학습했다. Promise.all 메서드와 Promise.race 메서드가 어떻게 동작하는지 이해했다. Promise를 then-체인 대신 async와 await 구문을 사용해 구현해 보았다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[06장 반복기와 생성기]]></title>
            <link>https://velog.io/@iris-dev/06%EC%9E%A5-%EB%B0%98%EB%B3%B5%EA%B8%B0%EC%99%80-%EC%83%9D%EC%84%B1%EA%B8%B0</link>
            <guid>https://velog.io/@iris-dev/06%EC%9E%A5-%EB%B0%98%EB%B3%B5%EA%B8%B0%EC%99%80-%EC%83%9D%EC%84%B1%EA%B8%B0</guid>
            <pubDate>Mon, 10 Jan 2022 07:54:49 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h2 id="06-1-반복기-이해하기">06-1 반복기 이해하기</h2>
<h3 id="실습-프로젝트-설정">실습 프로젝트 설정</h3>
<pre><code>&gt; npm init --y
&gt; npm i -D typescript ts-node @types/node
&gt; mkdir src</code></pre><p>🔽 tsconfig.json</p>
<pre><code class="language-json">{
  &quot;compilerOptions&quot;: {
    &quot;downlevelIteration&quot;: true
  }
}</code></pre>
<hr>
<h3 id="반복기와-반복기-제공자">반복기와 반복기 제공자</h3>
<blockquote>
<p>💡 <strong>반복기의 특징</strong></p>
</blockquote>
<ol>
<li>next라는 이름의 메서드 제공</li>
<li>next 메서드는 value와 done 속성을 가진 객체 반환</li>
</ol>
<hr>
<h2 id="06-2-생성기-이해하기">06-2 생성기 이해하기</h2>
<h3 id="yield-키워드">yield 키워드</h3>
<p>: 값을 대상으로 동작</p>
<blockquote>
<p>💡 <strong>yield의 기능</strong></p>
</blockquote>
<ol>
<li>반복기 자동 생성</li>
<li>반복기 제공자 역할 수행</li>
</ol>
<hr>
<h3 id="yield-키워드-1">yield* 키워드</h3>
<p>: 다른 생성기나 배열을 대상으로 동작</p>
<pre><code class="language-ts">function* gen12() {
  yield 1
  yield 2
}

export function* gen12345() {
  yield* gen12()
  yield* [3, 4]
  yield 5
}</code></pre>
<pre><code class="language-ts">import {gen12345} from &#39;./yield-star&#39;

for (let value of gen12345())
  console.log(value) // 1 2 3 4 5</code></pre>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>반복기와 생성기의 역할과 이러한 것들이 왜 필요한지에 대해 이해했다. 반복기의 next 메서드가 value와 done 두 개의 속성을 가진 객체를 반환한다는 것, 생성기의 yield와 yield* 두 키워드의 차이를 학습했다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[05장 배열과 튜플]]></title>
            <link>https://velog.io/@iris-dev/05%EC%9E%A5-%EB%B0%B0%EC%97%B4%EA%B3%BC-%ED%8A%9C%ED%94%8C</link>
            <guid>https://velog.io/@iris-dev/05%EC%9E%A5-%EB%B0%B0%EC%97%B4%EA%B3%BC-%ED%8A%9C%ED%94%8C</guid>
            <pubDate>Sun, 09 Jan 2022 14:59:34 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h2 id="05-4-순수-함수와-배열">05-4 순수 함수와 배열</h2>
<h3 id="깊은-복사와-얕은-복사">깊은 복사와 얕은 복사</h3>
<p>🔽 깊은 복사</p>
<pre><code class="language-ts">let original = 1
let copied = original

copied += 2

console.log(original, copied) // 1 3</code></pre>
<p>🔽 얕은 복사</p>
<pre><code class="language-ts">const originalArray = [5, 3, 9, 7]
const shallowCopiedArray = originalArray

shallowCopiedArray[0] = 0

console.log(originalArray, shallowCopiedArray) // [0, 3, 9, 7] [0, 3, 9, 7]</code></pre>
<hr>
<h3 id="전개-연산자와-깊은-복사">전개 연산자와 깊은 복사</h3>
<pre><code class="language-ts">const oArray = [1, 2, 3, 4]
const deepCopiedArray = [...oArray]

deepCopiedArray[0] = 0

console.log(oArray, deepCopiedArray) // [1, 2, 3, 4] [0, 2, 3, 4]</code></pre>
<hr>
<h2 id="05-5-튜플-이해하기">05-5 튜플 이해하기</h2>
<h3 id="튜플에-타입-별칭-사용하기">튜플에 타입 별칭 사용하기</h3>
<pre><code class="language-ts">export type ResultType = [boolean, string]</code></pre>
<pre><code class="language-ts">import {ResultType} from &#39;./ResultType&#39;

export const doSomething = (): ResultType =&gt; {
  try {
    throw new Error(&#39;Some error occurs...&#39;)
  } catch(e) {
    return [false, e.message]
  }
}</code></pre>
<hr>
<h3 id="튜플에-적용하는-비구조화-할당">튜플에 적용하는 비구조화 할당</h3>
<pre><code class="language-ts">import {doSomething} from &#39;./doSomething&#39;

const [result, errorMessage] = doSomething()
console.log(result, errorMessage) // false Some error occurs...</code></pre>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>자바스크립트에서 배열이 객체라는 것을 이해했다. 배열의 아이템 타입을 한꺼번에 표현할 때, 제네릭 방식 타입을 사용한다는 것을 알아보았다. 선언형 프로그래밍과 명령형 프로그래밍, 깊은 복사와 얕은 복사의 차이에 대해 학습했다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[04장 함수와 메서드]]></title>
            <link>https://velog.io/@iris-dev/04%EC%9E%A5-%ED%95%A8%EC%88%98%EC%99%80-%EB%A9%94%EC%84%9C%EB%93%9C</link>
            <guid>https://velog.io/@iris-dev/04%EC%9E%A5-%ED%95%A8%EC%88%98%EC%99%80-%EB%A9%94%EC%84%9C%EB%93%9C</guid>
            <pubDate>Mon, 03 Jan 2022 13:49:43 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h2 id="04-4-일등-함수-살펴보기">04-4 일등 함수 살펴보기</h2>
<h3 id="콜백-함수">콜백 함수</h3>
<pre><code class="language-ts">export const init = (callback: () =&gt; void): void =&gt; {
  console.log(&#39;default initialization finished.&#39;)
  callback()
  console.log(&#39;all initialization finished.&#39;)
}</code></pre>
<pre><code class="language-ts">import {init} from &#39;./init&#39;

init(() =&gt; console.log(&#39;custom initialization finished.&#39;))

// 실행 결과
// default initialization finished.
// custom initialization finished.
// all initialization finished.</code></pre>
<hr>
<h3 id="고차-함수와-클로저-그리고-부분-함수">고차 함수와 클로저, 그리고 부분 함수</h3>
<pre><code class="language-ts">export type NumbrToNumberFunc = (number) =&gt; number

export const add = (a: number): NumberToNumberFunc =&gt; {
  const _add: NumberToNumberFunc = (b: number): number =&gt; {
    return a + b // 클로저
  }
  return _add
}</code></pre>
<pre><code class="language-ts">import {NumberToNumberFunc, add} from &#39;./add&#39;

let fn: NumberToNumberFunc = add(1)
let result = fn(2)

console.log(result) // 3
console.log(add(1)(2)) // 3</code></pre>
<hr>
<h2 id="04-5-함수-구현-기법">04-5 함수 구현 기법</h2>
<h3 id="객체-생성-시-값-부분을-생략할-수-있는-타입스크립트-구문">객체 생성 시 값 부분을 생략할 수 있는 타입스크립트 구문</h3>
<pre><code class="language-ts">export type Person = {name: string, age: number}
export const makePerson = (name: string, age: number = 10): Person =&gt; {
  const person = {name, age}
  return person
}

console.log(makePerson(&#39;Iris&#39;)) // { name: &#39;Iris&#39;, age: 10 }
console.log(makePerson(&#39;Iris&#39;, 24)) // { name: &#39;Iris&#39;, age: 24 }</code></pre>
<hr>
<h3 id="객체를-반환하는-화살표-함수-만들기">객체를 반환하는 화살표 함수 만들기</h3>
<pre><code class="language-ts">export type Person = {name: string, age: number}
export const makePerson = (name: string, age: number = 10): Person =&gt; ({name, age})

console.log(makePerson(&#39;Iris&#39;)) // { name: &#39;Iris&#39;, age: 10 }
console.log(makePerson(&#39;Iris&#39;, 24)) // { name: &#39;Iris&#39;, age: 24 }</code></pre>
<hr>
<h3 id="색인-키와-값으로-객체-만들기">색인 키와 값으로 객체 만들기</h3>
<pre><code class="language-ts">export type KeyValueType = {
  [key: string]: string
}

export const makeObject = (key: string, value: string): KeyValueType =&gt; ({[key]: value})

console.log(makeObject(&#39;name&#39;, &#39;Iris&#39;)) // { name: &#39;Iris&#39; }
console.log(makeObject(&#39;firstName&#39;, &#39;Iris&#39;)) // { firstName: &#39;Iris&#39; }</code></pre>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>콜백 함수, 고차 함수 등 타입스크립트의 여러 함수 관련 문법들을 학습했다. 처음 읽어나가는 부분인 만큼 아직 이해가 잘 되지 않는 부분들이 있어 표시해둔 뒤 내일 복습하며 다시 한번 읽어보기로 했다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[03장 객체와 타입]]></title>
            <link>https://velog.io/@iris-dev/03%EC%9E%A5-%EA%B0%9D%EC%B2%B4%EC%99%80-%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@iris-dev/03%EC%9E%A5-%EA%B0%9D%EC%B2%B4%EC%99%80-%ED%83%80%EC%9E%85</guid>
            <pubDate>Sun, 02 Jan 2022 12:37:01 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h2 id="03-2-객체와-인터페이스">03-2 객체와 인터페이스</h2>
<h3 id="익명-인터페이스">익명 인터페이스</h3>
<pre><code class="language-ts">let ai: {
  name: string
  age: number
  etc?: boolean
} = {name: &#39;Iris&#39;, age: 24}

function printMe(me: {name: string, age: number, etc?: boolean}) {
  console.log(
    me.etc ?
      `${me.name} ${me.age} ${me.etc}` :
      `${me.name} ${me.age}`
  )
}

printMe(ai) // Iris 24</code></pre>
<hr>
<h2 id="03-3-객체와-클래스">03-3 객체와 클래스</h2>
<h3 id="생성자">생성자</h3>
<pre><code class="language-ts">class Person {
  constructor(public name: string, public age?: number) {}
}

let iris : Person = new Person(&#39;Iris&#39;, 24)

console.log(iris) // Person { name: &#39;Iris&#39;, age: 24 }</code></pre>
<hr>
<h2 id="03-4-객체의-비구조화-할당문">03-4 객체의 비구조화 할당문</h2>
<h3 id="잔여-연산자">잔여 연산자</h3>
<pre><code class="language-ts">let address: any = {
  country: &#39;Korea&#39;,
  city: &#39;Seoul&#39;,
  address1: &#39;Gangnam-gu&#39;,
  address2: &#39;Sinsa-dong&#39;
}

const {country, city, ...detail} = address

console.log(detail)

// 실행 결과
{ address1: &#39;Gangnam-gu&#39;,
  address2: &#39;Sinsa-dong&#39; }</code></pre>
<hr>
<h3 id="전개-연산자">전개 연산자</h3>
<pre><code class="language-ts">let part1 = {name: &#39;jane&#39;}, part2 = {age: 22, city: &#39;Seoul&#39;}
let merged = {...part1, ...part2}
console.log(merged)

// 실행 결과
{ name: &#39;jane&#39;, age: 22, city: &#39;Seoul&#39; }</code></pre>
<hr>
<h2 id="03-5-객체의-타입-변환">03-5 객체의 타입 변환</h2>
<h3 id="타입-단언">타입 단언</h3>
<pre><code class="language-ts">export default interface INameable {
  name: string
}</code></pre>
<pre><code class="language-ts">import INameable from &#39;./INameable&#39;

let obj: object = {name: &#39;Iris&#39;}

let name1 = (&lt;INameable&gt;obj).name
let name2 = (obj as INameable).name

console.log(name1, name2) // Iris Iris</code></pre>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>타입스크립트의 타입 종류와 인터페이스, 클래스, 타입 단언 등 여러 구조에 대해 학습했다. 대부분 자바스크립트와 비슷한 문법이었지만 생성자와 타입 단언 같은 부분은 새롭게 이해한 문법이었다. 이 부분부터 단단히 다지고 가야 다음 장들을 순조롭게 학습할 수 있다고 생각하여, 예제를 따라 작성해 보며 반복해서 읽고 넘어갔다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[01장 타입스크립트와 개발 환경 만들기 & 02장 타입스크립트 프로젝트 생성과 관리]]></title>
            <link>https://velog.io/@iris-dev/01%EC%9E%A5-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EB%A7%8C%EB%93%A4%EA%B8%B0-02%EC%9E%A5-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1%EA%B3%BC-%EA%B4%80%EB%A6%AC</link>
            <guid>https://velog.io/@iris-dev/01%EC%9E%A5-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EB%A7%8C%EB%93%A4%EA%B8%B0-02%EC%9E%A5-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1%EA%B3%BC-%EA%B4%80%EB%A6%AC</guid>
            <pubDate>Fri, 31 Dec 2021 14:09:02 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 전예홍, ⌈Do it! 타입스크립트 프로그래밍⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<h1 id="02장-타입스크립트-프로젝트-생성과-관리">02장 타입스크립트 프로젝트 생성과 관리</h1>
<h2 id="02-1-타입스크립트-프로젝트-만들기">02-1 타입스크립트 프로젝트 만들기</h2>
<pre><code>&gt; npm init --y // package.json 파일 생성</code></pre><hr>
<h3 id="프로젝트-생성자-관점에서-패키지-설치하기">프로젝트 생성자 관점에서 패키지 설치하기</h3>
<pre><code>&gt; npm i -D typescript ts-node // typescript와 ts-node 패키지 설치
&gt; npm i -D @types/node // @types/node 패키지 설치</code></pre><hr>
<h3 id="tsconfigjson-파일-만들기">tsconfig.json 파일 만들기</h3>
<pre><code>&gt; tsc --init // tsconfig.json 파일 생성</code></pre><p>🔽 tsconfig.json 수정</p>
<pre><code class="language-json">{
  &quot;compilerOptions&quot;: {
    &quot;module&quot;: &quot;commonjs&quot;,
    &quot;esModuleInterop&quot;: true,
    &quot;target&quot;: &quot;es5&quot;,
    &quot;moduleResolution&quot;: &quot;node&quot;,
    &quot;outDir&quot;: &quot;dist&quot;,
    &quot;baseUrl&quot;: &quot;.&quot;,
    &quot;sourceMap&quot;: true,
    &quot;downlevelIteration&quot;: true,
    &quot;noImplicitAny&quot;: false,
    &quot;paths&quot;: { &quot;*&quot;: [&quot;node_modules/*&quot;] }
  },
  &quot;include&quot;: [&quot;src/**/*&quot;]
}</code></pre>
<hr>
<h3 id="packagejson-수정">package.json 수정</h3>
<pre><code class="language-json">{
  &quot;name&quot;: &quot;ch02-1&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;description&quot;: &quot;&quot;,
  &quot;main&quot;: &quot;src/index.js&quot;,
  &quot;scripts&quot;: {
    &quot;dev&quot;: &quot;ts-node src&quot;,
    &quot;build&quot;: &quot;tsc &amp;&amp; node dist&quot;
  },
  &quot;keywords&quot;: [],
  &quot;author&quot;: &quot;&quot;,
  &quot;license&quot;: &quot;ISC&quot;,
  &quot;devDependencies&quot;: {
    &quot;@types/node&quot;: &quot;^17.0.5&quot;,
    &quot;ts-node&quot;: &quot;^10.4.0&quot;,
    &quot;typescript&quot;: &quot;^4.5.4&quot;
  }
}</code></pre>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>이번 스터디에서는 타입스크립트 개발을 위해 scoop과 nodejs를 설치하고 json, package 파일을 설치하는 방법을 실습해 보며 순서를 익히는 시간을 가졌다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[특별 부록] 스와이프 갤러리 제작하기]]></title>
            <link>https://velog.io/@iris-dev/%ED%8A%B9%EB%B3%84-%EB%B6%80%EB%A1%9D-%EC%8A%A4%EC%99%80%EC%9D%B4%ED%94%84-%EA%B0%A4%EB%9F%AC%EB%A6%AC-%EC%A0%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@iris-dev/%ED%8A%B9%EB%B3%84-%EB%B6%80%EB%A1%9D-%EC%8A%A4%EC%99%80%EC%9D%B4%ED%94%84-%EA%B0%A4%EB%9F%AC%EB%A6%AC-%EC%A0%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 20 Dec 2021 13:54:15 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 최성일, ⌈Do it! 인터랙티브 웹 페이지 만들기⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<hr>
<h3 id="슬라이드-세부-옵션-설정하기">슬라이드 세부 옵션 설정하기</h3>
<pre><code class="language-html">&lt;script&gt;
  const swiper = new Swiper(&quot;.wrap&quot;, {
    // 프레임의 요소명
    direction: &quot;horizontal&quot;, // 스와이프 방향
    loop: true, // 순환 여부
    pagination: {
      el: &quot;.swiper-pagination&quot;, // 페이지 메뉴 요소명
      type: &quot;fraction&quot;, // 페이지 버튼 대신 슬라이더 번호 출력
    },
    navigation: {
      nextEl: &quot;.swiper-button-next&quot;, // 다음 버튼 요소명
      prevEl: &quot;.swiper-button-prev&quot;, // 이전 버튼 요소명
    },
    spaceBetween: 0, // 패널 사이의 간격을 0px로 설정
    slidesPerView: &quot;auto&quot;, // CSS에 지정한 슬라이더의 크기를 반영
    grabCursor: true, // 스와이프 시 마우스 포인터 모양 변경
    centeredSlides: true, // 슬라이더 패널을 항상 가운데로 정렬
    speed: 1000, // 슬라이더 이동 속도 지정
    effect: &quot;coverflow&quot;, // 이펙트 효과 지정
    coverflowEffect: {
      rotate: 50, // 회전 각도 지정
      stretch: -100, // 슬라이드 간의 당김 정도 지정
      depth: 400, // 원근감 지정
      modifier: 1, // 중첩 정도 지정
      slideShadows: false, // 슬라이드의 그림자 생성
    },
  });
&lt;/script&gt;</code></pre>
<hr>
<h3 id="활성화-패널에-모션-효과-추가하기">활성화 패널에 모션 효과 추가하기</h3>
<pre><code class="language-css">@keyframes ani {
  0% {
    opacity: 0;
    transform: scale(1);
  }
  1% {
    opacity: 0.5;
  }
  100% {
    opacity: 0;
    transform: scale(1.4);
  }
}

.wrap .swiper-wrapper .swiper-slide-active .inner::before {
  animation: ani 1s ease 1;
}

.wrap .swiper-wrapper .swiper-slide-active .inner::after {
  animation: ani 1s ease 0.3s 1;
}</code></pre>
<hr>
<h3 id="자동-재생-정지-기능-추가하기">자동 재생, 정지 기능 추가하기</h3>
<pre><code class="language-html">&lt;script&gt;
  const swiper = new Swiper(&quot;.wrap&quot;, {
    autoplay: {
      delay: 1000,
      disableOnInteraction: true,
    },
  });

  // .btnStart 요소를 찾아서 btnStart에 저장
  const btnStart = document.querySelector(&quot;.btnStart&quot;);
  // .btnStop 요소를 찾아서 btnStop에 저장
  const btnStop = document.querySelector(&quot;.btnStop&quot;);

  // btnStart 버튼 클릭 시 자동 스와이프 시작
  btnStart.addEventListener(&quot;click&quot;, () =&gt; {
    swiper.autoplay.start();
  });

  // btnStop 버튼 클릭 시 자동 스와이프 정지
  btnStop.addEventListener(&quot;click&quot;, () =&gt; {
    swiper.autoplay.stop();
  });
&lt;/script&gt;</code></pre>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>Swiper 플러그인을 사용하여 스와이퍼 프레임과 각 슬라이드 요소를 쉽게 설정할 수 있었다. 플러그인을 활용해 JavaScript를 보다 간편하게 작성할 수 있다는 것을 알았고, 키프레임을 사용해서 현재 활성화된 패널에 모션 효과를 추가했다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[13장 핀터레스트 스타일의 반응형 웹 갤러리 제작하기]]></title>
            <link>https://velog.io/@iris-dev/13%EC%9E%A5-%ED%95%80%ED%84%B0%EB%A0%88%EC%8A%A4%ED%8A%B8-%EC%8A%A4%ED%83%80%EC%9D%BC%EC%9D%98-%EB%B0%98%EC%9D%91%ED%98%95-%EC%9B%B9-%EA%B0%A4%EB%9F%AC%EB%A6%AC-%EC%A0%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@iris-dev/13%EC%9E%A5-%ED%95%80%ED%84%B0%EB%A0%88%EC%8A%A4%ED%8A%B8-%EC%8A%A4%ED%83%80%EC%9D%BC%EC%9D%98-%EB%B0%98%EC%9D%91%ED%98%95-%EC%9B%B9-%EA%B0%A4%EB%9F%AC%EB%A6%AC-%EC%A0%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 19 Dec 2021 10:49:29 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 최성일, ⌈Do it! 인터랙티브 웹 페이지 만들기⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<hr>
<h3 id="오른쪽-메인-영역에-갤러리-이미지-추가하기">오른쪽 메인 영역에 갤러리 이미지 추가하기</h3>
<p>✨ Emmet 사용</p>
<pre><code class="language-html">&lt;main&gt;
  section&gt;article*20&gt;div&gt;img[src=&quot;/assets/images/p$.jpg&quot;]+h2&gt;lorem3^p&gt;lorem7
&lt;/main&gt;</code></pre>
<p>🔽 결과</p>
<pre><code class="language-html">&lt;main&gt;
  &lt;section&gt;
    &lt;article&gt;
      &lt;div&gt;
        &lt;img src=&quot;/assets/images/p1.jpg&quot; alt=&quot;&quot; /&gt;
        &lt;h2&gt;Lorem, ipsum dolor.&lt;/h2&gt;
        &lt;p&gt;Lorem ipsum dolor sit amet consectetur adipisicing.&lt;/p&gt;
      &lt;/div&gt;
    &lt;/article&gt;
    ...
    &lt;article&gt;
      &lt;div&gt;
        &lt;img src=&quot;/assets/images/p20.jpg&quot; alt=&quot;&quot; /&gt;
        &lt;h2&gt;Ut, corrupti incidunt!&lt;/h2&gt;
        &lt;p&gt;Dignissimos beatae quidem saepe, nisi ipsum dolores!&lt;/p&gt;
      &lt;/div&gt;
    &lt;/article&gt;
  &lt;/section&gt;
&lt;/main&gt;</code></pre>
<hr>
<h3 id="float-배치한-레이아웃-재정렬하기"><a href="https://isotope.metafizzy.co/">float 배치한 레이아웃 재정렬하기</a></h3>
<p><img src="https://images.velog.io/images/iris-dev/post/7633b5b0-d64e-4609-a2f2-1343a4ada5f1/image.png" alt=""></p>
<hr>
<h3 id="미디어-쿼리를-이용하여-반응형-웹-제작하기">미디어 쿼리를 이용하여 반응형 웹 제작하기</h3>
<pre><code class="language-css">@media screen and (max-width: 1599px) {
  header {
    width: 350px;
  }
  main {
    margin-left: 350px;
  }
  main section article {
    width: 25%;
  }
}</code></pre>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>Isotope 플러그인을 사용해서 번거롭고 복잡한 동적 기능을 쉽게 추가하여 반응형 웹 페이지를 제작했다. 브라우저 폭에 따라 article의 배치가 재정렬되게 했고, 짝수 또는 홀수 번째의 article만 분류해서 보여주는 기능을 담은 버튼을 추가했다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[12장 뮤직 플레이어 제작하기]]></title>
            <link>https://velog.io/@iris-dev/12%EC%9E%A5-%EB%AE%A4%EC%A7%81-%ED%94%8C%EB%A0%88%EC%9D%B4%EC%96%B4-%EC%A0%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@iris-dev/12%EC%9E%A5-%EB%AE%A4%EC%A7%81-%ED%94%8C%EB%A0%88%EC%9D%B4%EC%96%B4-%EC%A0%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 17 Dec 2021 10:18:06 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>📖 최성일, ⌈Do it! 인터랙티브 웹 페이지 만들기⌋, 이지스퍼블리싱, 2021</p>
</blockquote>
<hr>
<h3 id="article-패널을-자바스크립트로-회전시키기">article 패널을 자바스크립트로 회전시키기</h3>
<pre><code class="language-js">const frame = document.querySelector(&quot;section&quot;);
const lists = frame.querySelectorAll(&quot;article&quot;);
const deg = 45; // 각각의 article 요소가 회전할 각도
const len = lists.length - 1; // 순번이 0부터 시작하므로 전체 개수에서 1을 뺌
let i = 0;

// article의 개수만큼 반복
for (let el of lists) {
  // 각 article 요소를 45도씩 회전하고 아래로 배치
  el.style.transform = `rotate(${deg * i}deg) translateY(-100vh)`;

  let pic = el.querySelector(&quot;.pic&quot;);
  el.style.transform = `rotate(${deg * i}deg) translateY(-100vh)`;
  pic.style.backgroundImage = `url(/assets/images/member${
    i + 1
  }.jpg)`; /* 배경 이미지 추가 */
  i++;
}</code></pre>
<hr>
<h3 id="컨트롤-패널-버튼으로-음악을-재생하기">컨트롤 패널 버튼으로 음악을 재생하기</h3>
<pre><code class="language-js">// article의 개수만큼 반복
for (let el of lists) {
  // 각 article 요소 안쪽의 재생, 정지, 처음부터 재생 버튼을 변수에 저장
  let play = el.querySelector(&quot;.play&quot;);

  // play 버튼 클릭 시
  play.addEventListener(&quot;click&quot;, (e) =&gt; {
    let isActive = e.currentTarget.closest(&quot;article&quot;).classList.contains(&quot;on&quot;);
    if (isActive) {
      // play 버튼부터 .pic 요소까지 탐색한 뒤 클래스 on 추가하여 활성화
      e.currentTarget
        .closest(&quot;article&quot;)
        .querySelector(&quot;.pic&quot;)
        .classList.add(&quot;on&quot;);
      // play 버튼부터 audio 요소까지 탐색한 뒤 음악 재생
      e.currentTarget.closest(&quot;article&quot;).querySelector(&quot;audio&quot;).play();
    }
  });
}</code></pre>
<hr>
<h3 id="이전-버튼-클릭-시-패널-회전시키기">이전 버튼 클릭 시 패널 회전시키기</h3>
<pre><code class="language-js">const prev = document.querySelector(&quot;.btnPrev&quot;);
const audio = frame.querySelectorAll(&quot;audio&quot;);
let num = 0;
let active = 0;

// prev 버튼을 클릭할 때마다
prev.addEventListener(&quot;click&quot;, () =&gt; {
  // 음악 초기화 함수 호출
  initMusic();

  // num값을 1씩 증가시켜서 아래 transform 연산식에 적용
  num++;
  frame.style.transform = `rotate(${deg * num}deg)`;

  // 현재 패널의 순번이 0이면 다시 마지막 패널의 순번으로 변경하고
  // 그렇지 않으면 현재 패널 순번에서 1씩 감소시켜서 activation 함수 호출
  active == 0 ? (active = len) : active--;
  activation(active, lists);
});

function activation(index, lists) {
  for (let el of lists) {
    el.classList.remove(&quot;on&quot;);
  }
  lists[index].classList.add(&quot;on&quot;);
}

// 모든 오디오 요소를 반복하면서 정지시키고 .pic 요소의 모션을 중지해서 초기화하는 함수
function initMusic() {
  for (let el of audio) {
    el.pause();
    el.load();
    el.parentElement.previousElementSibling.classList.remove(&quot;on&quot;);
  }
}</code></pre>
<hr>
<h3 id="이번-스터디에서-특별히-좋았던-점이나-어려웠던-점-새로-알게-된-부분">이번 스터디에서 특별히 좋았던 점이나 어려웠던 점, 새로 알게 된 부분</h3>
<blockquote>
<p>JavaScript로 for 문을 이용하여 각 article 패널의 각도를 조절하고, 컨트롤 패널 버튼으로 삽입된 음악의 재생, 일시정지, 초기화 기능을 다루었다. 활성화된 패널 내에서만 버튼이 동작하고, 비활성화된 패널에서는 음악이 나오지 않도록 했다.</p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>