<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>N-Log</title>
    <link>https://n-log.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 9 May 2026 15:42:50 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>꿈꾸는 제노</managingEditor>
    <item>
      <title>[CSS] 박스 비율을 유지하며 여러 비율의 이미지 담기</title>
      <link>https://n-log.tistory.com/42</link>
      <description>&lt;p&gt;가로와 세로의 비율이 고정돼있는 박스에 이미지를 넣어야 할 경우, 이미지의 크기가 해당 비율로 고정돼있으면 문제가 없겠지만, 어떤 비율의 이미지가 들어올지 모를 경우에는 이미지가 튀어나오는 문제가 발생한다. 이를 해결하기 위한 가장 단순한 방법은 박스에 overflow: hidden 속성을 주는 것이다. 그럼 당연히 튀어나온 만큼의 이미지는 보이지 않게 된다. 하지만 이 방법은 여러 문제가 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. 튀어나온 부분을 숨기는 것이기 때문에 이미지가 잘릴 수밖에 없다. 심지어 잘린 뒤 보이는 부분은 중앙 부분이 아닌, 좌측 상단 부분이다.&lt;/p&gt;
&lt;p&gt;2. 반응형을 고려하기 위해 width를 퍼센트로 둘 경우, width는 브라우저의 크기가 줄어들면 같이 줄어들지만, height는 그대로다. 즉, 박스의 가로 세로 비율을 유지하지 못한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;265&quot; data-theme-id=&quot;0&quot; data-default-tab=&quot;html,result&quot; data-user=&quot;wjnoh&quot; data-slug-hash=&quot;oRmWaP&quot; data-pen-title=&quot;oRmWaP&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/wjnoh/pen/oRmWaP/&quot;&gt; oRmWaP&lt;/a&gt; by WOOJE (&lt;a href=&quot;https://codepen.io/wjnoh&quot;&gt;@wjnoh&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://static.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이런 상황인 것이다. 하지만 우리가 원하는 건 다음과 같다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. 박스 내에 빈 공간이 생기더라도 이미지의 비율은 유지되거나, 잘리더라도 좌측 상단이 아닌 중앙 부분이 보여야 한다.&lt;/p&gt;
&lt;p&gt;2. 브라우저의 크기가 줄어들더라도 박스의 비율은 그대로 유지돼야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;마치 인스타그램 마이페이지에 있는 썸네일처럼 말이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.jpg&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1dVGC/btqvPakjcDc/wgKEXsZrVO6b1FoXloahhk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1dVGC/btqvPakjcDc/wgKEXsZrVO6b1FoXloahhk/img.jpg&quot; data-alt=&quot;박스의 크기가 정방형으로 고정돼있다. 브라우저를 줄여도 정방형은 유지된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1dVGC/btqvPakjcDc/wgKEXsZrVO6b1FoXloahhk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1dVGC%2FbtqvPakjcDc%2FwgKEXsZrVO6b1FoXloahhk%2Fimg.jpg&quot; data-filename=&quot;1.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;박스의 크기가 정방형으로 고정돼있다. 브라우저를 줄여도 정방형은 유지된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.jpg&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daTjoy/btqvL9NGabu/T4KtdnFHPQLEkxCPhwCTtK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daTjoy/btqvL9NGabu/T4KtdnFHPQLEkxCPhwCTtK/img.jpg&quot; data-alt=&quot;실제 이미지는 어떤 비율의 이미지가 들어올지 모른다. 위 경우 가로가 긴 이미지지만 썸네일에서는 중앙 부분만 보여준다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daTjoy/btqvL9NGabu/T4KtdnFHPQLEkxCPhwCTtK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaTjoy%2FbtqvL9NGabu%2FT4KtdnFHPQLEkxCPhwCTtK%2Fimg.jpg&quot; data-filename=&quot;2.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실제 이미지는 어떤 비율의 이미지가 들어올지 모른다. 위 경우 가로가 긴 이미지지만 썸네일에서는 중앙 부분만 보여준다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;해결법은 다음과 같다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;265&quot; data-theme-id=&quot;0&quot; data-default-tab=&quot;css,result&quot; data-user=&quot;wjnoh&quot; data-slug-hash=&quot;QRYdrq&quot; data-pen-title=&quot;QRYdrq&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/wjnoh/pen/QRYdrq/&quot;&gt; QRYdrq&lt;/a&gt; by WOOJE (&lt;a href=&quot;https://codepen.io/wjnoh&quot;&gt;@wjnoh&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://static.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. thumbnail-wrapper는 width를 조절할 수 있는 박스다. 반응형으로 구성한다면 해당 값은 %가 될 것이다.&lt;/p&gt;
&lt;p&gt;2. thumbnail은 padding-top을 가지는데, padding은 %로 값을 줄 경우, width의 크기에 비례하는 특성이 있다. 즉 padding-top이 100%면 width의 100%만큼 padding-top이 높아지는 것이다. thumbnail-wrapper에 따로 height를 주지 않았기 때문에, 전체 박스의 크기는 정방형이 된다. 만약 70%로 두면 4:3 비율이 될 것이다.&lt;/p&gt;
&lt;p&gt;3. thunbnail-centered는 정방형이 된 박스에 이미지를 위치시키는 역할을 한다. position: absolute 속성과&amp;nbsp;translate 속성으로 위치를 잡아준다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4. thunbnail-img는 마찬가지로&amp;nbsp;translate로 위치를 잡아준다. 여기서 만약 max-width의 값을 100%로 두면 박스 내에 빈 공간이 남더라도 이미지의 비율은 그대로 유지된다. 해당 값이 없을 경우, 이미지는 중앙만을 보여준다. 이때 height 속성이 중요하다. height 속성은 최상위 박스(thunbnail-wrapper)의 높이가 돼야 한다. 이는 자바스크립트를 사용해 wrapper의 높이를 받아온 뒤 넣어주면 된다.&lt;/p&gt;</description>
      <category>WEB/CSS</category>
      <author>꿈꾸는 제노</author>
      <guid isPermaLink="true">https://n-log.tistory.com/42</guid>
      <comments>https://n-log.tistory.com/42#entry42comment</comments>
      <pubDate>Mon, 3 Jun 2019 15:01:04 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트에서의 모나드</title>
      <link>https://n-log.tistory.com/41</link>
      <description>&lt;p&gt;함수 합성 시, 함수에 어떤 값이 들어올지 모르는 상황에서의 함수 합성을 어떻게 하면 안전하게 할 수 있을까?&lt;/p&gt;
&lt;pre id=&quot;code_1558158008634&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const g = a =&amp;gt; a + 1;
const f = a =&amp;gt; a * a;

console.log(f(g(1)));	// 4
console.log(f(g()));	// NaN&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같은 경우가 문제가 된다. 숫자가 들어갈 경우에는 제대로 함수 합성이 되겠지만, 값이 들어가지 않을 경우에는 NaN이 반환된다. 이를 해결하기 위한 모나드는 예컨대 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1558158284520&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[1].map(g).map(f).forEach(r =&amp;gt; console.log(r));		// 4
[].map(g).map(f).forEach(r =&amp;gt; console.log(r));		//&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;배열이라는 박스를 만들어 map 함수를 통해 배열 내부의 요소에 g 함수와 f 함수를 적용한다. 그리고 forEach 함수로 배열 내부의 요소를 순환하며 반환하는 것이다. 이 경우 Array에 요소가 없다면 forEach에서 내보낼 요소도 없어지므로 아무것도 반환하지 않게 된다. 이러한 모나드 관점에서 Promise를 바라보면 어떨까?&lt;/p&gt;
&lt;pre id=&quot;code_1558158752969&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Promise.resolve(1).then(g).then(f).then(r =&amp;gt; console.log(r));	// 4
Promise.resolve().then(g).then(f).then(r =&amp;gt; console.log(r));	// NaN&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Promise의 then으로 함수 합성을 시도하면 값이 없을 경우 NaN을 반환한다. 모나드가 아니네? 라고 생각할 수도 있겠지만, Promise는 조금 다른 관점에서의 모나드라 할 수도 있다. Promise는 값이 들어있고 들어있지 않고에서의 안전성을 보장하는 것이 아닌, 비동기 상황에서, 즉 딜레이가 발생할 수 있는 값이 들어왔을 때 함수 합성의 안전을 보장해주기 때문이다. 즉 이러한 관점에서 Promise는 비동기시 함수 합성을 보장해주는 모나드라 할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/7637&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;함수형 프로그래밍과 ES6+ / 유인동님&lt;/a&gt;&lt;/p&gt;</description>
      <category>WEB/JS</category>
      <author>꿈꾸는 제노</author>
      <guid isPermaLink="true">https://n-log.tistory.com/41</guid>
      <comments>https://n-log.tistory.com/41#entry41comment</comments>
      <pubDate>Sat, 18 May 2019 15:02:25 +0900</pubDate>
    </item>
    <item>
      <title>HTTP 1.0과 1.1 그리고 2.0</title>
      <link>https://n-log.tistory.com/40</link>
      <description>&lt;p&gt;HTTP는 HyperText Transfer Protocol의 약자로, WWW상에서 정보를 주고받는 데 사용되는 프로토콜이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;문서화된 최초의 HTTP는 1991년에 만들어졌다. 이름에 HyperText라고 명시가 돼있는 만큼 초기 버전에는 HTML 파일만 주고받을 수 있고 메서드도 GET 밖에 없는 굉장히 단순한 형태였다. 이때에는 따로 버전 번호가 없었기 때문에 이후의 HTTP와 구분하기 위해 HTTP 0.9라 불린다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이후 HTTP 1.0이 등장했는데, 이 때부터 전송의 성공과 실패 여부를 알 수 있는 상태 코드가 생겨났고, 헤더 개념이 요청과 응답 모두에 도입됐으며, 이 헤더(Content-Type)의 도움으로 HTML 뿐만아니라 다른 문서들도 전송 가능하게 되었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 1997년 초, 드디어 현재까지도 가장 많이 쓰이는 HTTP의 첫 표준인 HTTP 1.1이 등장했다.&lt;/p&gt;
&lt;p&gt;그리고 2015년, HTTP 2.0이 발표되었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1.0에서 1.1까지 1년이라는 시간이 걸렸던 반면, 1.1에서 2.0까지는 16년이라는 시간이 흘렀다. 16년이라는 세월 동안 웹은 빠르게 발전했고, 무엇보다도 개별 사이트가 필요로 하는 리소스의 양이 엄청나게 커졌다. 1.1에서 2.0으로의 발전 또한 이러한 변화에 맞춰졌다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP&quot;&gt;HTTP의 진화 - MDN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://americanopeople.tistory.com/115&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;HTTP 2의 탄생 배경과 특징&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/@shlee1353/http1-1-vs-http2-0-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EA%B0%84%EB%8B%A8%ED%9E%88-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0-5727b7499b78&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;HTTP 1.1 vs HTTP 2.0 차이점 간단히 살펴보기&lt;/a&gt;&lt;/p&gt;</description>
      <category>WEB/ETC</category>
      <author>꿈꾸는 제노</author>
      <guid isPermaLink="true">https://n-log.tistory.com/40</guid>
      <comments>https://n-log.tistory.com/40#entry40comment</comments>
      <pubDate>Fri, 10 May 2019 00:47:17 +0900</pubDate>
    </item>
    <item>
      <title>[JS] forEach, for in, for of의 차이</title>
      <link>https://n-log.tistory.com/39</link>
      <description>&lt;p&gt;forEach는 Array의 prototype을 상속받은 객체가 사용할 수 있는 함수이다. 반복문이 아니라 '함수'이다. 인자로 함수를 받아 각 배열의 요소에 해당 함수를 적용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1556981724092&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const arr = [1, 2, 3, 4, 5];

arr.forEach(item =&amp;gt; {
  console.log(item);
});

// 1 2 3 4 5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;for in은 Object에 있는 key에 차례로 접근하는 데 사용되는 반복문이다. Array에도 사용할 수도 있지만 일반적으로 Object를 제외한 객체에는 사용하지 않는 것이 좋다. 왜냐하면 for in으로 순회를 하게 되면 해당 요소뿐 아니라 prototype chain을 따라 확장 속성들도 함께 순회하기 때문이다. 아래 예시를 보자.&lt;/p&gt;
&lt;pre id=&quot;code_1556981977089&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const object = {
  a: 1,
  b: 2,
  c: 3
};

Object.prototype.foo = function() {
  return 0;
};

for (const key in object) {
  console.log(key, object[key]);
}

// a 1 b 2 c 3 foo function()...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;object의 요소뿐 아니라 &lt;span style=&quot;color: #333333;&quot;&gt;Object의&amp;nbsp;&lt;/span&gt;prototype으로 만들어 둔 foo 함수까지 함께 순회하는 모습을 볼 수 있다. 이러한 이유 때문에&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;for in은&lt;/span&gt; Object의 key를 순회하기 위해 불가피하게 사용하는 것이 아니라면 사용하지 않는 것이 좋다. Object를 for in이 아닌 다른 방법으로 순회하고 싶다면, Object의 내장 메소드인 keys()를 사용하면 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;마지막으로 for of이다. for of는 &lt;a href=&quot;https://n-log.tistory.com/21&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이터러블&lt;/a&gt;한 객체의 순회를 도와주는 반복문이다. 때문에 Array만 반복할 수 있는 forEach와 다르게, 내부에 [Symbol.iterator]를 가진 객체라면 어떤 객체든 순회할 수 있다. 하지만&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;iterable하지 않은&amp;nbsp;&lt;/span&gt;일반 Object에는 사용할 수 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1556983314390&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const gen = function*() {
  yield 1;
  yield 2;
  yield 3;
};

for (const value of gen()) {
  console.log(value);
}

// 1 2 3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;* 요약&lt;/p&gt;
&lt;p&gt;1. forEach는 Array를 순회하는 데 사용되는 Array의 메소드.&lt;/p&gt;
&lt;p&gt;2. for in은 Object의 key를 순회하기 위해 사용되는 반복문. 단, 확장 속성까지 함께 순회한다는 점 고려.&lt;/p&gt;
&lt;p&gt;3. for of는 이터러블한 객체를 모두 순회할 수 있는 강력한 반복문!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;더 자세한 내용은 &lt;a href=&quot;http://hacks.mozilla.or.kr/2015/08/es6-in-depth-iterators-and-the-for-of-loop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;도 참고.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/7637&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;함수형 프로그래밍과 ES6+ / 유인동님&lt;/a&gt;&lt;/p&gt;</description>
      <category>WEB/JS</category>
      <author>꿈꾸는 제노</author>
      <guid isPermaLink="true">https://n-log.tistory.com/39</guid>
      <comments>https://n-log.tistory.com/39#entry39comment</comments>
      <pubDate>Sun, 5 May 2019 00:25:58 +0900</pubDate>
    </item>
    <item>
      <title>[JS] 코드를 값으로 다루는 go, pipe, curry 함수 만들기</title>
      <link>https://n-log.tistory.com/38</link>
      <description>&lt;p&gt;코드를 값으로 다룬다면 전체적인 코드의 표현력을 높일 수 있다. 이를 위해 주로 사용하는 함수들인 go, pipe curry 함수를 한 번 구현해 보자. 우선 go 함수이다. go 함수는 인자로 함수들을 받아 차례로 실행시켜 결과에 해당하는 값을 리턴하는 함수이다.&lt;/p&gt;
&lt;pre id=&quot;code_1556889783347&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const go = (...args) =&amp;gt; reduce((a, f) =&amp;gt; f(a), args);

go(
  0, 
  a =&amp;gt; a + 1, 
  a =&amp;gt; a + 10, 
  a =&amp;gt; a + 100, 
  console.log	// 111
);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;예시를 먼저 보면, 처음에 0을 받아 다음 인자로 넘기고, 그다음에는 인자로 받은 값을 +1, 그다음은 +10, 그다음은 +100 해준다. 그리고 마지막에는 인자를 console.log에 넣어준다. 이러한 go 함수는&amp;nbsp;&lt;a href=&quot;https://n-log.tistory.com/36&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;reduce&lt;/a&gt;로 쉽게 구현이 가능하다. 인자들을 스프레드 연산자를 사용해 이터러블 객체로 받아오고, reduce로 해당 요소들을 차례로 실행하는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;pipe 함수는 go와 비슷하지만 값을 리턴하는 것이 아닌, 함수를 리턴하는 함수이다. go는 인자로 받은 함수들을 모두 실행시켜 결과에 해당하는 값을 리턴하지만, pipe는 인자로 받은 함수들을 모두 합쳐 합성된 함수를 리턴한다.&lt;/p&gt;
&lt;pre id=&quot;code_1556891651123&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const pipe = (f, ...fs) =&amp;gt; (...as) =&amp;gt; go(f(...as), ...fs);

const f = pipe(
  (a, b) =&amp;gt; a + b,
  a =&amp;gt; a + 10,
  a =&amp;gt; a + 100
);

console.log(f(0, 1));	// 111&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;pipe 함수는 내부적으로 go 함수를 사용한다. 단, pipe 함수의 첫 번째 인자를 값이 아닌 함수로 받을 수 있도록 하기 위해, 첫 번째 함수인 f와 나머지 함수인 ...fs를 따로 받는다. 그렇게 리턴된 합성된 함수는 인자(...as)를 받게 되면 go 함수를 의 인자로 함수를 넣어 차례로 함수를 실행시킬 때, 첫 번째 받은 함수에 해당 인자(...as)를 넣어 먼저 실행하게 하고, 그다음에 나머지 함수들을 차례로 실행시키도록 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;curry 함수는 받아둔 함수를 원하는 시점에 평가하도록 하는 함수이다. 여러개의 인자가 필요한데 하나의 인자만 받았을 경우 다음 인자를 받을 수 있도록 기다리는 함수를 만드는 것이다. 개념에 대해서는 따로 &lt;a href=&quot;https://n-log.tistory.com/30&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;정리해둔 글&lt;/a&gt;이 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1556893129021&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const curry = f =&amp;gt; (a, ..._) =&amp;gt; (_.length ? f(a, ..._) : (..._) =&amp;gt; f(a, ..._));

const mult = curry((a, b) =&amp;gt; a * b);
console.log(mult(3)(2));	// 6

const mult3 = mult(3);
console.log(mult3(3));	// 9
console.log(mult3(4));	// 12&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;curry 함수를 받아 함수를 리턴하는데, 리턴된 함수의 인자가 여러개일 경우(_의 length가 0 이상일 경우)에는 받아둔 함수를 즉시 실행하고, 인자가 여러 개가 아닐 경우에는 함수를 다시 리턴하는데, 리턴된 함수가 인자를 받았을 때 앞서 받아둔 인자와 이후에 받은 인자를 합쳐서 실행하게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;curry 함수는 앞서 구현했던 map, filter, reduce 함수와도 함께 사용할 수 있는데, 이렇게 만들어진 currying map, currying filter, currying reduce 함수는 go 함수와 함께 사용할 때, 리턴된 인자를 다음 함수의 두 번째 인자로 다시 넘겨줘야 하는 번거로움을 없애준다. 아래와 같이 말이다.&lt;/p&gt;
&lt;pre id=&quot;code_1556894521676&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Before
go(
  products,
  products =&amp;gt; filter(p =&amp;gt; p.price &amp;lt; 2500, products),
  products =&amp;gt; map(p =&amp;gt; p.price, products),
  prices =&amp;gt; reduce(add, prices),
  console.log
);

// After
go(
  products,
  filter(p =&amp;gt; p.price &amp;lt; 2500),
  map(p =&amp;gt; p.price),
  reduce(add),
  console.log
);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/7637&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;함수형 프로그래밍과 ES6+ / 유인동님&lt;/a&gt;&lt;/p&gt;</description>
      <category>WEB/JS</category>
      <author>꿈꾸는 제노</author>
      <guid isPermaLink="true">https://n-log.tistory.com/38</guid>
      <comments>https://n-log.tistory.com/38#entry38comment</comments>
      <pubDate>Fri, 3 May 2019 23:19:34 +0900</pubDate>
    </item>
    <item>
      <title>[JS] 이터러블 프로토콜을 따르는 map, filter, reduce 함수 만들기</title>
      <link>https://n-log.tistory.com/36</link>
      <description>&lt;p&gt;기본적으로 우리가 알고 있는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;자바스크립트의 map 함수&lt;/a&gt;의 경우 Array를 상속받은 객체만 사용할 수 있는 함수이다. 즉 일반적으로 사용하는 Array의 경우에는 prototype으로 map 함수가 구현이 돼있어 map 함수를 사용할 수 있지만,&lt;/p&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;document.querySelectorAll(&quot;*&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같은 경우에는 이터러블 객체임에도 불구하고 Array를 상속받은 객체는 아니므로 map 함수를 사용할 수가 없다. 그러니 이터러블 프로토콜을 만족하는 객체라면 어떤 객체든 사용할 수 있는 map 함수를 한 번 만들어 보자.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const arr = [1, 2, 3, 4, 5];
const nodes = document.querySelectorAll(&quot;*&quot;);

const map = (f, iter) =&amp;gt; {
    let res = [];
    for(const a of iter) {
        res.push(f(a));
    }
    return res;
}

console.log(map(e =&amp;gt; e * 3, arr));    // [3, 6, 9, 12, 15]
console.log(map(e =&amp;gt; e.nodeName, nodes));    // [&quot;HTML&quot;, &quot;HEAD&quot;, &quot;META&quot;, &quot;META&quot;, &quot;META&quot;, &quot;TITLE&quot;, &quot;BODY&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이터러블 객체를 순회하는 for of 문을 이용해 이렇게 만들어주면, Generator 함수를 포함해 이터러블 프로토콜을 만족하는 모든 객체를 반복해 반환할 수 있다. &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter&quot;&gt;filter 함수&lt;/a&gt;도 마찬가지다 filter 함수도 Array.prototype에 구현된 함수이므로, 모든 이터러블 객체가 사용할 수 있게 만들려면 아래와 같이 함수를 따로 만들어 주면 된다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const arr = [1, 2, 3, 4, 5];
const nodes = document.querySelectorAll(&quot;*&quot;);

const filter = (f, iter) =&amp;gt; {
    let res = [];
    for(const a of iter) {
        if(f(a)) {
            res.push(a);
        }
    }
    return res;
}

console.log(filter(e =&amp;gt; e &amp;gt; 2, arr));    // [3, 4, 5]
console.log(filter(e =&amp;gt; e.nodeName === &quot;META&quot;, nodes));    // [meta, meta, meta]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce&quot;&gt;reduce 함수&lt;/a&gt;도 똑같다. 다만 reduce 함수는 시작 value를 주지 않았을 경우도 감안해서 함수를 만들어야 한다. 때문에 조건문을 걸어 만약 시작 value인 acc가 없을 경우(세 번째 파라미터가 없을 경우)에는 이터러블 값의 첫 번째 값을 next()로 뽑아 acc로 해주었다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const arr = [1, 2, 3, 4, 5];
const add = (a, b) =&amp;gt; a + b;

const reduce = (f, acc, iter) =&amp;gt; {
    if(!iter) {
        iter = acc[Symbol.iterator]();
        acc = iter.next().value;
    }
    for(const a of iter) {
        acc = f(acc, a);
    }
    return acc;
}

console.log(reduce(add, 0, arr));    // 15&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/7637&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;함수형 프로그래밍과 ES6+ / 유인동님&lt;/a&gt;&lt;/p&gt;</description>
      <category>WEB/JS</category>
      <author>꿈꾸는 제노</author>
      <guid isPermaLink="true">https://n-log.tistory.com/36</guid>
      <comments>https://n-log.tistory.com/36#entry36comment</comments>
      <pubDate>Mon, 29 Apr 2019 22:44:29 +0900</pubDate>
    </item>
    <item>
      <title>VSCode Terminal, Git Bash로 변경하기</title>
      <link>https://n-log.tistory.com/35</link>
      <description>&lt;p&gt;VSCode에 기본 터미널이 PowerShell일 경우 간혹 안먹히는 명령어가 있다.&lt;/p&gt;&lt;p&gt;기본 터미널을 Git의 Bash로 바꾸려면 설정에서,&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #e5e5e5&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#666; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&quot;terminal.integrated.shell.windows&quot;:&amp;nbsp;&quot;C:\\Program&amp;nbsp;Files\\Git\\bin\\bash.exe&quot;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(229, 229, 229); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Bash가 있는 경로를 기본 터미널로 명시해주면 된다.&lt;/p&gt;</description>
      <category>WEB/ETC</category>
      <author>꿈꾸는 제노</author>
      <guid isPermaLink="true">https://n-log.tistory.com/35</guid>
      <comments>https://n-log.tistory.com/35#entry35comment</comments>
      <pubDate>Tue, 9 Apr 2019 01:14:13 +0900</pubDate>
    </item>
    <item>
      <title>[JS] 콜스택과 이벤트루프</title>
      <link>https://n-log.tistory.com/31</link>
      <description>&lt;p&gt;V8엔진은 크게 메모리 할당이 이루어지는 메모리힙과 콜스택으로 이루어져있다. 거기에 더해 브라우저에서의 웹API와 이벤트루프, 콜백큐가 존재한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;자바스크립트는 &lt;b&gt;싱글쓰레드&lt;/b&gt; 프로그래밍 언어이므로, 콜스택은 하나만 존재한다. 즉, 한번에 하나의 일만 할 수 있다. 함수가 실행되면 해당 함수는 콜스택 위에 차곡차곡 쌓이고, 실행이 끝나면 가장 윗부분의 것이 POP된다. 만약 함수가 함수를 계속 재귀로 불러와 스택이 넘칠 경우 스택이 오버플로우된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;싱글쓰레드는 데드락과 같은 멀티쓰레드 기반 환경에서 대처해야하는 상황을 신경쓰지 않아도 되는 장점이 있지만, 동기적이기 때문에 앞선 함수가 실행되는 동안에는 뒤 함수가 처리되지 않는다는 단점이 있다. 뒷 작업이 블로킹 되는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;때문에 지금 당장 완료될 수 없는 작업은 비동기 처리를 통해 &lt;b&gt;논블로킹&lt;/b&gt;하게 처리한다. 이러한 비동기 처리에 사용되는 것이 콜스택, 프로미스 등이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기에서 앞서 말한 이벤트루프와 콜백큐가 필요하다. setTimeout이나 AJAX 처리가 발생할 경우, 콜스택으로 들어간 해당 함수는 웹API로 들어가고, 콜스택에서 빠져나온다. 그리고 나머지 당장 완료될 수 있는 작업들이 차례로 콜스택으로 들어갔다 나오며 완료된 후, 웹API에서의 작업이 끝나면 해당 함수는 콜백큐로 이동한다. 그리고 이벤트루프는 콜백큐에 함수가 있을 경우 해당 함수를 받아 콜스택에 넣는다. 그리고 차례로 함수 내 작업이 실행되면서 콜스택에서 빠져나온다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://engineering.huiseoul.com/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9E%91%EB%8F%99%ED%95%98%EB%8A%94%EA%B0%80-%EC%97%94%EC%A7%84-%EB%9F%B0%ED%83%80%EC%9E%84-%EC%BD%9C%EC%8A%A4%ED%83%9D-%EA%B0%9C%EA%B4%80-ea47917c8442&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;자바스크립트는 어떻게 작동하는가: 엔진, 런타임, 콜스택 개관&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://engineering.huiseoul.com/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9E%91%EB%8F%99%ED%95%98%EB%8A%94%EA%B0%80-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A3%A8%ED%94%84%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%98-%EB%B6%80%EC%83%81-async-await%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%BD%94%EB%94%A9-%ED%8C%81-%EB%8B%A4%EC%84%AF-%EA%B0%80%EC%A7%80-df65ffb4e7e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;자바스크립트는&amp;nbsp;어떻게&amp;nbsp;작동하는가:&amp;nbsp;이벤트&amp;nbsp;루프와&amp;nbsp;비동기&amp;nbsp;프로그래밍의&amp;nbsp;부상&lt;/a&gt;&lt;/p&gt;</description>
      <category>WEB/JS</category>
      <author>꿈꾸는 제노</author>
      <guid isPermaLink="true">https://n-log.tistory.com/31</guid>
      <comments>https://n-log.tistory.com/31#entry31comment</comments>
      <pubDate>Fri, 22 Feb 2019 01:56:28 +0900</pubDate>
    </item>
    <item>
      <title>[JS] 커링(Currying)</title>
      <link>https://n-log.tistory.com/30</link>
      <description>&lt;p&gt;커링은 여러 개의 인자를 가진 함수를 호출할 경우, 파라미터의 수보다 적은 수의 파라미터를 인자로 받으면 누락된 파라미터를 인자로 받도록 하는 것이다. 즉 커링은 함수 하나가 n개의 인자를 받는 과정을 n개의 함수로 각각의 인자를 받도록 하는 것이다. 부분적으로 적용된 함수를 체인으로 계속 생성해 결과적으로 값을 처리하도록 하는 것이 그 본질이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;말이 어렵다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;간단하게 말하면 &lt;u&gt;함수를 부르는 함수를 만들어 인자를 각 함수가 각각 받는 것&lt;/u&gt;이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;func(1, 2, 3)이 아닌,&amp;nbsp;func(1)(2)(3) 이런 방식으로 말이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이러한 함수를 생성할 때는 당연히 함수를 반환하는 클로저 패턴이 사용되는데,&lt;/p&gt;&lt;p&gt;때문에 let func1 = func(1)과 같이 생성해두고 func1(3)(4), func(5)(6)과 같이 변형하면 &lt;u&gt;첫 번째 인자는 고정된 상태에서 다른 인자를 받을 수&amp;nbsp;있다.&lt;/u&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;overflow: auto; position: relative !important;&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #e5e5e5&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#666; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;11&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;12&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;13&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;function&lt;/span&gt;&amp;nbsp;func(a){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;function&lt;/span&gt;(b){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;function&lt;/span&gt;(c){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;console&lt;/span&gt;.log(a,&amp;nbsp;b,&amp;nbsp;c);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;func(&lt;span style=&quot;color:#0099cc&quot;&gt;1&lt;/span&gt;)(&lt;span style=&quot;color:#0099cc&quot;&gt;2&lt;/span&gt;)(&lt;span style=&quot;color:#0099cc&quot;&gt;3&lt;/span&gt;);&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//&amp;nbsp;1&amp;nbsp;2&amp;nbsp;3&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;let&amp;nbsp;func1&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;func(&lt;span style=&quot;color:#0099cc&quot;&gt;1&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;func1(&lt;span style=&quot;color:#0099cc&quot;&gt;3&lt;/span&gt;)(&lt;span style=&quot;color:#0099cc&quot;&gt;4&lt;/span&gt;);&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//&amp;nbsp;1&amp;nbsp;3&amp;nbsp;4&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;func1(&lt;span style=&quot;color:#0099cc&quot;&gt;5&lt;/span&gt;)(&lt;span style=&quot;color:#0099cc&quot;&gt;6&lt;/span&gt;);&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//&amp;nbsp;1&amp;nbsp;5&amp;nbsp;6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(229, 229, 229); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그래서 커링 함수에서는 인자의 순서가 중요하다.&lt;/p&gt;&lt;p&gt;앞쪽 인자일수록 변동가능성이 적고, 뒤로갈수록 변동가능성이 높아지기 때문이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://sujinlee.me/currying-in-functional-javascript/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;[번역] &lt;/a&gt;&lt;a href=&quot;http://sujinlee.me/currying-in-functional-javascript/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;초보자를 위한 Currying 가이드&lt;/a&gt;&lt;/p&gt;</description>
      <category>WEB/JS</category>
      <author>꿈꾸는 제노</author>
      <guid isPermaLink="true">https://n-log.tistory.com/30</guid>
      <comments>https://n-log.tistory.com/30#entry30comment</comments>
      <pubDate>Tue, 19 Feb 2019 19:19:41 +0900</pubDate>
    </item>
    <item>
      <title>HTTP와 HTTPS의 차이</title>
      <link>https://n-log.tistory.com/29</link>
      <description>&lt;p&gt;HTTP는 Hyper Text Transfer Protocold의 약자로, 브라우저와 서버간의 자원을 주고받을 때 사용하는 통신 규약이다.&lt;/p&gt;&lt;p&gt;HTTPS는 그 뒤에 Secure Socket이&amp;nbsp;붙은 것으로, 보안성을 강화한 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;HTTPS는 통신에서 일반 텍스트를 이용하는 것 대신에, SSL이나 TLS 프로토콜을 통해 데이터를 암호화한다.&lt;/p&gt;&lt;p&gt;패킷을 암호화하는 과정을 거치기 때문에 속도는 더 느리다. 다만 큰 차이가 있을 정도는 아니다. 포트는 443번을 쓴다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;HTTP - TCP&lt;/p&gt;&lt;p&gt;(HTTP는 바로 TCP와 통신한다.)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;HTTPS - SSL - TCP&lt;/p&gt;&lt;p&gt;(HTTPS는 SSL을 거쳐 TCP와 통신한다.)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://wayhome25.github.io/cs/2018/03/11/ssl-https/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;인증 방식에 관한 링크&lt;/a&gt;&lt;/p&gt;</description>
      <category>WEB/ETC</category>
      <author>꿈꾸는 제노</author>
      <guid isPermaLink="true">https://n-log.tistory.com/29</guid>
      <comments>https://n-log.tistory.com/29#entry29comment</comments>
      <pubDate>Tue, 19 Feb 2019 16:12:54 +0900</pubDate>
    </item>
  </channel>
</rss>