<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Haru</title>
    <description>게으르기 때문에 게발자. 글쓰는 걸 좋아하고, 디자인과 개발을 좋아한다.
</description>
    <link>https://harurepository.github.io/</link>
    <atom:link href="https://harurepository.github.io/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Mon, 10 Jun 2019 07:13:00 +0000</pubDate>
    <lastBuildDate>Mon, 10 Jun 2019 07:13:00 +0000</lastBuildDate>
    <generator>Jekyll v3.8.5</generator>
    
      <item>
        <title>[일어]10. 동사의 사역</title>
        <description>&lt;h2 id=&quot;동사의-사역형&quot;&gt;동사의 사역형&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;~하게하다/~하도록하다: 1그룹 동사의 &lt;code class=&quot;highlighter-rouge&quot;&gt;う&lt;/code&gt; 단을 &lt;code class=&quot;highlighter-rouge&quot;&gt;아&lt;/code&gt;단으로 바꾸고  &lt;code class=&quot;highlighter-rouge&quot;&gt;세루&lt;/code&gt; 를 붙인다. 하나사세루. 말하게하다.&lt;/li&gt;
  &lt;li&gt;~하게하다/~하도록하다: 2그룹 동사의 &lt;code class=&quot;highlighter-rouge&quot;&gt;る&lt;/code&gt;를 사세루 로 바꾼다. 타베사세루. 먹게하다.&lt;/li&gt;
  &lt;li&gt;~하게하다/~하도록하다: 3그룹 동사 &lt;code class=&quot;highlighter-rouge&quot;&gt;する&lt;/code&gt; 는 &lt;code class=&quot;highlighter-rouge&quot;&gt;사세루&lt;/code&gt;가 된다.&lt;/li&gt;
  &lt;li&gt;~하게하다/~하도록하다: 3그룹 동사 &lt;code class=&quot;highlighter-rouge&quot;&gt;くる&lt;/code&gt; 는 &lt;code class=&quot;highlighter-rouge&quot;&gt;코사세루&lt;/code&gt;가 된다.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/tip/2019/04/23/japanese-10/</link>
        <guid isPermaLink="true">https://harurepository.github.io/tip/2019/04/23/japanese-10/</guid>
        
        <category>japan</category>
        
        
        <category>tip</category>
        
      </item>
    
      <item>
        <title>[일어]9. 동사의 명령, 주고 받는 동사</title>
        <description>&lt;h2 id=&quot;동사의-명령형&quot;&gt;동사의 명령형&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;강한명령(~해!): 1그룹 동사의 끝을 &lt;code class=&quot;highlighter-rouge&quot;&gt;え&lt;/code&gt;단으로 바꾼다. のめ 노메! 마셔!&lt;/li&gt;
  &lt;li&gt;부드러운명령(~해): 1그룹 동사의 う/つ/る 를 って 로 변경하여 사용한다. たって 탓테. 일어서.&lt;/li&gt;
  &lt;li&gt;부드러운명령(~해): 1그룹 동사의 む/ね/ぶ 를 んで 로 변경하여 사용할 수 있다. よんで　욘데. 읽어.&lt;/li&gt;
  &lt;li&gt;부드러운명령(~해): 1그룹 동사의 く 를 いて 로, ぐ 를 いで 로 변경하여 사용할 수 있다. かいて 카이테. 써. いそいで 이소이데. 서둘러.&lt;/li&gt;
  &lt;li&gt;강한명령(~하지마!): 1그룹 동사의 뒤에 な를 붙인다. のむな 노무나! 마시지마!&lt;/li&gt;
  &lt;li&gt;부드러운명령(~하지마): 1그룹 동사의 う단을 あ 단으로 바꾸고 ないで를 붙인다. はなさないで 하나사나이데. 말하지마.&lt;/li&gt;
  &lt;li&gt;강한명령(~해!): 2그룹 동사의 &lt;code class=&quot;highlighter-rouge&quot;&gt;る&lt;/code&gt;를 ろ 로 바꾼다. いれろ 이레로! 넣어!&lt;/li&gt;
  &lt;li&gt;부드러운명령(~해): 2그룹 동사의 &lt;code class=&quot;highlighter-rouge&quot;&gt;る&lt;/code&gt;를 て 로 바꾼다. たべて 타베테. 먹어.&lt;/li&gt;
  &lt;li&gt;강한명령(~하지마!): 2그룹 동사의 뒤에 な 를 사용한다. みるな 미루나! 보지마!&lt;/li&gt;
  &lt;li&gt;부드러운명령(~하지마): 2그룹 동사의 &lt;code class=&quot;highlighter-rouge&quot;&gt;る&lt;/code&gt;를 ないで 로 바꾼다. おきないで 오키나이데. 일어나지마.&lt;/li&gt;
  &lt;li&gt;강한명령(~해!): 3그룹 동사 &lt;code class=&quot;highlighter-rouge&quot;&gt;する&lt;/code&gt;를 しろ 로 바꾼다.&lt;/li&gt;
  &lt;li&gt;부드러운명령(~해): 3그룹 동사 &lt;code class=&quot;highlighter-rouge&quot;&gt;する&lt;/code&gt;를 して 로 바꾼다.&lt;/li&gt;
  &lt;li&gt;강한명령(~하지마!): 3그룹 동사 &lt;code class=&quot;highlighter-rouge&quot;&gt;する&lt;/code&gt; 를 するな로 바꾼다.&lt;/li&gt;
  &lt;li&gt;부드러운명령(~하지마): 3그룹 동사 &lt;code class=&quot;highlighter-rouge&quot;&gt;する&lt;/code&gt;를 しないで 로 바꾼다.&lt;/li&gt;
  &lt;li&gt;강한명령(~와!): 3그룹 동사 &lt;code class=&quot;highlighter-rouge&quot;&gt;くる&lt;/code&gt;를 こい! 로 바꾼다.&lt;/li&gt;
  &lt;li&gt;부드러운명령(~와): 3그룹 동사 &lt;code class=&quot;highlighter-rouge&quot;&gt;くる&lt;/code&gt;를 きて 로 바꾼다.&lt;/li&gt;
  &lt;li&gt;강한명령(~오지마!): 3그룹 동사 &lt;code class=&quot;highlighter-rouge&quot;&gt;くる&lt;/code&gt; 를 くるな! 로 바꾼다.&lt;/li&gt;
  &lt;li&gt;부드러운명령(~오지마): 3그룹 동사 &lt;code class=&quot;highlighter-rouge&quot;&gt;くる&lt;/code&gt;를 こないで로 바꾼다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;주고받는-동사&quot;&gt;주고받는 동사&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;주다(あげる　아게루): 나 또는 나의 그룹이 다른 이에게 무언가를 줄 때. 또는 제3자끼리 무언가를 줄 떄. わたしはともだちにおかねおあげました 와타시와 토모다치니 오카네오 아게마시타. 저는 친구에게 돈을 주었습니다.&lt;/li&gt;
  &lt;li&gt;주다(くれる 쿠레루): 제 3자가 나 또는 나의 그룹에게 무언가를 줄 때. かれはわたしにほんおくれませんでした 카레와 와타시니 혼오 쿠레마센데시타. 그는 저에게 책을 주지않았습니다.&lt;/li&gt;
  &lt;li&gt;받다(もらう 모라우): わたしはいもとにおみあげおもらいました 와타시와 이모토니 오미아게오 모라이마시타. 나는 여동생에게 선물을 받았습니다.&lt;/li&gt;
  &lt;li&gt;드리다(さしあげる 사시아게루): あにはしゃちょうにはなおさしあげた 아니와 샤쵸우니 하나오 사시아게타. 형은 사장에게 꽃을 드렸다.&lt;/li&gt;
  &lt;li&gt;주시다(くださる 쿠다사루): せんせいがわたしにほんおくださいました 센세이가 와타시니 혼오 쿠다사이마시타. 선생님이 저에게 책을 주셨습니다.&lt;/li&gt;
  &lt;li&gt;받다(いただく 이타다쿠): これはしゃちょうにいただきました 코레와 사쵸우니 이타다키마시타. 이것은 사장에게 받았습니다.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 22 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/tip/2019/04/22/japanese-9/</link>
        <guid isPermaLink="true">https://harurepository.github.io/tip/2019/04/22/japanese-9/</guid>
        
        <category>japan</category>
        
        
        <category>tip</category>
        
      </item>
    
      <item>
        <title>[일어]8. 동사의 가정</title>
        <description>&lt;h2 id=&quot;동사의-가정형&quot;&gt;동사의 가정형&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;~면: 1그룹 동사의 &lt;code class=&quot;highlighter-rouge&quot;&gt;う&lt;/code&gt; 단을 &lt;code class=&quot;highlighter-rouge&quot;&gt;え&lt;/code&gt;단으로 바꾸고  &lt;code class=&quot;highlighter-rouge&quot;&gt;바&lt;/code&gt; 를 붙인다. 아라에바. 씻으면.&lt;/li&gt;
  &lt;li&gt;~면: 1그룹 동사의 う/つ/る 를 ㅅ타라 로 변경하여 사용할 수 있다. 아왓타라. 축하하면.&lt;/li&gt;
  &lt;li&gt;~면: 1그룹 동사의 む/ね/ぶ 를 ㄴ다라 로 변경하여 사용할 수 있다. 논다라. 마신다면.&lt;/li&gt;
  &lt;li&gt;~면: 1그룹 동사의 く 를 이타라 로, 구 를 이다라 로 변경하여 사용할 수 있다. 아루이타라. 걸으면. 이소이다라. 서두르면.&lt;/li&gt;
  &lt;li&gt;~면: 2그룹 동사의 &lt;code class=&quot;highlighter-rouge&quot;&gt;る&lt;/code&gt;를 레바 로 바꾼다. 아라와레레바. 나타나면.&lt;/li&gt;
  &lt;li&gt;~면: 2그룹 동사의 &lt;code class=&quot;highlighter-rouge&quot;&gt;る&lt;/code&gt;를 타라 로 바꾼다. 타베타라. 먹으면.&lt;/li&gt;
  &lt;li&gt;~면: 3그룹 동사 &lt;code class=&quot;highlighter-rouge&quot;&gt;する&lt;/code&gt; 는 &lt;code class=&quot;highlighter-rouge&quot;&gt;스레바/시타라&lt;/code&gt;가 된다.&lt;/li&gt;
  &lt;li&gt;~면: 3그룹 동사 &lt;code class=&quot;highlighter-rouge&quot;&gt;くる&lt;/code&gt; 는 &lt;code class=&quot;highlighter-rouge&quot;&gt;쿠레바/키타라&lt;/code&gt;가 된다.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sun, 21 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/tip/2019/04/21/japanese-8/</link>
        <guid isPermaLink="true">https://harurepository.github.io/tip/2019/04/21/japanese-8/</guid>
        
        <category>japan</category>
        
        
        <category>tip</category>
        
      </item>
    
      <item>
        <title>[일어]7. 동사의 가능, 의지, 권유</title>
        <description>&lt;h2 id=&quot;동사의-가능형&quot;&gt;동사의 가능형&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;~수 있다: 1그룹 동사의 &lt;code class=&quot;highlighter-rouge&quot;&gt;う&lt;/code&gt; 단을 &lt;code class=&quot;highlighter-rouge&quot;&gt;え&lt;/code&gt;단으로 바꾸고  &lt;code class=&quot;highlighter-rouge&quot;&gt;る&lt;/code&gt; 를 붙인다. のめる。 노메루. 마실수 있다.&lt;/li&gt;
  &lt;li&gt;~수 있다: 2그룹 동사의 &lt;code class=&quot;highlighter-rouge&quot;&gt;る&lt;/code&gt; 를 &lt;code class=&quot;highlighter-rouge&quot;&gt;られる&lt;/code&gt; 로 바꾼다. たべられる。 타베라레루. 먹을 수 있다.&lt;/li&gt;
  &lt;li&gt;~할 수 있다: 3그룹 동사 &lt;code class=&quot;highlighter-rouge&quot;&gt;する&lt;/code&gt; 는 &lt;code class=&quot;highlighter-rouge&quot;&gt;できる&lt;/code&gt;가 된다. できる。　데키루. 할 수 있다.&lt;/li&gt;
  &lt;li&gt;~올 수 있다: 3그룹 동사 &lt;code class=&quot;highlighter-rouge&quot;&gt;くる&lt;/code&gt; 는 &lt;code class=&quot;highlighter-rouge&quot;&gt;こられる&lt;/code&gt;가 된다. こられる。　코라레루. 올 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;동사의-의지형&quot;&gt;동사의 의지형&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;~해야지/~하자: 1그룹 동사의 &lt;code class=&quot;highlighter-rouge&quot;&gt;う&lt;/code&gt; 단을 &lt;code class=&quot;highlighter-rouge&quot;&gt;お&lt;/code&gt; 단으로 바꾸고 &lt;code class=&quot;highlighter-rouge&quot;&gt;う&lt;/code&gt;를 붙인다. いそごう。 이소고우. 서둘러야지./서두르자.&lt;/li&gt;
  &lt;li&gt;~해야지/~하자: 2그룹 동사의 &lt;code class=&quot;highlighter-rouge&quot;&gt;る&lt;/code&gt;를 &lt;code class=&quot;highlighter-rouge&quot;&gt;よう&lt;/code&gt;로 바꾼다. おしえよう。  오시에요우. 가르쳐야지./가르치자.&lt;/li&gt;
  &lt;li&gt;~해야지/~하자: 3그룹 동사 &lt;code class=&quot;highlighter-rouge&quot;&gt;する&lt;/code&gt; 는 &lt;code class=&quot;highlighter-rouge&quot;&gt;しょう&lt;/code&gt;가 된다. いえでべんきょうおしょう。 이에데 벤쿄우오 쇼우. 집에서 공부를 해야지./집에서 공부를 하자.&lt;/li&gt;
  &lt;li&gt;~와야지/~오자: 3그룹 동사 &lt;code class=&quot;highlighter-rouge&quot;&gt;くる&lt;/code&gt; 는 &lt;code class=&quot;highlighter-rouge&quot;&gt;こよう&lt;/code&gt;가 된다. ここにまだこよう。 코코니 마다 코요우. 여기 다시 와야지./ 여기 다시오자.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;동사의-의지형--と-토--おもう오모우--하려고-한다할까한다&quot;&gt;동사의 의지형 + と 토 + おもう　오모우 : (~하려고 한다/~할까한다.)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;1그룹동사: いまあらおうとおもう。 이마 아라오우토 오모우. 지금 씻으려 한다.&lt;/li&gt;
  &lt;li&gt;2그룹동사: あしたあそこでねようとおもう。 아시타 아소코데 네요우토 오모우. 내일 저곳에서 자려고한다.&lt;/li&gt;
  &lt;li&gt;스루: きょううんどうおしょうとおもう。 코우 운도오 쇼우토 오모우. 오늘 운동을 하려고한다.&lt;/li&gt;
  &lt;li&gt;쿠루: かれはいまかっこにこようとおもう。 카레와 이마 캇코니 코요우토 오모우. 그는 지금 학교에 오려고한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;동사의-의지형--と-토--している시테이루--하려고-한다할까한다&quot;&gt;동사의 의지형 + と 토 + している　시테이루 : (~하려고 한다/~할까한다.)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;1그룹동사: あしたからほんおよもうとしている。 아시타카라 혼오 요모우토시테이루. 내일부터 책을 읽으려한다.&lt;/li&gt;
  &lt;li&gt;2그룹동사: あしたからドラマおみようとしている。 아시타카라 도라마오 미요우토시테이루. 내일부터 드라마를 보려한다.&lt;/li&gt;
  &lt;li&gt;스루: きょうからダイエとおしょうとしている。 쿄우카라 다이에토오 쇼우토시테이루. 오늘부터 다이어트 하려고한다.&lt;/li&gt;
  &lt;li&gt;쿠루: かれはいまこようとしている。 카레와 이마 코요우토시테이루. 그는 지금 오려고한다.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 20 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/tip/2019/04/20/japanese-7/</link>
        <guid isPermaLink="true">https://harurepository.github.io/tip/2019/04/20/japanese-7/</guid>
        
        <category>japan</category>
        
        
        <category>tip</category>
        
      </item>
    
      <item>
        <title>[일어]6. 동사의 て 형과 た 형</title>
        <description>&lt;h2 id=&quot;1그룹-동사의-うつる-를-하고해서って했다った-로-변경하여-사용할-수-있다&quot;&gt;1그룹 동사의 う/つ/る 를 (~하고/해서)って/(~했다)った 로 변경하여 사용할 수 있다.&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;~하고/~해서: わたしはあなたにいって、たべました。 와타시와 아나타니 잇테, 타베마시타. 나는 당신에게 말하고, 먹었습니다.&lt;/li&gt;
  &lt;li&gt;~했다: かれおまった。 카레오 맛타. 그를 기다렸다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;1그룹-동사의-むねぶ-를-하고해서んで했다んだ-로-변경하여-사용할-수-있다&quot;&gt;1그룹 동사의 む/ね/ぶ 를 (~하고/해서)んで/(~했다)んだ 로 변경하여 사용할 수 있다.&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;~하고/~해서: みすおのんで、ごはんおたべる。 미즈오 논데, 고항오 타베루. 물을 마시고, 밥을 먹는다.&lt;/li&gt;
  &lt;li&gt;~했다: かれおわたしのなまえおさけんだ 카레오 와타시노 나마에오 사켄다. 그는 나의 이름을 외쳤다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;1그룹-동사의-く-를-하고해서いて했다いた-로-변경하여-사용할-수-있다&quot;&gt;1그룹 동사의 く 를 (~하고/해서)いて/(~했다)いた 로 변경하여 사용할 수 있다.&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;~하고/~해서: いえまであるいていきました。 이에마데 아루이테 이키마시타. 집까지 걸어서 갔습니다.&lt;/li&gt;
  &lt;li&gt;~했다: いえまであるいた。 이에마데 아루이타. 집까지 걸어갔다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;1그룹-동사의-ぐ-를-하고해서いで했다いだ-로-변경하여-사용할-수-있다&quot;&gt;1그룹 동사의 ぐ 를 (~하고/해서)いで/(~했다)いだ 로 변경하여 사용할 수 있다.&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;~하고/~해서: いえまでいそいでいきました。 이에마데 이소이데 이키마시타. 집까지 서둘러 갔습니다.&lt;/li&gt;
  &lt;li&gt;~했다: いえまでいそいだ。 이에마데 이소이다. 집까지 서둘렀다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;1그룹-동사의-す-를-하고해서して했다した-로-변경하여-사용할-수-있다&quot;&gt;1그룹 동사의 す 를 (~하고/해서)して/(~했다)した 로 변경하여 사용할 수 있다.&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;~하고/~해서: らめんおわかしてたべる。 라멘오 와카시테 타베루. 라면을 끓여서 먹는다.&lt;/li&gt;
  &lt;li&gt;~했다: らめんおわかした。 라멘오 와카시타. 라면을 끓였다.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;2그룹-동사의-る-를-하고해서て했다た-로-변경하여-사용할-수-있다&quot;&gt;2그룹 동사의 る 를 (~하고/해서)て/(~했다)た 로 변경하여 사용할 수 있다.&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;~하고/~해서: ひるめしおたべて、ひだるくない。 히루메시오 타베테, 히다루쿠나이. 점심밥을 먹어서, 배고프지않다.&lt;/li&gt;
  &lt;li&gt;~했다: ばんごはんおもうたべた。 반고항오 모우타베타. 저녁밥을 이미 먹었다.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;3그룹-동사&quot;&gt;3그룹 동사&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;~하고/~해서: うんどうおして、ひだるい。 운도우오시테, 히다루이. 운동을해서 배가고프다.&lt;/li&gt;
  &lt;li&gt;~했다: うんどうおした。 운도우오시타. 운동을했다.&lt;/li&gt;
  &lt;li&gt;~오고/~와서: いえにきて。 이에니키테, 벤쿄우오시타. 집에와서, 공부를했다.&lt;/li&gt;
  &lt;li&gt;~왔다: いえにきた。 이에니키타. 집에왔다.&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Fri, 19 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/tip/2019/04/19/japanese-6/</link>
        <guid isPermaLink="true">https://harurepository.github.io/tip/2019/04/19/japanese-6/</guid>
        
        <category>japan</category>
        
        
        <category>tip</category>
        
      </item>
    
      <item>
        <title>[함수형 자바스크립트]8.비동기 이벤트와 데이터 관리</title>
        <description>&lt;p&gt;요즘 자바스크립트 프로그램은 단일 요청으로 로드되는 경우가 거의 없다. 보통 사용자의 필요에 따라 여러 비동기 요청을 동시에 전송해서 데이터를 페이지에 미리 로드한다. 비동기는 다음 문제가 있다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;함수 간에 일시적 의존 관계가 형성 됨&lt;/li&gt;
  &lt;li&gt;콜백 피라미드의 늪에 빠짐&lt;/li&gt;
  &lt;li&gt;동기/비동기 코드의 호환되지 않는 조합&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;비동기-로직을-프라미스로-일급화&quot;&gt;비동기 로직을 프라미스로 일급화&lt;/h2&gt;

&lt;p&gt;함수형을 이런 특징을 지녀야한다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;합성과 무인수 프로그래밍을 이용한다.&lt;/li&gt;
  &lt;li&gt;중첩된 구조를 선형적으로 흐르게 눌러 편다.&lt;/li&gt;
  &lt;li&gt;단일 함수로 에러 처리로직을 통합하여 코드 흐름을 원할하게한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;위의 특징들은 모나드의 특징과도 같다. 비동기 로직을 가싸는 모나드인 프라미스를 소개한다.&lt;/p&gt;

&lt;p&gt;프라미스의 상태는 보류, 이룸, 버림, 귀결 중 하나이다. 프라미스는 성공하면 resolve를 실패하면 reject를 콜백한다. 그 콜백이 .then과 .catch로 체이닝된다.&lt;/p&gt;

&lt;h2 id=&quot;느긋한-데이터-생성&quot;&gt;느긋한 데이터 생성&lt;/h2&gt;

&lt;p&gt;ES6의 강한 특성 중 하나는 어떤 함수를 끝까지 실행하지 않아도 데이터 제공을 잠시 중단한 상태로 다른 함수들과 더불어 작동시키는 능력이다. 거대한 자료구조를 당장 꼭 처리할 필요 없이 느긋하게 데이터를 생성하는 매개체로 함수를 활용할 수 있는 다양한 기회가 생기게 되는것이다.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;제너레이터&lt;/code&gt;를 사용하는 것이다. 제너레이터는 &lt;code class=&quot;highlighter-rouge&quot;&gt;function*&lt;/code&gt;로 선언할 수 있다. 그렇게 선언 된 제너레이터는 &lt;code class=&quot;highlighter-rouge&quot;&gt;yeild&lt;/code&gt;를 통해 데이터를 순차적으로 뱉어낸다. 같은 ES6 신상인 &lt;code class=&quot;highlighter-rouge&quot;&gt;이터레이터&lt;/code&gt;가 제너레이터로 구현되어 있다.&lt;/p&gt;

&lt;h2 id=&quot;rxjs&quot;&gt;RxJS&lt;/h2&gt;

&lt;p&gt;웹 앱에서 비동기 전략인 &lt;code class=&quot;highlighter-rouge&quot;&gt;AJAX&lt;/code&gt;의 출현은 아주 큰 혁명을 가져왔다. 함수형 프로그래밍에서도 비동기 프로그램과 이벤트 기반 프로그램을 우아하게 엮는 RxJS에 대해 알아보자.&lt;/p&gt;

&lt;h3 id=&quot;옵저버블-순차열로서의-데이터&quot;&gt;옵저버블 순차열로서의 데이터&lt;/h3&gt;

&lt;p&gt;옵저버블은 구독 가능한 모든 객체를 이야기한다. 애플리케이션은 파일 읽기, 웹서비스 호출, DB 쿼리 등등의 비동기 이벤트를 구독할 수 있다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;Rx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Observable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`next: &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`error: &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'done'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;cm&quot;&gt;/*
    다음: 1
    다음: 2
    다음: 3
    완료
    */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;리액티브 프로그래밍은 함수형과 유사한점이 많아 결국 &lt;code class=&quot;highlighter-rouge&quot;&gt;함수형 리액티브 프로그래밍&lt;/code&gt;이라는 패러다임이 생겼다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;Rx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Observable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fromEvent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'#student-ssn'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'change'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;cleanInput&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;checkLengthSsn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ssn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ssn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isRight&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Valid'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Invalid'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Either모나드의 Right 이다.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;rxjs와-프라미스&quot;&gt;RxJS와 프라미스&lt;/h3&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;Rx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Observable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fromPromise&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getJSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'/student'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;sortBy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;toLower&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'firstname'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;flatMapLatest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Rx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Observable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;pathEq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'address'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'country'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'US'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fullname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;subscribe가 에러처리를 도맡는다.&lt;/p&gt;
</description>
        <pubDate>Fri, 19 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/devlog/2019/04/19/functional-programing-8/</link>
        <guid isPermaLink="true">https://harurepository.github.io/devlog/2019/04/19/functional-programing-8/</guid>
        
        <category>nodejs</category>
        
        <category>javascript</category>
        
        
        <category>devlog</category>
        
      </item>
    
      <item>
        <title>[Klaytn]클레이튼 컨트랙트 Fee 대납하기</title>
        <description>&lt;p&gt;클레이튼 네트워크의 사용료는 누군가가 대신 내어줄 수 있다. 서비스를 운영하는 주체가 된다면 이 기능에 대해서 고려할 텐데, 오늘은 간단한 구현체로 &lt;code class=&quot;highlighter-rouge&quot;&gt;클레이튼 네트워크에 등록된 컨트랙트의 함수를 대납으로 실행&lt;/code&gt; 시켜보자.&lt;/p&gt;

&lt;h2 id=&quot;구현체&quot;&gt;구현체&lt;/h2&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;encodedAbi&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;myContract&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;methods&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;myMethod&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;encodeABI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;feeDelegator&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fromPrivateKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;contractAddress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;encodedAbi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;senderPrivateKey&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fromPrivateKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rawTransaction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;senderRawTransaction&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;klaytn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;accounts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;signTransaction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;FEE_DELEGATED_SMART_CONTRACT_EXECUTION_TYPE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;contractAddress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;encodedAbi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;gas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;GAS_LIMIT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;senderPrivateKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;feePayerPrivateKey&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;FEE_DELEGATOR_PRIVATE_KEY&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;kr&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;klaytn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;accounts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;wallet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;feePayerPrivateKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;FEE_DELEGATOR_ADDRESS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;klaytn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;sendTransaction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;senderRawTransaction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;senderRawTransaction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;feePayer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;FEE_DELEGATOR_ADDRESS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;구현체는 위처럼하면 된다. 특별한 예외처리 없이 간단하게 감싸놓기만 했다. 여기서 중요한 점은 &lt;code class=&quot;highlighter-rouge&quot;&gt;signTransaction&lt;/code&gt;의 &lt;code class=&quot;highlighter-rouge&quot;&gt;data&lt;/code&gt;인자이다. &lt;code class=&quot;highlighter-rouge&quot;&gt;encodedABI&lt;/code&gt;가 어떤 함수를 실행할건지와 어떤 인자를 지니고 있는지까지 포함하여 스마트 컨트랙트의 특정함수를 호출할 수 있다.&lt;/p&gt;

&lt;p&gt;나머지는 상수와 변수이름으로 이해하기 쉽게 만들어 적어놨기 때문에 금방 이해가 될 것이다.&lt;/p&gt;
</description>
        <pubDate>Thu, 18 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/devlog/2019/04/18/klaytn-contract-fee-delegation/</link>
        <guid isPermaLink="true">https://harurepository.github.io/devlog/2019/04/18/klaytn-contract-fee-delegation/</guid>
        
        <category>devlog</category>
        
        <category>javascript</category>
        
        
        <category>devlog</category>
        
      </item>
    
      <item>
        <title>[일어]5. 조사</title>
        <description>&lt;h2 id=&quot;조사&quot;&gt;조사&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;주격조사(은/는): &lt;code class=&quot;highlighter-rouge&quot;&gt;は&lt;/code&gt;는 주격조사로 하가 아닌 와로 읽는다. これはくるまです 코레와 쿠루마데스. 이거슨 차입니다.&lt;/li&gt;
  &lt;li&gt;주격조사(이/가): &lt;code class=&quot;highlighter-rouge&quot;&gt;が&lt;/code&gt;는 주격조사이다. かれがともだちですが 카레가 토모다치데스가. 그가 친구입니까?&lt;/li&gt;
  &lt;li&gt;주격조사(을/를): &lt;code class=&quot;highlighter-rouge&quot;&gt;お&lt;/code&gt; 오. わたしはにほんごおべんきょうする 와타시와 니혼고오 벤쿄우스르. 나는 일본어를 공부한다.&lt;/li&gt;
  &lt;li&gt;~의/~의 것: &lt;code class=&quot;highlighter-rouge&quot;&gt;の&lt;/code&gt; 노를 사용한다. わたしのほんです 와타시노 혼데스. 나의 책입니다. わたしのだ 와타시노다. 나의것이다.&lt;/li&gt;
  &lt;li&gt;~로/~에/~에게: &lt;code class=&quot;highlighter-rouge&quot;&gt;に&lt;/code&gt; 니. わたしはあちらにいきます 와타시와 아치라니 이키마스. 나는 저쪽으로 갑니다. かれにききました 카레니 키키마시타. 그에게 들었습니다.&lt;/li&gt;
  &lt;li&gt;~에: &lt;code class=&quot;highlighter-rouge&quot;&gt;へ&lt;/code&gt; 헤이지만 에로 발음한다. わたしはびょいんへいきます 와타시와 뵤인에 이끼마스. 저는 병원에 갑니다.&lt;/li&gt;
  &lt;li&gt;~에서/~로/~때문에/~이고: &lt;code class=&quot;highlighter-rouge&quot;&gt;で&lt;/code&gt; 데. &lt;code class=&quot;highlighter-rouge&quot;&gt;に&lt;/code&gt;와 비슷하지만 데 뒤의 문장에는 행위가 온다. わたしたちはしょくどうで、ごはんたべる 와타시타치와 쇼쿠도우데, 고항 타베루. 우리는 식당에서 밥을 먹는다.&lt;/li&gt;
  &lt;li&gt;~부터/~에서부터: &lt;code class=&quot;highlighter-rouge&quot;&gt;から&lt;/code&gt;카라. じゃぎょうは３じからはじめる 자교우와 3지카라 하지메루. 수업은 3시부터 시작한다.&lt;/li&gt;
  &lt;li&gt;~까지: &lt;code class=&quot;highlighter-rouge&quot;&gt;まで&lt;/code&gt; 마데. かれは５じまでどうちゃくします 카레와 5지마데 도챠쿠시마스. 그는 5시까지 도착합니다.&lt;/li&gt;
  &lt;li&gt;~도/~나/~씩이나: &lt;code class=&quot;highlighter-rouge&quot;&gt;も&lt;/code&gt; 모. ここにはのみものもあります 코코니와 노미모노모 아리마스. 여기에는 마실것도 있습니다.&lt;/li&gt;
  &lt;li&gt;~와/~과: &lt;code class=&quot;highlighter-rouge&quot;&gt;と&lt;/code&gt; 토. わたしとかれはともだちです 와타시토 카레와 토모다치데스. 나와 그는 친구입니다.&lt;/li&gt;
  &lt;li&gt;~라던가/~등:&lt;code class=&quot;highlighter-rouge&quot;&gt;とか&lt;/code&gt; 토카. あさごはんおたべるとか、らめんおたべるとか、どちらがいい 아사고항오 타베루토카, 라멘오 타베루토카 도찌라가 이이? 아침밥을 먹는다던가, 라면을 먹는다던가 어느쪽이 좋아?&lt;/li&gt;
  &lt;li&gt;~랑: &lt;code class=&quot;highlighter-rouge&quot;&gt;や&lt;/code&gt; 야. あさごはんやらめんやいつしょにたべました 아사고항야 라멘야 잇쇼니타베마시타. 아침밥이랑 라멘이랑 같이 먹었습니다.&lt;/li&gt;
  &lt;li&gt;~보다/~로부터: &lt;code class=&quot;highlighter-rouge&quot;&gt;より&lt;/code&gt; 요리. これはあれよりやすい 코레와 아레요리 야스이. 이건 저거보다 싸다. これはかれよりきました 코레와 카레요리 키마시타. 이건 그로부터 왔습니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;예외&quot;&gt;예외&lt;/h2&gt;

&lt;h3 id=&quot;가는-나형용사-4가지와-할-수-있다는-표현-앞에서는-을를-로-사용된다&quot;&gt;가는 나형용사 4가지와 ~할 수 있다는 표현 앞에서는 ~을/~를 로 사용된다.&lt;/h3&gt;

&lt;h4 id=&quot;예외-나형용사-4가지&quot;&gt;예외 나형용사 4가지&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;すきだ 스키다. 좋아하다. : かれはかのじょがすきだ 카레와 카노죠가 스키다. 그는 그녀를 좋아한다.&lt;/li&gt;
  &lt;li&gt;きらいだ 키라이다. 싫어하다.: かれはこれがきらいだ 카레와 코레가 키라이다. 그는 이것을 싫어한다.&lt;/li&gt;
  &lt;li&gt;じょうずだ 죠즈다. 잘하다.: かれはうんどうがじょうずだ 카레와 운도가 죠즈다. 그는 운동을 잘한다.&lt;/li&gt;
  &lt;li&gt;へただ 헤타다. 못하다.: かれはべんきょうがへただ 카레와 벤쿄우가 헤타다. 그는 공부를 못한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;할-수-있다&quot;&gt;~할 수 있다.&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;できる 데키루. 할 수 있다.: かれはかんこくごができる 카레와 칸코쿠고가 데키루.&lt;/li&gt;
  &lt;li&gt;가능동사:かれはあさごはんがたべられる 카레와 아사고항가 타베라레루. 그는 아침밥을 먹을 수 있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;니는-타다만나다이-되다-에서-다른-조사대신-사용된다&quot;&gt;니는 ~타다/~만나다/~이 되다 에서 다른 조사대신 사용된다.&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;~타다: でんしゃにのる 덴샤니 노루. 전차를 타다.&lt;/li&gt;
  &lt;li&gt;~만나다: ともだちにあう 토모다치니 아우. 친구를 만나다.&lt;/li&gt;
  &lt;li&gt;~이 되다: だいがくせいになる 다이가쿠세이니 나루. 대학생이 되다.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 18 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/tip/2019/04/18/japanese-5/</link>
        <guid isPermaLink="true">https://harurepository.github.io/tip/2019/04/18/japanese-5/</guid>
        
        <category>japan</category>
        
        
        <category>tip</category>
        
      </item>
    
      <item>
        <title>[함수형 자바스크립트]7.함수형 최적화</title>
        <description>&lt;p&gt;최적화는 항상 맨 나중에 한다. 함수형 코드를 작성하는 것과 테스트하는것까지 알아본 지금이 최적화에 대해 이야기 할 적기인 것 같다. 모든 프로그래밍 패러다임은 완벽할 수 없다. 그저 일장일단이 있을뿐.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;성능&lt;/code&gt;과 &lt;code class=&quot;highlighter-rouge&quot;&gt;추상화&lt;/code&gt;도 마찬가지다. 함수형은 래핑하는 경우가 많기때문에 성능에 대한 궁금증이 생길 수 밖에 없다. 명령형과 비교하여 어떨까? 결론적으로 말하자면 &lt;code class=&quot;highlighter-rouge&quot;&gt;또이또이&lt;/code&gt;하다. 하드웨어의 성능이 충분히 좋은 요즘같은경우에 몇 밀리초 단축시키거나 느린건 큰 문제가 되지 않는다.&lt;/p&gt;

&lt;p&gt;패러다임으로써는 문제가 없다는걸 알았고, 사실 코드에서 대부분의 냄새는 패러다임보다는 로직의 구성방법이나 로직에서 나온다.&lt;/p&gt;

&lt;h2 id=&quot;함수-실행의-내무-작동-원리&quot;&gt;함수 실행의 내무 작동 원리&lt;/h2&gt;

&lt;p&gt;자바스크립트에서는 함수를 호출할 때마다 함수 컨텍스트 스택에 레코드(프레임)가 생성된다.&lt;/p&gt;

&lt;p&gt;전역 컨텍스트 프레임은 항상 스택 맨 밑에 위치한다. 함수 컨텍스트 프레임은 각각 내부 지역 변수의 개수만큼 메모리를 점유한다. 지역변수가 하나도 없는 빈 프레임은 48바이트 정도 되고, 숫자, 불리언 같은 지역 변수/매개변수는 8바이트를 차지한다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;executionContextData&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;scopeChain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;variableObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;variableObject&lt;/code&gt;는 지역변수와 함수는 물론이고 함수의 인수, 유사배열 객체 arguments를 가리키는 속성이므로, 사실상 스택프레임의 크기는 이 속성으로 결정된다. 스코프체인은 부모 실행컨텍스트와 연결하거나 참조한다. 모든 함수는 결국 전역 프레임과 직/간접적으로 연결되게 된다.&lt;/p&gt;

&lt;p&gt;스택의 주요 작동 규칙은 아래와 같다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;단일 스레드로작동한다. 즉 동기실행이다.&lt;/li&gt;
  &lt;li&gt;전역컨텍스트는 단 하나만 존재한다.&lt;/li&gt;
  &lt;li&gt;함수컨텍스트 개수에 제한은 없다.&lt;/li&gt;
  &lt;li&gt;함수를 호출할 때마다 실행 콘텍스트가 새로 생성되며, 자기 자신을 재귀호출해도 마찬가지다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;이런 연유로 커리된 함수를 지나치게 사용하면 컨텍스트 스택을 신경써야 할 때가 올 수도 있다.&lt;/p&gt;

&lt;h3 id=&quot;커링과-함수-컨텍스트-스택&quot;&gt;커링과 함수 컨텍스트 스택&lt;/h3&gt;

&lt;p&gt;추상화를 한 커풀 더 입히면 일반적인 함수 평가보다 컨텍스트에 오버헤드가 더 많이 발생할 수 있다.&lt;/p&gt;

&lt;p&gt;어떤 함수를 커리하면 한 번에 인수를 전부 넣고 평가하는 것이 아니라 한 번에 하나씩 인수를 받는다고 이야기했었다. 즉 인수 수만큰 함수를 생성하는 것과 마찬가지이다. 그럼 함수 컨텍스트 프레임이 쌓이게된다.&lt;/p&gt;

&lt;p&gt;모든 함수를 커리하면 좋을 것 같지만, 과용하면 메모리 소모가 커져 곤란해질 수 있다.&lt;/p&gt;

&lt;h3 id=&quot;재귀-코드의-문제점&quot;&gt;재귀 코드의 문제점&lt;/h3&gt;

&lt;p&gt;재귀 호출도 함수 컨텍스트가 생성된다. 출구 케이스에 도달하지 못하는 잘못된 재귀 코드를 호출하면 스택 넘침이 일어날 수 있다.&lt;/p&gt;

&lt;p&gt;원소가 많은 리스트는 map, filter, reduce등의 고계함수를 이용하는것이 좋다.&lt;/p&gt;

&lt;h2 id=&quot;느긋한-평가로-실행을-늦춘다&quot;&gt;느긋한 평가로 실행을 늦춘다&lt;/h2&gt;

&lt;p&gt;불필요한 함수 호출을 삼가하고 꼭 필요한 입력만 넣고 실행하면 여러모로 성능 향상을 기대할 수 있다. 하스켈 같은 함수형 언어는 기본적으로 모든 함수 표현식을 느긋하게 평가한다.&lt;/p&gt;

&lt;p&gt;자바스크립트는 기본적으로 함수를 조급하게 평가한다. 함수 결괏값이 필요한지 따져볼 새도 없이 변수에 바인딩되자마자 표현식 평가를 마친다.&lt;/p&gt;

&lt;p&gt;어떻게 느긋하게 평가 할 수 있을까?&lt;/p&gt;

&lt;h3 id=&quot;대체-함수형-조합으로-계산을-회피&quot;&gt;대체 함수형 조합으로 계산을 회피&lt;/h3&gt;

&lt;p&gt;느긋한 평가를 제대로 흉내 내면 순수 함수형 언어만의 혜택을 누릴 수 있다. 가장 단순한 사용법은 함수를 레퍼런스로 전달하고 조건에 따라 한쪽만 호출하여 쓸데없는 계산을 건너뛰는 것이다.&lt;/p&gt;

&lt;p&gt;alt조합기를 생각하면 된다. 혹은 실행 전에 전체 프로그램을 미리 정의해서 함수형 라이브러리로 하여금 단축 융합이라는 최적화를 수행하게 하는 방법도 있다.&lt;/p&gt;

&lt;h3 id=&quot;단축-융합&quot;&gt;단축 융합&lt;/h3&gt;

&lt;p&gt;chain 이라는 함수를 배웠었다. 맨 마지막에 value()를 호출하면 전체 함수를 몽땅 실행하게 만드는 함수. 이렇게 하면 프로그램 서술부와 실행부를 나눌 수 있을 뿐아니라 함수 실행 중 차지하는 공간을 효율적으로 통합하여 최적화하도록 할 수 있다.&lt;/p&gt;

&lt;p&gt;단축 융합은 몇 개 함수의 실행을 하나로 병합하고 중간 결과를 계산할 때 사용하는 내부 자료구조의 개수를 줄이는 함수 수준의 최적화이다. 자료구조가 줄면 대량 데이터를 처리할 때 필요한 과도한 메모리 사용을 낮출 수 있다.&lt;/p&gt;

&lt;p&gt;이게 가능한 이유는 함수형프로그래밍이 참조투명성을 가지고 있어서 수학적인 정합 관계가 성립하기 때문이다. 예를 들면 &lt;code class=&quot;highlighter-rouge&quot;&gt;compose(map(f), map(g))&lt;/code&gt; 는 &lt;code class=&quot;highlighter-rouge&quot;&gt;map(compose(f, g))&lt;/code&gt;와 같다.&lt;/p&gt;

&lt;h2 id=&quot;필요할-때-부른다&quot;&gt;필요할 때 부른다.&lt;/h2&gt;

&lt;p&gt;반복적인 계산을 피하는것도 실행 속도를 올리는 방법이다. 캐시나 프록시 기법을 생각하면 된다. 함수형에서는 &lt;code class=&quot;highlighter-rouge&quot;&gt;메모이제이션&lt;/code&gt;이 있다.&lt;/p&gt;

&lt;h3 id=&quot;계산량이-많은-함수를-메모이제이션&quot;&gt;계산량이 많은 함수를 메모이제이션&lt;/h3&gt;

&lt;p&gt;순수 함수형 언어는 자동으로 메모이제이션을 하지만, 자바스크립트나 파이썬같은 언어에서는 언제 할지 선택할 수 있다. 아무래도 캐시 계층을 잘 엮어놓으면 가장 큰 덕을 보는건 계산 집약적인 함수이다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;Function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;memoized&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_cache&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_cache&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{};&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_cache&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_cache&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_cache&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;Function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;memoize&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;memoized&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;단항함수를 메모이제이션 하는 것을 구현하는건 크게 어렵지 않다. 단항함수를 할 수 있다면, 커링하면 된다.&lt;/p&gt;

&lt;h3 id=&quot;커링과-메모이제이션&quot;&gt;커링과 메모이제이션&lt;/h3&gt;

&lt;p&gt;인수가 여러개인 함수는 순수함수라해도 캐시하기가 어렵다. 캐시과정에서 키값을 생성하는데 더 큰 오버헤드가 들기 때문이다.&lt;/p&gt;

&lt;h2 id=&quot;재귀와-꼬리-호출-최적화&quot;&gt;재귀와 꼬리 호출 최적화&lt;/h2&gt;

&lt;p&gt;재귀는 보통 스택 소비량이 일반적인 상황보다 훨씬 많다. 메모이제이션은 재귀에서 엄청난 성능을 보여주지만, 만약 매번 입력값이 바뀌는 재귀라면 캐싱은 쓸모가 없어진다.&lt;/p&gt;

&lt;p&gt;재귀를 일반 루프만큼 최적화 할 수 있을까? 컴파일러가 꼬리 호출 최적화를 수행하게끔 짜면 된다.&lt;/p&gt;

</description>
        <pubDate>Thu, 18 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/devlog/2019/04/18/functional-programing-7/</link>
        <guid isPermaLink="true">https://harurepository.github.io/devlog/2019/04/18/functional-programing-7/</guid>
        
        <category>nodejs</category>
        
        <category>javascript</category>
        
        
        <category>devlog</category>
        
      </item>
    
      <item>
        <title>[일어]4. 동사</title>
        <description>&lt;p&gt;　&lt;/p&gt;
&lt;h2 id=&quot;동사의-특징&quot;&gt;동사의 특징&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;う&lt;/code&gt; 단으로 끝난다.&lt;/li&gt;
  &lt;li&gt;단독으로 문장이나 절을 만들 수 있다.&lt;/li&gt;
  &lt;li&gt;사물의 동작/존재를 표현할 수 있다.&lt;/li&gt;
  &lt;li&gt;어간과 어미로 나누어져있다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;1그룹-동사&quot;&gt;1그룹 동사&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;어미가 루로 끝나지 않는 모든 동사&lt;/li&gt;
  &lt;li&gt;어미가 루로 끝나지만 어미 바로 앞글자가 이/에 단으로 끝나지 않는 모든 동사&lt;/li&gt;
  &lt;li&gt;예외&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;예&quot;&gt;예&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;반말: 그대로 사용. わかる 와카루 알다&lt;/li&gt;
  &lt;li&gt;정중: 끝을 &lt;code class=&quot;highlighter-rouge&quot;&gt;이&lt;/code&gt;단으로 바꾸고 마스. よみます 요미마스 읽습니다&lt;/li&gt;
  &lt;li&gt;부정: 끝을 &lt;code class=&quot;highlighter-rouge&quot;&gt;아&lt;/code&gt;단으로 바꾸고 나이. はなさない 하나사나이 이야기하지않아.&lt;/li&gt;
  &lt;li&gt;부정정중: 부정에 데스. きかないです 키카나이데스 듣지 않습니다.&lt;/li&gt;
  &lt;li&gt;부정정중2: 끝을 &lt;code class=&quot;highlighter-rouge&quot;&gt;이&lt;/code&gt;단으로 바꾸고 마센. のみません 노미마센 마시지않습니다.&lt;/li&gt;
  &lt;li&gt;과거정중: 끝을 &lt;code class=&quot;highlighter-rouge&quot;&gt;이&lt;/code&gt;단으로 바꾸고 마시타. あらいました 아라이마시타 씻었습니다.&lt;/li&gt;
  &lt;li&gt;부정과거: 끝을 &lt;code class=&quot;highlighter-rouge&quot;&gt;아&lt;/code&gt;단으로 바꾸고 나캇타. のらなかった 노라나캇타 타지않았어.&lt;/li&gt;
  &lt;li&gt;부정과거정중: 끝을 &lt;code class=&quot;highlighter-rouge&quot;&gt;아&lt;/code&gt;단으로 바꾸고 나캇타데스. きたなかったです 키타나캇타데스 기다리지 않았습니다.&lt;/li&gt;
  &lt;li&gt;부정과거정중2: 끝을 &lt;code class=&quot;highlighter-rouge&quot;&gt;이&lt;/code&gt;단으로 바꾸고 마센데시타. とりませんでした 토리마센데시타 찍지 않았습니다.&lt;/li&gt;
  &lt;li&gt;권유: 끝을 &lt;code class=&quot;highlighter-rouge&quot;&gt;이&lt;/code&gt;단으로 바꾸고 마쇼우. よみましょう 요미마쇼우 읽자.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;23그룹-동사&quot;&gt;2/3그룹 동사&lt;/h2&gt;

&lt;h3 id=&quot;2그룹-동사&quot;&gt;2그룹 동사&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;루로 끝나며 어미 바로 앞글자가 &lt;code class=&quot;highlighter-rouge&quot;&gt;이/에&lt;/code&gt;단으로 끝나는 모든 동사&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;반말: 그대로 사용. おきる 오키루 일어나다.&lt;/li&gt;
  &lt;li&gt;정중: 루를 마스로 바꿈. おきます 오키마스 일어납니다.&lt;/li&gt;
  &lt;li&gt;부정: 루를 나이로 바꿈. うけない 우케나이 받지않는다.&lt;/li&gt;
  &lt;li&gt;부정정중: 루를 나이데스로 바꿈. あけないです 아케나이데스 열지않습니다.&lt;/li&gt;
  &lt;li&gt;부정정중2: 루를 마센으로 바꿈. みません 미마센 보지않습니다.&lt;/li&gt;
  &lt;li&gt;과거정중: 루를 마시타로 바꿈. あらわれました 아라와레마시타 나타났었습니다.&lt;/li&gt;
  &lt;li&gt;부정과거: 루를 나캇타로 바꿈. たべなかった 타베나캇타 먹지않았다.&lt;/li&gt;
  &lt;li&gt;부정과거정중: 루를 나캇타데스로 바꿈. たべなかったです 타베나캇타데스 먹지않았습니다.&lt;/li&gt;
  &lt;li&gt;부정과거정중2: 루를 마센데시타로 바꿈. ねすれませんでした 네스레마센데시타 잊지않았습니다.&lt;/li&gt;
  &lt;li&gt;권유: 루를 마쇼우로 바꿈. おぼえましょう 오보에마쇼우 외우자.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3그룹-동사&quot;&gt;3그룹 동사&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;스루 하다 / 쿠루 오다&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;스루&quot;&gt;스루&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;します 시마스 합니다.&lt;/li&gt;
  &lt;li&gt;しますか 시마스카 합니까?&lt;/li&gt;
  &lt;li&gt;しません 시마센 하지 않습니다.&lt;/li&gt;
  &lt;li&gt;しませんか 시마센카 하지 않습니까?&lt;/li&gt;
  &lt;li&gt;しました 시마시타 했습니다.&lt;/li&gt;
  &lt;li&gt;しましたか 시마시타카 했습니까?&lt;/li&gt;
  &lt;li&gt;しませんでした 시마센데시타 하지 않았습니다.&lt;/li&gt;
  &lt;li&gt;しましょう 시마쇼우 합시다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;쿠루&quot;&gt;쿠루&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;くます 쿠마스 옵니다.&lt;/li&gt;
  &lt;li&gt;くますか 쿠마스카 옵니까?&lt;/li&gt;
  &lt;li&gt;くません 쿠마센 오지 않습니다.&lt;/li&gt;
  &lt;li&gt;くませんか 쿠마센카 오지 않습니까?&lt;/li&gt;
  &lt;li&gt;くました 쿠마시타 왔습니다.&lt;/li&gt;
  &lt;li&gt;くましたか 쿠마시타카 왔습니까?&lt;/li&gt;
  &lt;li&gt;くません　쿠마센 오지 않았습니다.&lt;/li&gt;
  &lt;li&gt;くましょう 쿠마쇼우 옵시다.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Wed, 17 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/tip/2019/04/17/japanese-4/</link>
        <guid isPermaLink="true">https://harurepository.github.io/tip/2019/04/17/japanese-4/</guid>
        
        <category>japan</category>
        
        
        <category>tip</category>
        
      </item>
    
      <item>
        <title>[함수형 자바스크립트]6.빈틈없는 코드 만들기</title>
        <description>&lt;p&gt;함수형 코드와 테스트에 대해 이야기해보자.&lt;/p&gt;

&lt;h2 id=&quot;명령형-프로그램-테스트의-어려움&quot;&gt;명령형 프로그램 테스트의 어려움&lt;/h2&gt;

&lt;p&gt;단위 테스트의 주요 원칙중 하나는 격리이다. 사이드이펙트로 인해 테스트가 좌지우지 되는 일을 막아야하는것이다. 명령형 테스트는 몇가지 문제가 있다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;분해하기 어렵다.&lt;/li&gt;
  &lt;li&gt;공유자원에 의존한다.&lt;/li&gt;
  &lt;li&gt;평가순서를 미리 정해놓아야한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;함수형-코드를-테스트&quot;&gt;함수형 코드를 테스트&lt;/h2&gt;

&lt;p&gt;함수형 프로그래밍은 입력 매개변수가 명확히 정의되어 있으므로 쉽게 이모저모 살펴볼 수 있다. 불순하다면 모나드로 감싸면 된다. 함수형 코드를 테스트하면 다음이 좋다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;함수를 블랙박스처럼 취급&lt;/li&gt;
  &lt;li&gt;비즈니스 로직에 집중&lt;/li&gt;
  &lt;li&gt;모나드 격리를 통해 순수와 불순한 부분 분리&lt;/li&gt;
  &lt;li&gt;외부 디펜던시를 모킹&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;함수를-블랙박스처럼-취급&quot;&gt;함수를 블랙박스처럼 취급&lt;/h3&gt;

&lt;p&gt;함수형프로그래밍에서는 어플리케이션의 다른 부분에 구애받지 않고 느슨하게 입력값을 결합하는 함수를 독립적으로 작성한다. 이런 함수는 사이드이펙트가없고 참조 투명하므로 임의의 순서로 몇 번이고 실행하더라고 결과가 동일하고 예측가능하다.&lt;/p&gt;

&lt;p&gt;이처럼 블랙박스로 취급하고 입력에 맞게 결과만 나오는지 테스트할 수 있다.&lt;/p&gt;

&lt;h3 id=&quot;비즈니스-로직에-집중&quot;&gt;비즈니스 로직에 집중&lt;/h3&gt;

&lt;p&gt;함수형 코드를 개발할 때 가장 오랜시간이 걸리는 과정은 문제를 더 작은 부분으로 나누는 일이다. 잘 나누고 비즈니스 로직만 집중해서 코드를 짜면 함수별로 테스트를 만들면 되기 때문에 간단해진다.&lt;/p&gt;

&lt;h3 id=&quot;모나드-격리를-통해-순수불순-코드-분리&quot;&gt;모나드 격리를 통해 순수/불순 코드 분리&lt;/h3&gt;

&lt;p&gt;프로그램은 대부분 순수한 부분과 불순한 부분을 모두 갖고 있다. 클라이언트 자바스크립트라면 DOM 상호작용이 많으니 물론이고, 서버 측에서도 DB나 파일에서 데이터를 읽어오니 마찬가지이다. 합성을 통해 순수/불순함수를 결합하는 걸 해봤지만 그럼에도 여전히 불순한 상태로 남아있다.&lt;/p&gt;

&lt;p&gt;불순하면 테스트하기 어렵다. 잘게 쪼개서 불순한 코드를 격리시키면 나머지 순수한 코드를 수월하게 테스트 할 수 있다.&lt;/p&gt;

&lt;h3 id=&quot;외부-디펜던시를-모킹&quot;&gt;외부 디펜던시를 모킹&lt;/h3&gt;

&lt;p&gt;불순할 수 있는 데이터를 모킹해서 mock 데이터를 이용해 불순한 부분까지 커버할 수 있다.&lt;/p&gt;

&lt;h2 id=&quot;속성-기반-테스트로-명세-담기&quot;&gt;속성 기반 테스트로 명세 담기&lt;/h2&gt;

&lt;p&gt;테스트 시나리오로 명세서를 대체할 수 있다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;학생의 평균성적이 90점 이상이면 A&lt;/li&gt;
  &lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;등등을 테스트 코드로 명세화 할 수 있다.&lt;/p&gt;

&lt;p&gt;JSCheck라는 라이브러리를 사용해 자동 생성되는 속성 기반 테스트를 관리 할 수 있다.&lt;/p&gt;

&lt;h2 id=&quot;코드-실행률로-효율-측정&quot;&gt;코드 실행률로 효율 측정&lt;/h2&gt;

&lt;p&gt;단위 테스트의 효율은 테스트코드 실행률을 나타내므로 적절한 도구 없이 측정하기 어렵다. 기껏 만든 코드가 한번도 쓰이지 않는다면 아쉬우니 커버리지를 높이는게 좋겠다.&lt;/p&gt;

&lt;h3 id=&quot;함수형-코드-테스트의-효율-측정&quot;&gt;함수형 코드 테스트의 효율 측정&lt;/h3&gt;

&lt;p&gt;명령형 코드에 입력이 올바른 긍정 테스트를 하면 예외처리 로직은 들르지 않아 코드 커버리지는 100%가 될 수 없다. 하지만 함수형은 100%가 가능하다. 예외처리를 모나드로 묶어두기 때문이다.&lt;/p&gt;

&lt;p&gt;부정테스트를 하면 명령형의 경우 매우 낮은 커버리지를 보이지만, 함수형은 꽤 높은 커버리지를 보일 수 있다.&lt;/p&gt;

&lt;h3 id=&quot;함수형-코드의-복잡도-측정&quot;&gt;함수형 코드의 복잡도 측정&lt;/h3&gt;

&lt;p&gt;프로그램의 복잡도를 측정하려면 제어 흐름을 잘 들여다봐야한다. &lt;code class=&quot;highlighter-rouge&quot;&gt;순환복잡도&lt;/code&gt;라는 소프트웨어의 정량적 지표를 이용해 복잡도를 측정할 수 있다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;순환복잡도 M = E - N + P&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;E = 간선 개수&lt;/li&gt;
  &lt;li&gt;N = 노드나 블록의 개수&lt;/li&gt;
  &lt;li&gt;P = 출구 있는 노드의 개수&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;함수형 프로그래밍은 순환복잡도가 &lt;code class=&quot;highlighter-rouge&quot;&gt;1&lt;/code&gt;에 가깝다.&lt;/p&gt;

</description>
        <pubDate>Wed, 17 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/devlog/2019/04/17/functional-programing-6/</link>
        <guid isPermaLink="true">https://harurepository.github.io/devlog/2019/04/17/functional-programing-6/</guid>
        
        <category>nodejs</category>
        
        <category>javascript</category>
        
        
        <category>devlog</category>
        
      </item>
    
      <item>
        <title>[일어]3. い형용사의 현재문, 수식, 연결, 의문문, 과거문</title>
        <description>&lt;p&gt;　&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;현재문: &lt;code class=&quot;highlighter-rouge&quot;&gt;い&lt;/code&gt;를 그대로사용하면 된다. かわい 카와이 귀엽다.&lt;/li&gt;
  &lt;li&gt;수식: 그대로 뒤에 명사를 쓰면 된다. たかいくるま 타카이쿠루마　비싼차&lt;/li&gt;
  &lt;li&gt;부사(~게): 쿠로 바꿔서 사용한다. つよく 츠요쿠    강하게&lt;/li&gt;
  &lt;li&gt;연결(~고 ~다): 쿠데를 이용해서 연결한다. つよくでかっこいいです 츠요쿠데 캇코이데스 강하고 멋있습니다.&lt;/li&gt;
  &lt;li&gt;부정(~않다.): 쿠나이　ながくない 나가쿠나이 길지않다.&lt;/li&gt;
  &lt;li&gt;과거형(~었다.): 캇타　おいしかった 오이시캇타 맛있었다&lt;/li&gt;
  &lt;li&gt;부정과거(~하지않았다.): 쿠나캇타　やさしくなかった 야사시쿠나캇타 상냥하지않았다.&lt;/li&gt;
  &lt;li&gt;추측(~겠지): 다로우　つよいだろう 츠요이다로우 강하겠지&lt;/li&gt;
  &lt;li&gt;가정 및 조건(~면): 케레바　やすければ 야스케레바 싸면&lt;/li&gt;
  &lt;li&gt;가정 및 조건2(~면): 캇타라　いたかったら 이타캇타라 아프면&lt;/li&gt;
  &lt;li&gt;변화(~해지다): 쿠나루　あたたかくなる 아타타카쿠나루 따뜻해지다.&lt;/li&gt;
  &lt;li&gt;명사화:  사 ふかさ 후카사 깊이.&lt;/li&gt;
  &lt;li&gt;명사화2: 미 あつみ 아츠미 더위.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Tue, 16 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/tip/2019/04/16/japanese-3/</link>
        <guid isPermaLink="true">https://harurepository.github.io/tip/2019/04/16/japanese-3/</guid>
        
        <category>japan</category>
        
        
        <category>tip</category>
        
      </item>
    
      <item>
        <title>[함수형 자바스크립트]5.복잡성을 줄이는 디자인 패턴</title>
        <description>&lt;p&gt;함수형 패러다임이 다른 패러다임보다 에러를 더 깔끔하게 처리한다는 의견이 많다.&lt;/p&gt;

&lt;p&gt;프로그램 실행 중 예외가 나거나 네트워크 연결이 끊기는 등 예기치 않은 사고로 인해 데이터가 &lt;code class=&quot;highlighter-rouge&quot;&gt;null, undefined&lt;/code&gt;가 되는 경우 골치아픈 문제들이 발생할 수 있다. 이런 에러처리를 위해 개발자들은 아주 많은 리소스를 사용한다. 그렇게 덩치가 커진 코드는 수수께끼 같은 코드가 되기 마련이다.&lt;/p&gt;

&lt;p&gt;모나드라는 기법을 사용하여 이 문제에 대해 다뤄보자.&lt;/p&gt;

&lt;h2 id=&quot;명령형-에러-처리의-문제점&quot;&gt;명령형 에러 처리의 문제점&lt;/h2&gt;

&lt;p&gt;명령형 코드는 대부분 &lt;code class=&quot;highlighter-rouge&quot;&gt;try-catch&lt;/code&gt; 구문으로 에러를 처리한다. 하지만 &lt;code class=&quot;highlighter-rouge&quot;&gt;try-catch&lt;/code&gt;를 사용하면 다른 함수와 합성/체이닝을 할 수 없고 코드 설계에서도 어려움을 갖는다.&lt;/p&gt;

&lt;h3 id=&quot;함수형-프로그램은-왜-예외를-던지지-않을까&quot;&gt;함수형 프로그램은 왜 예외를 던지지 않을까?&lt;/h3&gt;

&lt;p&gt;명령형에서 예외를 던지는 함수의 특징은 다음과 같다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;다른 함수형 장치처럼 합성이나 체이닝을 할 수 없다.&lt;/li&gt;
  &lt;li&gt;예외를 던지는 행위는 함수 호출에서 빠져나갈 구멍을 찾는 것이므로 예측가능한 값을 지향하는 참조 투명성에 위배된다.&lt;/li&gt;
  &lt;li&gt;예기치 않게 스택이 풀리면 함수 호출 범위를 벗어나 전체 시스템에 영향을 미치는 사이드이펙트를 일으킨다.&lt;/li&gt;
  &lt;li&gt;에러를 조치하는 코드가 당초 함수를 호출한 지점과 동떨어져 있어서 비지역성원리에 위배된다. 에러가 나면 함수는 지역 스택과 환경에서 벗어난다.&lt;/li&gt;
  &lt;li&gt;함수의 단일 반환값에 신경 써야 할 에너지를 catch 블록을 선언해 예외를 붙잡아 처리하는데 낭비하게 되어 호출자의 부담이 가중된다.&lt;/li&gt;
  &lt;li&gt;다양한 에러 조건을 처리하는 블록들이 중첩되어 사용하기 어렵다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;그렇다면 함수형 프로그래밍에서는 예외를 완전히 없애야할까?&lt;/p&gt;

&lt;h3 id=&quot;null-체크&quot;&gt;Null 체크&lt;/h3&gt;

&lt;p&gt;함수가 null을 반환하면 이 함수를 부른 호출자는 null체크를 해야 하는 부담을 떠안게된다.&lt;/p&gt;

&lt;h2 id=&quot;함수자&quot;&gt;함수자&lt;/h2&gt;

&lt;p&gt;try-catch와 비슷하게 잠재적인 위험을 가진 코드를 컨테이너로 감싸면서 함수형 에러처리를 할 수 있다.&lt;/p&gt;

&lt;h3 id=&quot;불안전한-값을-감싼다&quot;&gt;불안전한 값을 감싼다&lt;/h3&gt;

&lt;p&gt;래퍼함수를 만들어서 에러가 날지 모를 값을 감싸는 것이다. 이 경우 값에 직접 접근할 수 없어 identity를 사용해야한다.&lt;/p&gt;

&lt;h2 id=&quot;모나드를-응용한-함수형-에러-처리&quot;&gt;모나드를 응용한 함수형 에러 처리&lt;/h2&gt;

&lt;p&gt;모나드는 제이쿼리를 사용해봤다면 비슷한 개념이다. 선택자가 잘못된 값을 선택해도 예외를 던지는게 아니라 빈 제이쿼리 객체에 메서드를 적용하는 걸 생각하면 된다.&lt;/p&gt;

&lt;h3 id=&quot;제어흐름에서-데이터흐름으로&quot;&gt;제어흐름에서 데이터흐름으로&lt;/h3&gt;

&lt;p&gt;모나드는 다음 인터페이스를 준수해야한다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;형식생성자: 모나드형을 생성한다.&lt;/li&gt;
  &lt;li&gt;단위 함수: 어떤 형식의 값을 모나드에 삽입한다.&lt;/li&gt;
  &lt;li&gt;바인드함수: 연산을 서로 체이닝한다.&lt;/li&gt;
  &lt;li&gt;조인연산: 모나드 반환함수를 다중합성할때 중요하게 쓰인다.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Wrapper Monad&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Wrapper&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 형식 생성자&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;kr&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 단위 함수&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Wrapper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 바인드 함수&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Wrapper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 조인 연산&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Wrapper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;`Wrapper (&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;)`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;maybe와-either-모나드로-에러-처리&quot;&gt;Maybe와 Either 모나드로 에러 처리&lt;/h3&gt;

&lt;p&gt;모나드는 유효한 값을 감싸기도 하지만 값이 없는 상태, null이나 undefined를 모형화할 수 있다. 함수형 프로그래밍에서는 Maybe/Either로 아래와 같은 일들을 처리한다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;불순 코드 격리&lt;/li&gt;
  &lt;li&gt;null 체크 로직 정리&lt;/li&gt;
  &lt;li&gt;예외를 던지지 않음&lt;/li&gt;
  &lt;li&gt;함수 합성 지원&lt;/li&gt;
  &lt;li&gt;기본값 제공 로직을 한곳에 모음&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;null-체크를-maybe로-일원화&quot;&gt;null 체크를 Maybe로 일원화&lt;/h4&gt;

&lt;p&gt;Maybe 모나드는 Just, Nothing 두 하위형으로 구성된 빈 형식으로, 주로 null 체크로직을 효과적으로 통합한다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Just(value): 존재하는 값을 감싼 컨테이너를 나타낸다.&lt;/li&gt;
  &lt;li&gt;Nothing(): 값이 없는 컨테이너 또는 추가 정보없이 실패한 컨테이너를 나타낸다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maybe 모나드는 DB쿼리, 컬렉션에서 값을 검색하거나 서버에 데이터를 요청하는 등 결과가 불확실한 호출을 할 때 자주사용한다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;safeFindObject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;curry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Maybe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fromNullable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)));&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;safeFindStudent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;safeFindObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;DB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'student'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;address&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;safeFindStudent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'444-44-4444'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'address'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Just(Address(...)) or Nothing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;country&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getCountry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;safeFindStudent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getCountry&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'school'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'address'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'country'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getOrElse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'존재하지 않는 국가입니다'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 어느 하나라도 Nothing이면 다른 연산은 건너뛴다.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h4 id=&quot;함수-승급&quot;&gt;함수 승급&lt;/h4&gt;

&lt;p&gt;모든 함수마다 일일이 모나드를 부착해야할까? 이런 작업을 간략화하기위해 lift라는 함수 승급기법이 있다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;lift&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;curry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Maybe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fromNullable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;safeFindObject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;lift&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;findObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;either로-실패-복구&quot;&gt;Either로 실패 복구&lt;/h4&gt;

&lt;p&gt;Either는 Maybe와 조금 다르다. Either는 절대로 동시에 발생하지 않는 두 값을 논리적으로 구분한 자료구조이다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Left(a): 에러 메시지 또는 예외 객체를 담는다.&lt;/li&gt;
  &lt;li&gt;Right(b): 성공한 값을 담는다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;즉 실패하면 왼쪽을 보고 성공하면 오른쪽을 보면 된다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;safeFindObject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;curry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;obj&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Either&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Either&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`ID가 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;인 객체를 찾을 수 없습니다.`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;findStudent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;safeFindObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;DB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'student'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;findStudent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'444-44-4444'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getOrElse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Student&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;errorLogger&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;partial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'console'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'basic'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'MyErrorLogger'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Error'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;fineStudent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'444-44-4444'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;orElse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;errorLogger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;io-모나드로-외부-자원과-상호작용&quot;&gt;IO 모나드로 외부 자원과 상호작용&lt;/h3&gt;

&lt;p&gt;DOM을 읽고쓰는 예제를 보자.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;read&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;innerHTML&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;write&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;innerHTML&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// document를 미리 할당하도록 부분적용&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;readDom&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;partial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;writeDom&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;partial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;changeToStartCase&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;IO&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;readDom&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'#student-name'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;startCase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;writeDom&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'#student-name'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;changeToStartCase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;run()을 할때서 한번에 실행되기 때문에 읽기쓰기 중간에 불순한 일이 생길 수 없다.&lt;/p&gt;

&lt;h2 id=&quot;모나드-체인-및-합성&quot;&gt;모나드 체인 및 합성&lt;/h2&gt;

&lt;p&gt;모나드는 사이드이펙트를 억제하므로 합성 가능한 자료구조로 활용할 수 있다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;liftIO&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;IO&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getOrElse&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;curry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getOrElse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;showStudent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'#student-info'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;liftIO&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;getOrElse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Can not find student'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'ssn'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'firsename'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'lastname'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])),&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;chain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;findStudent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;chain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;checkLengthSsn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;lift&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;cleanInput&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;    
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Tue, 16 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/devlog/2019/04/16/functional-programing-5/</link>
        <guid isPermaLink="true">https://harurepository.github.io/devlog/2019/04/16/functional-programing-5/</guid>
        
        <category>nodejs</category>
        
        <category>javascript</category>
        
        
        <category>devlog</category>
        
      </item>
    
      <item>
        <title>[일어]2. な형용사의 현재문, 수식, 연결, 의문문, 과거문</title>
        <description>&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;현재문: な 형용사는 &lt;code class=&quot;highlighter-rouge&quot;&gt;~だ&lt;/code&gt;가 기본형이다. 그때 &lt;code class=&quot;highlighter-rouge&quot;&gt;だ&lt;/code&gt;를 뺀부분을 어간이라고하는데 그부분을 유의하자.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;수식: な 형용사가 な 형용사라고 불리는 이유는 명사를 수식할때 어미가 &lt;code class=&quot;highlighter-rouge&quot;&gt;だ&lt;/code&gt; 대신 &lt;code class=&quot;highlighter-rouge&quot;&gt;な&lt;/code&gt;로 바뀌기 때문이다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;연결: 문장과 문장을 연결할때는 &lt;code class=&quot;highlighter-rouge&quot;&gt;で&lt;/code&gt;로 바뀐다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;예문&quot;&gt;예문&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;すきなうただ　스키나우타다    좋아하는 노래다&lt;/li&gt;
  &lt;li&gt;このかしゅはきれいじゃない　코노카슈와 키레이쟈나이     이 가수는 예쁘지 않다.&lt;/li&gt;
  &lt;li&gt;こえがすできです　코에가스데키데스      목소리가 멋집니다.&lt;/li&gt;
  &lt;li&gt;ヒップホップはしずかじゃありません　힙뿌홉뿌와시즈카쟈아리마센       힙합은 조용하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;ul&gt;
  &lt;li&gt;현재긍정의문문: ~?&lt;/li&gt;
  &lt;li&gt;현재부정의문문: ~じゃない?&lt;/li&gt;
  &lt;li&gt;과거긍정의문문: ~だった?&lt;/li&gt;
  &lt;li&gt;과거부정의문문: ~じゃなかった?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;예문-1&quot;&gt;예문&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;かれはゆうめいだった 카레와유우메이닷타.       그는 유명했다.&lt;/li&gt;
  &lt;li&gt;こくはくはかんたんじゃなかった 코쿠하쿠와간탄쟈나캇타.   고백은 간단하지 않았다.&lt;/li&gt;
  &lt;li&gt;わたしはりょうりがへたでした 와타시와료우리가헤타데시타.   저는 요리를 못했습니다.&lt;/li&gt;
  &lt;li&gt; せいかくがまじめじゃありませんでした 세이카쿠가마지메쟈아리마센데시타.     성격이 성실하지 않았습니다.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 15 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/tip/2019/04/15/japanese-2/</link>
        <guid isPermaLink="true">https://harurepository.github.io/tip/2019/04/15/japanese-2/</guid>
        
        <category>japan</category>
        
        
        <category>tip</category>
        
      </item>
    
      <item>
        <title>[함수형 자바스크립트]4. 재사용 가능한 모듈로</title>
        <description>&lt;blockquote&gt;
  &lt;p&gt;잘 작동하는 복잡한 시스템은 열이면 아홉 잘 작동했던 단순한 시스템에서 진화한 경우가 많다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;대규모 프로젝트에서 모듈성은 아주 중요한 특성이다. 프로그램을 더 작고 독립적인 부분으로 나눌 수 있는 정도를 뜻하는 모듈성은 재사용 가능한 컴포넌트를 만드는데 주요하다. 재사용 가능하다는 것은 다시 만들지 않아도 된다는 뜻으로 잘 만들어둔 모듈 하나는 평생 사용할 수도 있다.&lt;/p&gt;

&lt;h2 id=&quot;메서드-체인-대-함수-파이프라인&quot;&gt;메서드 체인 대 함수 파이프라인&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;tip: 함수형을 표기할때는 하스켈 표기법을 자주 사용한다. &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;function-name&amp;gt; :: &amp;lt;inputs&amp;gt; -&amp;gt; &amp;lt;output&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;메서드-체이닝-단단한-결합-제한된-표현성&quot;&gt;메서드 체이닝 (단단한 결합, 제한된 표현성)&lt;/h3&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;chain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;persons&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isValid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;property&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'address.country'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gatherStats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{})&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;sortBy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'count'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;reverse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;firse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 'US'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이전에 만들었던 코드가 메서드 체이닝의 예이다.이는 로대시가 제공하는 연산만 쓸 수 있기때문에 다른 함수를 연결하기 쉽지 않다.&lt;/p&gt;

&lt;h3 id=&quot;함수-파이프라인-배열-느슨한-결합-유연성&quot;&gt;함수 파이프라인 배열 (느슨한 결합, 유연성)&lt;/h3&gt;

&lt;p&gt;파이프라인은 함수 입출력을 서로 연결지어 느슨하게 결합된 컴포넌트를 만든다. 인수의 개수와 형식이 호환되지 않으면 연결할 수 없기 때문에 주의해야한다.&lt;/p&gt;

&lt;h2 id=&quot;함수-호환-요건&quot;&gt;함수 호환 요건&lt;/h2&gt;

&lt;p&gt;각 함수는 두가지 측면에서 입력과 출력이 서로 호환되어야 한다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;형식: 한 함수의 반환 형식과 수신 함수의 인쑤 형식이 일치해야한다.&lt;/li&gt;
  &lt;li&gt;항수: 수신 함수는 앞 단계 함수가 반환된 값을 처리하기 위해 적어도 하나 이상의 매개변수를 선언해야 한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;형식이-호환되는-함수&quot;&gt;형식이 호환되는 함수&lt;/h3&gt;

&lt;p&gt;하스켈 표기법으로 선행 함수의 출력과 후행함수의 입력이 같은 타입이면 된다.&lt;/p&gt;

&lt;h3 id=&quot;함수와-항수-튜플&quot;&gt;함수와 항수: 튜플&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;항수&lt;/code&gt;란 함수가 받는 인수의 개수이다. 함수의 길이라고도 한다. 이 항수가 작을수록 단순한 함수라고 볼 수 있다.&lt;/p&gt;

&lt;p&gt;항수가 1인 함수가 가장 유연하고 좀 더 모듈화되었다고 볼 수 있다. 하지만 항수가 1인 함수를 얻기란 쉬운일이 아니다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;nx&quot;&gt;isValid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'444-444-4444'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// (false, 'too long')&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;isValid&lt;/code&gt;의 출력에 에러메세지까지 포함 한다고 해보자. 이때 두가지 다른 값을 반환한 자료구조를 튜플이라고 한다.&lt;/p&gt;

&lt;p&gt;튜플은 유한 원소를 지닌 정렬된 리스트로, 보통 한번에 두세 개 값을 묶어 &lt;code class=&quot;highlighter-rouge&quot;&gt;(a, b , c)&lt;/code&gt;와 같이 쓴다.&lt;/p&gt;

&lt;p&gt;튜플은 다음과 같은 특징을 가진다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;불변성: 한번 만들어지면 바꿀 수 없다.&lt;/li&gt;
  &lt;li&gt;임의 형식 생성 방지: 튜플은 전혀 무관한 값을 서로 연관 지을 수 있다. 새로운 인터페이스를 만들지 않아도 된다.&lt;/li&gt;
  &lt;li&gt;이형배열 생성 방지: 자바스크립트는 형식이 다른 원소를 배열에 함께 포함할 수 있다. 하지만 형식이 다른 원소가 배열에 섞여 있으면 형식을 검사하는데 어려움이 있다. 배열은 동일한 형식을 담는 자료구조일 때만 쓰도록 하자.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;커리된-함수의-평가&quot;&gt;커리된 함수의 평가&lt;/h2&gt;

&lt;p&gt;자바스크립트는 언어 특성상 다항함수의 인자가 전부 전해지지 않아도 &lt;code class=&quot;highlighter-rouge&quot;&gt;undefined&lt;/code&gt;를 세팅한다. f(a, b, c)에서 a만 전해지면 f(a, ‘undefined’, ‘undefined’)가 되는것이다. 이런 경우는 생각보다 위험하다.&lt;/p&gt;

&lt;p&gt;이때 커리된 함수를 사용하면 일부 인수만 넣어 호출하면 모자란 나머지 인수가 채워지기를 기다리는 새로운 함수가 반환된다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;f(a) -&amp;gt; f(b,c)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;재사용-가능한-함수-템플릿을-구현하는데-쓰이는-커리&quot;&gt;재사용 가능한 함수 템플릿을 구현하는데 쓰이는 커리&lt;/h3&gt;

&lt;p&gt;log4js를 이용해 로그를 찍는 모듈을 만들어보자.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;logger&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;appender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;level&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;appenders&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;'alert'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Log4js&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;JSAlertAppender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;'console'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Log4js&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;BrowserConsoleAppender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;layouts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;'basic'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Log4js&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;BasicLayout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;'json'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Log4js&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;JSONLayout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;'xml'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Log4js&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;XMLLayout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;appender&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;appenders&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;appender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;appender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;setLayout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;layouts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;logger&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Log4js&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getLogger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addAppender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;appender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;level&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;curry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'alert'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'json'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'FJS'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// R은 람다js. level과 message를 빼고 호출했다.ㄴ&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'ERROR'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Error Occurred!!'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;logError&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;curry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'console'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'basic'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'FJS'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'ERROR'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;logError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'404 Error Occurred!'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;아마 이 예제로 객체지향적 프로그래밍을 하던 사람들은 꽤 와닿았을 것 같다.&lt;/p&gt;

&lt;h2 id=&quot;부분-적용과-매개변수-바인딩&quot;&gt;부분 적용과 매개변수 바인딩&lt;/h2&gt;

&lt;p&gt;부분 적용(partial)은 함수의 일부 매개변수 값을 처음부터 고정시켜 항수가 더 작은 함수를 생성하는 기법이다. 커링과 마찬가지로 함수의 길이를 줄이는 방법이지만 조금 다르다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;커링은 부분 호출할 때마다 단항 함수를 중첩 생성하며, 내부적으로는 이들을 단계별로 합성하여 최종 결과를 낸다. 커링은 여러인수를 부분 평가하는 식으로도 변용할 수 있어서 개발자가 평가 시점과 방법을 좌지우지 할 수 있다.&lt;/li&gt;
  &lt;li&gt;부분 적용은 함수 인수를 미리 정의된 값으로 할당한 후, 인수가 적은 함수를 새로 만든다. 이 결과 함수는 자신의 클로저에 고정된 매개변수를 갖고 있으며, 후속 호출 시 이미 평가를 마친 상태이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;consoleLog&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;partial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'console'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'json'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'FJS partial'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;consoleInfoLog&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;partial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;consoleLog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'INFO'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;consoleInfoLog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'INFO logger using partial'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;커링은 파셜의 자동화기법이라고 봐도 된다.&lt;/p&gt;

&lt;h2 id=&quot;함수-파이프라인-합성&quot;&gt;함수 파이프라인 합성&lt;/h2&gt;

&lt;p&gt;사이드이펙트를 없앤 순수함수의 합성이 함수형 프로그래밍의 가장 큰 목적이라고 할 수 있다.&lt;/p&gt;

&lt;h3 id=&quot;함수-합성-서술과-평가를-구분&quot;&gt;함수 합성: 서술과 평가를 구분&lt;/h3&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;explode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\s&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt;+/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;countWords&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;countWords&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;countWords(str)&lt;/code&gt;이 실행되기 전까지 이 함수는 구동되지 않는다. 서술부와 평가부가 분리되어 있다고 볼 수 있다.&lt;/p&gt;

&lt;h3 id=&quot;순수불순-함수-다루기&quot;&gt;순수/불순 함수 다루기&lt;/h3&gt;

&lt;p&gt;함수형 프로그래밍을 한다고해서 모두 순수함수만 존재하는건 아니다. 거의 불가능하기때문에 그걸 인정하고 불순한 코드와 순수한 코드를 잘 분리해서 격리하는 것이 중요하다.&lt;/p&gt;

&lt;h2 id=&quot;함수-조합기로-제어-흐름-관리하기&quot;&gt;함수 조합기로 제어 흐름 관리하기&lt;/h2&gt;

&lt;p&gt;함수 조합기는 자주쓰이는 건 아래와 같다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;compose&lt;/li&gt;
  &lt;li&gt;pipe&lt;/li&gt;
  &lt;li&gt;identity&lt;/li&gt;
  &lt;li&gt;tap&lt;/li&gt;
  &lt;li&gt;alternation&lt;/li&gt;
  &lt;li&gt;sequence&lt;/li&gt;
  &lt;li&gt;fork or join&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;이중 compose와 pipe는 비슷하니 넘어가고 이야기해보자.&lt;/p&gt;

&lt;h3 id=&quot;identity&quot;&gt;identity&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;identity&lt;/code&gt;는 주어진 인수와 똑같은 값을 반환하는 함수이다.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;identity :: (a) -&amp;gt; a&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;주로 함수의 수학적 속성을 살펴보는 용도로 쓰이지만 실용적인 쓰임새도 있다.&lt;/p&gt;

&lt;h3 id=&quot;탭&quot;&gt;탭&lt;/h3&gt;

&lt;p&gt;탭은 코드 추가 없이 void함수를 연결하여 합성할때 유용하다. 자신을 함수에 넘기고 자신을 돌려받는다.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;tap :: (a -&amp;gt; *) -&amp;gt; a  -&amp;gt; a&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;debugLog&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;partial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'console'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'basic'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'MyLogger'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'DEBUG'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;debug&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;tap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;debugLog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;cleanInput&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;isValidSsn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;checkLengthSsn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;cleanInput&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;isValidSsn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'444-44-4444'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/*
    MyLogger [DEBUG] 444-44-4444
    MyLogger [DEBUG] 444444444
    MyLogger [DEBUG] true
*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;선택&quot;&gt;선택&lt;/h3&gt;

&lt;p&gt;alt는 함수 호출 시 기본 응답을 제공하는 단순 조건 로직을 수행한다. 함수 2개를 인수로 받아 값이 있으면 첫번째 함수의 결과를, 그렇지 않으면 두번째 함수를 반환한다. &lt;code class=&quot;highlighter-rouge&quot;&gt;OR&lt;/code&gt;라고 생각하면 된다.&lt;/p&gt;

&lt;h3 id=&quot;순차&quot;&gt;순차&lt;/h3&gt;

&lt;p&gt;seq는 함수 순차열을 순회한다. 2개 또는 더 많은 함수를 인수로 받아 동일한 값에 대해 각 함수를 차례로 실행하는 또 다른 함수를 반환한다.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;seq(append('#student-info'), consoleLog);&lt;/code&gt;&lt;/p&gt;

&lt;h3 id=&quot;포크조인&quot;&gt;포크(조인)&lt;/h3&gt;

&lt;p&gt;fork는 하나의 자원을 두가지 방법으로 처리 후 그 결과를 다시 조합한다. 하나의 join 함수와 주어진 입력을 처리할 종단 함수 2개를 받는다. 분기된 각 함수의 결과는 제일 마지막에 인수 2개를 받는 join 함수에 전달된다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;computeAverageGrade&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getLetterGrade&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fork&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;divide&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;computeAverageGrade&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;99&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;80&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;89&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 'B'&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

</description>
        <pubDate>Mon, 15 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/devlog/2019/04/15/functional-programing-4/</link>
        <guid isPermaLink="true">https://harurepository.github.io/devlog/2019/04/15/functional-programing-4/</guid>
        
        <category>nodejs</category>
        
        <category>javascript</category>
        
        
        <category>devlog</category>
        
      </item>
    
      <item>
        <title>[일어]1. 명사의 현재문, 연결, 의문문, 과거문</title>
        <description>&lt;p&gt;일어는 한국어와 상당히 유사하다. 영어등의 타 언어들과는 다르게 거의 1대1 대응이 되는 게 많다. 즉, 어느정도의 문법들과 단어들만 알아도 간단한 의사소통은 할 수 있다는 것이다.&lt;/p&gt;

&lt;p&gt;히라가나를 알고 있다는 전제하에 그에 필요한 문법들을 알아보자.&lt;/p&gt;

&lt;h2 id=&quot;현재문과-연결&quot;&gt;현재문과 연결&lt;/h2&gt;

&lt;h3 id=&quot;현재문&quot;&gt;현재문&lt;/h3&gt;

&lt;p&gt;현재문은 긍정과 부정으로 나눌 수 있다.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;긍/부정&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;일반문&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;긍정&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;~は ~だ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;부정&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;〜は 〜じゃない&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;연결&quot;&gt;연결&lt;/h3&gt;

&lt;p&gt;한국어는 &lt;code class=&quot;highlighter-rouge&quot;&gt;한국 학생&lt;/code&gt; 이라고 쓰지만, 일어로 하면 &lt;code class=&quot;highlighter-rouge&quot;&gt;한국의 학생&lt;/code&gt;이라는 식으로 명사와 명사 사이를 이어준다.&lt;/p&gt;

&lt;p&gt;일어 の는 위의 경우 같은걸 제외하고 우리나라의 &lt;code class=&quot;highlighter-rouge&quot;&gt;~의&lt;/code&gt;와 거의 1대1 대응 된다.&lt;/p&gt;

&lt;h3 id=&quot;예문&quot;&gt;예문&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;わたしは　がくせいだ。    나는 학생이다.&lt;/li&gt;
  &lt;li&gt;あのひとは　わたしのかれしじゃない.   그는 내 남자친구가 아니다.&lt;/li&gt;
  &lt;li&gt;かれしは　にほんごの　せんせいです。  남자친구는 일본어 선생님입니다.&lt;/li&gt;
  &lt;li&gt;これは　かれのじゃない。  이것은 그의 것이 아닙니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;의문문과-과거문&quot;&gt;의문문과 과거문&lt;/h2&gt;

&lt;h3 id=&quot;의문문&quot;&gt;의문문&lt;/h3&gt;

&lt;p&gt;현재문에서 だ를 빼고 억양을 올리면 된다.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;긍/부정&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;과거문&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;긍정&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;〜は　〜？&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;부정&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;〜は　〜じゃない？&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;과거문&quot;&gt;과거문&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;긍/부정&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;과거문&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;긍정&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;~は ~だった&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;부정&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;〜は 〜じゃなかった&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;예시&quot;&gt;예시&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;わたしは　きょねんまでは　こうこうせいだった。  나는 작년까지는 고등학생이었다.&lt;/li&gt;
  &lt;li&gt;このせいふくは　わたしのじゃなかった。    이 교복은 내것이 아니었다.&lt;/li&gt;
  &lt;li&gt;こどものこそ、あのこは ともだちでした。    어릴 적, 저 아이는 친구였습니다.&lt;/li&gt;
  &lt;li&gt;つうがくのバスはこれじゃあぃませんでした。    통학 버스는 이것이 아니었습니다.&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Sun, 14 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/tip/2019/04/14/japanese-1/</link>
        <guid isPermaLink="true">https://harurepository.github.io/tip/2019/04/14/japanese-1/</guid>
        
        <category>japan</category>
        
        
        <category>tip</category>
        
      </item>
    
      <item>
        <title>[함수형 자바스크립트]3. 자료구조는 적게, 일은 많이</title>
        <description>&lt;p&gt;자료구조를 순차적으로 탐색/변환하는데 쓰이는 실용적인 연산 몇가지(map, reduce, filter)를 알아보자. 대부분의 루프는 이들이 처리하는 하나의 특정 케이스에 지나지 않으므로 수동 루프를 없애는 목적으로도 쓰인다.&lt;/p&gt;

&lt;h2 id=&quot;애플리케이션의-제어-흐름&quot;&gt;애플리케이션의 제어 흐름&lt;/h2&gt;

&lt;p&gt;프로그램이 정답에 이르기까지 거치는 경로를 &lt;code class=&quot;highlighter-rouge&quot;&gt;제어 흐름&lt;/code&gt;이라고 한다. 명령형 프로그램은 작업 수행에 필요한 모든 단계를 노출하여 흐름이나 경로를 상세히 서술한다.&lt;/p&gt;

&lt;p&gt;반면, 선억적 프로그램, 특히 함수형 프로그램은 독립적인 블랙박스 연산들이 단순하게 최소한의 제어 구조를 통해 연결되어 추상화 수준이 높다. 이렇게 연결한 연산들은 각자 다음 연산으로 상태를 이동시키는 고계함수에 불과하다. 실제로 함수형 프로그램은 데이터와 제어 흐름 자체를 고수준 컴포넌트 사이의 단순한 연결로 취급한다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;opA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;opB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;opC&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;opD&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 체이닝으로 간결한 연결&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;연산을 체이닝하면 간결하게 표현적인 형태로 프로그램을 작성할 수 있어 제어 흐름과 계산 로직을 분리할 수 있고 코드와 데이터를 더욱 효과적으로 관리 할 수 있다.&lt;/p&gt;

&lt;h2 id=&quot;메서드-체이닝&quot;&gt;메서드 체이닝&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;메서드 체이닝&lt;/code&gt;은 메서드를 단일 구문으로 호출하는 객체지향적 패턴이다. 변이를 일이크지 않는 선에서 함수형 프로그래밍에서도 단일 객체 인스턴스에 속한 메서드를 체이닝하는 건 나름대로 쓸모가 있다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;s1&quot;&gt;'Functional Programming'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;' is fun'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// 위의 코드를 함수형으로 리팩토링 한다면&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Functional Programming'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;' is fun'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;아래처럼한다면 속에서부터 코드를 이해해야하기 때문에 코드를 이해하기에 어렵다.&lt;/p&gt;

&lt;h2 id=&quot;함수-체이닝&quot;&gt;함수 체이닝&lt;/h2&gt;

&lt;p&gt;객체지향 프로그램은 주로 상속을 통해 코드를 재사용한다. &lt;code class=&quot;highlighter-rouge&quot;&gt;List&lt;/code&gt;컴포넌트가 ArrayList, LinkedList… 등등 존재하는 게 그 예다.&lt;/p&gt;

&lt;p&gt;함수형 프로그래밍은 접근 방법이 조금 다르다. 자료구조를 새로 만들어 어떤 요건을 충족시키는것이 아니라, 배열 등의 자료구조를 이용해 다수의 굵게 나뉜 고계 연산을 적용한다. 작업 내용은 다음과 같다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;작업을 수행하기 위해 무슨 일을 해야 하는지 기술된 함수를 인수로 받는다.&lt;/li&gt;
  &lt;li&gt;임시 변수의 값을 계속 바꾸면서 부수효과를 일으키는 기존 수동 루프를 대체한다. 관리할 코드가 줄고 에러가 날 만한 코드가 줄어든다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;람다-표현식&quot;&gt;람다 표현식&lt;/h3&gt;

&lt;p&gt;람다 표현식은 &lt;code class=&quot;highlighter-rouge&quot;&gt;=&amp;gt;&lt;/code&gt; 화살표 함수라고도 한다. 함수형 프로그래밍은 람다 표현식과 잘 어울리는 주요 고계함수 &lt;code class=&quot;highlighter-rouge&quot;&gt;map, reduce, filter&lt;/code&gt;를 적극 사용할 것을 권장한다. 로대시js 함수로 공부해보자.&lt;/p&gt;

&lt;h3 id=&quot;_map-데이터-변환&quot;&gt;_.map: 데이터 변환&lt;/h3&gt;

&lt;p&gt;덩치 큰 데이터 컬렉션의 원소를 모두 변환해야 할 때가 있다. &lt;code class=&quot;highlighter-rouge&quot;&gt;map&lt;/code&gt; 함수는 컬렉션의 원소를 전부 파싱할 경우 아주 유용한다. 항상 새로운 배열을 반환하기 때문에 불변성도 유지된다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;tip: 로대시 함수에서 _(something)로 감싸면 객체를 로대시 함수로 자유롭게 사용할 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;_reduce-결과를-수집&quot;&gt;_.reduce: 결과를 수집&lt;/h3&gt;

&lt;p&gt;데이터를 변환하였다면 그 데이터로 의미 있는 결과를 도출하고 싶을것이다. 이 일은 &lt;code class=&quot;highlighter-rouge&quot;&gt;reduce&lt;/code&gt; 함수가 전문성이 있다.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;reduce&lt;/code&gt;는 원소 배열을 하나의 값으로 짜내는 고계함수이며, 원소마다 함수를 실행한 결괏값의 누적치를 계산한다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;persons&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;person&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;country&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;person&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;country&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;country&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isUndefined&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;country&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;country&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{})&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/*
{
    'US' : 2,
    'Greece' : 1,
    'Hungary' : 1
}
*/&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;맵 리듀스 조합을 이용하면 더 단순화해 작업할 수 있다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getCountry&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;person&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;person&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;country&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;gatherStats&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;criteria&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;criteria&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isUndefined&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;criteria&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;criteria&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;persons&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getCountry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gatherStats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;_filter-원하지-않는-원소를-제거&quot;&gt;_.filter: 원하지 않는 원소를 제거&lt;/h3&gt;

&lt;p&gt;map이나 reduce는 모든 원소를 탐색하기 때문에 계산하지 않을 원소는 사전에 빼놓는게 좋다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;persons&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isValid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fullname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;선언적 개발은 개발자가 문제의 해법에 어떻게 도달해야 하는지 고민하기보다 어플리케이션이 어떤 결과를 내야하는지에 전념하게한다.&lt;/p&gt;

&lt;h2 id=&quot;코드-헤아리기&quot;&gt;코드 헤아리기&lt;/h2&gt;

&lt;p&gt;함수형 흐름은 프로그램 로직을 파헤치지 않아도 뭘 하는 프로그램인지 윤곽을 잡기 쉽다. 그로인해 개발자는 코드뿐만 아니라, 결과를 내기 위해 서로 다른 단계를 드나드는 데이터의 흐름까지 더 깊이 헤아릴 수 있다.&lt;/p&gt;

&lt;h3 id=&quot;선언적-코드와-느긋한-함수-체인&quot;&gt;선언적 코드와 느긋한 함수 체인&lt;/h3&gt;

&lt;p&gt;함수형 프로그램은 단순 함수들로 구성한다. 개별 함수가 하는 일은 작지만, 뭉치면 복잡한 작업도 해낼 수 있다. 아래 예제는 가장 많은 사람들이 사는 나라를 출력하는 예제이다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;chain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;persons&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isValid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;property&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'address.country'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;gatherStats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{})&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;sortBy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'count'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;reverse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;firse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 'US'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;tip: _.chain()은 _.(something) 과 같은 일을 하지만 value()를 호출하기전까지 값을 반환하지 않는다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;재귀적-사고방식&quot;&gt;재귀적 사고방식&lt;/h2&gt;

&lt;p&gt;복잡한 문제를 풀 수 있는 가장 뚜렷한 방법은 문제를 분해하는 것이다. 그 작은 문제들을 하나하나 풀어나가면 전체 문제도 풀 수 있다.&lt;/p&gt;

&lt;h3 id=&quot;재귀란&quot;&gt;재귀란&lt;/h3&gt;

&lt;p&gt;재귀는 주어진 문제를 자기 반복적인 문제들로 잘게 분해한 다음 이들을 다시 조합해 원래 문제의 정답을 찾는 기법이다. 재귀 함수는 &lt;code class=&quot;highlighter-rouge&quot;&gt;기저 케이스&lt;/code&gt;와 &lt;code class=&quot;highlighter-rouge&quot;&gt;재귀 케이스&lt;/code&gt;로 이루어져있다.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;기저 케이스&lt;/code&gt;는 재귀 함수가 구체적인 결괏값을 바로 계산할 수 있는 입력 집합이다. &lt;code class=&quot;highlighter-rouge&quot;&gt;재귀 케이스&lt;/code&gt;는 함수가 자신을 호출할 때 전달한 입력 집합(점차 작아진다)을 처리한다.&lt;/p&gt;

&lt;p&gt;재귀 케이스를 돌다가 가장 마지막에 기저케이스에 도달하면 하나의 값으로 귀결된다. 고등수학에서 배웠던 &lt;code class=&quot;highlighter-rouge&quot;&gt;점화식&lt;/code&gt;을 떠올리면 된다.&lt;/p&gt;
</description>
        <pubDate>Sun, 14 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/devlog/2019/04/14/functional-programing-3/</link>
        <guid isPermaLink="true">https://harurepository.github.io/devlog/2019/04/14/functional-programing-3/</guid>
        
        <category>nodejs</category>
        
        <category>javascript</category>
        
        
        <category>devlog</category>
        
      </item>
    
      <item>
        <title>[함수형 자바스크립트]2. 고계 자바스크립트</title>
        <description>&lt;blockquote&gt;
  &lt;p&gt;자연어는 지배적인 패러다임이 없다. 자바스크립트도 마찬가지이다.
개발자들은 절차적, 함수형, 객체지향형 접근 방법을 적절히 골라 섞어 쓰면 된다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;자바스크립트와-함수형-프로그래밍&quot;&gt;자바스크립트와 함수형 프로그래밍&lt;/h2&gt;

&lt;p&gt;자바스크립트는 어디에나 있다. 꾸준히 개선되고 있으며, 객체형인 동시에 함수형이다.&lt;/p&gt;

&lt;h2 id=&quot;함수형-대-객체지향-프로그래밍&quot;&gt;함수형 대 객체지향 프로그래밍&lt;/h2&gt;

&lt;p&gt;객체지향과 함수형의 가장 중요한 차이점은 데이터(객체 속성)와 기능(함수)을 조직하는 방법에 있다. 객체지향은 인스턴스 메서드를 통해 가변 상태를 노출하고 조작할 수 있고, 캡슐화되어 응집도가 높은 패키지가 형성된다.&lt;/p&gt;

&lt;p&gt;반면, 함수형 프로그램은 데이터를 숨길 필요 없이 데이터와 기능을 느슨하게 결합한다. 그로인해 특정 코드에 종속되지 않아 재사용성과 유지보수성이 좋다.&lt;/p&gt;

&lt;p&gt;즉, 객체지향은 데이터와 데이터 관계의 본질에 초점을 두는 반면, 함수형은 오직 기능만을 초점한다.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;vs&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;함수형&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;객체지향형&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;합성단위&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;함수&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;객체(클래스)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;프로그래밍 스타일&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;선언적&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;명령형&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;데이터와 기능&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;순수함수의 느슨한 결합&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;클래스 안에서 메서드와 강한 결합&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;상태관리&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;불변값으로 취급&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;객체를 변이시킴&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;제어흐름&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;함수와 재귀&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;루프와 조건 분기&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;스레드 안전&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;동시성 프로그래밍 가능&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;캡슐화하기 어려움&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;캡슐화&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;불변이라 필요없음&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;데이터 무결성을 지키기위해 필요&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;자바스크립트-객체의-상태-관리&quot;&gt;자바스크립트 객체의 상태 관리&lt;/h3&gt;

&lt;p&gt;상태란 어느 시점에 찍은 모든 객체에 저장된 데이터의 스냅샷이다. 상태를 보호하는 측면에서 자바스크립트는 사실 최악의 언어 중 하나이다.&lt;/p&gt;

&lt;p&gt;자바스크립트는 너무나 동적이어서 언제건 속성을 추가, 삭제, 수정할 수 있다. 자유에는 언제나 책임이 수반되는 법. 관리가 어려워지지 않도록 스스로 데이터를 보호하는 훈련을 해야한다.&lt;/p&gt;

&lt;h3 id=&quot;객체를-값으로-취급&quot;&gt;객체를 값으로 취급&lt;/h3&gt;

&lt;p&gt;불변성을 바탕으로 사고하려면 사실상 모든 객체를 값으로 취급해야 한다.자바의 &lt;code class=&quot;highlighter-rouge&quot;&gt;final&lt;/code&gt;같은 장치가 그것이다. 하지만 자바스크립트에서는 그런 호사를 누릴 수가 없다. 이 때 객체 구조가 단순하다면 &lt;code class=&quot;highlighter-rouge&quot;&gt;값 객체&lt;/code&gt; 패턴을 사용하는 것도 좋다.&lt;/p&gt;

&lt;p&gt;또한 &lt;code class=&quot;highlighter-rouge&quot;&gt;Object.freeze()&lt;/code&gt;를 사용하면 객체 상태를 못바꾸게 동결할 수 있다. 하지만 이 또한 얕은 연산이라 확실히 동결하고 싶다면 중첩구조를 일일이 동결해야한다.&lt;/p&gt;

&lt;p&gt;지금까지 불변성에 대해 강조했지만 사실 상태를 전혀 바꾸지 않는 어플리케이션은 현실적으로 존재하기 어렵다. 따라서 원본 객체에서 새 객체를 만드는 엄격한 정책을 적용하면 도움이 될 수 있다. 한가지 기법이 더 있다면 객체의 불변 상태를 한 곳에서 관리하는 &lt;code class=&quot;highlighter-rouge&quot;&gt;렌즈&lt;/code&gt;라는 기법이 있다.&lt;/p&gt;

&lt;h3 id=&quot;객체-그래프를-렌즈로-탐색수정&quot;&gt;객체 그래프를 렌즈로 탐색/수정&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;람다JS&lt;/code&gt;를 사용하면 렌즈를 손쉽게 사용할 수 있다. 람다는 &lt;code class=&quot;highlighter-rouge&quot;&gt;Copy On Write&lt;/code&gt;기법을 사용해 게으른 복사를 실행하게 도와준다. 그로인해 아래와 같은 코드가 동작된다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;newPerson&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;lastnameLens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Mourning'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Person&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;newPerson&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;lastname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 'Mourning'&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;person&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;lastname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 'Church'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;함수&quot;&gt;함수&lt;/h2&gt;

&lt;p&gt;함수형 프로그래밍에서 함수는 작업의 기본 단위이며, 표현식(값을 내는 함수)과 구문(값을 내지 않는 함수)로 구분할 수 있다.&lt;/p&gt;

&lt;h3 id=&quot;일급-함수&quot;&gt;일급 함수&lt;/h3&gt;

&lt;p&gt;자바스크립트 함수는 실제로 객체이기 때문에 &lt;code class=&quot;highlighter-rouge&quot;&gt;일급(first class)&lt;/code&gt;이다. 자바스크립트 함수는 모두 &lt;code class=&quot;highlighter-rouge&quot;&gt;Function&lt;/code&gt; 형식의 인스턴스이며 &lt;code class=&quot;highlighter-rouge&quot;&gt;length&lt;/code&gt; 속성은 정규 매개변수 개수를 의미한다.&lt;/p&gt;

&lt;h3 id=&quot;고계-함수&quot;&gt;고계 함수&lt;/h3&gt;

&lt;p&gt;함수의 작동 원리는 일반 객체와 같아서 함수를 인수로 전달하거나 반환할수 있다. 이런 함수를 &lt;code class=&quot;highlighter-rouge&quot;&gt;고계 함수&lt;/code&gt;라고 한다. 자바스크립트 함수는 일급이면서 고계여서 여느 &lt;code class=&quot;highlighter-rouge&quot;&gt;값&lt;/code&gt;이나 다름없다. 즉, 자신이 받은 입력밧을 기반으로 정의된 언젠가 실행될 값에 지나지 않는다.&lt;/p&gt;

&lt;h3 id=&quot;함수-호출-유형&quot;&gt;함수 호출 유형&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;전역함수로 호출&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;doWork&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;myVar&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'something'&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 전역의 this&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;doWork&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;메서드로 호출&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;obj&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'some prop'&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;getProp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prop&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 소유 객체의 this&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getProp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;new를 붙여 생성자로 호출&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MyType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;arg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;props&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;arg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 방금 생성된 객체의 this&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;someVal&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MyType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'something'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;다른 프로그래밍 언어와는 달리 자바스크립트는 &lt;code class=&quot;highlighter-rouge&quot;&gt;this&lt;/code&gt; 레퍼런스가 가리키는 대상이 함수를 사용하는 방법에 따라 달라진다. 이 때문에 이해하기 어려운 코드가 될 수도 있으니 &lt;code class=&quot;highlighter-rouge&quot;&gt;문맥&lt;/code&gt;을 잘 살펴야 한다.&lt;/p&gt;

&lt;p&gt;물론 함수형 프로그래밍 기법을 사용한다면 자바스크립트에서 &lt;code class=&quot;highlighter-rouge&quot;&gt;this&lt;/code&gt;를 사용할 일은 거의 없다. 아니, 어떤 일이 있더라도 쓰지 않도록 해야한다.&lt;/p&gt;

&lt;h3 id=&quot;함수-메서드&quot;&gt;함수 메서드&lt;/h3&gt;

&lt;p&gt;자바스크립트 함수는 프로토타입에 소속된 일종의 상위 함수인 &lt;code class=&quot;highlighter-rouge&quot;&gt;apply&lt;/code&gt;와 &lt;code class=&quot;highlighter-rouge&quot;&gt;call&lt;/code&gt; 메서드로도 호출할 수 있다.&lt;/p&gt;

&lt;h2 id=&quot;클로저와-호이스팅&quot;&gt;클로저와 호이스팅&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;클로저&lt;/code&gt;는 함수를 선언할 당시의 환경에 함수를 묶어둔 자료구조이다. 클로저와 호이스팅에 대한 이해는 &lt;a href=&quot;https://www.slideshare.net/MinPark48/ss-79004233&quot;&gt;이 슬라이드&lt;/a&gt; 후반부를 참조하자.&lt;/p&gt;

&lt;h3 id=&quot;전역-스코프&quot;&gt;전역 스코프&lt;/h3&gt;

&lt;p&gt;전역 스코프는 위험하다는 건 모두가 공감할 것이다. 특히 자바스크립트가 사용되는 환경 중에 하나인 브라우저에서는 직접 관리하지 않는 전역 변수가 많기 때문에 이름 공간이 충돌이 날 수가 있다.&lt;/p&gt;

&lt;p&gt;이처럼 사이드 이펙트를 낼 수 있는 여지가 다분하니 전역변수는 가능한한 삼가해서 사용하도록 하자.&lt;/p&gt;

&lt;h3 id=&quot;함수-스코프&quot;&gt;함수 스코프&lt;/h3&gt;

&lt;p&gt;함수 스코프는 자바스크립트가 선호하는 스코프 방식이다. 함수 내부에 선언된 변수는 해당 함수의 지역변수라서 다른 곳에서는 안 보이고, 함수가 반환되는 시점에 이들은 모두 사라진다.&lt;/p&gt;

&lt;p&gt;함수 스코프를 체크하고, 부모 스코프를 체크하고, 전역 스코프를 체크한 뒤 에도 없다면 &lt;code class=&quot;highlighter-rouge&quot;&gt;undefined&lt;/code&gt;를 반환한다.&lt;/p&gt;

</description>
        <pubDate>Sat, 13 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/devlog/2019/04/13/functional-programing-2/</link>
        <guid isPermaLink="true">https://harurepository.github.io/devlog/2019/04/13/functional-programing-2/</guid>
        
        <category>nodejs</category>
        
        <category>javascript</category>
        
        
        <category>devlog</category>
        
      </item>
    
      <item>
        <title>[함수형 자바스크립트] 1.함수형 자바스크립트</title>
        <description>&lt;blockquote&gt;
  &lt;p&gt;객체지향은 가동부를 캡슐화하여 코드의 이해를 돕는다.
함수형 프로그래밍은 가동부를 최소화하여 코드의 이해를 돕는다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;함수형-프로그래밍이란&quot;&gt;함수형 프로그래밍이란?&lt;/h2&gt;

&lt;p&gt;요즘 많이 쓰는 프로그래밍 언어 대부분은 네이티브로 또는 API로 함수형 프로그래밍을 지원한다.&lt;/p&gt;

&lt;p&gt;함수형 프로그래밍이란 &lt;code class=&quot;highlighter-rouge&quot;&gt;함수 사용을 강조하는 소프트웨어 개발 스타일&lt;/code&gt;이다. 함수는 다들 사용하고 있을 것이다. 하지만 그 함수를 사용함에 있어 &lt;code class=&quot;highlighter-rouge&quot;&gt;데이터의 제어 흐름과 연산을 추상&lt;/code&gt;하여야 함을 이야기 한다. 그로인해 어플리케이션은 &lt;code class=&quot;highlighter-rouge&quot;&gt;상태의 변이&lt;/code&gt;와 &lt;code class=&quot;highlighter-rouge&quot;&gt;부작용&lt;/code&gt;을 줄일 수 있을 것이다.&lt;/p&gt;

&lt;h3 id=&quot;선언적&quot;&gt;선언적&lt;/h3&gt;

&lt;p&gt;함수형프로그래밍은 큰 틀에서 선언적 프로그래밍에 속한다. 내부적으로는 어떻게 구현했는지, 데이터는 어떻게 흘러가는지 밝히지 않은 채 연산/작업을 표현하는 것이다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;pow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;반복문이라는 명령형 구문을 쓰지 않고 선언적으로 구현하였다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;반복문은 재사용하기도 어렵고, 다른 연산에 끼워 넣기도 어렵다. 또한 반복문은 매 반복시마다 값이나 상태가 계속 바뀌게 된다. 함수형 프로그램은 무상태성과 불변성을 지향하기때문에 전역상태를 바꾸거나  부작용을 일으키지 않는다.&lt;/p&gt;

&lt;h3 id=&quot;순수함수와-사이드이펙트&quot;&gt;순수함수와 사이드이펙트&lt;/h3&gt;

&lt;p&gt;함수형 프로그래밍은 순수함수로 구성된 불변 프로그램 구축을 전제로 한다.&lt;/p&gt;

&lt;p&gt;순수함수란&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;숨겨진 값이나 외부상태와 무관하게 작동한다.&lt;/li&gt;
  &lt;li&gt;함수 스코프 밖의 어떠한 변경도 일으키지 않는다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;함수가 순수하지 않다면 대부분 사이드이펙트를 일으킨다. 함수스코프에 벗어난 무언가를 바꾸거나 참조하기 때문이다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;showStudent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ssn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ssn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;elementId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;innerHTML&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ssn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;firstname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;lastname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'학생을 찾을 수 없습니다.'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;showStudent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'444-44-4444'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이 함수는 입력값으로 제시되지 않은 db와 elementId를 참조하므로 불순하다. 또한 DOM이라는 전역 공유자원을 직접 참조하며, 학생 레코드를 찾지 못해 예외를 던지면 에러를 일으켜 종료될 것이다.&lt;/p&gt;

&lt;p&gt;함수형 사고방식과 커링을 이용해 조금 개선해보자.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;curry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;obj&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;obj&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'객체를 찾을 수 없습니다.'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;csv&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ssn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;firstname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;lastname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;append&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;curry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;innerHTML&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;코드가 선언적으로 변해 읽기 좋아졌다. 또한 DOM을 다루는 함수를 따로 빼내어 순수하지 않은 로직을 순수함수에서 배제했다.&lt;/p&gt;

&lt;h3 id=&quot;참조-투명성&quot;&gt;참조 투명성&lt;/h3&gt;

&lt;p&gt;참조 투명성은 순수함수 상태에서 &lt;code class=&quot;highlighter-rouge&quot;&gt;입력이 같으면 언제나 결과가 같다&lt;/code&gt;를 충족하는 성질이라고 볼 수 있다.&lt;/p&gt;

&lt;h3 id=&quot;불변-데이터-유지&quot;&gt;불변 데이터 유지&lt;/h3&gt;

&lt;p&gt;불변데이터는 한번 생성된 이후에 절대 바뀌지 않는다. 원시 자료형은 본래 불변형이지만 배열등의 객체는 불변이 아니어서 내용의 변경으로 인한 사이드이펙트가 발생할 수 있다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;sortDesc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;arr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;arr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;sortDesc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이 경우 &lt;code class=&quot;highlighter-rouge&quot;&gt;Array.sort&lt;/code&gt;는 원본 레퍼런스가 가리키는 배열의 원소를 정렬하는 사이드이펙트를 일으킨다. 이건 자바스크립트가 가진 문제점중에 하나인데, 해결하는 방법은 다음에 자세히 살펴보자.&lt;/p&gt;

&lt;h2 id=&quot;함수형-프로그래밍의-좋은-점&quot;&gt;함수형 프로그래밍의 좋은 점&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;단순한 작업으로 만든다.&lt;/li&gt;
  &lt;li&gt;흐름체인으로 데이터를 처리한다.&lt;/li&gt;
  &lt;li&gt;이벤트 중심 코드의 복잡성을 줄인다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;단순한-작업으로-만든다&quot;&gt;단순한 작업으로 만든다.&lt;/h3&gt;

&lt;p&gt;함수형 프로그래밍은 사실 &lt;code class=&quot;highlighter-rouge&quot;&gt;분해&lt;/code&gt;와 &lt;code class=&quot;highlighter-rouge&quot;&gt;합성&lt;/code&gt;의 상호작용이라고 할 수 있다. 충분한 모듈화를 진행하여 하나의 목적만을 가진 단일성을 유지해야한다.&lt;/p&gt;

&lt;h3 id=&quot;체이닝하여-처리한다&quot;&gt;체이닝하여 처리한다.&lt;/h3&gt;

&lt;p&gt;로대시의 예를 보자.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;chain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;enrollment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;student&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;enrolled&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;pluck&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'grade'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;average&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;체이닝은 필요한 시점까지 실행을 미룰수 있다. 위의 경우 &lt;code class=&quot;highlighter-rouge&quot;&gt;value()&lt;/code&gt;를 실행하기 전까지 체이닝된 함수들은 작동하지 않는다.&lt;/p&gt;

&lt;h3 id=&quot;복잡한-비동기-앱에서도-신속히-반응한다&quot;&gt;복잡한 비동기 앱에서도 신속히 반응한다.&lt;/h3&gt;

&lt;p&gt;함수형프로그래밍을 이용해서 문제를 해결하려는 노력중에 가장 두드러지는 것 중 하나는 단연 &lt;code class=&quot;highlighter-rouge&quot;&gt;리액티브 프로그래밍&lt;/code&gt;이다. 리액티브 패러다임의 가장 큰 장점은 더 높은 쑤준으로 코드를 추상하여 비동기, 이벤트 기반프로그램을 설정하느라 반복되는 코드는 잊고 오직 비즈니스 로직에만 전념할 수 있다.&lt;/p&gt;

&lt;p&gt;리액티브 패러디임은 옵저버블이라는 장치를 매개로 움직인다. 옵저버블을 이용하여 데이터 스트림을 구독해서 원하는 연산을 우아하게 합성 및 체이닝하여 처리할 수 있다.&lt;/p&gt;

&lt;p&gt;반드시 함수형 프로그래밍과 리액티드 패러다임을 섞어쓸 필요는 없다. 하지만 함수형프로그래밍을 배우다 보면 언젠가 자신도 모르게 리액티브 패러다임과 결합해 있는 자신의 코드를 발견하게 돌 것이다.&lt;/p&gt;
</description>
        <pubDate>Fri, 12 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/devlog/2019/04/12/functional-programing-1/</link>
        <guid isPermaLink="true">https://harurepository.github.io/devlog/2019/04/12/functional-programing-1/</guid>
        
        <category>nodejs</category>
        
        <category>javascript</category>
        
        
        <category>devlog</category>
        
      </item>
    
      <item>
        <title>[개발]가능한 지키려하는 개발 원칙</title>
        <description>&lt;h2 id=&quot;컨벤션&quot;&gt;컨벤션&lt;/h2&gt;

&lt;p&gt;나는 혼자 개발하는 것도 좋아하지만. 팀으로 일하는 것을 더 좋아한다. 팀으로 일하면 더 커다랗고 규모있는 프로젝트를 만들 수 있고, 다른 사람들의 지혜를 빌릴 수 있다. 그리고 내 목표 중에 한가지가 최고의 팀을 갖추는 것이기 때문이기도 하다.&lt;/p&gt;

&lt;p&gt;팀으로써 일하는 건 아주 좋지만 사실 혼자 할 때 보다 어려운점이 많다. 혼자 할 때는 나만 설득하면 되지만. 팀으로 활동할 때는 팀원들을 모두 설득해야한다. 자신이 맡을 부분을 정하고, 겹치는 부분이 있다면 서로 맞추는 커뮤니케이션 등이 필요하다.&lt;/p&gt;

&lt;p&gt;우리 팀에도 일하는 방식에 대한 문서가 준비되어있고, 새로 들어오시는분들마다 읽게 되어있다. 그 중에 코드 협약에 대해 이야기 해보려한다.&lt;/p&gt;

&lt;h2 id=&quot;코드-컨벤션&quot;&gt;코드 컨벤션&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;기본적으로 네이밍은 로어케이스카멜로한다.&lt;/li&gt;
  &lt;li&gt;클래스명은 어퍼케이스카멜로 작성한다.&lt;/li&gt;
  &lt;li&gt;상수의 경우 대문자와 언더바로 한다.&lt;/li&gt;
  &lt;li&gt;함수 하나가 30 줄이 넘어가면 함수를 분리한다.&lt;/li&gt;
  &lt;li&gt;들여쓰기가 두 단계 이상 넘어가면 함수를 분리한다.(for, if 문 마찬가지)&lt;/li&gt;
  &lt;li&gt;주석을 적어야 하면 함수로 분리한다.(이름만으로도 알 수 있게해야한다.)&lt;/li&gt;
  &lt;li&gt;다루는 데이터의 종류가 추가되면 모듈(파일) 또는 클래스로 분리(데이터와 그 데이터를 다루는 알고리즘을 결합한 것이 한 묶음)&lt;/li&gt;
  &lt;li&gt;lint, format 도구 반드시 사용(현재는 prettier 사용 중)&lt;/li&gt;
  &lt;li&gt;기능 추가/수정하기 전에 리팩토링을 한 줄이라도 하고 시작한다.&lt;/li&gt;
  &lt;li&gt;한번 만든게 전부가 아니다. 반복해서 만들어라. 필요하다면 부수고 새로만들어라.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;우리팀의 기본언어는 타입스크립트이고 프론트엔드는 리액트 또는 리액트네이티브, 백엔드는 노드를 이용한다.&lt;/p&gt;

&lt;h3 id=&quot;기본적으로-네이밍은-로어케이스카멜로한다&quot;&gt;기본적으로 네이밍은 로어케이스카멜로한다.&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;balanceOf(address: string)&lt;/code&gt;, 이런식으로 첫글자가 소문자인 카멜표기법을 사용한다.&lt;/p&gt;

&lt;h3 id=&quot;클래스명은-어퍼케이스카멜로-작성한다&quot;&gt;클래스명은 어퍼케이스카멜로 작성한다.&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;class UserService&lt;/code&gt;, 이처럼 첫글자가 대문자인 카멜표기법을 사용한다.&lt;/p&gt;

&lt;h3 id=&quot;상수의-경우-대문자와-언더바로-한다&quot;&gt;상수의 경우 대문자와 언더바로 한다.&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;TEXT_COLOR&lt;/code&gt;, 이처럼 대문자와 언더바로 상수를 정의한다.&lt;/p&gt;

&lt;h3 id=&quot;함수-하나가-30-줄이-넘어가면-함수를-분리한다&quot;&gt;함수 하나가 30 줄이 넘어가면 함수를 분리한다.&lt;/h3&gt;

&lt;p&gt;함수가 30줄이 넘어가면 가능하면 분리하도록 한다. 팀으로 짜는 코드는 무조건 가독성을 높여야한다.&lt;/p&gt;

&lt;h3 id=&quot;들여쓰기가-두-단계-이상-넘어가면-함수를-분리한다for-if-문-마찬가지&quot;&gt;들여쓰기가 두 단계 이상 넘어가면 함수를 분리한다.(for, if 문 마찬가지)&lt;/h3&gt;

&lt;p&gt;들여쓰기가 들어갔다는건 제어문이나 반복문을 사용했다는 말이된다. 제어문과 반복문이 여러번 있으면 코드를 읽기에 어려운 점이 많다.&lt;/p&gt;

&lt;h3 id=&quot;주석을-적어야-하면-함수로-분리한다이름만으로도-알-수-있게해야한다&quot;&gt;주석을 적어야 하면 함수로 분리한다.(이름만으로도 알 수 있게해야한다.)&lt;/h3&gt;

&lt;p&gt;함수의 이름만으로도 코드의 내용을 알 수 있어야한다. 주석을 적어야할 것 같다면 좀 더 네이밍과 사용처를 고민하는게 좋다.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;isOdd(value)&lt;/code&gt;처럼 명확하게 이름을 지으면 좋다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isOdd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)){&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;다루는-데이터의-종류가-추가되면-모듈파일-또는-클래스로-분리데이터와-그-데이터를-다루는-알고리즘을-결합한-것이-한-묶음&quot;&gt;다루는 데이터의 종류가 추가되면 모듈(파일) 또는 클래스로 분리(데이터와 그 데이터를 다루는 알고리즘을 결합한 것이 한 묶음)&lt;/h3&gt;

&lt;p&gt;관심사 분리를 명확히 하자. 뷰에서 데이터를 조작하려하지 말자.&lt;/p&gt;

&lt;h3 id=&quot;lint-format-도구-반드시-사용현재는-prettier-사용-중&quot;&gt;lint, format 도구 반드시 사용(현재는 prettier 사용 중)&lt;/h3&gt;

&lt;p&gt;우리는 린트나 각자의 스타일 때문에 코드리뷰에서 시간을 낭비하지 않는다. 그건 프리티어에게 맡기자.&lt;/p&gt;

&lt;h3 id=&quot;기능-추가수정하기-전에-리팩토링을-한-줄이라도-하고-시작한다&quot;&gt;기능 추가/수정하기 전에 리팩토링을 한 줄이라도 하고 시작한다.&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;내가 방문한 곳은 조금이라도 좋게 만들고 나간다.&lt;/code&gt;, 이건 현실에서도 마찬가지인게 내가 버리지 않았어도 회의실에 쓰레기가 있었으면 나갈때 들고나가는 것과 같다.&lt;/p&gt;

&lt;h3 id=&quot;한번-만든게-전부가-아니다-반복해서-만들어라-필요하다면-부수고-새로만들어라&quot;&gt;한번 만든게 전부가 아니다. 반복해서 만들어라. 필요하다면 부수고 새로만들어라.&lt;/h3&gt;

&lt;p&gt;내가 엊그제 만든 코드보다, 동료가 지난주에 만든 코드보다 더 낫게 만들 수 있다면 백번이고 부수고 다시 만들어라. 완벽한 코드는 없을 뿐더러 처음에 만든 코드가 완벽에 가까울 가능성은 아주 낮다.&lt;/p&gt;

&lt;h2 id=&quot;끝내며&quot;&gt;끝내며&lt;/h2&gt;

&lt;p&gt;이 외에도 언제 클래스를 만들어야하는지, 데이터베이스, 디자인패턴에 대한 내용 등도 있고 정리해야할 여러가지 협약들이 있다. 내용이 중요하다고 생각할 수도 있지만, 더 중요한건 팀이 함께 맞춰서 작업해야 한다는 것이다.&lt;/p&gt;

&lt;p&gt;건강한 팀문화가 있어야 더 좋은 프로덕트를 만들 수 있다.&lt;/p&gt;
</description>
        <pubDate>Thu, 10 Jan 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/devlog/2019/01/10/dev-convention/</link>
        <guid isPermaLink="true">https://harurepository.github.io/devlog/2019/01/10/dev-convention/</guid>
        
        <category>tool</category>
        
        <category>nodejs</category>
        
        <category>react-native</category>
        
        
        <category>devlog</category>
        
      </item>
    
      <item>
        <title>[Sentry]ReactNative에 Sentry 달기</title>
        <description>&lt;h2 id=&quot;sentry&quot;&gt;Sentry&lt;/h2&gt;

&lt;p&gt;Sentry는 다양한 언어, 프레임워크에서 에러를 리포트해주는 툴이다. 에러를 모두 웹, 웹훅으로 쏠 수 있어 슬랙으로도 볼 수 있고, 모든 에러를 종합해서 웹에서 확인할 수 있다. 로깅을 꽤 자세히 해주기때문에 아주 쓸만하다. 센트리 외에도 다양한 툴이 있는데, 익숙하기도 하고 가장 활발하고 가성비 좋은거 같아서 센트리를 쓰기로했다.&lt;/p&gt;

&lt;h2 id=&quot;문제&quot;&gt;문제&lt;/h2&gt;

&lt;p&gt;Sentry를 ReactNative에 연동하는 과정은 아주 쉬운데 라이브러리를 설치하고, 링크를 걸면 된다. 근데 여기서 문제가 발생했다. 모든 상황에서 나타나는지는 확인하지 않았지만 &lt;code class=&quot;highlighter-rouge&quot;&gt;fatal error: 'RNSentry.h' file not found&lt;/code&gt; 이러한 에러가 발생하였다.&lt;/p&gt;

&lt;p&gt;RN 버전이 &lt;code class=&quot;highlighter-rouge&quot;&gt;0.4x&lt;/code&gt; 이상일 경우 발생하는 현상으로, pod가 설치되지 않은 것을 확인했다. 조치는 아래와 같이 처리했다.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cd ios
pod repo update
pod install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

</description>
        <pubDate>Wed, 09 Jan 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/devlog/2019/01/09/react-native-sentry-setting/</link>
        <guid isPermaLink="true">https://harurepository.github.io/devlog/2019/01/09/react-native-sentry-setting/</guid>
        
        <category>tool</category>
        
        <category>nodejs</category>
        
        <category>react-native</category>
        
        
        <category>devlog</category>
        
      </item>
    
      <item>
        <title>[회고]인생리뷰 - 20대의 짱을 먹었다.</title>
        <description>&lt;p&gt;글을 쓴지 얼마만일까. 내 기억으로는 1년 반쯤 된 것 같다.&lt;/p&gt;

&lt;p&gt;그 사이 많은 변화가 있었다. 회고를 남겨본 적이 없으니 내 소개부터 해보자.&lt;/p&gt;

&lt;h2 id=&quot;박민&quot;&gt;박민&lt;/h2&gt;

&lt;p&gt;2019년 20대의 짱을 먹었다. 개발을 주로한다. 풀싸이클 개발자이며, 풀스택 개발자이다. 많은 풀스택 개발자들이 그러겠지만 모든걸 다 잘하지는 않는다.&lt;/p&gt;

&lt;p&gt;19살에 문득 내가 세상을 너무 재미없게 산다는 생각이 들어 하고싶은것들을 리스트업한다. 리스트업된 내용은 8가지.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;미술, 음악, 건축, 한의학, 연기, 모델, 개발, 선생님&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;그 리스트를 보면서 나는 나와 작은 게임을 하게 되는데 게임내용은 다음과 같다. &lt;code class=&quot;highlighter-rouge&quot;&gt;전부 하나씩 해보며 돈을 한푼이라도 벌어보기. 그리고 그것들 중에 가장 재밌는 것으로 진로를 정하기&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;돈을 번다는건 누군가 나의 그 재능을 돈을 주고서라도 사고싶어한다는 반증이라고 생각했고, 그 때까지는 해야 중도포기가 아니라고 생각했다. 결과적으로는 3가지를 제외한 5가지로 돈을 벌어봤다.&lt;/p&gt;

&lt;p&gt;근데 이 작은 게임이 끝나고 아주 큰 문제가 생겼는데. 그 문제는 정말 말도 안되게도 전부 &lt;code class=&quot;highlighter-rouge&quot;&gt;너무 재밌었다&lt;/code&gt;는 것이다.&lt;/p&gt;

&lt;p&gt;그렇게 대학에서 2년을 방황하다 공군 중앙전산소에서 프로그램 작성병으로 2년간 복무하게된다(중전소 714기 만세). 사연은 복잡하지만 나는 군대를 경험으로 개발자를 업으로 삼게 되었다.&lt;/p&gt;

&lt;h2 id=&quot;개발자&quot;&gt;개발자&lt;/h2&gt;

&lt;p&gt;제대하고 스타트업과 사이드프로젝트 등을 여러개 하게된다. 엎어진것도 많고, 완성해도 빛 발하지 못한 것들도 많지만. 2016년 3월 &lt;code class=&quot;highlighter-rouge&quot;&gt;리액트&lt;/code&gt;를 만나면서 내 인생은 또 한번 달라진다.&lt;/p&gt;

&lt;p&gt;여태까지는 스프링을 기반한 자바 웹 프로그래밍이나 자바를 이용한 안드로이드를 개발해왔는데, 리액트를 만나면서 개발의 신세계를 맛봤다.&lt;/p&gt;

&lt;p&gt;create-react-app 과 자바스크립트, css만으로 엄청난 속도로 개발을 할 수 있었다(이게 착각이라는건 머지않아 알게되었다.) 2016년 3월부터 리액트와 리액트 네이티브로 개발을 시작했고, 정말 즐거운 경험으로 당시에 하던 스타트업의 프로덕트를 개발했다.&lt;/p&gt;

&lt;h2 id=&quot;리액트&quot;&gt;리액트&lt;/h2&gt;

&lt;p&gt;근데 리액트가 쉽다는건 정말 착각이었던게 뭐였냐면, 나는 브라우저나 웹, 앱서비스에 대한 이해도가 그렇게 높은 편이 아니었다. 거기다 백엔드는 미티어를 사용했는데, 개발에 대해서 별로 잘 알지도 못하는 놈이 프론트, 백을 다 하려니 머리 터지고. 심지어 자바스크립트도 자바스크립트라기보단 JQuery를 더 많이 다뤘다고 해야할까. 여튼 익숙하지 않은 상태였다.&lt;/p&gt;

&lt;p&gt;그 상태에서 헬은 리액트의 상태관리. 리액트는 단방향으로 데이터를 전달한다. 쉽게 이야기하면 부모가 자식에게만 데이터를 전달한다. 이게 규모가 커지면, state와 prop만으로 다루기 엄청나게 어려운 상황에 도달하게 된다.&lt;/p&gt;

&lt;p&gt;그래서 상태관리도구. 당시에는 Redux(이거 내 취향아님)라는걸 사용하게 되는데 이게 쉽게 이야기하면 전역 상태관리를 도와준다. 근데 그 과정에서 코드를 꽤 많이 작성하게 된다. 내가 불리언 하나를 변경하려고 몇개의 파일과 20줄정도 되는 코드를 작성해야 되는 것이다. (MobX 만세)&lt;/p&gt;

&lt;p&gt;그 외에도 라우팅, 생명주기, HOC, 컴포넌트화, 디렉토리구조 등등 날 괴롭히는게 아주 많았고 재밌었지만 거의 1년동안 키보드보다 &lt;code class=&quot;highlighter-rouge&quot;&gt;머리털&lt;/code&gt;을 붙잡고 있는 시간이 더 길었을 수도 있었겠다는 생각이든다.&lt;/p&gt;

&lt;h2 id=&quot;백엔드&quot;&gt;백엔드&lt;/h2&gt;

&lt;p&gt;처음 프론트와 분리된 백엔드를 내가 손수 만든건 미티어를 이용해서였다. 미티어는 프론트와 백엔드를 한데 묶어놓은 프레임워크인데(나는 여기서 백엔드로써만 사용했다), 디폴트 디비가 몽고디비이고, 사용하기 쉽고 ws을 사용해서 재밌는 경험을 할 수있다. 한번쯤 해보는건 추천. 이건 내가 만들고 실제프로젝트에서도 쓰던 &lt;a href=&quot;https://github.com/isme2n/react-redux-material-meteor&quot;&gt;깃헙레포&lt;/a&gt;. 2년이나 지났지만 참고정도는 되지 않을까.&lt;/p&gt;

&lt;p&gt;그 외에도 익스프레스, 코아 등등 노드 기반의 백엔드를 몇개 만들어서 사용해봤다. 루비온레일즈도 해봤는데 너무 대규모 프로젝트였고, 아주 힘들었던 기억이 지배적이다.&lt;/p&gt;

&lt;p&gt;실제 프로덕트에서 쓰인건 미티어, 코아, 루비온레일즈.&lt;/p&gt;

&lt;h2 id=&quot;블로그&quot;&gt;블로그&lt;/h2&gt;

&lt;p&gt;블로그는 네이버블로그, 티스토리, 지금의 깃헙블로그까지 3가지를 해봤다. 2015년부터 한것 같은데, 2017년 9월쯤부터 지금까지 약 1년 3개월은 블로깅을 하지 않았다.&lt;/p&gt;

&lt;p&gt;1년 3개월이나 안했다고 생각해보니 충격적이다. 그래도 꽤 꾸준히 하던 편이었는데. 사는게 뭔지.&lt;/p&gt;

&lt;p&gt;2012년 군대 입대날 시작한 일기부터 하면 2017년까지 5년간 거의 매일 조금씩 글을 썼던것 같다.&lt;/p&gt;

&lt;p&gt;2019년을 어떻게 보낼지는 아직 플래닝하지 않았는데, &lt;code class=&quot;highlighter-rouge&quot;&gt;블로깅이나 유튜브 중 하나는 다시 해볼 생각&lt;/code&gt;이다.&lt;/p&gt;

&lt;p&gt;블로그 테마는 2017년에 맘에 들어서 테마를 받고 거의 1주일간 뜯어고쳐서 만든 테마이다. 내 블로그의 아주 많은 유입은 대부분 블로그 테마인데… 나도 베낀거다.&lt;/p&gt;

&lt;p&gt;자유롭게 쓰세요.&lt;/p&gt;

&lt;h2 id=&quot;강의-및-발표&quot;&gt;강의 및 발표&lt;/h2&gt;

&lt;p&gt;2017년 5월 &lt;a href=&quot;https://www.youtube.com/watch?v=r9fbXIaNxck&amp;amp;list=PLBrx45N7b6tkdisu8ZhKs02tEf5wDuk2W&amp;amp;index=1&quot;&gt;리액트 강의&lt;/a&gt;는 태어나서 처음으로 공개적인 곳에 올린 강의였다. 그 뒤 여름에 GDG 캠퍼스에서 &lt;a href=&quot;https://www.slideshare.net/MinPark48/ss-79004233&quot;&gt;자바스크립트&lt;/a&gt;를 발표했다.&lt;/p&gt;

&lt;p&gt;2018년에는&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;인프런에서 &lt;a href=&quot;https://www.inflearn.com/course/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-blockchain/&quot;&gt;블록체인강의&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.slideshare.net/MinPark48/devfest-webtech18min&quot;&gt;GDG 웹테크에서 주니어를 위한 커리어 개발&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;동덕여대에서 대학생을위한 블록체인 개발&lt;/li&gt;
  &lt;li&gt;한국외대에서 대학생을위한 블록체인&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;이렇게 강의와 발표를 한것 같다.&lt;/p&gt;

&lt;p&gt;2019년에는 1월 7,8,9 동덕여대에서 &lt;code class=&quot;highlighter-rouge&quot;&gt;블록체인 개발&lt;/code&gt;에 대한 강의를 하고, 추후 &lt;code class=&quot;highlighter-rouge&quot;&gt;재직자를 위한 강의&lt;/code&gt;를 예정하고있다.&lt;/p&gt;

&lt;h2 id=&quot;블록체인&quot;&gt;블록체인&lt;/h2&gt;

&lt;p&gt;나에게 2018년은 블록체인을 빼고 이야기 할 수가 없다. 2018년 1월 1일 &lt;code class=&quot;highlighter-rouge&quot;&gt;포장도 뜯지않은 17년형 맥북(현금박치기로 샀다)&lt;/code&gt;을 들고 도쿄로 떠난 그 날부터 지금까지 블록체인과 관련된 일을 하고있다.&lt;/p&gt;

&lt;p&gt;사실은 블록체인쪽에서 일한건 2017년 9월부터였지만. 개념이 재밌고 일을 더 잘하고 싶어서 공부하던게 거의 내 모든 업의 중심이 되었다.&lt;/p&gt;

&lt;p&gt;앞으로도 한동안은 블록체인과 함께 하지 않을까 싶다.&lt;/p&gt;

&lt;h2 id=&quot;리모트워크&quot;&gt;리모트워크&lt;/h2&gt;

&lt;p&gt;원격근무라고도 하는데, 내가 리모트워크를 원하게된건 대부분의 회사가 강남에 있고 나는 부천이라는 곳에 살았기 때문이다. 출퇴근에 걸리는 시간동안 개발을 하면 짧게는 3시간 길게는 하루에 4시간을 더 일할 수 있었다. 2017년 10월부터 리모트워크를 할 수 있게 됬고, 현재 다니는 회사도 리모트 워크를 하고있다.&lt;/p&gt;

&lt;p&gt;리모트워크의 &lt;code class=&quot;highlighter-rouge&quot;&gt;장점은 시간과 커뮤니케이션이고, 단점은 커뮤니케이션과 시간&lt;/code&gt;이다. 나는 아침에 일어나서 눈 뜨자마자 회사 데일리에 어제 무엇을했고 오늘 무엇을 할 것인지 알린다. 씨리얼이나 식사대용식을 먹으며 일을 하다가 점심시간이 되면 밥을 먹고 샤워를 하고 카페에 간다. 이게 일반적이지만 조금 틀어지면 바로 문제가 생긴다.&lt;/p&gt;

&lt;p&gt;장점부터 이야기하자면, 출퇴근 시간을 줄이고 더 일할 수 있다. 그리고 시간을 어느 정도 조절해서 일을 할 수 있다. 오전에 못했다면 저녁에 좀 더 하면 된다. 커뮤니케이션을 글을 기반으로하기 때문에 검색이 용이하고, 좀 더 명확하게 전달하려고 노력한다.&lt;/p&gt;

&lt;p&gt;단점은 그냥 한두마디면 될 일을 글로 이야기하려면 생각보다 길어지는 경우가 많아진다. 이런 경우는 오히려 좋은 경우인게, 시간이 좀 더 들지만 더 명확하게 의도를 전달할 수 있다. 진짜 문제는 글로 하다 &lt;code class=&quot;highlighter-rouge&quot;&gt;생략&lt;/code&gt;되어버리는 경우도 생각보다 많다. 그럼 생략된 부분을 찾기 위해 서로 몇번의 커뮤니케이션이 더 왔다갔다하는 경우가 더러있다.&lt;/p&gt;

&lt;p&gt;이런 경우는 꽤나 문제이지만 리모트워크를 한다면 해결해야하는 숙명인 것 같다. 또 하나의 단점은 일상과 업무가 흐릿하다는 거다. 업무시간에 유튜브를 보고 &lt;code class=&quot;highlighter-rouge&quot;&gt;음.. 저녁에 더 하지 뭐.&lt;/code&gt;와 같은 상황도 더러일어난다.&lt;/p&gt;

&lt;p&gt;나는 집중력이 좋은편이라고 생각했는데, &lt;code class=&quot;highlighter-rouge&quot;&gt;엄청난 관리&lt;/code&gt;에서 나온 집중력이라는걸 깨달았다. 나는 집중력을 잃을까봐 티비도 음악도 거의 보고 듣지 않는다. 일할때는 휴대폰도 멀리하고 연락이 늦어 친구들한테 혼나는 편이다. 근데 우리동생과 어머니가 한집에 사니 정신 없어지는 일이 아주 많아졌다.&lt;/p&gt;

&lt;p&gt;빠른시일내로 다시 독립을 할 예정이다.&lt;/p&gt;

&lt;h2 id=&quot;여행&quot;&gt;여행&lt;/h2&gt;

&lt;p&gt;나는 운이 좋게도 2년마다 해외에 너무 짧지않은 시간동안 체류할 수 있는 기회들이 있었다.&lt;/p&gt;

&lt;p&gt;2012년에는 &lt;code class=&quot;highlighter-rouge&quot;&gt;인도&lt;/code&gt;에 3주정도있었고, 2016년에는 &lt;code class=&quot;highlighter-rouge&quot;&gt;연변&lt;/code&gt;에 3주정도, 2018년에는 &lt;code class=&quot;highlighter-rouge&quot;&gt;일본&lt;/code&gt;에 2주정도 있었다.(2014년엔 군대에 있었다.)&lt;/p&gt;

&lt;p&gt;나는 이 경험들이 아주 많은 도움이 됬다. 인도에서의 경험으로 많은 영감을 얻고 잘 안풀리던 디자이너로써의 일을 풀어냈고, 연변에서 좋은 사람들과 재밌는 경험들을 많이 했다. 일본에서도 일본인들과, 그리고 동료들과 즐거운 추억을 많이 만들고왔다.&lt;/p&gt;

&lt;p&gt;그 외에도 친구들과 국내여행, 해외여행 할 것없이 즐거운 기억들 투성이다. 2018년에는 처음으로 &lt;code class=&quot;highlighter-rouge&quot;&gt;혼자 여행&lt;/code&gt;을 떠나봤다. 오사카에 일주일정도 머무르는 여정이었다. 좀 더 오래 있으려고 했는데 가장 친한 친구의 결혼식이 있어 예정보다 빠르게 돌아왔다.&lt;/p&gt;

&lt;p&gt;난 부천에서도. 서울에서도. 부천과 서울을 떠난 어느곳에서도 너무나도 행복한 삶을 살고있다.&lt;/p&gt;

&lt;h2 id=&quot;외국어&quot;&gt;외국어&lt;/h2&gt;

&lt;p&gt;나는 외국어를 좋아하는데, 아주 못한다. 곤방와. 현재 관심있는 언어는 영어, 일어, 중국어이다. 아마 유튜브를 다시 시작하게 된다면 언어를 공부하는 컨텐츠가 되지 않을까 싶다.(아무도 안보겠네;;) 2019년에는 꼭 &lt;code class=&quot;highlighter-rouge&quot;&gt;영어와 일어&lt;/code&gt;를 어느정도 구사해서 친구를 사귀고 이야기할 수 있게 되었으면 좋겠다.&lt;/p&gt;

&lt;h2 id=&quot;팀장&quot;&gt;팀장&lt;/h2&gt;

&lt;p&gt;나는 보통 스타트업에서 일을 해서 프로젝트를 리드하는 역할을 많이 했는데 고작해봐야 개발자가 한두명이어서 어쩔 수 없던 일이었다. 3명이 넘어가는 그룹에서 리드를 한건 대학교때 학생회장을 한 뒤론 처음인거 같다.&lt;/p&gt;

&lt;p&gt;팀장의 역할을 맡게 된 후 내게 가장 감사했던건 내가 &lt;code class=&quot;highlighter-rouge&quot;&gt;귀기울일줄 알며, 풀스택, 풀싸이클 개발자&lt;/code&gt;라는 것이었다. 나는 프론트부터 백엔드, 운영까지 다 어느정도의 지식이 있는 상태였고, 다른팀원들의 지식과 의견을 들었을때 그게 미칠 영향력을 판단하고 함께 고려할 수 있었다. 이건 내가 프론트만 했거나, 백엔드만 했다면 조금은 어려웠을 법한 일이었을 수도 있다고 생각한다.&lt;/p&gt;

&lt;p&gt;무언가 하나를 딥따 잘하는 건 멋있지만, 잘하는 다른 사람들을 융화시키는 삶도 꽤 괜찮은 삶일 수 있겠다는 것을 느꼈다.&lt;/p&gt;

&lt;p&gt;당연히 자신의 몫을 해내는 팀구성원들에게도 감사하다.&lt;/p&gt;

&lt;h2 id=&quot;책&quot;&gt;책&lt;/h2&gt;

&lt;p&gt;나는 책읽는걸 꽤 좋아하는 편이다. 요즘엔 일반 문학은 거의 못읽고 있지만. 다들 그렇듯 군대에 있을때는 2년간 200권 정도 되는 책을 읽었다.&lt;/p&gt;

&lt;p&gt;책을 읽는 다는건 말그대로 읽는게 다가 아니라 &lt;code class=&quot;highlighter-rouge&quot;&gt;사유&lt;/code&gt;라고 생각한다. 그런의미에서 개인적으로 속독은 써먹고 싶을 때 써먹는 스킬정도라고 생각하지 책을 읽고싶을때는 별로 좋지 않은 기술이라고 생각한다. 책을 읽다 어떤 문장에서 &lt;code class=&quot;highlighter-rouge&quot;&gt;나만의 세계 또는 작가와 나의 세계&lt;/code&gt;에 빠져서 생각하는것이 책의 묘미아닐까.&lt;/p&gt;

&lt;p&gt;최근엔 개발서적에 치여 많은 책을 못읽었지만 2019년에는 좀 더 다양한 책을 읽어보려한다.&lt;/p&gt;

&lt;h2 id=&quot;마무리&quot;&gt;마무리&lt;/h2&gt;

&lt;p&gt;내 20대는 결국 개발이었다. 개발을 하다가 잠을 못자기도하고, 만들고 싶은것, 해내고싶은것들이 많아 많은 밤을 지새웠어도, 나는 개발을 하며 살아왔다. 개발을 조금씩 잘하게 되면서도 뿌듯하고, 앞으로 갈길이 멀었다는것에 아득하기도, 기쁘기도 하다. 난 &lt;code class=&quot;highlighter-rouge&quot;&gt;끊임없이 배우고, 재밌는 일들을 하면서&lt;/code&gt; 행복하게 살거다.&lt;/p&gt;
</description>
        <pubDate>Wed, 02 Jan 2019 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/review/2019/01/02/retrospect-my-life/</link>
        <guid isPermaLink="true">https://harurepository.github.io/review/2019/01/02/retrospect-my-life/</guid>
        
        <category>event</category>
        
        
        <category>review</category>
        
      </item>
    
      <item>
        <title>[시데브콘] 시데브콘 #1</title>
        <description>&lt;h2 id=&quot;스팀-api-활용&quot;&gt;스팀 API 활용&lt;/h2&gt;

&lt;p&gt;전수훈&lt;/p&gt;

&lt;p&gt;어떻게 사용할까?&lt;/p&gt;

&lt;p&gt;트랜잭션 처리 또는 데이터 읽기&lt;/p&gt;

&lt;h3 id=&quot;노드-선택하기&quot;&gt;노드 선택하기&lt;/h3&gt;

&lt;p&gt;public node : api.steemit.com&lt;/p&gt;

&lt;p&gt;private node(docker, source build) : p2p node, full node(64gb)&lt;/p&gt;

&lt;p&gt;테스트넷:&lt;/p&gt;

&lt;p&gt;클라이언트&lt;/p&gt;

&lt;p&gt;JSON RPC, js(dsteem/steem-js),python(beem)&lt;/p&gt;

&lt;h3 id=&quot;json-rpc-api&quot;&gt;JSON RPC API&lt;/h3&gt;

&lt;p&gt;condenser API, Database, market history, network broadcst, RC, tag, witness…&lt;/p&gt;

&lt;p&gt;데이터 읽기: 블락(트랜잭션), 버츄얼오퍼(사용자가 따로 날리지 않은?), 어카운트, 스테이트, 코멘트, 마켓&lt;/p&gt;

&lt;h3 id=&quot;condenser&quot;&gt;condenser&lt;/h3&gt;

&lt;p&gt;계정상태, 계정 내역, 포스팅 목록, 포스팅 내용, 댓글목록, 스테이트(로드가 심해서 없어질 예정)&lt;/p&gt;

&lt;p&gt;트랜잭션 처리: 에스크로기능이 있음.&lt;/p&gt;

&lt;p&gt;스팀 커넥트, 스팀 URI, opbuilder, multi-sig&lt;/p&gt;

&lt;h3 id=&quot;사용비용&quot;&gt;사용비용&lt;/h3&gt;

&lt;p&gt;리소스 크레딧(RC): 커스텀 이제일 쌈&lt;/p&gt;

&lt;h3 id=&quot;보상&quot;&gt;보상&lt;/h3&gt;

&lt;p&gt;포스팅 리워드&lt;/p&gt;

&lt;h3 id=&quot;디앱&quot;&gt;디앱&lt;/h3&gt;

&lt;p&gt;뮤징, 스팀헌트, 이튜브, 스팁샷, 스팀몬스터,&lt;/p&gt;

&lt;h2 id=&quot;자바스크립트-기반의-이더리움-디앱-개발-환경&quot;&gt;자바스크립트 기반의 이더리움 디앱 개발 환경&lt;/h2&gt;

&lt;p&gt;개발자 교육의 관점: 블록체인 애플리케이션 / 코어&lt;/p&gt;

&lt;p&gt;블록체인 - 이더리움 - 자바스크립트&lt;/p&gt;

&lt;p&gt;드리즐 - 리액트, 리덕스, 사가, 드리즐 컴포넌트&lt;/p&gt;

&lt;h2 id=&quot;아바키&quot;&gt;아바키&lt;/h2&gt;

&lt;p&gt;퍼블릭키로 유니크 아바타&lt;/p&gt;

&lt;p&gt;어드레스를 아바타로 대체하는 컨셉&lt;/p&gt;

&lt;p&gt;유니크한 아바타를 만드는 알고리즘들.&lt;/p&gt;

&lt;p&gt;결국 크립토키티처럼 하게됬음.&lt;/p&gt;

&lt;p&gt;이오스로도 만들었음.&lt;/p&gt;

&lt;p&gt;이연에서 활동중&lt;/p&gt;

&lt;p&gt;에브리토큰&lt;/p&gt;

&lt;h2 id=&quot;블록체인-개발-기초&quot;&gt;블록체인 개발 기초&lt;/h2&gt;

&lt;p&gt;데브이오스 이선호&lt;/p&gt;

&lt;p&gt;블록체인은 믿음을 얻어야 성공하는 프로젝트&lt;/p&gt;

&lt;p&gt;스마트 컨트랙트가 블록체인을 만나면서 무결성이 생김.&lt;/p&gt;

&lt;p&gt;개발&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;스마트컨트랙트 코드 작성 : 씨쁠쁠 eosio-cpp&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;c++ 에디터. 별도의 컴파일러를 사용하기때문에 ide는 아무거나.&lt;/p&gt;

&lt;p&gt;컨트랙트 액션 데이터 스트럭쳐&lt;/p&gt;

&lt;p&gt;DML(데이터 조작언어) find…&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;리카르디안 컨트랙 작성: 둘 이상의 당사자들이 합의 사항의 조건과 내용을 정의한 디지털 문서를 사람이 읽을 수 있는 형태&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;마크다운 형식&lt;/p&gt;

&lt;p&gt;조항명, 조항내용&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;테스트넷 구축&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;스마트 컨트랙트 세팅&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;컴파일 -&amp;gt; 와즘 -&amp;gt; ABI&lt;/p&gt;

&lt;p&gt;클리오스 셋&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;스마트컨트랙 함수 실행&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;JSON RPC API, EOSJS 등을 사용해서 통신&lt;/p&gt;

&lt;h2 id=&quot;이오스-디앱-개발-맛보기&quot;&gt;이오스 디앱 개발 맛보기&lt;/h2&gt;

&lt;p&gt;코드는 더 이상 법이 아니다.&lt;/p&gt;

&lt;p&gt;eosio: 블락원이 개발한 블럭체인 소프트웨어&lt;/p&gt;

&lt;p&gt;eos: 이오스아이오 기반 토큰&lt;/p&gt;

&lt;p&gt;컨트랙트와 액션 등등 다 매크로로 선언되어있음.&lt;/p&gt;

&lt;p&gt;사실상 매크로 떡칠되있는거임.&lt;/p&gt;

&lt;p&gt;데이터타입은 eosio types에 있음.&lt;/p&gt;

&lt;p&gt;eosio.cdt 라이브러리스와 이그잼플 확인&lt;/p&gt;

&lt;p&gt;내 컨트랙은 램을 얼마나 소비?&lt;/p&gt;

&lt;p&gt;컨트랙 용량은 컴파일된 와즘의 10배&lt;/p&gt;

&lt;p&gt;테이블 용량은 바이트 단위이기 때문에 무시 가능&lt;/p&gt;

&lt;p&gt;레코드 는 스트럭트 크기만큼.&lt;/p&gt;

&lt;p&gt;64비트 = 8바이트&lt;/p&gt;

&lt;p&gt;두개가 스트럭트면 16바이트&lt;/p&gt;

&lt;p&gt;cpu/net: 보증금 예치 시스템. 사용 시 소비되고, 시간 지나면 충전&lt;/p&gt;

&lt;p&gt;램: 구매. 디비에 레코드 쌓이면 소모, 지우면 반환&lt;/p&gt;

&lt;p&gt;자원들을 구매하기 어렵다면, Chintai에서 임대받을 수 있음.&lt;/p&gt;

&lt;p&gt;eosrp.io에 가면 현재 네트워크 값과 씨피유 값 알수있음&lt;/p&gt;

&lt;p&gt;feexplorer 가면 램가격 알 수 있음. 램은 알고리즘으로 책정됨.&lt;/p&gt;

&lt;p&gt;컴파일하고 와즘으로 변환함.&lt;/p&gt;

&lt;p&gt;씨쁠쁠은 실행 중 프로그램 수정 불가. 실행중 수정가능한 VM으로 와즘 VM tjsxor&lt;/p&gt;

&lt;p&gt;그럼 처음부터 와즘짜면 안되요? : 가능하지만 어셈블리를 하실거라면…&lt;/p&gt;
</description>
        <pubDate>Sat, 15 Dec 2018 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/review/2018/12/15/seedevcon/</link>
        <guid isPermaLink="true">https://harurepository.github.io/review/2018/12/15/seedevcon/</guid>
        
        <category>event</category>
        
        
        <category>review</category>
        
      </item>
    
      <item>
        <title>[마소콘] 마소콘 #1</title>
        <description>&lt;p&gt;인터널 트랜잭션&lt;/p&gt;

&lt;p&gt;레지스트리 컨트랙트&lt;/p&gt;

&lt;p&gt;아토믹 업데이트&lt;/p&gt;

&lt;p&gt;vvisp&lt;/p&gt;

&lt;h2 id=&quot;it-chain-개발기&quot;&gt;it-chain 개발기&lt;/h2&gt;

&lt;p&gt;코스랩 이준범&lt;/p&gt;

&lt;p&gt;디랩토리 - 잇 체인, 스윔, 코아(스마트컨트랙트언어)&lt;/p&gt;

&lt;p&gt;잇 체인 시작&lt;/p&gt;

&lt;p&gt;소프트웨어 아키텍쳐와 딥러닝의 결합 공부중에&lt;/p&gt;

&lt;p&gt;연구실 형의 권유로 블록체인 공부시작했다가 지금까지 하는 중&lt;/p&gt;

&lt;p&gt;이해는 한거 같은데 실제로 할 수 있는지 모르겠음&lt;/p&gt;

&lt;p&gt;그래서 블록체인을 한번 만들어보기로 함.&lt;/p&gt;

&lt;p&gt;하이퍼레져 페브릭을 모델로 시작함.&lt;/p&gt;

&lt;p&gt;목표: 블록체인 코어 공부, 경량 맞춤형 블록체인 엔진: 핵심 서비스의 모듈화를 통해 목적에 맞게 쉽게 교체 가능, 국내 블록체인 오픈소스 활성화&lt;/p&gt;

&lt;p&gt;합의 알고리즘을 간단히 바꾸거나 하는 모듈화&lt;/p&gt;

&lt;h3 id=&quot;요구사항&quot;&gt;요구사항&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;제 3자가 손쉽게 수정/확장&lt;/li&gt;
  &lt;li&gt;개발자들이 자기 영역에서 간섭받지 않고 : 컴포넌트화, 이벤트 드리븐 아키텍쳐 스타일 도입&lt;/li&gt;
  &lt;li&gt;중앙 관리자 없이 피투피구조&lt;/li&gt;
  &lt;li&gt;기본적인 블록체인 기능&lt;/li&gt;
  &lt;li&gt;PBFT 합의 지원 : 트랜잭션 풀 컴포넌트, 리더 노드 개념 도입&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;리더가 있음. 리더가 블락을 만들고 합의. 합이 끝나면 블락저장 및 스테이트 업데이트.&lt;/p&gt;

&lt;p&gt;어려운게 p2p랑 합의 알고리즘.&lt;/p&gt;

&lt;h3 id=&quot;합의-알고리즘&quot;&gt;합의 알고리즘&lt;/h3&gt;

&lt;p&gt;permissioned p2p network(private)&lt;/p&gt;

&lt;p&gt;소수 노드&lt;/p&gt;

&lt;p&gt;빠른 합의 속도&lt;/p&gt;

&lt;p&gt;PBFT&lt;/p&gt;

&lt;h4 id=&quot;합의알고리즘이란&quot;&gt;합의알고리즘이란?&lt;/h4&gt;

&lt;p&gt;분산된 프로세스 또는 시스템간의 …&lt;/p&gt;

&lt;p&gt;여러 개의 신뢰할 수 없는 노드가 포함된 네트워크에서 안정성을 달성하도록 설계&lt;/p&gt;

&lt;p&gt;비잔틴 장군 문제&lt;/p&gt;

&lt;p&gt;PBFT는 노드수가 많아지면 너무 부하가 커짐. 30개가 넘어가면 빡셈. 2번의 브로드캐스팅 과정이있음.&lt;/p&gt;

&lt;p&gt;Tendermint - pbft 라이브러리&lt;/p&gt;

&lt;p&gt;근데 많이 깨지고 문제가 있다고함.&lt;/p&gt;

&lt;h3 id=&quot;잇체인의-스마트-컨트랙트&quot;&gt;잇체인의 스마트 컨트랙트&lt;/h3&gt;

&lt;p&gt;이더리움은 제너럴 펄포즈 랭귀지 지원 안됨.&lt;/p&gt;

&lt;p&gt;잇체인은 sdk를 통해 제너럴 펄포즈 지원 가능(현재 고지원)&lt;/p&gt;

&lt;p&gt;제너럴 펄포즈를 쓰면 무한루프나 랜덤함수같은 문제가있음.&lt;/p&gt;

&lt;p&gt;제너럴 펄포즈는 항상 동일한 스테이트를 가지는지 검사하는게 필요함.&lt;/p&gt;

&lt;p&gt;도커 컨테이너 기반의 독립적인 환경 제공&lt;/p&gt;

&lt;h2 id=&quot;오픈소스-개발자로-개발하기&quot;&gt;오픈소스 개발자로 개발하기&lt;/h2&gt;

&lt;p&gt;블록체인 공부시작하고 팀 구성함.&lt;/p&gt;

&lt;p&gt;오픈소스로 해서&lt;/p&gt;

&lt;p&gt;코딩 스타일, 테스트, 다큐멘테이션 필수: 새로 유입되기 어려움 안되있으면, 이슈나 피알 템플릿, 이슈: 다른사람이 도울수있게, CI, Test coverage&lt;/p&gt;

&lt;p&gt;제주도 개발, 오픈소스 대회 수상&lt;/p&gt;

&lt;p&gt;열정적인 팀원(매주 오프라인 미팅)들의 자극&lt;/p&gt;

&lt;p&gt;코드 리뷰&lt;/p&gt;

&lt;p&gt;독자를 고려한 코딩의 습관&lt;/p&gt;

&lt;h2 id=&quot;펜타-시큐리티---아모랩스&quot;&gt;펜타 시큐리티 - 아모랩스&lt;/h2&gt;
</description>
        <pubDate>Sat, 15 Dec 2018 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/review/2018/12/15/masocon/</link>
        <guid isPermaLink="true">https://harurepository.github.io/review/2018/12/15/masocon/</guid>
        
        <category>event</category>
        
        
        <category>review</category>
        
      </item>
    
      <item>
        <title>[마소콘] 마소콘 #2</title>
        <description>&lt;h2 id=&quot;2080-the-search-for-efficiency&quot;&gt;2080 the search for efficiency&lt;/h2&gt;

&lt;p&gt;스캘터랩스 이승민&lt;/p&gt;

&lt;p&gt;코드리뷰&lt;/p&gt;

&lt;p&gt;GERRIT 리뷰 툴&lt;/p&gt;

&lt;p&gt;시간이 많이 듦&lt;/p&gt;

&lt;p&gt;윈도우의 올드 프로세스: 프로토타입, 리얼, 리얼 2-3년&lt;/p&gt;

&lt;p&gt;안정화기간이있음. 그래서 사람들이 대충만들고 안정화때 고쳐야지. 함.&lt;/p&gt;

&lt;p&gt;윈도우의 뉴 프로세스: 7-8개월&lt;/p&gt;

&lt;p&gt;그럼에도 불구하고 문제.&lt;/p&gt;

&lt;p&gt;기술부채.&lt;/p&gt;

&lt;p&gt;타임, 코스트, 스코프&lt;/p&gt;

&lt;p&gt;빌드타임 줄여야함. 5분미만의 빌드 시간. 디스트리뷰티드 빌드 시스템.&lt;/p&gt;

&lt;p&gt;브랜치를 잘 사용&lt;/p&gt;

&lt;p&gt;스타일: eslint, vue의 스트롱리 레커멘디드&lt;/p&gt;

&lt;p&gt;100라인 안넘어가게&lt;/p&gt;

&lt;p&gt;리팩토링: 코드메트릭스(vscode),&lt;/p&gt;

&lt;p&gt;테스트: 모카(유닛테스트), 싸이프레스(E2E)&lt;/p&gt;

&lt;p&gt;CI: 팀씨티&lt;/p&gt;

&lt;p&gt;소통: 문서, 커미티&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;빚을-탕감하기-위해-없애야-할-3가지-서버-융통성-그리고&quot;&gt;빚을 탕감하기 위해 없애야 할 3가지: 서버, 융통성, 그리고…&lt;/h2&gt;

&lt;p&gt;코스모체인 백엔드 김선미&lt;/p&gt;

&lt;p&gt;부채는 오픈 하기 전부터 쌓인다.&lt;/p&gt;

&lt;p&gt;클라우드프론트 - api gateway - lambda - dynamoDB&lt;/p&gt;

&lt;p&gt;언제 빚을 질까?&lt;/p&gt;

&lt;p&gt;급할 때&lt;/p&gt;

&lt;p&gt;기술부채도 마찬가지&lt;/p&gt;

&lt;h3 id=&quot;서버리스-장점&quot;&gt;서버리스 장점&lt;/h3&gt;

&lt;h4 id=&quot;설계-부채-감소--코드는-람다에만-들어감&quot;&gt;설계 부채 감소 : 코드는 람다에만 들어감.&lt;/h4&gt;

&lt;p&gt;블록체인 네트워크 트랜잭션 속도 보장 불가 : 언제 트랜잭션이 성공할 지 알 수 없음. 짧게는 1초, 보통은 1분, 길게는 몇시간. 심지어 실패할때도&lt;/p&gt;

&lt;p&gt;그동안 우리 눈이 많이 높아져 있었구나.&lt;/p&gt;

&lt;p&gt;이더리움 트랜잭션을 백엔드에서 보조하자. : 실패해도 늦어져도 무조건 성공했다고 하고. 무조건 성공하게 만든다.&lt;/p&gt;

&lt;p&gt;서버리스: 이벤트 기반 + 블록 연결&lt;/p&gt;

&lt;p&gt;블록체인 트랜잭션 상태 확인&lt;/p&gt;

&lt;h4 id=&quot;스펙변경-부담-감소&quot;&gt;스펙변경 부담 감소&lt;/h4&gt;

&lt;p&gt;의존성 관리. 생각보다 큰 일&lt;/p&gt;

&lt;p&gt;패키지 관리 힘듦.&lt;/p&gt;

&lt;p&gt;웹3에서 이더스로 변경.&lt;/p&gt;

&lt;p&gt;간단했다.&lt;/p&gt;

&lt;p&gt;람다는 펑션기반이라 인풋과 아웃풋이 명확.&lt;/p&gt;

&lt;p&gt;인풋 아웃풋이 같으니 동작만 한다면 됨.&lt;/p&gt;

&lt;h4 id=&quot;간편한-배포&quot;&gt;간편한 배포&lt;/h4&gt;

&lt;p&gt;103일간 149회 배포&lt;/p&gt;

&lt;p&gt;up과 apex로 관리.&lt;/p&gt;

&lt;p&gt;한줄로 가능.&lt;/p&gt;

&lt;p&gt;이미지 프로세싱: 기본적으로 타입스크립트 쓰는데 이미지 프로세싱만 파이썬.&lt;/p&gt;

&lt;p&gt;트랜딩(랭킹): 엘라스틱 서치: 람다 - 다이나모 - 람다 -엘라스틱서치&lt;/p&gt;

&lt;p&gt;로깅: 다이나모 - 람다,파이어호스,&lt;/p&gt;

&lt;h4 id=&quot;적재적소&quot;&gt;적재적소&lt;/h4&gt;

&lt;h4 id=&quot;오토스케일링등-신경-안서도-됨&quot;&gt;오토스케일링등 신경 안서도 됨.&lt;/h4&gt;

&lt;h3 id=&quot;융통성&quot;&gt;융통성&lt;/h3&gt;

&lt;p&gt;좋은 의미인거 같지만. 없애야함.&lt;/p&gt;

&lt;p&gt;왜 빚지는지 보면 갚을 능력 되니까. 신용 1등급이니까.&lt;/p&gt;

&lt;p&gt;그러나 빚쟁이에겐 자비가 없다.&lt;/p&gt;

&lt;p&gt;융통성 발휘해서 빚지면 갚기 어려워요.&lt;/p&gt;

&lt;p&gt;원금 균등, 원리금 균등, 만기 일시상환 방법이 있음. 이자는 뒤쪽일수록 비쌈.&lt;/p&gt;

&lt;p&gt;대출시점에 미리 약정해서 미리 갚기도 안되고 함.&lt;/p&gt;

&lt;p&gt;TwIL&lt;/p&gt;

&lt;p&gt;This week I Leared&lt;/p&gt;

&lt;p&gt;한주간 코스모 체인 개발자가 공부한 내용 돌아가면서 고유.&lt;/p&gt;

&lt;p&gt;데일리 미팅 후 5-15분.&lt;/p&gt;

&lt;p&gt;매 스프린트마다 트와일한 내용 모아 기술 블로그 발행&lt;/p&gt;

&lt;p&gt;많이 모여서 컨퍼런스도 열어봄.&lt;/p&gt;

&lt;p&gt;서비스 오픈날에도 트와일 할정도로 융통성 없음.&lt;/p&gt;

&lt;p&gt;궁금한것 5월초 람다에 빠짐: 람다 기본개념. 프리퍼런스, 람다 핸들러, 람다 로컬테스트 + 프레임웤&lt;/p&gt;

&lt;p&gt;잘하고 싶은것&lt;/p&gt;

&lt;p&gt;자산으로 남기고 싶은 것&lt;/p&gt;

&lt;p&gt;검토후 적용 =&amp;gt; 30퍼&lt;/p&gt;

&lt;p&gt;적용 x 22%&lt;/p&gt;

&lt;p&gt;더 잘하기 위한것 34%&lt;/p&gt;

&lt;p&gt;후기 13%&lt;/p&gt;

&lt;p&gt;프로덕트와 직접적인 관련이 있는 것 77%&lt;/p&gt;

&lt;p&gt;기술부채 상환은 기술검토 부터다.&lt;/p&gt;

&lt;h3 id=&quot;짠을-없애야함&quot;&gt;짠!을 없애야함.&lt;/h3&gt;

&lt;p&gt;서프라이즈하지 말자.&lt;/p&gt;

&lt;p&gt;로컬에 브랜치따서 실험함.&lt;/p&gt;

&lt;p&gt;프로젝트 방향성과 조금 다른 개발.&lt;/p&gt;

&lt;p&gt;최신기술.&lt;/p&gt;

&lt;p&gt;알아요. 선물을 주고싶었다는거.&lt;/p&gt;

&lt;p&gt;실제로 필요해서 급할때 가져다 쓰기도합니다.&lt;/p&gt;

&lt;p&gt;하지만 미리 알려주세요.&lt;/p&gt;

&lt;p&gt;요즘에 이런거 찾아보고 있어요.&lt;/p&gt;

&lt;p&gt;팀이라서 좋은 이유: 내 프로그램이 아니다. 책임이 분담된다. 혼자서 못이뤄낼 결과물. 혼자서 다 하지 않아도 됨.&lt;/p&gt;

&lt;p&gt;팀원들이 얼마나 대단하냐면. 옆에 와서 앉아만 있어도 문제가 해결되는 경우가 많음.&lt;/p&gt;

&lt;h3 id=&quot;정리&quot;&gt;정리&lt;/h3&gt;

&lt;p&gt;급할때, 기획변경, 기능이 추가될때 빚진다.&lt;/p&gt;

&lt;p&gt;설계, 의존성, 자동화, 컨셉과 맞지 않는 도메인&lt;/p&gt;

&lt;p&gt;능력이 되니까. 효율적으로 사고하니까. 비즈니스 성장을 위해.&lt;/p&gt;

&lt;p&gt;덜 질 수 있다면 덜 지자: 서버리스, 빚 갚을 땐 융통성 필요 없다 : 트와일, 예고없이 일시 상환 하지 말자: 활발한 의견교환.&lt;/p&gt;

&lt;p&gt;빚도 자산이다.&lt;/p&gt;

&lt;p&gt;2등급이었는데 갚으니까 1등급 만들어주더라.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;최고다. 핵멋진 발표였다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;팀웍 높이기&lt;/p&gt;

&lt;p&gt;데일리미팅, 컨디션, 어제, 오늘&lt;/p&gt;

&lt;p&gt;리뷰: 좀 치열하게 하는 편. 칭찬도 함께.&lt;/p&gt;

&lt;p&gt;서버리스 문제&lt;/p&gt;

&lt;p&gt;러닝 코스트가 좀 들었음. AWS등을 공부해야함.&lt;/p&gt;

&lt;p&gt;서버리스 생태계, 가상화등이 잘 안되있었음.&lt;/p&gt;

&lt;p&gt;AWS 문제일때 문제 되었었음.&lt;/p&gt;

&lt;h2 id=&quot;데브옵스-인-웨더컴퍼니&quot;&gt;데브옵스 인 웨더컴퍼니&lt;/h2&gt;

&lt;p&gt;더 웨더 컴퍼니 조지훈&lt;/p&gt;

&lt;p&gt;더 웨더컴퍼니 데이터 소스: 과거기록, 레이더 데이터, 위성데이터, 공공데이터, 3자 데이터 소스, 프라이빗 웯 스테이션(25만개 정도)&lt;/p&gt;

&lt;p&gt;150~250억 리퀘스트가 하루에 발생&lt;/p&gt;

&lt;h3 id=&quot;데브옵스-cams&quot;&gt;데브옵스 CAMS&lt;/h3&gt;

&lt;p&gt;개발라이프 사이클을 단축시키는것.&lt;/p&gt;

&lt;p&gt;업데이트 빈번하게 수행&lt;/p&gt;

&lt;p&gt;비즈니스 목표와 연관되어야함&lt;/p&gt;

&lt;p&gt;컬쳐, 오토메이션, 메져먼트, 쉐어링&lt;/p&gt;

&lt;h4 id=&quot;문화&quot;&gt;문화&lt;/h4&gt;

&lt;p&gt;Silo의 해체, 리더십의 지원, 비즈니스 목표가 공통된 목표, 조직의 구조&lt;/p&gt;

&lt;p&gt;사일로: 운영, 개발, 테스트 조직등이 완전히 별도의 조직.&lt;/p&gt;

&lt;h4 id=&quot;자동화&quot;&gt;자동화&lt;/h4&gt;

&lt;p&gt;너무 툴에만 포커스 되면 안됨&lt;/p&gt;

&lt;h4 id=&quot;측정&quot;&gt;측정&lt;/h4&gt;

&lt;p&gt;시스템 모니터링, 로그&lt;/p&gt;

&lt;p&gt;사용자의 피드백&lt;/p&gt;

&lt;p&gt;라이프 사이클 주기&lt;/p&gt;

&lt;h4 id=&quot;공유&quot;&gt;공유&lt;/h4&gt;

&lt;p&gt;사일로 탈피, 지식과 경험의 공유&lt;/p&gt;

&lt;h3 id=&quot;더-웨더-컴퍼니의-데브옵스&quot;&gt;더 웨더 컴퍼니의 데브옵스&lt;/h3&gt;

&lt;p&gt;애자일&lt;/p&gt;

&lt;p&gt;2주+-단위로 릴리즈 수행&lt;/p&gt;

&lt;p&gt;개발팀 단위로 업무 시간 내에 다운타임 없이 릴리즈 수행&lt;/p&gt;

&lt;p&gt;데브옵스 엔지니어는 거의 옵스&lt;/p&gt;

&lt;p&gt;팀리더, 세일즈엔지니어링, 프로덕트 오너&lt;/p&gt;

&lt;p&gt;프로덕트 오너 : 리드 디벨로퍼(1), 디벨로퍼(3~4), 큐에이(1~2), 데브옵스 엔지니어(1)&lt;/p&gt;

&lt;p&gt;백로그 티켓, 스프린트 티켓&lt;/p&gt;

&lt;p&gt;슬랙: 도움이 짱많이 됨.&lt;/p&gt;

&lt;p&gt;테라폼, 셰프&lt;/p&gt;

&lt;p&gt;모니터링: 데이터독, 알람: 페이져듀티&lt;/p&gt;

&lt;p&gt;어떻게 더 빠르고 더 자주 그리고 안정적으로 고객에게 딜리버리 할 것인가?&lt;/p&gt;
</description>
        <pubDate>Sat, 15 Dec 2018 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/review/2018/12/15/masocon-2/</link>
        <guid isPermaLink="true">https://harurepository.github.io/review/2018/12/15/masocon-2/</guid>
        
        <category>event</category>
        
        
        <category>review</category>
        
      </item>
    
      <item>
        <title>[블록체인] 스토리지</title>
        <description>&lt;h2 id=&quot;ipfs&quot;&gt;IPFS&lt;/h2&gt;

&lt;h2 id=&quot;file-coin&quot;&gt;File Coin&lt;/h2&gt;

&lt;p&gt;파일코인이 뭐야?&lt;/p&gt;

&lt;p&gt;ㅁㅏ이너 두종류&lt;/p&gt;

&lt;p&gt;시장 두가지 : 저장하는 사람, 찾아서 갖다주는사람&lt;/p&gt;

&lt;p&gt;프루프오브 스토리지&lt;/p&gt;

&lt;p&gt;독자체인의 합의 알고리즘&lt;/p&gt;

&lt;p&gt;ipfs는 http를 대체하는 프로토콜.&lt;/p&gt;

&lt;h3 id=&quot;파일코인이-뭐야&quot;&gt;파일코인이 뭐야?&lt;/h3&gt;

&lt;p&gt;파일코인은 ipfs의 인센티브 레이어.&lt;/p&gt;

&lt;p&gt;파일코인은 저장소시장과 검색시장에서 수수료로 통용되는 화폐&lt;/p&gt;

&lt;p&gt;저장소 마이너 보상&lt;/p&gt;

&lt;h3 id=&quot;마이너&quot;&gt;마이너&lt;/h3&gt;

&lt;p&gt;스토리지 마이너만 컨센서스에 참여&lt;/p&gt;

&lt;p&gt;검색마이너는 참여 x&lt;/p&gt;

&lt;h3 id=&quot;마켓&quot;&gt;마켓&lt;/h3&gt;

&lt;h4 id=&quot;스토리지&quot;&gt;스토리지&lt;/h4&gt;

&lt;p&gt;얼마에 저장해달라는 주문이 블록체인에 올라감.&lt;/p&gt;

&lt;p&gt;저장된거는 확인이 되야함. 받고 바로지울수도있음.&lt;/p&gt;

&lt;p&gt;시간이 지나면서 조금씩 정산이 됨.&lt;/p&gt;

&lt;h4 id=&quot;리트리벌&quot;&gt;리트리벌&lt;/h4&gt;

&lt;p&gt;연구중&lt;/p&gt;

&lt;p&gt;오프체인 예정인듯&lt;/p&gt;

&lt;h3 id=&quot;프루프오브-스토리지&quot;&gt;프루프오브 스토리지&lt;/h3&gt;

&lt;p&gt;클라가 저장소 마이너에게 챌린지 하는 방법&lt;/p&gt;

&lt;p&gt;저장소 마이너가 증명을 생성하여 지속적으로 포스트하는 방법&lt;/p&gt;

&lt;h3 id=&quot;컨센서스-메카니즘&quot;&gt;컨센서스 메카니즘&lt;/h3&gt;

&lt;p&gt;파워: 해당 에폭에서 마이너 A에게 할당된 저장소의 총합&lt;/p&gt;

&lt;h2 id=&quot;스웜&quot;&gt;스웜&lt;/h2&gt;

&lt;p&gt;컨셉증명 중&lt;/p&gt;

&lt;p&gt;0.3 기준&lt;/p&gt;

&lt;p&gt;이더리움의 웹3스택 중의 하나&lt;/p&gt;

&lt;p&gt;스웜, 이더리움, 위스퍼&lt;/p&gt;

&lt;h3 id=&quot;스웜-1&quot;&gt;스웜&lt;/h3&gt;

&lt;p&gt;이더리움 예비&lt;/p&gt;

&lt;p&gt;카드미아 기반의 해시테이블로 데브피투피기반&lt;/p&gt;

&lt;p&gt;게스가 필요.ENS연동필요&lt;/p&gt;

&lt;h3 id=&quot;bzz&quot;&gt;bzz&lt;/h3&gt;

&lt;p&gt;스웜을 통한 데이터 업로드, 다운로드 프로토콜&lt;/p&gt;

&lt;h3 id=&quot;feeds&quot;&gt;feeds&lt;/h3&gt;

&lt;p&gt;뮤터블 리소스 업데이트&lt;/p&gt;

&lt;p&gt;bzz는 데이터내용이 바뀌면 메니페스트 전체 값이 바뀜.&lt;/p&gt;

&lt;p&gt;이를 해결. 데이터 변경 동일한 메니페스트&lt;/p&gt;

&lt;h3 id=&quot;act&quot;&gt;act&lt;/h3&gt;

&lt;p&gt;액세스 컨트롤 프로토콜&lt;/p&gt;

&lt;p&gt;메니페스트를 공개하면 누구나 데ㅣ터 접근가능. 그래서 특정 인만 접근할수있게하기위함.&lt;/p&gt;

&lt;h3 id=&quot;pss&quot;&gt;pss&lt;/h3&gt;

&lt;p&gt;포스탈 서비스 오버 스웖&lt;/p&gt;

&lt;p&gt;스웜 노드사ㅣ에서 메세지.&lt;/p&gt;

&lt;p&gt;위스퍼를 기반으로하는 노드 투 노드 메시지 프로토콜&lt;/p&gt;

&lt;p&gt;비대칭키 기반&lt;/p&gt;

&lt;p&gt;발신자와 수신자를 숨길수있음.&lt;/p&gt;

&lt;p&gt;수신자를 일부만 공개하고 다뿌리는듯. 딱나에게 맞는거만 볼수있으니까.&lt;/p&gt;

&lt;h3 id=&quot;sw3&quot;&gt;sw3&lt;/h3&gt;

&lt;p&gt;스왑&lt;/p&gt;

&lt;p&gt;체큐북 컨트랙트를 발행. 청크 수표를 컨트랙트를 통해 발행하는 것으로 실시간 청크에 대한 지불을 할 수 있음.&lt;/p&gt;

&lt;p&gt;이더나 개별 토큰 사용가능&lt;/p&gt;

&lt;p&gt;스웨어&lt;/p&gt;

&lt;p&gt;데이터 유실 위험 줄이기 위해 데이터 저장하는 노드는 스웨어 컨트랙트에 보증금 예치. 책임있는 참가자가될수있음.&lt;/p&gt;

&lt;p&gt;데이터 소유자는 약정을 보험형태로 구매 가능.&lt;/p&gt;

&lt;p&gt;데이터 유실시 스웨어 보증금을 데이터 소유자에게 전송함.&lt;/p&gt;

&lt;p&gt;스윈들&lt;/p&gt;

&lt;p&gt;노드가 스웨어에 의해 데이터 저장 계약을 이행하지 않으면 소송및 징계&lt;/p&gt;
</description>
        <pubDate>Thu, 13 Dec 2018 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/review/2018/12/13/blockchain-storage/</link>
        <guid isPermaLink="true">https://harurepository.github.io/review/2018/12/13/blockchain-storage/</guid>
        
        <category>event</category>
        
        
        <category>review</category>
        
      </item>
    
      <item>
        <title>[COSMO체인]코스모체인</title>
        <description>&lt;p&gt;블록체인은 AWS의 100만분의 1&lt;/p&gt;

&lt;p&gt;탈중앙화와 중앙화의 혼합&lt;/p&gt;

&lt;p&gt;카카오가 공격했음. 그거 깨고 투자 받음&lt;/p&gt;

&lt;p&gt;40000정도의 액티비티&lt;/p&gt;

&lt;p&gt;Dapp 아니고 Bapp(블록체인 앱)&lt;/p&gt;

&lt;p&gt;중앙화와 탈중앙화의 타협.&lt;/p&gt;

&lt;h2 id=&quot;블록체인-서버리스로-조립하기&quot;&gt;블록체인 서버리스로 조립하기&lt;/h2&gt;

&lt;p&gt;서버리스 !== 노 서버&lt;/p&gt;

&lt;p&gt;서버리스 === 노 매니지&lt;/p&gt;

&lt;p&gt;블록체인 특징: 변화가 빠르다. 개발환경이 다르다. 한치앞도 내다 볼 수 없다.&lt;/p&gt;

&lt;p&gt;스마트 컨트랙트 도입 이유: 레퍼런스가 많다. 사용이 많다.&lt;/p&gt;

&lt;p&gt;이더리움의 한계: 실패의 가능성, 용량의 제한, 사용자 지불, 속도&lt;/p&gt;

&lt;p&gt;서버와 블록체인의 협업&lt;/p&gt;

&lt;p&gt;서버가 일해야함.&lt;/p&gt;

&lt;p&gt;왜 하필 서버리스?&lt;/p&gt;

&lt;p&gt;파일럿이라 기능 추가.. 유저 수 예상 불가.. 보상은 어떻게.. 빠른 개발..&lt;/p&gt;

&lt;p&gt;중요한건 잦은 배포&lt;/p&gt;

&lt;h3 id=&quot;웹3&quot;&gt;웹3&lt;/h3&gt;

&lt;p&gt;이더리움 공식 모듈&lt;/p&gt;

&lt;p&gt;풍부한 레퍼런스&lt;/p&gt;

&lt;p&gt;하지만: 이차원 어레이 지원 불가, 등의 문제 프라미스 이벤트 컨트롤 어려움, 세팅 어려움&lt;/p&gt;

&lt;h3 id=&quot;ethersjs&quot;&gt;ethersjs&lt;/h3&gt;

&lt;p&gt;웹3사용하다 너무 엄청난 삽질을 하다가 이더스로 바꿈&lt;/p&gt;

&lt;p&gt;이런경우 모놀리틱이었으면 서비스 중간에 교체하기 너무 어려웠을 것이다. 하지만 서버리스라서 잘 했음.&lt;/p&gt;

&lt;p&gt;좋은 앱은 좋은 설계로부터&lt;/p&gt;

&lt;h3 id=&quot;어떤-서비스를-제공하고싶은가&quot;&gt;어떤 서비스를 제공하고싶은가&lt;/h3&gt;

&lt;p&gt;빨랐으면 좋겠다. 블록체인으로 보상의 투명성, 시제품, SNS&lt;/p&gt;

&lt;p&gt;일반적인 서비스: 빠르게, SNS&lt;/p&gt;

&lt;p&gt;댑으로서의 서비스: 보상의 투명성&lt;/p&gt;

&lt;p&gt;알렉산더: 터기의 리디아 지방 침공시. 신전을 묶어놓은 매듭을 풀어야 점령할수있다.는 전설 그러나 걍 끊어버림.&lt;/p&gt;

&lt;p&gt;SNS &amp;lt;-&amp;gt; Bapp&lt;/p&gt;

&lt;p&gt;킵 칾 앤 메잌 트랜잭션&lt;/p&gt;

&lt;p&gt;블록체인에 뭘 쌓아요? 트랜잭션&lt;/p&gt;

&lt;p&gt;트랜잭션의 상태: 펜딩, 캔슬드, 컨펌드, 페일&lt;/p&gt;

&lt;p&gt;리워드 &amp;lt;-&amp;gt; 펜딩, 페일, 컨펌, 캔슬&lt;/p&gt;

&lt;p&gt;펜딩: 타임이 찍힌 타입, 펜딩타임이 찍히지 않은 타입&lt;/p&gt;

&lt;p&gt;펜딩 &amp;lt;-&amp;gt; 인프로그레스, 캔슬, 컨펌, 페일&lt;/p&gt;

&lt;p&gt;왜 하필 서버리스인가&lt;/p&gt;

&lt;p&gt;배포, 스케일러빌리티, 플렉서빌리티&lt;/p&gt;

&lt;p&gt;…, 예상되는 요청 대비 확장성, 추가 되는 새로운 개념에 대해서 얼마든지 적용 가능&lt;/p&gt;

&lt;h3 id=&quot;리액트-훅스&quot;&gt;리액트 훅스&lt;/h3&gt;

&lt;p&gt;리액트와 리액트네이티브 사용&lt;/p&gt;

&lt;p&gt;리유저블이 장점&lt;/p&gt;

&lt;p&gt;스테이트풀 로직도 재사용 가능&lt;/p&gt;

&lt;h3 id=&quot;훅&quot;&gt;훅&lt;/h3&gt;

&lt;p&gt;클래스를 적지않고 스테이트를 사용할수있다.&lt;/p&gt;

&lt;p&gt;커스텀 훅&lt;/p&gt;

&lt;p&gt;네트워크 스테이터스에 사용할 예정&lt;/p&gt;

&lt;h3 id=&quot;리액트로보는-코스미&quot;&gt;리액트로보는 코스미&lt;/h3&gt;

&lt;p&gt;기술 스택&lt;/p&gt;

&lt;p&gt;네퉠: 그래프큐엘, 레스트&lt;/p&gt;

&lt;p&gt;상태관리: 포믹, ?&lt;/p&gt;

&lt;p&gt;데브 툴: 스토리북, ?&lt;/p&gt;

&lt;p&gt;네비게이션: 리액트 네이티브 네비게이션 v2&lt;/p&gt;

&lt;p&gt;유아이: 스타일드 컴포넌트, 앤트디&lt;/p&gt;

&lt;p&gt;버그 리포트: 엑센트라?&lt;/p&gt;

&lt;p&gt;스테이트 매니지먼트: 몹엑스 스테이트 트리&lt;/p&gt;

&lt;p&gt;도메인 기반 상태관리&lt;/p&gt;

&lt;p&gt;화면, 컴포넌트 간의 비즈니스 로직 분리&lt;/p&gt;

&lt;p&gt;리액트 네이티브 네비게이션 v2&lt;/p&gt;

&lt;p&gt;스택, 모달, 오버레이&lt;/p&gt;

&lt;p&gt;개발 환경&lt;/p&gt;

&lt;p&gt;###환경&lt;/p&gt;

&lt;p&gt;리액토트론, 리액트네이티브 디버거, 스토리북, 그래프큐엘&lt;/p&gt;

&lt;p&gt;다음 여정&lt;/p&gt;

&lt;h3 id=&quot;투비&quot;&gt;투비&lt;/h3&gt;

&lt;p&gt;리액트 훅, 리얼 컴포넌트 포 디자인, 에이비 테스트&lt;/p&gt;

&lt;p&gt;스케치 =&amp;gt; 컴포넌트 : 리액트 스케치&lt;/p&gt;

&lt;p&gt;그래프큐엘 서버, 서버리스, 업(그래프큐엘 서버리스에 올리는거)&lt;/p&gt;
</description>
        <pubDate>Wed, 05 Dec 2018 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/review/2018/12/05/cosmochain/</link>
        <guid isPermaLink="true">https://harurepository.github.io/review/2018/12/05/cosmochain/</guid>
        
        <category>event</category>
        
        
        <category>review</category>
        
      </item>
    
      <item>
        <title>[Devfest] 데브페스트 웹테크 2018</title>
        <description>&lt;p&gt;김석준&lt;/p&gt;

&lt;h2 id=&quot;히치하이커&quot;&gt;히치하이커&lt;/h2&gt;

&lt;p&gt;프로덕트 개발자&lt;/p&gt;

&lt;p&gt;소카-스트리미-스튜디오시드&lt;/p&gt;

&lt;p&gt;소프트웨어 개발은 건축과 비슷하지만 꽤 다름&lt;/p&gt;

&lt;p&gt;그림을 같이 그리는것과 더 비슷&lt;/p&gt;

&lt;p&gt;엔지니어링 아트 팀플레이&lt;/p&gt;

&lt;p&gt;진실: 디자이너는 암것도 모른다.&lt;/p&gt;

&lt;p&gt;개발자도 대부분 잘 모르지만 그나마 좀 더 알기때문에 개발자가 리드해 줘야함.&lt;/p&gt;

&lt;p&gt;폰트, 타이포그라피&lt;/p&gt;

&lt;p&gt;시맨틱, 논시맨틱 : h1과 큰 글자에 볼드 한거.&lt;/p&gt;

&lt;p&gt;크롤러가 보기엔 중요함.&lt;/p&gt;

&lt;p&gt;시맨틱 컬러링&lt;/p&gt;

&lt;p&gt;컬러 베리에이션, 브랜드, 스테이터스, 백그라운드 패딩 보더 등을 미리 설정&lt;/p&gt;

&lt;p&gt;컴포넌트를 먼저 디자인하게&lt;/p&gt;

&lt;p&gt;프론트 개발자가 디자이너에게 많이 이야기를 해야함.&lt;/p&gt;

&lt;p&gt;외부라이브러리도 한번 래핑해서 쓰는게 좋음&lt;/p&gt;

&lt;p&gt;포매터 칼큘레이터 파서 등 필요한거는 다 만들어놓자.&lt;/p&gt;

&lt;p&gt;상수관리&lt;/p&gt;

&lt;p&gt;Fetch도 한번 래핑&lt;/p&gt;

&lt;p&gt;home 밑에 button은 home-button 으로 하기&lt;/p&gt;

&lt;p&gt;라이브러리는 필요하거, 왠만하면 만들고 . 쓸거면 깃헙스타&lt;/p&gt;

&lt;p&gt;워크 스마트&lt;/p&gt;
</description>
        <pubDate>Wed, 28 Nov 2018 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/review/2018/11/28/devfest-2018/</link>
        <guid isPermaLink="true">https://harurepository.github.io/review/2018/11/28/devfest-2018/</guid>
        
        <category>event</category>
        
        
        <category>review</category>
        
      </item>
    
      <item>
        <title>[BlockChain] 라인 링크 데브 2018 - 3</title>
        <description>&lt;h2 id=&quot;라인-토큰-이코노미&quot;&gt;라인 토큰 이코노미&lt;/h2&gt;

&lt;h3 id=&quot;라인과-유저&quot;&gt;라인과 유저&lt;/h3&gt;

&lt;p&gt;2011 일본 대지진&lt;/p&gt;

&lt;p&gt;이 때 헤어진 가족, 친지들이 많았고 통신망 마비.&lt;/p&gt;

&lt;p&gt;다들 공중전화에 몰려듦.&lt;/p&gt;

&lt;p&gt;이런 커뮤니케이션 간극을 없애기위해 라인 메신저가나옴.&lt;/p&gt;

&lt;p&gt;긴급한 상황에서도 커뮤니케이션이 가능하게.&lt;/p&gt;

&lt;p&gt;디바이스간에도 커뮤니케이션이 가능하게.&lt;/p&gt;

&lt;p&gt;피쳐폰을가진 어린세대 스마트폰을가진 어른세대와의 커뮤니케이션&lt;/p&gt;

&lt;p&gt;폭발적인 성장. 1억6천5백만명의 MAU&lt;/p&gt;

&lt;h3 id=&quot;라인과-토큰&quot;&gt;라인과 토큰&lt;/h3&gt;

&lt;p&gt;인터넷이 모든것을 바꿈.&lt;/p&gt;

&lt;p&gt;UX, UI가 중요하게 됨.&lt;/p&gt;

&lt;p&gt;유저들의 인식이 바뀌어감.&lt;/p&gt;

&lt;p&gt;커스토머 -(인터넷)&amp;gt; 유저 -(블록체인)&amp;gt; 컨트리뷰터&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;링크 데뷔 2018.09.04&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
  &lt;li&gt;유저에게 편해야 한다.&lt;/li&gt;
  &lt;li&gt;기여는 마이닝이다.&lt;/li&gt;
  &lt;li&gt;여러가지 디앱, 단일 코인.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;10억 중 8억개가 유저에게.&lt;/p&gt;

&lt;h3 id=&quot;라인과-토큰이코노미&quot;&gt;라인과 토큰이코노미&lt;/h3&gt;

&lt;p&gt;라인 테크 플러스&lt;/p&gt;

&lt;p&gt;위즈볼 파샤 타파스 스탭에서 모인 정보를 모으면 검색 마왕이 될 수 있을것이다.&lt;/p&gt;

&lt;p&gt;유저가 사용하지 않은건 328억개정도의 라인포인트가 있음&lt;/p&gt;

&lt;p&gt;라인 플랫폼을 이용해 크립토세계와 실제 세계간의 거리를 줄일것임&lt;/p&gt;

&lt;h3 id=&quot;하나더&quot;&gt;하나더&lt;/h3&gt;

&lt;p&gt;참석하신분들께 링크 에어드랍.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;아이콘-루프-인터체인&quot;&gt;아이콘 루프 인터체인&lt;/h2&gt;

&lt;p&gt;이더, 이오스같은 크립토자이언트 사이에서 살아남는 법&lt;/p&gt;

&lt;p&gt;tx를 충분히, 가치있게 생성할 수 있는가.&lt;/p&gt;

&lt;p&gt;dApp 이 이더의 ?퍼정도 그마저 덱스를 제외하면 게임. 이건 가치있는거라고 말하기 어려움.&lt;/p&gt;

&lt;p&gt;리좀: 처음과 끝이 없고 항상 중간자로 존재&lt;/p&gt;

&lt;p&gt;각각 블록체인의 거버넌스등을 인정하고 그것들을 연결하는데에 집중.&lt;/p&gt;

&lt;p&gt;인터체인으로 연결하면 뭐가 좋음?&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;이더리움체인에서 이더사용하던사람들이 이오스체인내에 디앱을 사용하려면 지갑을 만들고… 해야함.&lt;/li&gt;
  &lt;li&gt;…&lt;/li&gt;
  &lt;li&gt;BTP 블록체인 트랜스퍼 프로터콜 :: 씨랩&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;이더유저가 ICO 참여할때 신원인증서비스를 사용하고싶다고 하면 결국 금투체인에 연결&lt;/p&gt;

&lt;h3 id=&quot;개발자-친화적인-팔리씨와-툴&quot;&gt;개발자 친화적인 팔리씨와 툴&lt;/h3&gt;

&lt;p&gt;비트베리언급 - 아이디기반 키관리&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;블로코-아르고&quot;&gt;블로코 아르고&lt;/h2&gt;

&lt;p&gt;엔터프라이즈 블록체인 : 빗장을 열다&lt;/p&gt;

&lt;h3 id=&quot;엔터프라이즈-블록체인&quot;&gt;엔터프라이즈 블록체인&lt;/h3&gt;

&lt;p&gt;기업환경에서의 블록체인&lt;/p&gt;

&lt;p&gt;블록체인은 기업에 적용하기 사실 어려운 파트다.&lt;/p&gt;

&lt;p&gt;기업은 서비스에 블록체인적용을 생각함&lt;/p&gt;

&lt;p&gt;퓨어한 블록체인과는 척을 짐.&lt;/p&gt;

&lt;p&gt;블로코는 비투비 비투씨 최고 숫자 기록&lt;/p&gt;

&lt;p&gt;코인스택 : 인증, 투표, 거래, 전자문서 등&lt;/p&gt;

&lt;p&gt;인증사업: 챌린지 리스판스 : 사용자 앱에 난스값보내고 서명&lt;/p&gt;

&lt;p&gt;금융기관 송금: 은행 - 중앙기관에 다른은행에 돈보낸다고 알려줌 - 다른은행에서 확인 등등 어려움.&lt;/p&gt;

&lt;p&gt;분산원장 :: 비가역성 :: 오너십&lt;/p&gt;

&lt;p&gt;프라이빗으로 하던 중에 퍼블릭에대한 니즈가 생김.&lt;/p&gt;

&lt;p&gt;하지만 TPS값등 문제가 많아 하이브리드한 환경이 필요.&lt;/p&gt;

&lt;h3 id=&quot;아르고&quot;&gt;아르고&lt;/h3&gt;

&lt;p&gt;개발자가 쉬워야한다.&lt;/p&gt;

&lt;p&gt;API 이거나 컨트랙트를 짤때의 프레임웤이 필요&lt;/p&gt;

&lt;p&gt;하이브리드 블록체인, 서버리스 컴퓨팅&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;구성, 디앱, 테스트, 디플로이&lt;/p&gt;

&lt;p&gt;토큰만쓰면 키밸류로 충분. 하지만 데이터베이스의 피쳐가 필요. 그거 지원&lt;/p&gt;

&lt;p&gt;ship이라는 패키지 매니져&lt;/p&gt;

&lt;p&gt;루아에 sql사옹&lt;/p&gt;

&lt;p&gt;디앱 프로바이더 : 허브, 마켓플레이스 등&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;아르고 비즈니스&lt;/p&gt;

&lt;p&gt;결국 브릿지. 에셋을 어떻게 넘길것인가.&lt;/p&gt;

&lt;p&gt;멀티시그방식과 머클프루프방식으로 넘긴다.&lt;/p&gt;

&lt;p&gt;멀티시그: 중간에 오퍼레이터가 있어서 릴레이 해줌.&lt;/p&gt;

&lt;p&gt;코인 락을 하고 다른곳에서 풀어주고.&lt;/p&gt;

&lt;p&gt;머클프루프: 내가 락을 걸고 내가 함.&lt;/p&gt;

&lt;p&gt;이더리움 샤딩등이 구현되면 백본처럼 될것이다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;갬퍼-가상과-실물경제의-만남&quot;&gt;갬퍼 가상과 실물경제의 만남&lt;/h2&gt;

&lt;p&gt;비트코인만으로 세계일주한 부부이야기를 보고 암호화폐에 관심.&lt;/p&gt;

&lt;p&gt;2015 : 비트코인 지갑 및 ATM 서비스, 암호화폐를 이용한 해외 송금서비스&lt;/p&gt;

&lt;p&gt;2016 : 프라이빗 블락체인 구축&lt;/p&gt;

</description>
        <pubDate>Thu, 08 Nov 2018 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/review/2018/11/08/line-link-dev-3/</link>
        <guid isPermaLink="true">https://harurepository.github.io/review/2018/11/08/line-link-dev-3/</guid>
        
        <category>event</category>
        
        
        <category>review</category>
        
      </item>
    
      <item>
        <title>[BlockChain] 라인 링크 데브 2018 - 2</title>
        <description>&lt;h2 id=&quot;캐리프로토콜&quot;&gt;캐리프로토콜&lt;/h2&gt;

&lt;p&gt;매장 - 소비자 이해&lt;/p&gt;

&lt;p&gt;소비자 - 내 결제 데이터를 통제하고 수익화&lt;/p&gt;

&lt;p&gt;광고주 - 낮은 비용으로 높은 효율의 광고 집행&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;캐리토큰 - 데이터 공유시, 광고 수신시&lt;/p&gt;

&lt;p&gt;브랜드토큰 - 쿠폰같은것&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;활성화된 서비스에서 사용자 끌어오기,&lt;/p&gt;

&lt;p&gt;블록체인에 대해 잘 모르는, 스마트폰 작동 할 줄 아는&lt;/p&gt;

&lt;p&gt;매장 태블릿 인터페이스에 익숙한, 적립매장 메시지 수신에 거부감이 덜한&lt;/p&gt;

&lt;h3 id=&quot;캐리-얼라이언스&quot;&gt;캐리 얼라이언스&lt;/h3&gt;

&lt;p&gt;이미 매장을 확보 한 단말 사업자&lt;/p&gt;

&lt;p&gt;지갑사업자&lt;/p&gt;

&lt;p&gt;광고사업자&lt;/p&gt;

&lt;p&gt;크립토-피앗 정산 사업자&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;AB180 Airblock&lt;/p&gt;

&lt;h2 id=&quot;에어블락-프로토콜&quot;&gt;에어블락 프로토콜&lt;/h2&gt;

&lt;p&gt;데이터 마켓플레이스&lt;/p&gt;

&lt;p&gt;ab180 빅데이터 분석&lt;/p&gt;

&lt;p&gt;에어블록은 에어브릿지 통합 데이터 플랫폼 내에 위치함.&lt;/p&gt;

&lt;p&gt;광고에선 데이터 품질, 데이터 양 중요&lt;/p&gt;

&lt;p&gt;개인 데이터 권리 침해&lt;/p&gt;

&lt;h3 id=&quot;개인데이터-시자의-수요공급-불일치&quot;&gt;개인데이터 시자의 수요/공급 불일치&lt;/h3&gt;

&lt;p&gt;개인 사용자 - 데이터의 주인이지만 개인 데이터 권리 침해&lt;/p&gt;

&lt;p&gt;서비스들 - 고객 데이터 수익화 니즈 하지만 합법적인 데이터 수익화 수단의 부재&lt;/p&gt;

&lt;p&gt;데이터 소비자 - 출처가 투명한 품질 높은 데이터를 많이 구매하고자 함 그러나 투명한 출처의 데이터 마켓플레이스의 부재&lt;/p&gt;

&lt;h3 id=&quot;sdk를-통한-확장성-극대화&quot;&gt;SDK를 통한 확장성 극대화&lt;/h3&gt;

&lt;p&gt;데이터 수집 및 수익화에 대한 명시적 동의를 받을 수 있음.&lt;/p&gt;

&lt;h3 id=&quot;발전1-사이드체인기술&quot;&gt;발전1: 사이드체인기술&lt;/h3&gt;

&lt;p&gt;엔터프라이즈 데이터 프라이버시, 비용절감, 속도 및 확장성&lt;/p&gt;

&lt;h3 id=&quot;발전2-세컨트파티-데이터-거래&quot;&gt;발전2: 세컨트파티 데이터 거래&lt;/h3&gt;
</description>
        <pubDate>Thu, 08 Nov 2018 00:00:00 +0000</pubDate>
        <link>https://harurepository.github.io/review/2018/11/08/line-link-dev-2/</link>
        <guid isPermaLink="true">https://harurepository.github.io/review/2018/11/08/line-link-dev-2/</guid>
        
        <category>event</category>
        
        
        <category>review</category>
        
      </item>
    
  </channel>
</rss>
