<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="text">Genius Project</title>
  <id>http://genius-project.postach.io/feed.xml</id>
  <updated>2017-02-19T15:03:17.558000Z</updated>
  <link href="http://genius-project.postach.io/" />
  <link href="http://genius-project.postach.io/feed.xml" rel="self" />
  <generator>Werkzeug</generator>
  <entry xml:base="http://genius-project.postach.io/feed.xml">
    <title type="text">[React]Nested Components와 Props</title>
    <id>https://genius-project.postach.io/post/react-nested-componentswa-props</id>
    <updated>2017-02-19T15:03:17.558000Z</updated>
    <published>2017-02-19T15:02:32Z</published>
    <link href="https://genius-project.postach.io/post/react-nested-componentswa-props" />
    <author>
      <name>Jaewon Kwon</name>
    </author>
    <category term="react" />
    <category term="component" />
    <category term="nest" />
    <category term="props" />
    <content type="html">&lt;div&gt;&lt;del style=&quot;position:relative;display:block;z-index:10;&quot;&gt;&lt;a style=&quot;position: absolute;color: #FFF;text-decoration: none;font-size: 12px;height: 25px;border-radius: 0;margin-top: -20px;right: 15px;background: rgba(0, 0, 0, 0);border-left: 10px solid #BB3A34;border-right: 10px solid #BB3A34;border-bottom: 5px solid rgba(0, 0, 0, 0);width: 0;text-indent:-100000px;&quot; href=&quot;http://marxi.co/#/?provider=evernote_int&amp;guid=b3b0a2d6-90cf-49a7-b586-224a722856c2&amp;notebook=React&quot;&gt;Edit&lt;/a&gt;&lt;/del&gt;&lt;div style=&quot;color: #2c3f51; line-height: 1.6;&quot;&gt;
                        
                    

&lt;h3 style=&quot;font-family: inherit; font-weight: bold; color: inherit; margin-top: 21px; margin-bottom: 10.5px; font-size: 1.7em; margin: 1.2em 0 .6em 0; text-align: start; line-height: 1.6;&quot;&gt;[React]Nested Components와 Props&lt;/h3&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;/&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;a style=&quot;background: transparent; color: #1980e6; text-decoration: none;&quot; target=&quot;_blank&quot; href=&quot;http://genius-project.postach.io/post/react-reactyi-componente-daehayeo&quot;&gt;이전 포스트&lt;/a&gt;에서 React &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;component&lt;/strong&gt;를 만드는 방법을 알아보았다. 이번 글에서는 component를 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;nested&lt;/strong&gt;(중첩) 시키는 방법과 자식 React component에 데이터를 전달하는 방법에 대해 알아보자.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이전부터 쭉 말해왔지만 React의 가장 큰 장점은 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;state&lt;/strong&gt;를 관리하는 것이 정말 쉽다는 것이다. 그 예로 한 component에서 다른 하위 component로 데이터를 쉽게 전달하는 시스템이 있고 그 시스템이 바로 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;props&lt;/strong&gt;이다. &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;props&lt;/strong&gt;는 component에 어떤 인수가 function에 연결되어 있는지 나타내 주는 놈이다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;다음은 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;props&lt;/strong&gt;를 사용하는 아주 기본적인 예이다.&lt;/p&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; HelloUser = React.createClass({&lt;br/&gt;  render: &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt;(&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;/&gt;)&lt;/span&gt;{&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; (&lt;br/&gt;      &lt;span style=&quot;line-height: 1.6;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt;&gt;&lt;/span&gt; Hello, {this.props.name}&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;    )&lt;/span&gt;&lt;br/&gt;  }&lt;br/&gt;});&lt;br/&gt;ReactDOM.render(&lt;span style=&quot;line-height: 1.6;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;HelloUser&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;Tyler&quot;&lt;/span&gt;/&gt;&lt;/span&gt;, document.getElementById('app'));&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;위의 코드를 보면 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;component&lt;/strong&gt;를 호출할 때 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;name&lt;/strong&gt;(Tyler)을 전달한다. 이 속성은 component 내에서 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;this.props.name&lt;/code&gt;으로 불러올 수 있다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;조금 더 복잡한 경우를 생각해보자. 위 예제는 component가 하나였다면 이번에는 두 개의 component에 대해 다루어보자.각각의 component는 부모 component, 자식(하위) component이며, 부모 component는 자식 component에게 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;props&lt;/strong&gt;으로 데이터를 전달한다. 먼저 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;부모 component&lt;/strong&gt;를 보자.&lt;/p&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; FriendsContainer = React.createClass({&lt;br/&gt;  render: &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt;(&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;/&gt;)&lt;/span&gt;{&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; name = &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'Jaewon Kwon'&lt;/span&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; friends = [&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'friend1'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'friend2'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'friend3'&lt;/span&gt;]&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; (&lt;br/&gt;      &lt;span style=&quot;line-height: 1.6;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;h3&lt;/span&gt;&gt;&lt;/span&gt; Name: {name} &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;h3&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;ShowList&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;names&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;{friends}&lt;/span&gt; /&gt;&lt;/span&gt;&lt;br/&gt;      &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;    )&lt;/span&gt;&lt;br/&gt;  }&lt;br/&gt;});&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이번에는 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;자식 Component&lt;/strong&gt;이다.&lt;/p&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; ShowList = React.createClass({&lt;br/&gt;  render: &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt;(&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;/&gt;)&lt;/span&gt;{&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; listItems = &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;this&lt;/span&gt;.props.names.map(&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt;(&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;friend&lt;/span&gt;)&lt;/span&gt;{&lt;br/&gt;      &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;line-height: 1.6;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;li&lt;/span&gt;&gt;&lt;/span&gt; {friend} &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;li&lt;/span&gt;&gt;&lt;/span&gt;;&lt;/span&gt;&lt;br/&gt;    });&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; (&lt;br/&gt;      &lt;span style=&quot;line-height: 1.6;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;h3&lt;/span&gt;&gt;&lt;/span&gt; Friends &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;h3&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;ul&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;          {listItems}&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;ul&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;      &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;    )&lt;/span&gt;&lt;br/&gt;  }&lt;br/&gt;});&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;Array.prototype.map&lt;/code&gt;가 익숙하지 않다면, 위의 예제가 조금 어색해 보일 수 있다. &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;map&lt;/code&gt;은 새로운 배열을 만들고, 배열의 각 항목에 콜백 함수를 호출하여, 각 배열에 콜백 함수를 호출 한 결과로 새 배열에 채운다. 예를 들면&lt;/p&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; friends = [&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'friend1'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'friend2'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'friend3'&lt;/span&gt;];&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; listItems = friends.map(&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt;(&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;friend&lt;/span&gt;)&lt;/span&gt;{&lt;br/&gt;  &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;&lt;li&gt; &quot;&lt;/span&gt; + friend + &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;&lt;/li&gt;&quot;&lt;/span&gt;;&lt;br/&gt;});&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;console&lt;/span&gt;.log(listItems); &lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;// [&quot;&lt;li&gt; friend1 &lt;/li&gt;&quot;, &quot;&lt;li&gt; friend2&lt;/li&gt;&quot;, &quot;&lt;li&gt; friend3 &lt;/li&gt;&quot;];&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;위의 결과로 새로운 배열 안에  원래 배열의 각 이름들이 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;&lt;li&gt; &lt;/ li&gt;&lt;/code&gt; 안에 추가가 되었다. 이런 점 때문에 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;map&lt;/code&gt;은 React에 딱 어울리는 함수이다. 자식 component에서 이름을 매핑하고 각 이름을 한 쌍의 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;&lt;li&gt;&lt;/code&gt; 태그로 묶어 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;listItems&lt;/code&gt; 변수에 저장한다. 그런 다음  &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;render&lt;/code&gt; 메소드는 모든 친구들의 목록을 반환한다.&lt;/p&gt;&lt;/div&gt;&lt;center style=&quot;display:none&quot;&gt;%23%23%23%5BReact%5DNested%20Components%uC640%20Props%0A@%28React%29%5Breact%2C%20nest%2C%20component%2C%20props%5D%0A%0A%5B%uC774%uC804%20%uD3EC%uC2A4%uD2B8%5D%28http%3A//genius-project.postach.io/post/react-reactyi-componente-daehayeo%29%uC5D0%uC11C%20React%20**component**%uB97C%20%uB9CC%uB4DC%uB294%20%uBC29%uBC95%uC744%20%uC54C%uC544%uBCF4%uC558%uB2E4.%20%uC774%uBC88%20%uAE00%uC5D0%uC11C%uB294%20component%uB97C%20**nested**%28%uC911%uCCA9%29%20%uC2DC%uD0A4%uB294%20%uBC29%uBC95%uACFC%20%uC790%uC2DD%20React%20component%uC5D0%20%uB370%uC774%uD130%uB97C%20%uC804%uB2EC%uD558%uB294%20%uBC29%uBC95%uC5D0%20%uB300%uD574%20%uC54C%uC544%uBCF4%uC790.%0A%0A%uC774%uC804%uBD80%uD130%20%uCB49%20%uB9D0%uD574%uC654%uC9C0%uB9CC%20React%uC758%20%uAC00%uC7A5%20%uD070%20%uC7A5%uC810%uC740%20**state**%uB97C%20%uAD00%uB9AC%uD558%uB294%20%uAC83%uC774%20%uC815%uB9D0%20%uC27D%uB2E4%uB294%20%uAC83%uC774%uB2E4.%20%uADF8%20%uC608%uB85C%20%uD55C%20component%uC5D0%uC11C%20%uB2E4%uB978%20%uD558%uC704%20component%uB85C%20%uB370%uC774%uD130%uB97C%20%uC27D%uAC8C%20%uC804%uB2EC%uD558%uB294%20%uC2DC%uC2A4%uD15C%uC774%20%uC788%uACE0%20%uADF8%20%uC2DC%uC2A4%uD15C%uC774%20%uBC14%uB85C%20**props**%uC774%uB2E4.%20**props**%uB294%20component%uC5D0%20%uC5B4%uB5A4%20%uC778%uC218%uAC00%20function%uC5D0%20%uC5F0%uACB0%uB418%uC5B4%20%uC788%uB294%uC9C0%20%uB098%uD0C0%uB0B4%20%uC8FC%uB294%20%uB188%uC774%uB2E4.%0A%0A%uB2E4%uC74C%uC740%20**props**%uB97C%20%uC0AC%uC6A9%uD558%uB294%20%uC544%uC8FC%20%uAE30%uBCF8%uC801%uC778%20%uC608%uC774%uB2E4.%0A%0A%60%60%60javascript%0Avar%20HelloUser%20%3D%20React.createClass%28%7B%0A%20%20render%3A%20function%28%29%7B%0A%20%20%20%20return%20%28%0A%20%20%20%20%20%20%3Cdiv%3E%20Hello%2C%20%7Bthis.props.name%7D%3C/div%3E%0A%20%20%20%20%29%0A%20%20%7D%0A%7D%29%3B%0AReactDOM.render%28%3CHelloUser%20name%3D%22Tyler%22/%3E%2C%20document.getElementById%28%27app%27%29%29%3B%0A%60%60%60%0A%0A%uC704%uC758%20%uCF54%uB4DC%uB97C%20%uBCF4%uBA74%20**component**%uB97C%20%uD638%uCD9C%uD560%20%uB54C%20**name**%28Tyler%29%uC744%20%uC804%uB2EC%uD55C%uB2E4.%20%uC774%20%uC18D%uC131%uC740%20component%20%uB0B4%uC5D0%uC11C%20%60this.props.name%60%uC73C%uB85C%20%uBD88%uB7EC%uC62C%20%uC218%20%uC788%uB2E4.%0A%0A%uC870%uAE08%20%uB354%20%uBCF5%uC7A1%uD55C%20%uACBD%uC6B0%uB97C%20%uC0DD%uAC01%uD574%uBCF4%uC790.%20%uC704%20%uC608%uC81C%uB294%20component%uAC00%20%uD558%uB098%uC600%uB2E4%uBA74%20%uC774%uBC88%uC5D0%uB294%20%uB450%20%uAC1C%uC758%20component%uC5D0%20%uB300%uD574%20%uB2E4%uB8E8%uC5B4%uBCF4%uC790.%uAC01%uAC01%uC758%20component%uB294%20%uBD80%uBAA8%20component%2C%20%uC790%uC2DD%28%uD558%uC704%29%20component%uC774%uBA70%2C%20%uBD80%uBAA8%20component%uB294%20%uC790%uC2DD%20component%uC5D0%uAC8C%20**props**%uC73C%uB85C%20%uB370%uC774%uD130%uB97C%20%uC804%uB2EC%uD55C%uB2E4.%20%uBA3C%uC800%20**%uBD80%uBAA8%20component**%uB97C%20%uBCF4%uC790.%0A%60%60%60javascript%0Avar%20FriendsContainer%20%3D%20React.createClass%28%7B%0A%20%20render%3A%20function%28%29%7B%0A%20%20%20%20var%20name%20%3D%20%27Jaewon%20Kwon%27%0A%20%20%20%20var%20friends%20%3D%20%5B%27friend1%27%2C%20%27friend2%27%2C%20%27friend3%27%5D%0A%20%20%20%20return%20%28%0A%20%20%20%20%20%20%3Cdiv%3E%0A%20%20%20%20%20%20%20%20%3Ch3%3E%20Name%3A%20%7Bname%7D%20%3C/h3%3E%0A%20%20%20%20%20%20%20%20%3CShowList%20names%3D%7Bfriends%7D%20/%3E%0A%20%20%20%20%20%20%3C/div%3E%0A%20%20%20%20%29%0A%20%20%7D%0A%7D%29%3B%0A%60%60%60%0A%0A%uC774%uBC88%uC5D0%uB294%20**%uC790%uC2DD%20Component**%uC774%uB2E4.%0A%0A%60%60%60javascript%0Avar%20ShowList%20%3D%20React.createClass%28%7B%0A%20%20render%3A%20function%28%29%7B%0A%20%20%20%20var%20listItems%20%3D%20this.props.names.map%28function%28friend%29%7B%0A%20%20%20%20%20%20return%20%3Cli%3E%20%7Bfriend%7D%20%3C/li%3E%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20return%20%28%0A%20%20%20%20%20%20%3Cdiv%3E%0A%20%20%20%20%20%20%20%20%3Ch3%3E%20Friends%20%3C/h3%3E%0A%20%20%20%20%20%20%20%20%3Cul%3E%0A%20%20%20%20%20%20%20%20%20%20%7BlistItems%7D%0A%20%20%20%20%20%20%20%20%3C/ul%3E%0A%20%20%20%20%20%20%3C/div%3E%0A%20%20%20%20%29%0A%20%20%7D%0A%7D%29%3B%0A%60%60%60%0A%60Array.prototype.map%60%uAC00%20%uC775%uC219%uD558%uC9C0%20%uC54A%uB2E4%uBA74%2C%20%uC704%uC758%20%uC608%uC81C%uAC00%20%uC870%uAE08%20%uC5B4%uC0C9%uD574%20%uBCF4%uC77C%20%uC218%20%uC788%uB2E4.%20%60map%60%uC740%20%uC0C8%uB85C%uC6B4%20%uBC30%uC5F4%uC744%20%uB9CC%uB4E4%uACE0%2C%20%uBC30%uC5F4%uC758%20%uAC01%20%uD56D%uBAA9%uC5D0%20%uCF5C%uBC31%20%uD568%uC218%uB97C%20%uD638%uCD9C%uD558%uC5EC%2C%20%uAC01%20%uBC30%uC5F4%uC5D0%20%uCF5C%uBC31%20%uD568%uC218%uB97C%20%uD638%uCD9C%20%uD55C%20%uACB0%uACFC%uB85C%20%uC0C8%20%uBC30%uC5F4%uC5D0%20%uCC44%uC6B4%uB2E4.%20%uC608%uB97C%20%uB4E4%uBA74%0A%0A%60%60%60javascript%0Avar%20friends%20%3D%20%5B%27friend1%27%2C%20%27friend2%27%2C%20%27friend3%27%5D%3B%0Avar%20listItems%20%3D%20friends.map%28function%28friend%29%7B%0A%20%20return%20%22%3Cli%3E%20%22%20+%20friend%20+%20%22%3C/li%3E%22%3B%0A%7D%29%3B%0Aconsole.log%28listItems%29%3B%20//%20%5B%22%3Cli%3E%20friend1%20%3C/li%3E%22%2C%20%22%3Cli%3E%20friend2%3C/li%3E%22%2C%20%22%3Cli%3E%20friend3%20%3C/li%3E%22%5D%3B%0A%60%60%60%0A%0A%uC704%uC758%20%uACB0%uACFC%uB85C%20%uC0C8%uB85C%uC6B4%20%uBC30%uC5F4%20%uC548%uC5D0%20%20%uC6D0%uB798%20%uBC30%uC5F4%uC758%20%uAC01%20%uC774%uB984%uB4E4%uC774%20%60%3Cli%3E%20%3C/%20li%3E%60%20%uC548%uC5D0%20%uCD94%uAC00%uAC00%20%uB418%uC5C8%uB2E4.%20%uC774%uB7F0%20%uC810%20%uB54C%uBB38%uC5D0%20%60map%60%uC740%20React%uC5D0%20%uB531%20%uC5B4%uC6B8%uB9AC%uB294%20%uD568%uC218%uC774%uB2E4.%20%uC790%uC2DD%20component%uC5D0%uC11C%20%uC774%uB984%uC744%20%uB9E4%uD551%uD558%uACE0%20%uAC01%20%uC774%uB984%uC744%20%uD55C%20%uC30D%uC758%20%60%3Cli%3E%60%20%uD0DC%uADF8%uB85C%20%uBB36%uC5B4%20%60listItems%60%20%uBCC0%uC218%uC5D0%20%uC800%uC7A5%uD55C%uB2E4.%20%uADF8%uB7F0%20%uB2E4%uC74C%20%20%60render%60%20%uBA54%uC18C%uB4DC%uB294%20%uBAA8%uB4E0%20%uCE5C%uAD6C%uB4E4%uC758%20%uBAA9%uB85D%uC744%20%uBC18%uD658%uD55C%uB2E4.&lt;/center&gt;&lt;br/&gt;&lt;/div&gt;
</content>
  </entry>
  <entry xml:base="http://genius-project.postach.io/feed.xml">
    <title type="text">[Django]Django의 Inspectdb을 이용해 외부 DB에 대해 ORM를 써보자!</title>
    <id>https://genius-project.postach.io/post/django-djangoyi-inspectdbeul-iyonghae-oebu-dbe-daehae-ormreul-sseoboja</id>
    <updated>2017-02-19T09:23:55.585000Z</updated>
    <published>2017-02-19T09:23:15Z</published>
    <link href="https://genius-project.postach.io/post/django-djangoyi-inspectdbeul-iyonghae-oebu-dbe-daehae-ormreul-sseoboja" />
    <author>
      <name>Jaewon Kwon</name>
    </author>
    <category term="django" />
    <category term="inspectdb" />
    <category term="migrate" />
    <content type="html">&lt;div&gt;&lt;del style=&quot;position:relative;display:block;z-index:10;&quot;&gt;&lt;a style=&quot;position: absolute;color: #FFF;text-decoration: none;font-size: 12px;height: 25px;border-radius: 0;margin-top: -20px;right: 15px;background: rgba(0, 0, 0, 0);border-left: 10px solid #BB3A34;border-right: 10px solid #BB3A34;border-bottom: 5px solid rgba(0, 0, 0, 0);width: 0;text-indent:-100000px;&quot; href=&quot;http://marxi.co/#/?provider=evernote_int&amp;guid=dfb4fe4c-3398-41e8-bc95-49c96343cadf&amp;notebook=Django&quot;&gt;Edit&lt;/a&gt;&lt;/del&gt;&lt;div style=&quot;color: #2c3f51; line-height: 1.6;&quot;&gt;
                        
                    

&lt;h3 style=&quot;font-family: inherit; font-weight: bold; color: inherit; margin-top: 21px; margin-bottom: 10.5px; font-size: 1.7em; margin: 1.2em 0 .6em 0; text-align: start; line-height: 1.6;&quot;&gt;[Django]Django의 Inspectdb을 이용해 외부 DB에 대해 ORM를 써보자!&lt;/h3&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;/&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;Django를 하다보면 외부 DB의 정보를 가져와서 사용해야할 경우가 있는데 sql문으로 외부 DB를 가져오기에는 장고의 ORM기능이 너무 아까울때가 있다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;Django에서는 다행히도 외부 DB에 대해 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;inspectdb&lt;/strong&gt;라는 기능을 제공하고 있다. &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;inspectdb&lt;/strong&gt;를 사용하면 실제 DB를 만들지는 않고 외부 DB를 가져와 model로 만들어주는 정말 편리한 기능이다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;기본적으로 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;inspectdb&lt;/strong&gt;를 사용할려면 외부 DB에 대한 접속 정보가 있어야한다. 이는 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;settings.py&lt;/code&gt;의 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;&lt;em style=&quot;line-height: 1.6;&quot;&gt;DATABASE&lt;/em&gt;&lt;/strong&gt;를 설정해주면 된다. 장고를 처음 생성하면 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;&lt;em style=&quot;line-height: 1.6;&quot;&gt;DATABASE&lt;/em&gt;&lt;/strong&gt;가 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;default&lt;/code&gt;로 되어 있을 것이다. 여기에 원하는 이름의 외부 DB 접속 정보를 넣어주면 된다.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# settings.py&lt;/span&gt;&lt;br/&gt;DATABASES = {&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'default'&lt;/span&gt;: {&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'ENGINE'&lt;/span&gt;: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'django.db.backends.mysql'&lt;/span&gt;,&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'NAME'&lt;/span&gt;: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'&lt;default_database&gt;'&lt;/span&gt;,&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'USER'&lt;/span&gt;: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'&lt;default_useranme&gt;'&lt;/span&gt;,&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'PASSWORD'&lt;/span&gt;: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'&lt;default_password&gt;'&lt;/span&gt;,&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'HOST'&lt;/span&gt;: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'&lt;default_db_host_url&gt;'&lt;/span&gt;,&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'PORT'&lt;/span&gt;: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'3306'&lt;/span&gt;&lt;br/&gt;    },&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'external'&lt;/span&gt;: {&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'ENGINE'&lt;/span&gt;: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'django.db.backends.mysql'&lt;/span&gt;,&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'NAME'&lt;/span&gt;: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'&lt;external_database&gt;'&lt;/span&gt;,&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'USER'&lt;/span&gt;: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'&lt;external_username&gt;'&lt;/span&gt;,&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'PASSWORD'&lt;/span&gt;: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'&lt;external_password&gt;'&lt;/span&gt;,&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'HOST'&lt;/span&gt;: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'&lt;external_db_host_url&gt;'&lt;/span&gt;,&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;여기서 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;external&lt;/code&gt;이라는 이름으로 추가를 했는데 이름은 마음대로 지어도 된다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;inspectdb&lt;/strong&gt;를 사용해보자. &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;users&lt;/code&gt;라는 앱 안에 models.py에 저장하도록 해보자.&lt;/p&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;$ python manage.py inspectdb &gt; &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'users/models.py'&lt;/span&gt; --database &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'external'&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이렇게 하면 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;users&lt;/code&gt; 앱 안의 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;models.py&lt;/code&gt;에 외부 Table이 model 형태로 이쁘게 저장되어 있을 것이다. &lt;br/&gt;
이렇게 가져온 Table를 ORM으로 사용하기 위해서는 다음과 같이 하면 됩니다. MyUser라는 모델은 외부 DB에 있는 테이블 명으로 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;inspectdb&lt;/strong&gt; 명령어로 통해 자동 생성된 모델이다.&lt;/p&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# users/views.py&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; users.models &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; MyUser&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# using을 이용해 앞서 설정한 external 이름을 넣어주면 된다.&lt;/span&gt;&lt;br/&gt;queryset = MyUser.objects.using(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'external'&lt;/span&gt;).all()&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;inspectdb&lt;/strong&gt;는 엄청 편리한 기능이긴 하지만 몇가지 주의해야할 점이 있다.&lt;/p&gt;

&lt;ol style=&quot;margin-top: 0; margin-bottom: 1.1em; line-height: 1.6;&quot;&gt;&lt;li style=&quot;line-height: 1.6;&quot;&gt;기본적으로 관계형 테이블만 가능하다. 하지만 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;MySql&lt;/strong&gt;의 ` bit 타입은 제대로 가지고 오지 못하는 등 여러 문제가 있긴 하다.&lt;/li&gt;
&lt;li style=&quot;line-height: 1.6;&quot;&gt;외부 테이블의 Primary Key를 간혹 제대로 못 가져올 경우가 있다. 그럴 경우, 생성된 모델의 필드에 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;primary_key=True&lt;/code&gt;를 추가해줘야 한다.&lt;/li&gt;
&lt;li style=&quot;line-height: 1.6;&quot;&gt;가지고 온 외부 테이블 구조를 변경하고 싶다면 Meta 클래스의 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;managed=False&lt;/code&gt;를 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;True&lt;/code&gt;로 바꿔주면 된다.&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;center style=&quot;display:none&quot;&gt;%23%23%23%5BDjango%5DDjango%uC758%20Inspectdb%uC744%20%uC774%uC6A9%uD574%20%uC678%uBD80%20DB%uC5D0%20%uB300%uD574%20ORM%uB97C%20%uC368%uBCF4%uC790%21%0A@%28Django%29%5Bdjango%2C%20inspectdb%2C%20migrate%5D%0A%0ADjango%uB97C%20%uD558%uB2E4%uBCF4%uBA74%20%uC678%uBD80%20DB%uC758%20%uC815%uBCF4%uB97C%20%uAC00%uC838%uC640%uC11C%20%uC0AC%uC6A9%uD574%uC57C%uD560%20%uACBD%uC6B0%uAC00%20%uC788%uB294%uB370%20sql%uBB38%uC73C%uB85C%20%uC678%uBD80%20DB%uB97C%20%uAC00%uC838%uC624%uAE30%uC5D0%uB294%20%uC7A5%uACE0%uC758%20ORM%uAE30%uB2A5%uC774%20%uB108%uBB34%20%uC544%uAE4C%uC6B8%uB54C%uAC00%20%uC788%uB2E4.%0A%0ADjango%uC5D0%uC11C%uB294%20%uB2E4%uD589%uD788%uB3C4%20%uC678%uBD80%20DB%uC5D0%20%uB300%uD574%20**inspectdb**%uB77C%uB294%20%uAE30%uB2A5%uC744%20%uC81C%uACF5%uD558%uACE0%20%uC788%uB2E4.%20**inspectdb**%uB97C%20%uC0AC%uC6A9%uD558%uBA74%20%uC2E4%uC81C%20DB%uB97C%20%uB9CC%uB4E4%uC9C0%uB294%20%uC54A%uACE0%20%uC678%uBD80%20DB%uB97C%20%uAC00%uC838%uC640%20model%uB85C%20%uB9CC%uB4E4%uC5B4%uC8FC%uB294%20%uC815%uB9D0%20%uD3B8%uB9AC%uD55C%20%uAE30%uB2A5%uC774%uB2E4.%0A%0A%uAE30%uBCF8%uC801%uC73C%uB85C%20**inspectdb**%uB97C%20%uC0AC%uC6A9%uD560%uB824%uBA74%20%uC678%uBD80%20DB%uC5D0%20%uB300%uD55C%20%uC811%uC18D%20%uC815%uBCF4%uAC00%20%uC788%uC5B4%uC57C%uD55C%uB2E4.%20%uC774%uB294%20%60settings.py%60%uC758%20***DATABASE***%uB97C%20%uC124%uC815%uD574%uC8FC%uBA74%20%uB41C%uB2E4.%20%uC7A5%uACE0%uB97C%20%uCC98%uC74C%20%uC0DD%uC131%uD558%uBA74%20***DATABASE***%uAC00%20%60default%60%uB85C%20%uB418%uC5B4%20%uC788%uC744%20%uAC83%uC774%uB2E4.%20%uC5EC%uAE30%uC5D0%20%uC6D0%uD558%uB294%20%uC774%uB984%uC758%20%uC678%uBD80%20DB%20%uC811%uC18D%20%uC815%uBCF4%uB97C%20%uB123%uC5B4%uC8FC%uBA74%20%uB41C%uB2E4.%0A%0A%60%60%60python%0A%23%20settings.py%0ADATABASES%20%3D%20%7B%0A%20%20%20%20%27default%27%3A%20%7B%0A%20%20%20%20%20%20%20%20%27ENGINE%27%3A%20%27django.db.backends.mysql%27%2C%0A%20%20%20%20%20%20%20%20%27NAME%27%3A%20%27%3Cdefault_database%3E%27%2C%0A%20%20%20%20%20%20%20%20%27USER%27%3A%20%27%3Cdefault_useranme%3E%27%2C%0A%20%20%20%20%20%20%20%20%27PASSWORD%27%3A%20%27%3Cdefault_password%3E%27%2C%0A%20%20%20%20%20%20%20%20%27HOST%27%3A%20%27%3Cdefault_db_host_url%3E%27%2C%0A%20%20%20%20%20%20%20%20%27PORT%27%3A%20%273306%27%0A%20%20%20%20%7D%2C%0A%20%20%20%20%27external%27%3A%20%7B%0A%20%20%20%20%20%20%20%20%27ENGINE%27%3A%20%27django.db.backends.mysql%27%2C%0A%20%20%20%20%20%20%20%20%27NAME%27%3A%20%27%3Cexternal_database%3E%27%2C%0A%20%20%20%20%20%20%20%20%27USER%27%3A%20%27%3Cexternal_username%3E%27%2C%0A%20%20%20%20%20%20%20%20%27PASSWORD%27%3A%20%27%3Cexternal_password%3E%27%2C%0A%20%20%20%20%20%20%20%20%27HOST%27%3A%20%27%3Cexternal_db_host_url%3E%27%2C%0A%20%20%20%20%7D%0A%7D%0A%60%60%60%0A%uC5EC%uAE30%uC11C%20%60external%60%uC774%uB77C%uB294%20%uC774%uB984%uC73C%uB85C%20%uCD94%uAC00%uB97C%20%uD588%uB294%uB370%20%uC774%uB984%uC740%20%uB9C8%uC74C%uB300%uB85C%20%uC9C0%uC5B4%uB3C4%20%uB41C%uB2E4.%0A%0A%uC774%uC81C%20**inspectdb**%uB97C%20%uC0AC%uC6A9%uD574%uBCF4%uC790.%20%60users%60%uB77C%uB294%20%uC571%20%uC548%uC5D0%20models.py%uC5D0%20%uC800%uC7A5%uD558%uB3C4%uB85D%20%uD574%uBCF4%uC790.%0A%60%60%60bash%0A%24%20python%20manage.py%20inspectdb%20%3E%20%27users/models.py%27%20--database%20%27external%27%0A%60%60%60%0A%uC774%uB807%uAC8C%20%uD558%uBA74%20%60users%60%20%uC571%20%uC548%uC758%20%60models.py%60%uC5D0%20%uC678%uBD80%20Table%uC774%20model%20%uD615%uD0DC%uB85C%20%uC774%uC058%uAC8C%20%uC800%uC7A5%uB418%uC5B4%20%uC788%uC744%20%uAC83%uC774%uB2E4.%0A%uC774%uB807%uAC8C%20%uAC00%uC838%uC628%20Table%uB97C%20ORM%uC73C%uB85C%20%uC0AC%uC6A9%uD558%uAE30%20%uC704%uD574%uC11C%uB294%20%uB2E4%uC74C%uACFC%20%uAC19%uC774%20%uD558%uBA74%20%uB429%uB2C8%uB2E4.%20MyUser%uB77C%uB294%20%uBAA8%uB378%uC740%20%uC678%uBD80%20DB%uC5D0%20%uC788%uB294%20%uD14C%uC774%uBE14%20%uBA85%uC73C%uB85C%20**inspectdb**%20%uBA85%uB839%uC5B4%uB85C%20%uD1B5%uD574%20%uC790%uB3D9%20%uC0DD%uC131%uB41C%20%uBAA8%uB378%uC774%uB2E4.%0A%0A%60%60%60python%0A%23%20users/views.py%0Afrom%20users.models%20import%20MyUser%0A%23%20using%uC744%20%uC774%uC6A9%uD574%20%uC55E%uC11C%20%uC124%uC815%uD55C%20external%20%uC774%uB984%uC744%20%uB123%uC5B4%uC8FC%uBA74%20%uB41C%uB2E4.%0Aqueryset%20%3D%20MyUser.objects.using%28%27external%27%29.all%28%29%0A%60%60%60%0A%0A**inspectdb**%uB294%20%uC5C4%uCCAD%20%uD3B8%uB9AC%uD55C%20%uAE30%uB2A5%uC774%uAE34%20%uD558%uC9C0%uB9CC%20%uBA87%uAC00%uC9C0%20%uC8FC%uC758%uD574%uC57C%uD560%20%uC810%uC774%20%uC788%uB2E4.%0A%0A1.%20%uAE30%uBCF8%uC801%uC73C%uB85C%20%uAD00%uACC4%uD615%20%uD14C%uC774%uBE14%uB9CC%20%uAC00%uB2A5%uD558%uB2E4.%20%uD558%uC9C0%uB9CC%20**MySql**%uC758%20%60%20bit%20%uD0C0%uC785%uC740%20%uC81C%uB300%uB85C%20%uAC00%uC9C0%uACE0%20%uC624%uC9C0%20%uBABB%uD558%uB294%20%uB4F1%20%uC5EC%uB7EC%20%uBB38%uC81C%uAC00%20%uC788%uAE34%20%uD558%uB2E4.%0A2.%20%20%uC678%uBD80%20%uD14C%uC774%uBE14%uC758%20Primary%20Key%uB97C%20%uAC04%uD639%20%uC81C%uB300%uB85C%20%uBABB%20%uAC00%uC838%uC62C%20%uACBD%uC6B0%uAC00%20%uC788%uB2E4.%20%uADF8%uB7F4%20%uACBD%uC6B0%2C%20%uC0DD%uC131%uB41C%20%uBAA8%uB378%uC758%20%uD544%uB4DC%uC5D0%20%60primary_key%3DTrue%60%uB97C%20%uCD94%uAC00%uD574%uC918%uC57C%20%uD55C%uB2E4.%0A3.%20%20%uAC00%uC9C0%uACE0%20%uC628%20%uC678%uBD80%20%uD14C%uC774%uBE14%20%uAD6C%uC870%uB97C%20%uBCC0%uACBD%uD558%uACE0%20%uC2F6%uB2E4%uBA74%20Meta%20%uD074%uB798%uC2A4%uC758%20%60managed%3DFalse%60%uB97C%20%60True%60%uB85C%20%uBC14%uAFD4%uC8FC%uBA74%20%uB41C%uB2E4.%0A&lt;/center&gt;&lt;br/&gt;&lt;/div&gt;
</content>
  </entry>
  <entry xml:base="http://genius-project.postach.io/feed.xml">
    <title type="text">[React]React의 Component에 대하여</title>
    <id>https://genius-project.postach.io/post/react-reactyi-componente-daehayeo</id>
    <updated>2017-02-18T21:50:00.063000Z</updated>
    <published>2017-02-18T21:47:16Z</published>
    <link href="https://genius-project.postach.io/post/react-reactyi-componente-daehayeo" />
    <author>
      <name>Jaewon Kwon</name>
    </author>
    <category term="react" />
    <category term="component" />
    <content type="html">&lt;div&gt;&lt;del style=&quot;position:relative;display:block;z-index:10;&quot;&gt;&lt;a  style=&quot;position: absolute;color: #FFF;text-decoration: none;font-size: 12px;height: 25px;border-radius: 0;margin-top: -20px;right: 15px;background: rgba(0, 0, 0, 0);border-left: 10px solid #BB3A34;border-right: 10px solid #BB3A34;border-bottom: 5px solid rgba(0, 0, 0, 0);width: 0;text-indent:-100000px;&quot; href=&quot;http://marxi.co/#/?provider=evernote_int&amp;guid=7c07efc3-56c8-4365-a3e2-e11629f7b808&amp;notebook=Postach.io&quot;&gt;Edit&lt;/a&gt;&lt;/del&gt;&lt;div  style=&quot;color: #2c3f51; line-height: 1.6;&quot;&gt;
                        
                    



&lt;h3 style=&quot;font-family: inherit; font-weight: bold; color: inherit; margin-top: 21px; margin-bottom: 10.5px; font-size: 1.7em; margin: 1.2em 0 .6em 0; text-align: start; line-height: 1.6;&quot;&gt;[React]React의 Component에 대하여&lt;/h3&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;/&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;React&lt;/strong&gt;에서 가장 중요한게 무엇이냐 묻는다면 당연히 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;Component&lt;/strong&gt; 일 것이다. React의 Component는 Angular의 Directive와 매우 유사하다. 이 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;Component&lt;/strong&gt;는 하나의 모듈인데 HTML, CSS, JS 및 해당 관련된 데이터로 구성되어 있다. 보통 React에서는 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;Component&lt;/strong&gt;가 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;jsx&lt;/code&gt;(공식 튜토리얼에서는 이걸 쓴다.)로 되어 있는데 나중에 jsx를 javascript로 변환해주기 위한 컴파인 단계가 필요하다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;React&lt;/strong&gt;가 UI를 구현하는데 있어 매우 편리한 이유는 데이터가 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;Component&lt;/strong&gt; 자체에 포함되어 있기 때문이다.(상위 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;Component&lt;/strong&gt;에 포함 될 수 도 있다.) &lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;첫 번째 React 구성 요소를 만들어 보자. React 구성 요소를 생성하려면 React 객체에서 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;createClass&lt;/strong&gt; 메소드를 사용하고 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;createClass&lt;/strong&gt;에 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;Component&lt;/strong&gt;에 대한 설명을 전달한다.&lt;/p&gt;

&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; React = &lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;require&lt;/span&gt;(&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'react'&lt;/span&gt;)&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; ReactDOM = &lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;require&lt;/span&gt;(&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'react-dom'&lt;/span&gt;)&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; HelloBver = React.createClass({&lt;br/&gt;  render: &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt;(&lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;/&gt;)&lt;/span&gt;{&lt;br/&gt;    &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; (&lt;br/&gt;      &lt;span  style=&quot;line-height: 1.6;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;        Hello Bver!&lt;br/&gt;      &lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;    )&lt;/span&gt;&lt;br/&gt;  }&lt;br/&gt;});&lt;br/&gt;ReactDOM.render(&lt;span  style=&quot;line-height: 1.6;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;HelloBver&lt;/span&gt; /&gt;&lt;/span&gt;, document.getElementById('app'));&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;createClass&lt;/strong&gt;에 전달하는 객체의 유일한 메소드는 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;render&lt;/strong&gt; 메소드이다. 모든 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;Component&lt;/strong&gt;에는 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;render&lt;/strong&gt; 메서드가 있어야 한다. 렌더링의 역할은 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;Component&lt;/strong&gt;의 템플릿에 우리가 원하는 데이터를 뿌려주기 위함이다. 조심할 점은 왠만하면 return을 ()로 감싸주자. (습관처럼 해주자.) 위 예제에서 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;Component&lt;/strong&gt;가 렌더링되면 화면에 표시 될 텍스트는 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;Hello Bver!&lt;/code&gt;이다. &lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;위의 코드에서&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;React.createClass&lt;/code&gt; 생성자를 호출 한 결과를 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;HelloBver&lt;/code&gt;라는 변수에 저장했다. &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;ReactDOM.render&lt;/code&gt;는 두 개의 인수를 받는데 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;랜더링 할 component&lt;/strong&gt;와 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;component를 랜더링 할 DOM 노드&lt;/strong&gt;이다.(React.render가 아닌 ReactDOM.render를 사용하고 있음을 주목하자) 위의 예제에서 HelloBver component를 가져와 ID가 app 인 요소에 렌더링하도록 React에 지시했다. React의 특징은 부모 component에 랜더링하면 모든 하위 자식 component도 랜더링 되기 때문에 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;ReactDOM.render&lt;/code&gt;는 웹 어플리케이션에서 한 번만 사용해야한다. 만약 전체 어플리케이션을 React로 만ㄷ르려면 component를 document.body에 랜더링 하면 된다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;예제를 자세히 살펴보면 이상한 점이 있다. 바로 JavaScript에 “HTML&quot;이 존재한다는 것이다. 이것은 &lt;em style=&quot;line-height: 1.6;&quot;&gt;React&lt;/em&gt;만의 특징이다.  render 메소드에서 작성하는 “HTML&quot;은 실제 HTML이 아니지만 React가 “JSX&quot;를 호출하는 것이다. JSX를 사용하면 가벼운 JavaScript 객체로 변형된 HTML 구문을 작성할 수 있다. 그런 다음 React는 이러한 JavaScript 객체를 가져 와서 실제 DOM의 “가상 DOM&quot;또는 JavaScript 표현을 형성하게 된다. 즉, 자바스크립트의 힘으로 템플릿의 접근성을 얻는 장점을 얻게 된다. 물론 template를 구분하지 못한에 따른 관리 측면에서는 불리함이 존재한다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;아래 예제를 보면 Webpack의 변환 프로세스를 실행하면 JSX가 변환된다.&lt;/p&gt;



&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; HelloWorld = React.createClass({&lt;br/&gt;  displayName: &lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;HelloMessage&quot;&lt;/span&gt;,&lt;br/&gt;  render: &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt;(&lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;/&gt;) &lt;/span&gt;{&lt;br/&gt;    &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; React.createElement(&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;div&quot;&lt;/span&gt;, &lt;span  style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;null&lt;/span&gt;, &lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;Hello World&quot;&lt;/span&gt;);&lt;br/&gt;  }&lt;br/&gt;});&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;위처럼 작성하면 이제 JSX -&gt; JS 변환 단계를 거치지 않고 React component를  작성할 수 있지만 더 산으로 간 느낌이다. 참고로 내 주변 React 개발자 중에서 JSX 쓰지 않는 사람을 못 봤다.&lt;/p&gt;&lt;/div&gt;&lt;center style='display:none'&gt;%23%23%23%5BReact%5DReact%uC758%20Component%uC5D0%20%uB300%uD558%uC5EC%0A@%28Postach.io%29%5Breact%2C%20component%2C%20published%2C%20React%5D%0A%0A**React**%uC5D0%uC11C%20%uAC00%uC7A5%20%uC911%uC694%uD55C%uAC8C%20%uBB34%uC5C7%uC774%uB0D0%20%uBB3B%uB294%uB2E4%uBA74%20%uB2F9%uC5F0%uD788%20**Component**%20%uC77C%20%uAC83%uC774%uB2E4.%20React%uC758%20Component%uB294%20Angular%uC758%20Directive%uC640%20%uB9E4%uC6B0%20%uC720%uC0AC%uD558%uB2E4.%20%uC774%20**Component**%uB294%20%uD558%uB098%uC758%20%uBAA8%uB4C8%uC778%uB370%20HTML%2C%20CSS%2C%20JS%20%uBC0F%20%uD574%uB2F9%20%uAD00%uB828%uB41C%20%uB370%uC774%uD130%uB85C%20%uAD6C%uC131%uB418%uC5B4%20%uC788%uB2E4.%20%uBCF4%uD1B5%20React%uC5D0%uC11C%uB294%20**Component**%uAC00%20%60jsx%60%28%uACF5%uC2DD%20%uD29C%uD1A0%uB9AC%uC5BC%uC5D0%uC11C%uB294%20%uC774%uAC78%20%uC4F4%uB2E4.%29%uB85C%20%uB418%uC5B4%20%uC788%uB294%uB370%20%uB098%uC911%uC5D0%20jsx%uB97C%20javascript%uB85C%20%uBCC0%uD658%uD574%uC8FC%uAE30%20%uC704%uD55C%20%uCEF4%uD30C%uC778%20%uB2E8%uACC4%uAC00%20%uD544%uC694%uD558%uB2E4.%0A%0A**React**%uAC00%20UI%uB97C%20%uAD6C%uD604%uD558%uB294%uB370%20%uC788%uC5B4%20%uB9E4%uC6B0%20%uD3B8%uB9AC%uD55C%20%uC774%uC720%uB294%20%uB370%uC774%uD130%uAC00%20**Component**%20%uC790%uCCB4%uC5D0%20%uD3EC%uD568%uB418%uC5B4%20%uC788%uAE30%20%uB54C%uBB38%uC774%uB2E4.%28%uC0C1%uC704%20**Component**%uC5D0%20%uD3EC%uD568%20%uB420%20%uC218%20%uB3C4%20%uC788%uB2E4.%29%20%0A%0A%uCCAB%20%uBC88%uC9F8%20React%20%uAD6C%uC131%20%uC694%uC18C%uB97C%20%uB9CC%uB4E4%uC5B4%20%uBCF4%uC790.%20React%20%uAD6C%uC131%20%uC694%uC18C%uB97C%20%uC0DD%uC131%uD558%uB824%uBA74%20React%20%uAC1D%uCCB4%uC5D0%uC11C%20**createClass**%20%uBA54%uC18C%uB4DC%uB97C%20%uC0AC%uC6A9%uD558%uACE0%20**createClass**%uC5D0%20**Component**%uC5D0%20%uB300%uD55C%20%uC124%uBA85%uC744%20%uC804%uB2EC%uD55C%uB2E4.%0A%0A%60%60%60javascript%0Avar%20React%20%3D%20require%28%27react%27%29%0Avar%20ReactDOM%20%3D%20require%28%27react-dom%27%29%0Avar%20HelloBver%20%3D%20React.createClass%28%7B%0A%20%20render%3A%20function%28%29%7B%0A%20%20%20%20return%20%28%0A%20%20%20%20%20%20%3Cdiv%3E%0A%20%20%20%20%20%20%20%20Hello%20Bver%21%0A%20%20%20%20%20%20%3C/div%3E%0A%20%20%20%20%29%0A%20%20%7D%0A%7D%29%3B%0AReactDOM.render%28%3CHelloBver%20/%3E%2C%20document.getElementById%28%27app%27%29%29%3B%0A%60%60%60%0A%0A**createClass**%uC5D0%20%uC804%uB2EC%uD558%uB294%20%uAC1D%uCCB4%uC758%20%uC720%uC77C%uD55C%20%uBA54%uC18C%uB4DC%uB294%20**render**%20%uBA54%uC18C%uB4DC%uC774%uB2E4.%20%uBAA8%uB4E0%20**Component**%uC5D0%uB294%20**render**%20%uBA54%uC11C%uB4DC%uAC00%20%uC788%uC5B4%uC57C%20%uD55C%uB2E4.%20%uB80C%uB354%uB9C1%uC758%20%uC5ED%uD560%uC740%20**Component**%uC758%20%uD15C%uD50C%uB9BF%uC5D0%20%uC6B0%uB9AC%uAC00%20%uC6D0%uD558%uB294%20%uB370%uC774%uD130%uB97C%20%uBFCC%uB824%uC8FC%uAE30%20%uC704%uD568%uC774%uB2E4.%20%uC870%uC2EC%uD560%20%uC810%uC740%20%uC660%uB9CC%uD558%uBA74%20return%uC744%20%28%29%uB85C%20%uAC10%uC2F8%uC8FC%uC790.%20%28%uC2B5%uAD00%uCC98%uB7FC%20%uD574%uC8FC%uC790.%29%20%uC704%20%uC608%uC81C%uC5D0%uC11C%20**Component**%uAC00%20%uB80C%uB354%uB9C1%uB418%uBA74%20%uD654%uBA74%uC5D0%20%uD45C%uC2DC%20%uB420%20%uD14D%uC2A4%uD2B8%uB294%20%60Hello%20Bver%21%60%uC774%uB2E4.%20%0A%0A%uC704%uC758%20%uCF54%uB4DC%uC5D0%uC11C%60React.createClass%60%20%uC0DD%uC131%uC790%uB97C%20%uD638%uCD9C%20%uD55C%20%uACB0%uACFC%uB97C%20%60HelloBver%60%uB77C%uB294%20%uBCC0%uC218%uC5D0%20%uC800%uC7A5%uD588%uB2E4.%20%60ReactDOM.render%60%uB294%20%uB450%20%uAC1C%uC758%20%uC778%uC218%uB97C%20%uBC1B%uB294%uB370%20**%uB79C%uB354%uB9C1%20%uD560%20component**%uC640%20**component%uB97C%20%uB79C%uB354%uB9C1%20%uD560%20DOM%20%uB178%uB4DC**%uC774%uB2E4.%28React.render%uAC00%20%uC544%uB2CC%20ReactDOM.render%uB97C%20%uC0AC%uC6A9%uD558%uACE0%20%uC788%uC74C%uC744%20%uC8FC%uBAA9%uD558%uC790%29%20%uC704%uC758%20%uC608%uC81C%uC5D0%uC11C%20HelloBver%20component%uB97C%20%uAC00%uC838%uC640%20ID%uAC00%20app%20%uC778%20%uC694%uC18C%uC5D0%20%uB80C%uB354%uB9C1%uD558%uB3C4%uB85D%20React%uC5D0%20%uC9C0%uC2DC%uD588%uB2E4.%20React%uC758%20%uD2B9%uC9D5%uC740%20%uBD80%uBAA8%20component%uC5D0%20%uB79C%uB354%uB9C1%uD558%uBA74%20%uBAA8%uB4E0%20%uD558%uC704%20%uC790%uC2DD%20component%uB3C4%20%uB79C%uB354%uB9C1%20%uB418%uAE30%20%uB54C%uBB38%uC5D0%20%60ReactDOM.render%60%uB294%20%uC6F9%20%uC5B4%uD50C%uB9AC%uCF00%uC774%uC158%uC5D0%uC11C%20%uD55C%20%uBC88%uB9CC%20%uC0AC%uC6A9%uD574%uC57C%uD55C%uB2E4.%20%uB9CC%uC57D%20%uC804%uCCB4%20%uC5B4%uD50C%uB9AC%uCF00%uC774%uC158%uC744%20React%uB85C%20%uB9CC%u3137%uB974%uB824%uBA74%20component%uB97C%20document.body%uC5D0%20%uB79C%uB354%uB9C1%20%uD558%uBA74%20%uB41C%uB2E4.%0A%0A%uC608%uC81C%uB97C%20%uC790%uC138%uD788%20%uC0B4%uD3B4%uBCF4%uBA74%20%uC774%uC0C1%uD55C%20%uC810%uC774%20%uC788%uB2E4.%20%uBC14%uB85C%20JavaScript%uC5D0%20%22HTML%22%uC774%20%uC874%uC7AC%uD55C%uB2E4%uB294%20%uAC83%uC774%uB2E4.%20%uC774%uAC83%uC740%20*React*%uB9CC%uC758%20%uD2B9%uC9D5%uC774%uB2E4.%20%20render%20%uBA54%uC18C%uB4DC%uC5D0%uC11C%20%uC791%uC131%uD558%uB294%20%22HTML%22%uC740%20%uC2E4%uC81C%20HTML%uC774%20%uC544%uB2C8%uC9C0%uB9CC%20React%uAC00%20%22JSX%22%uB97C%20%uD638%uCD9C%uD558%uB294%20%uAC83%uC774%uB2E4.%20JSX%uB97C%20%uC0AC%uC6A9%uD558%uBA74%20%uAC00%uBCBC%uC6B4%20JavaScript%20%uAC1D%uCCB4%uB85C%20%uBCC0%uD615%uB41C%20HTML%20%uAD6C%uBB38%uC744%20%uC791%uC131%uD560%20%uC218%20%uC788%uB2E4.%20%uADF8%uB7F0%20%uB2E4%uC74C%20React%uB294%20%uC774%uB7EC%uD55C%20JavaScript%20%uAC1D%uCCB4%uB97C%20%uAC00%uC838%20%uC640%uC11C%20%uC2E4%uC81C%20DOM%uC758%20%22%uAC00%uC0C1%20DOM%22%uB610%uB294%20JavaScript%20%uD45C%uD604%uC744%20%uD615%uC131%uD558%uAC8C%20%uB41C%uB2E4.%20%uC989%2C%20%uC790%uBC14%uC2A4%uD06C%uB9BD%uD2B8%uC758%20%uD798%uC73C%uB85C%20%uD15C%uD50C%uB9BF%uC758%20%uC811%uADFC%uC131%uC744%20%uC5BB%uB294%20%uC7A5%uC810%uC744%20%uC5BB%uAC8C%20%uB41C%uB2E4.%20%uBB3C%uB860%20template%uB97C%20%uAD6C%uBD84%uD558%uC9C0%20%uBABB%uD55C%uC5D0%20%uB530%uB978%20%uAD00%uB9AC%20%uCE21%uBA74%uC5D0%uC11C%uB294%20%uBD88%uB9AC%uD568%uC774%20%uC874%uC7AC%uD55C%uB2E4.%0A%0A%uC544%uB798%20%uC608%uC81C%uB97C%20%uBCF4%uBA74%20Webpack%uC758%20%uBCC0%uD658%20%uD504%uB85C%uC138%uC2A4%uB97C%20%uC2E4%uD589%uD558%uBA74%20JSX%uAC00%20%uBCC0%uD658%uB41C%uB2E4.%0A%0A%60%60%60javascript%0Avar%20HelloWorld%20%3D%20React.createClass%28%7B%0A%20%20displayName%3A%20%22HelloMessage%22%2C%0A%20%20render%3A%20function%28%29%20%7B%0A%20%20%20%20return%20React.createElement%28%22div%22%2C%20null%2C%20%22Hello%20World%22%29%3B%0A%20%20%7D%0A%7D%29%3B%0A%60%60%60%0A%0A%uC704%uCC98%uB7FC%20%uC791%uC131%uD558%uBA74%20%uC774%uC81C%20JSX%20-%3E%20JS%20%uBCC0%uD658%20%uB2E8%uACC4%uB97C%20%uAC70%uCE58%uC9C0%20%uC54A%uACE0%20React%20component%uB97C%20%20%uC791%uC131%uD560%20%uC218%20%uC788%uC9C0%uB9CC%20%uB354%20%uC0B0%uC73C%uB85C%20%uAC04%20%uB290%uB08C%uC774%uB2E4.%20%uCC38%uACE0%uB85C%20%uB0B4%20%uC8FC%uBCC0%20React%20%uAC1C%uBC1C%uC790%20%uC911%uC5D0%uC11C%20JSX%20%uC4F0%uC9C0%20%uC54A%uB294%20%uC0AC%uB78C%uC744%20%uBABB%20%uBD24%uB2E4.&lt;/center&gt;&lt;br/&gt;&lt;/div&gt;
</content>
  </entry>
  <entry xml:base="http://genius-project.postach.io/feed.xml">
    <title type="text">[React]webpack 설정하기</title>
    <id>https://genius-project.postach.io/post/react-webpack-seoljeonghagi</id>
    <updated>2017-02-18T20:50:21.281000Z</updated>
    <published>2017-02-18T20:49:39Z</published>
    <link href="https://genius-project.postach.io/post/react-webpack-seoljeonghagi" />
    <author>
      <name>Jaewon Kwon</name>
    </author>
    <category term="react" />
    <category term="webpack" />
    <content type="html">&lt;div&gt;&lt;del style=&quot;position:relative;display:block;z-index:10;&quot;&gt;&lt;a style=&quot;position: absolute;color: #FFF;text-decoration: none;font-size: 12px;height: 25px;border-radius: 0;margin-top: -20px;right: 15px;background: rgba(0, 0, 0, 0);border-left: 10px solid #BB3A34;border-right: 10px solid #BB3A34;border-bottom: 5px solid rgba(0, 0, 0, 0);width: 0;text-indent:-100000px;&quot; href=&quot;http://marxi.co/#/?provider=evernote_int&amp;guid=decb3a86-1a57-4954-ae17-0a645aa503d4&amp;notebook=React&quot;&gt;Edit&lt;/a&gt;&lt;/del&gt;&lt;div style=&quot;color: #2c3f51; line-height: 1.6;&quot;&gt;
                        
                    



&lt;h3 style=&quot;font-family: inherit; font-weight: bold; color: inherit; margin-top: 21px; margin-bottom: 10.5px; font-size: 1.7em; margin: 1.2em 0 .6em 0; text-align: start; line-height: 1.6;&quot;&gt;[React]webpack 설정하기&lt;/h3&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt; &lt;br/&gt;
최근에 뜨고 있는 Webpack은 프론트의 테스트크를 자동으로 수행해주는 아주 고마운 녀석이다. 기존의 Gulp, Grunt가 가지지 못한 여러 장점들이 많아 프론트 개발자들이 많이 쓰고 있지만, 명성에 비해 쓰레기같은 공식 문서를 가지고 있다.(프론트 개발자들은 공감할 것.) 이번 글에서는 Webpack의 알짜배기에 초첨을 맞추어 고급 기능을 다뤄보고자 한다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;프론트 기술은 눈 깜빡할 새에 새로운 녀석들이 나온다. 그만큼 트랜드가 계속 바뀌는게 프론트 세상인데, 프론트를 공부하는 사람들은 이러한 트랜드 속에서 살아 남기 위해서 끊임없이 공부를 해야한다. 공부 해야할 양이 많아 질수록 새로운 기술에 대한 핵심을 이해하고 있어야하는데 두 가지 질문을 항상 마음 속에 품고 있어야한다. 첫번째는 “이것이 왜 존재할까?&quot;이고 두번째는 “이 기술이 어떤 문제점을 해결해줄까?&quot;이다.  두 가지 질문에 대답 할 수 없는 기술이라면 굳이 배울 필요는 없을 것이다. 따라서 Webpack를 이러한 관점에 대해 알아보자.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;Webpack이란게 왜 있는것일까? Webpack을 한 단어로 표현하자면 코드 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;Bundler&lt;/code&gt;이다. 코드를 가져 와서 변환하고 Bundle 한 다음 새로운 버전의 코드를 반환한다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;그럼 이번에는 Webpack이 어떤 문제점을 해결해줄까? SASS 또는 LESS와 같은 CSS 전처리기를 사용한 적이 있다면 SASS / Less 코드를 일반 CSS로 변환해야 한다는 것은 알고 있을 것이다. TypeScript 나 다른 자바 스크립트 언어를 사용 해본 적이 있다면 변환 단계가 있다는 것을 알고 있을 것이다. Webpack이 정말 좋은 점은 다양한 종류의 코드를 목표로하는 것으로 변환 시킬 수 있다는 것이다. 코드를 작성하여 해당 변경 사항을 실시간으로 출력 할 수도 있다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이번 글에서는 Webpack 구성을 매우 가볍게 다룰 예정이지만, 향후 좀 더 고급 주제를 다루어 보도록 하자.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;위에서 언급 한 프로세스에 대해 다시 생각해 보자. 코드를 가져 와서 변환하는 단계에서 3 가지 주요 단계와 3 가지 주요 사항이 있다.&lt;/p&gt;

&lt;blockquote style=&quot;padding: 15px 20px; margin: 0 0 1.1em; border-left: 5px solid rgba(102,128,153,0.075); border-left-width: 10px; background-color: rgba(102,128,153,0.05); border-top-right-radius: 5px; border-bottom-right-radius: 5px;&quot;&gt;
  &lt;ol style=&quot;margin-top: 0; margin-bottom: 0; line-height: 1.6;&quot;&gt;&lt;li style=&quot;line-height: 1.6;&quot;&gt;Webpack은 웹 어플리케이션의 시작 지점 또는 루트 JavaScript 파일을 바라보고 있어야 한다.&lt;/li&gt;
  &lt;li style=&quot;line-height: 1.6;&quot;&gt;Webpack은 코드를 어떤 것으로 변환을 할 것인지를 알아야 한다.&lt;/li&gt;
  &lt;li style=&quot;line-height: 1.6;&quot;&gt;Webpack은 새로게 변환한 코드를 저장할 위치를 알아야 한다.&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;사실 위의 3가지만 숙지하고 있다면 Webpack은 별게 아니다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;첫번째 해야할 일은 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;Webpack 구성을 포함 할 파일을 만드는 것이다. &lt;/strong&gt; 이 파일의 이름은 Webpack이 인식 할 수 있도록 이름이 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;webpack.config.js&lt;/code&gt;로 정해져 있다. 이 파일은 프로젝트의 루트 리렉토리에 있어야 한다. &lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;webpack.config.js&lt;/code&gt; 파일을 만들었고,  이 파일이 Webpack의 구성을 나타낼 object를 제대로 내보내는지 확인해야합니다. 자바스크립트 모듈에 익숙하지 않다면 &lt;a style=&quot;background: transparent; color: #1980e6; text-decoration: none;&quot; target=&quot;_blank&quot; href=&quot;https://medium.freecodecamp.com/javascript-modules-a-beginner-s-guide-783f7d7a5fcc#.q991f5q8e&quot;&gt;Preethi의 블로그 시리즈&lt;/a&gt;를 먼저 읽어보고 오자.&lt;/p&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;// In webpack.config.js&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;module&lt;/span&gt;.exports = {}&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 위의 언급대로 코드로 변환해보자. 먼저, Webpack에 어플리케이션의 진입 지점을 알려주자.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;// In webpack.config.js&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;module&lt;/span&gt;.exports = {&lt;br/&gt;  entry: [&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'./app/index.js'&lt;/span&gt;&lt;br/&gt;  ]&lt;br/&gt;}&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;위에서 한 것은 객체에 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;entry 속성&lt;/strong&gt;과 그 값을 정해준 것이다. 여기서 값이 왜 문자열이 아닌 배열인지 궁금할 수 있을 것이다. Webpack을 사용하면 어플리케이션에서 하나 이상의 entry 포인트를 가질 수 있기 때문에 더 많은 정보를 담기 위해서 배열을 사용했다. (물론 배열을 안 써도 되지만 습관을 위해 배열을 쓰자) 이렇게 하면 나중에 추가 시 쉽게 추가 할 수 있다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;여기까지는 Webpack에게 어디에서 시작해야 한다고 알려주었고, &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;이제 코드를 변형을 해야한다.&lt;/strong&gt;이 변형에는 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;loader&lt;/code&gt;라는 것을 사용한다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;loader는 타켓 파일의 종류에 맞춰어서 준비하면 된다. TypeScript면 그거에 맞는 loader를 CoffeeScript면 그거에 맞는 loader를 사용하면 된다. 사용처에 맞게 loader를 설치할 것인데 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;npm&lt;/code&gt;을 사용하자. 이 글에서는 예제로 CoffeeScript를 변환 시킬 것이다. 터미널에서 다음과 같이 loader를 설치하자.&lt;/p&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;$ npm install --save-dev coffee-loader&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이를 실행하면 coffee-loader가 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;package.json&lt;/code&gt; 파일의 dev 종속 파일로 저장된다. 그런 다음 webpack.config.js 파일을 반영시켜주자. 이를 위해 먼저 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;webpack.config.js&lt;/code&gt;에서 내보내는 객체에 모듈 속성을 추가한다.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;// In webpack.config.js&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;module&lt;/span&gt;.exports = {&lt;br/&gt;  entry: [&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'./app/index.js'&lt;/span&gt;&lt;br/&gt;  ],&lt;br/&gt;  &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;module&lt;/span&gt;: {&lt;br/&gt;    loaders: []&lt;br/&gt;  }&lt;br/&gt;}&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;loader&lt;/strong&gt; 배열 내부에는 원하는 모든 loader를 넣을 것이다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;각 loader는 세 가지로 구성되어야 한다. 첫 번째는 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;특정 변환을 실행할 파일 유형이다.&lt;/strong&gt; 예를 들어, 자바스크립트 파일에서 자바스크립트로만 변환할 수 있도록 하는 것이다. 다음은 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;변환 할 디렉토리를 포함하거나 제외해야하는 항목이다.&lt;/strong&gt; 여기서는 node_modules 폴더의 모든 항목에 대해 변환을 실행하지 않으므로 node_modules 경로를 제외 값으로 사용하자. 마지막으로 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;실행하고자하는 특정 loader이다.&lt;/strong&gt; 예로 들면 아래와 같다.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;// In webpack.config.js&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;module&lt;/span&gt;.exports = {&lt;br/&gt;  entry: [&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'./app/index.js'&lt;/span&gt;&lt;br/&gt;  ],&lt;br/&gt;  &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;module&lt;/span&gt;: {&lt;br/&gt;    loaders: [&lt;br/&gt;      {test: &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;/\.coffee$/&lt;/span&gt;, exclude: &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;/node_modules/&lt;/span&gt;, loader: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;coffee-loader&quot;&lt;/span&gt;}&lt;br/&gt;    ]&lt;br/&gt;  },&lt;br/&gt;}&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;위에서 눈여겨봐야 할 것은 정규식이다. &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;test&lt;/strong&gt;에 있는 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;/ \. coffee $ /&lt;/code&gt;&lt;/strong&gt; 을 사용하게 되면 Webpack이 .coffee로 끝나는 모든 확장 프로그램에서 coffe-loader를 실행하게 된다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;다음으로, &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;exclude&lt;/strong&gt;는 변환에서 제외시킬 것을 나타낸다. 앞서 말했듯이 node_modules 폴더를 변형하고 싶지 않기 때문에 제외한다. 마지막으로는 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;loader&lt;/strong&gt;로 Webpack에게 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;test&lt;/strong&gt;의 정규식과 일치하고 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;exclude&lt;/strong&gt;에 없는 모든 경로에서 실행될 변환을 지시한다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;만약 여러 loader를 추가할려면 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;npm&lt;/code&gt;으로 loader를 설치하고 loader 배열에 추가해주면 된다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 마지막 단계로 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;새로운 변환 된 코드를 출력해야 하는 위치&lt;/strong&gt;를 지정해주자.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;// In webpack.config.js&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;module&lt;/span&gt;.exports = {&lt;br/&gt;  entry: [&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'./app/index.js'&lt;/span&gt;&lt;br/&gt;  ],&lt;br/&gt;  &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;module&lt;/span&gt;: {&lt;br/&gt;    loaders: [&lt;br/&gt;      {test: &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;/\.coffee$/&lt;/span&gt;, exclude: &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;/node_modules/&lt;/span&gt;, loader: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;coffee-loader&quot;&lt;/span&gt;}&lt;br/&gt;    ]&lt;br/&gt;  },&lt;br/&gt;  output: {&lt;br/&gt;    filename: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;index_bundle.js&quot;&lt;/span&gt;,&lt;br/&gt;    path: __dirname + &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'/dist'&lt;/span&gt;&lt;br/&gt;  },&lt;br/&gt;}&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;위의 코드를 보면 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;filename&lt;/strong&gt;은 새로운 변환 된 코드가 포함 된 Webpack이 만들 파일의 이름이다. &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;path&lt;/strong&gt;는 새 파일 이름 (여기서는 index_bundle.js)이 배치 될 디렉토리이다. 참고로 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;__dirname&lt;/code&gt;는 현재 실행 중인 스크립트의 상위 디렉토리 이름이다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 Webpack이 실행 시키면,  코드가 변형되어 ourApp / dist / index_bundle.js에서 참조할 수 있게 된다. 이제 HTML 파일이 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;index_bundle.js&lt;/code&gt;를 참조하도록 해보자. 일반 앱의 일반적으로 구조는 다음과 같을 것이다.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;/app&lt;br/&gt;  - components&lt;br/&gt;  - containers&lt;br/&gt;  - config&lt;br/&gt;  - utils&lt;br/&gt;  index&lt;span style=&quot;line-height: 1.6;&quot;&gt;.js&lt;/span&gt;&lt;br/&gt;  index&lt;span style=&quot;line-height: 1.6;&quot;&gt;.html&lt;/span&gt;&lt;br/&gt;/dist&lt;br/&gt;  index&lt;span style=&quot;line-height: 1.6;&quot;&gt;.html&lt;/span&gt;&lt;br/&gt;  index_bundle&lt;span style=&quot;line-height: 1.6;&quot;&gt;.js&lt;/span&gt;&lt;br/&gt;package&lt;span style=&quot;line-height: 1.6;&quot;&gt;.json&lt;/span&gt;&lt;br/&gt;webpack&lt;span style=&quot;line-height: 1.6;&quot;&gt;.config&lt;/span&gt;&lt;span style=&quot;line-height: 1.6;&quot;&gt;.js&lt;/span&gt;&lt;br/&gt;.gitignore&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;보통 개발 중인 코드는 app 폴더에 두고 변형 후 배포에 사용할 코드는 dist 폴더에 있다. 여기서 한가지 문제점이 생기는데 app 폴더에있는 index.html을 변경할 때이다. 브라우저가 실제로 사용하게 될 index.html 파일은 dist 폴더 내의 파일이기 때문에 app 안의 html 파일을 옮겨주어야 한다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이를 위해 두가지 방법이 있는데, 첫번째 방법은 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;두 개의 index.html 파일을 관리하는 것이다.&lt;/strong&gt;  app에 있는 파일을 변경할 때마다 dist에 있는 파일로 직접 복사하는 것이다. 하지만 이 방법은 너무 무식한 방법이다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;두 번째 옵션은 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;Webpack이 실행될 때마다 /app/index.html이 /dist/index.html에 복사&lt;/strong&gt;되도록하는 방법이다. 첫번째 방법보다 훨씬 깔끔하고 손이 덜 가는 방법이다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;두번째 일 Webpack tool에 이미 존재한다. 바로 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;html-webpack-plugin&lt;/code&gt;이다. npm으로 마찬가지로 설치해주자. &lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;npm install --save-dev html-webpack-plugin&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;우선, &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;HTMLWebpackPlugin&lt;/code&gt;의 새 인스턴스를 만든 후 세 가지를 지정해야 한다. 먼저, 새로 생성 된 파일이 어떻게 보이길 원하는지에 대한 템플릿을 제공해야한다. 두번째는, 파일 이름을 지정하거나, 생성한 새 파일을 호출합니다. 셋번째는 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;WebpackPluginConfig&lt;/code&gt;로 통해 변환 된 코드의 출력 파일 이름을 감지시키는 것이다, (여기서는 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;index_bundle.js&lt;/code&gt;). 그런 다음  또는 에 스크립트를 삽입해야한다. 새로 생성 된 index.html 파일에 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;injection&lt;/strong&gt;으로, 스크립트를 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;head&lt;/code&gt; 또는 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;body&lt;/code&gt;에 삽입하면 된다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;정리하면 아래와 같다.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;// In webpack.config.js&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; HtmlWebpackPlugin = &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;require&lt;/span&gt;(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'html-webpack-plugin'&lt;/span&gt;)&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; HTMLWebpackPluginConfig = &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;new&lt;/span&gt; HtmlWebpackPlugin({&lt;br/&gt;  template: __dirname + &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'/app/index.html'&lt;/span&gt;,&lt;br/&gt;  filename: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'index.html'&lt;/span&gt;,&lt;br/&gt;  inject: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'body'&lt;/span&gt;&lt;br/&gt;});&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;module&lt;/span&gt;.exports = {&lt;br/&gt;  entry: [&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'./app/index.js'&lt;/span&gt;&lt;br/&gt;  ],&lt;br/&gt;  &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;module&lt;/span&gt;: {&lt;br/&gt;    loaders: [&lt;br/&gt;      {test: &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;/\.coffee$/&lt;/span&gt;, exclude: &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;/node_modules/&lt;/span&gt;, loader: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;coffee-loader&quot;&lt;/span&gt;}&lt;br/&gt;    ]&lt;br/&gt;  },&lt;br/&gt;  output: {&lt;br/&gt;    filename: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;index_bundle.js&quot;&lt;/span&gt;,&lt;br/&gt;    path: __dirname + &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'/dist'&lt;/span&gt;&lt;br/&gt;  },&lt;br/&gt;  plugins: [HTMLWebpackPluginConfig]&lt;br/&gt;};&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;파일의 맨 위에 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;HtmlWebpackPlugin&lt;/strong&gt;의 새 인스턴스를 만들고 요놈은 세 가지 옵션을 제공한다. &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;template&lt;/strong&gt;은 앱 디렉토리에있는 일반 index.html 파일을 가리킨다. &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;filename&lt;/strong&gt;은 index.html으로 기존 파일 이름과 동일하게 지었다. &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;inject&lt;/strong&gt;는 loader의 출력 파일 (index_bundle.js)의 이름을 참조하는 스크립트를 삽입하여 새로 생성 된 html 파일의 본문에 삽입한다. 마지막으로 작성한 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;HTMLWebpackPluginConfig&lt;/strong&gt; 변수를 webpack config의 플러그인 배열에 항목으로 추가한다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 Webpack을 실행하면 dist 폴더 안에 두 개의 파일이 생긴다. &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;index_bundle.js&lt;/code&gt; 와 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;index.html&lt;/code&gt;가 생겼을 것이다. &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;index_bundle.js&lt;/code&gt;는 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;entry&lt;/code&gt;&lt;/strong&gt; 코드를 가져 와서 loader를 통해 실행 한 결과이다. &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;index.html&lt;/code&gt;은 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;HTMLWebpackPluginConfig&lt;/strong&gt;를 거쳐 만들어진 파일이다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;dist의 내부에 새로 생성 된 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;index.html&lt;/code&gt; 파일이 어떻게 생겼는지, app 폴더 안의 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;index.html&lt;/code&gt; 와 비교해보자.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;&lt;em style=&quot;line-height: 1.6;&quot;&gt;app/index.html&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;&lt;!DOCTYPE html&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;html&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;lang&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;en&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;head&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;meta&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;charset&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;title&lt;/span&gt;&gt;&lt;/span&gt;My App&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;title&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;link&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;rel&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;href&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;styles.css&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;head&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;body&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;app&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;body&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;html&lt;/span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;&lt;em style=&quot;line-height: 1.6;&quot;&gt;dist/index.html&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;&lt;!DOCTYPE html&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;html&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;lang&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;en&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;head&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;meta&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;charset&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;title&lt;/span&gt;&gt;&lt;/span&gt;My App&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;title&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;link&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;rel&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;href&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;styles.css&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;head&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;body&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;app&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;script&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;index_bundle.js&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;span style=&quot;line-height: 1.6;&quot;/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;script&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;body&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;html&lt;/span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;두 파일의 차이점은 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;dist&lt;/strong&gt; (&lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;HTMLWebpackPlugin&lt;/strong&gt;으로 생성된 파일)에 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;index_bundle.js&lt;/code&gt;를 가리키는 script 태그가 있다는 것이다. 다시 말하지만 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;HTMLWebpackConfig&lt;/strong&gt;가 Webpack에서 새로 생성 된 파일의 출력 파일 이름을 감지하고 새로 만든 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;index.html&lt;/code&gt; 파일의 스크립트로 자동 추가한 것이다. 위의 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;index.html&lt;/code&gt; 파일에서 볼 수 있듯이 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;body&lt;/code&gt;에는 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;&lt;script src=&quot;index_bundle.js&quot;&gt;&lt;/script&gt;&lt;/code&gt;가 있다. Webpack 설정에서 출력을 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;test.js&lt;/code&gt;로 변경했다면 새로 생성 된 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;index.html&lt;/code&gt; 파일의 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;body&lt;/code&gt; 안에 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;&lt;script src=&quot;test.js&quot;&gt;&lt;/script&gt;&lt;/code&gt;가 생겼을 것이다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 거의 다 끝났다 마지막으로는 Webpack에 실제로 실행하는 방법이다. Webpack이 설치되어 있지 않았다면 다음과 같이 설치해주자.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;$ npm install -g webpack&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;Webpack을 설치를 하면 Webpack CLI에 접근 할 수 있다. (만약 local에 설치했다면 npm으로 실행시켜줘야 한다.)&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;어플리케이션의 루트 디렉토리 (여기서는 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;webpack.config.js&lt;/code&gt;의 위치)에서 Webpack을 터미널로 실행할 수 있다. 실행 시 Webpack 설정이 한 번 실행된다. 하지만 파일이 여러번 수정될 경우마다 Webpack을 매번 실행 시켜줘야하는데 그러기에는 너무 귀찮다. Webpack은 watch라는 기능을 제공하는데 파일이 변경 될 때마다 실시간으로 Webpack을 실행 시켜주는 기능이다. &lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;$ webpack -w&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;배포 단계로 내놓을려면 다음을 실행 시 변환과 코드 축소가 실행된다.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;$ webpack -p&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;사실 Webpack만 보고 왔다면 여기까지 해도 된다. 하지만 최종 목표는 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;React&lt;/code&gt; 관리를 Webpack으로 하는 것이기 때문에 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;Babal&lt;/code&gt;이라는 것을 loader로 추가해야 한다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;Babel.js&lt;/code&gt;는 자바스크립트를 컴파일 도구인데, Webpack을 사용하면 바벨이 특정 변환 자체 인 동안 코드에서 어떤 변환을 수행할지 지정할 수 있다. React의 관점에서 바벨은 JSX 를 실제 JavaScript로 변형 할 수 있게 한다. &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;Babel&lt;/strong&gt;이 좋은 점은 JSX -&gt; JS 변형 외에도 많은 용도로 사용할 수 있다는 것이다. Javascript도 놀랍게도 버전들이 존재하는데 최신 Javascript랑 우리가 알고 있는 Javascript랑은 차이점이 매우 많다. 이에 따라 브라우저가 최신 Javascript를 못 따라오는 현상이 발생했는데 이를 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;Babel&lt;/code&gt;이라는 놈이 바로 잡아주는 것이다. 최신 JavaScript (ES2015, 2016 등)을 브라우저가 알고 있는 Javascript로 변환 시켜 브라우저가 이해할 수 있도록 해준다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;babel&lt;/strong&gt; 설치도 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;npm&lt;/code&gt;으로 해주면 된다. &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;babel&lt;/strong&gt;은 여러 모듈로 구성되어 있기 때문에 설치 전에  몇 가지를 설치해야 한다. &lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;$ npm install --save-dev babel-core babel-loader babel-preset-react&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;babel-core&lt;/code&gt;는 babel 자체이고, &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;babel-loader&lt;/code&gt;는 사용할  Webpack loader이며, &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;babel-preset-react&lt;/code&gt;는 JSX -&gt; JS 변형을 도와준다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;위의 세가지 모듈을 Webpack에 추가해줘도 되지만 굳이 그럴 필요가 없다. &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;babel&lt;/strong&gt; 설정을 위해 별도의 파일로 관리하면 된다. &lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;먼저 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;webpack.config.js&lt;/code&gt; 파일이 있는 루트 디렉토리에 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;.babelrc&lt;/code&gt; 파일을 만들어주자.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;{&lt;br/&gt;  &quot;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;presets&lt;/span&gt;&quot;: &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;[&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;react&quot;&lt;/span&gt;&lt;br/&gt;  ]&lt;br/&gt;&lt;/span&gt;}&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;여기서는 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;babel&lt;/strong&gt; 변환이 실제로 만들어 내는 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;&lt;em style=&quot;line-height: 1.6;&quot;&gt;babel loader&lt;/em&gt;&lt;/strong&gt;에 지시하는 것이다. 좀 전에 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;babel-preset-react&lt;/code&gt;를 설치해줬기 때문에 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;react&lt;/strong&gt;로 설정해주면 된다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;&lt;em style=&quot;line-height: 1.6;&quot;&gt;babel-loader&lt;/em&gt;&lt;/strong&gt;를 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;webpack.config.js&lt;/code&gt;의 loader에 추가해주면 된다.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;// In webpack.config.js&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; HtmlWebpackPlugin = &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;require&lt;/span&gt;(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'html-webpack-plugin'&lt;/span&gt;)&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; HTMLWebpackPluginConfig = &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;new&lt;/span&gt; HtmlWebpackPlugin({&lt;br/&gt;  template: __dirname + &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'/app/index.html'&lt;/span&gt;,&lt;br/&gt;  filename: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'index.html'&lt;/span&gt;,&lt;br/&gt;  inject: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'body'&lt;/span&gt;&lt;br/&gt;});&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;module&lt;/span&gt;.exports = {&lt;br/&gt;  entry: [&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'./app/index.js'&lt;/span&gt;&lt;br/&gt;  ],&lt;br/&gt;  output: {&lt;br/&gt;    path: __dirname + &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'/dist'&lt;/span&gt;,&lt;br/&gt;    filename: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;index_bundle.js&quot;&lt;/span&gt;&lt;br/&gt;  },&lt;br/&gt;  &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;module&lt;/span&gt;: {&lt;br/&gt;    loaders: [&lt;br/&gt;      {test: &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;/\.js$/&lt;/span&gt;, exclude: &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;/node_modules/&lt;/span&gt;, loader: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;babel-loader&quot;&lt;/span&gt;}&lt;br/&gt;    ]&lt;br/&gt;  },&lt;br/&gt;  plugins: [HTMLWebpackPluginConfig]&lt;br/&gt;};&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;center style=&quot;display:none&quot;&gt;%23%23%23%5BReact%5Dwebpack%20%uC124%uC815%uD558%uAE30%0A@%28React%29%5Breact%7Cwebpack%5D%0A%uCD5C%uADFC%uC5D0%20%uB728%uACE0%20%uC788%uB294%20Webpack%uC740%20%uD504%uB860%uD2B8%uC758%20%uD14C%uC2A4%uD2B8%uD06C%uB97C%20%uC790%uB3D9%uC73C%uB85C%20%uC218%uD589%uD574%uC8FC%uB294%20%uC544%uC8FC%20%uACE0%uB9C8%uC6B4%20%uB140%uC11D%uC774%uB2E4.%20%uAE30%uC874%uC758%20Gulp%2C%20Grunt%uAC00%20%uAC00%uC9C0%uC9C0%20%uBABB%uD55C%20%uC5EC%uB7EC%20%uC7A5%uC810%uB4E4%uC774%20%uB9CE%uC544%20%uD504%uB860%uD2B8%20%uAC1C%uBC1C%uC790%uB4E4%uC774%20%uB9CE%uC774%20%uC4F0%uACE0%20%uC788%uC9C0%uB9CC%2C%20%uBA85%uC131%uC5D0%20%uBE44%uD574%20%uC4F0%uB808%uAE30%uAC19%uC740%20%uACF5%uC2DD%20%uBB38%uC11C%uB97C%20%uAC00%uC9C0%uACE0%20%uC788%uB2E4.%28%uD504%uB860%uD2B8%20%uAC1C%uBC1C%uC790%uB4E4%uC740%20%uACF5%uAC10%uD560%20%uAC83.%29%20%uC774%uBC88%20%uAE00%uC5D0%uC11C%uB294%20Webpack%uC758%20%uC54C%uC9DC%uBC30%uAE30%uC5D0%20%uCD08%uCCA8%uC744%20%uB9DE%uCD94%uC5B4%20%uACE0%uAE09%20%uAE30%uB2A5%uC744%20%uB2E4%uB904%uBCF4%uACE0%uC790%20%uD55C%uB2E4.%0A%0A%uD504%uB860%uD2B8%20%uAE30%uC220%uC740%20%uB208%20%uAE5C%uBE61%uD560%20%uC0C8%uC5D0%20%uC0C8%uB85C%uC6B4%20%uB140%uC11D%uB4E4%uC774%20%uB098%uC628%uB2E4.%20%uADF8%uB9CC%uD07C%20%uD2B8%uB79C%uB4DC%uAC00%20%uACC4%uC18D%20%uBC14%uB00C%uB294%uAC8C%20%uD504%uB860%uD2B8%20%uC138%uC0C1%uC778%uB370%2C%20%uD504%uB860%uD2B8%uB97C%20%uACF5%uBD80%uD558%uB294%20%uC0AC%uB78C%uB4E4%uC740%20%uC774%uB7EC%uD55C%20%uD2B8%uB79C%uB4DC%20%uC18D%uC5D0%uC11C%20%uC0B4%uC544%20%uB0A8%uAE30%20%uC704%uD574%uC11C%20%uB04A%uC784%uC5C6%uC774%20%uACF5%uBD80%uB97C%20%uD574%uC57C%uD55C%uB2E4.%20%uACF5%uBD80%20%uD574%uC57C%uD560%20%uC591%uC774%20%uB9CE%uC544%20%uC9C8%uC218%uB85D%20%uC0C8%uB85C%uC6B4%20%uAE30%uC220%uC5D0%20%uB300%uD55C%20%uD575%uC2EC%uC744%20%uC774%uD574%uD558%uACE0%20%uC788%uC5B4%uC57C%uD558%uB294%uB370%20%uB450%20%uAC00%uC9C0%20%uC9C8%uBB38%uC744%20%uD56D%uC0C1%20%uB9C8%uC74C%20%uC18D%uC5D0%20%uD488%uACE0%20%uC788%uC5B4%uC57C%uD55C%uB2E4.%20%uCCAB%uBC88%uC9F8%uB294%20%22%uC774%uAC83%uC774%20%uC65C%20%uC874%uC7AC%uD560%uAE4C%3F%22%uC774%uACE0%20%uB450%uBC88%uC9F8%uB294%20%22%uC774%20%uAE30%uC220%uC774%20%uC5B4%uB5A4%20%uBB38%uC81C%uC810%uC744%20%uD574%uACB0%uD574%uC904%uAE4C%3F%22%uC774%uB2E4.%20%20%uB450%20%uAC00%uC9C0%20%uC9C8%uBB38%uC5D0%20%uB300%uB2F5%20%uD560%20%uC218%20%uC5C6%uB294%20%uAE30%uC220%uC774%uB77C%uBA74%20%uAD73%uC774%20%uBC30%uC6B8%20%uD544%uC694%uB294%20%uC5C6%uC744%20%uAC83%uC774%uB2E4.%20%uB530%uB77C%uC11C%20Webpack%uB97C%20%uC774%uB7EC%uD55C%20%uAD00%uC810%uC5D0%20%uB300%uD574%20%uC54C%uC544%uBCF4%uC790.%0A%0AWebpack%uC774%uB780%uAC8C%20%uC65C%20%uC788%uB294%uAC83%uC77C%uAE4C%3F%20Webpack%uC744%20%uD55C%20%uB2E8%uC5B4%uB85C%20%uD45C%uD604%uD558%uC790%uBA74%20%uCF54%uB4DC%20%60Bundler%60%uC774%uB2E4.%20%uCF54%uB4DC%uB97C%20%uAC00%uC838%20%uC640%uC11C%20%uBCC0%uD658%uD558%uACE0%20Bundle%20%uD55C%20%uB2E4%uC74C%20%uC0C8%uB85C%uC6B4%20%uBC84%uC804%uC758%20%uCF54%uB4DC%uB97C%20%uBC18%uD658%uD55C%uB2E4.%0A%0A%uADF8%uB7FC%20%uC774%uBC88%uC5D0%uB294%20Webpack%uC774%20%uC5B4%uB5A4%20%uBB38%uC81C%uC810%uC744%20%uD574%uACB0%uD574%uC904%uAE4C%3F%20SASS%20%uB610%uB294%20LESS%uC640%20%uAC19%uC740%20CSS%20%uC804%uCC98%uB9AC%uAE30%uB97C%20%uC0AC%uC6A9%uD55C%20%uC801%uC774%20%uC788%uB2E4%uBA74%20SASS%20/%20Less%20%uCF54%uB4DC%uB97C%20%uC77C%uBC18%20CSS%uB85C%20%uBCC0%uD658%uD574%uC57C%20%uD55C%uB2E4%uB294%20%uAC83%uC740%20%uC54C%uACE0%20%uC788%uC744%20%uAC83%uC774%uB2E4.%20TypeScript%20%uB098%20%uB2E4%uB978%20%uC790%uBC14%20%uC2A4%uD06C%uB9BD%uD2B8%20%uC5B8%uC5B4%uB97C%20%uC0AC%uC6A9%20%uD574%uBCF8%20%uC801%uC774%20%uC788%uB2E4%uBA74%20%uBCC0%uD658%20%uB2E8%uACC4%uAC00%20%uC788%uB2E4%uB294%20%uAC83%uC744%20%uC54C%uACE0%20%uC788%uC744%20%uAC83%uC774%uB2E4.%20Webpack%uC774%20%uC815%uB9D0%20%uC88B%uC740%20%uC810%uC740%20%uB2E4%uC591%uD55C%20%uC885%uB958%uC758%20%uCF54%uB4DC%uB97C%20%uBAA9%uD45C%uB85C%uD558%uB294%20%uAC83%uC73C%uB85C%20%uBCC0%uD658%20%uC2DC%uD0AC%20%uC218%20%uC788%uB2E4%uB294%20%uAC83%uC774%uB2E4.%20%uCF54%uB4DC%uB97C%20%uC791%uC131%uD558%uC5EC%20%uD574%uB2F9%20%uBCC0%uACBD%20%uC0AC%uD56D%uC744%20%uC2E4%uC2DC%uAC04%uC73C%uB85C%20%uCD9C%uB825%20%uD560%20%uC218%uB3C4%20%uC788%uB2E4.%0A%0A%uC774%uBC88%20%uAE00%uC5D0%uC11C%uB294%20Webpack%20%uAD6C%uC131%uC744%20%uB9E4%uC6B0%20%uAC00%uBCCD%uAC8C%20%uB2E4%uB8F0%20%uC608%uC815%uC774%uC9C0%uB9CC%2C%20%uD5A5%uD6C4%20%uC880%20%uB354%20%uACE0%uAE09%20%uC8FC%uC81C%uB97C%20%uB2E4%uB8E8%uC5B4%20%uBCF4%uB3C4%uB85D%20%uD558%uC790.%0A%0A%uC704%uC5D0%uC11C%20%uC5B8%uAE09%20%uD55C%20%uD504%uB85C%uC138%uC2A4%uC5D0%20%uB300%uD574%20%uB2E4%uC2DC%20%uC0DD%uAC01%uD574%20%uBCF4%uC790.%20%uCF54%uB4DC%uB97C%20%uAC00%uC838%20%uC640%uC11C%20%uBCC0%uD658%uD558%uB294%20%uB2E8%uACC4%uC5D0%uC11C%203%20%uAC00%uC9C0%20%uC8FC%uC694%20%uB2E8%uACC4%uC640%203%20%uAC00%uC9C0%20%uC8FC%uC694%20%uC0AC%uD56D%uC774%20%uC788%uB2E4.%0A%0A%3E%201.%20Webpack%uC740%20%uC6F9%20%uC5B4%uD50C%uB9AC%uCF00%uC774%uC158%uC758%20%uC2DC%uC791%20%uC9C0%uC810%20%uB610%uB294%20%uB8E8%uD2B8%20JavaScript%20%uD30C%uC77C%uC744%20%uBC14%uB77C%uBCF4%uACE0%20%uC788%uC5B4%uC57C%20%uD55C%uB2E4.%0A%3E%202.%20Webpack%uC740%20%uCF54%uB4DC%uB97C%20%uC5B4%uB5A4%20%uAC83%uC73C%uB85C%20%uBCC0%uD658%uC744%20%uD560%20%uAC83%uC778%uC9C0%uB97C%20%uC54C%uC544%uC57C%20%uD55C%uB2E4.%0A%3E%203.%20Webpack%uC740%20%uC0C8%uB85C%uAC8C%20%uBCC0%uD658%uD55C%20%uCF54%uB4DC%uB97C%20%uC800%uC7A5%uD560%20%uC704%uCE58%uB97C%20%uC54C%uC544%uC57C%20%uD55C%uB2E4.%0A%0A%uC0AC%uC2E4%20%uC704%uC758%203%uAC00%uC9C0%uB9CC%20%uC219%uC9C0%uD558%uACE0%20%uC788%uB2E4%uBA74%20Webpack%uC740%20%uBCC4%uAC8C%20%uC544%uB2C8%uB2E4.%0A%0A%uCCAB%uBC88%uC9F8%20%uD574%uC57C%uD560%20%uC77C%uC740%20**Webpack%20%uAD6C%uC131%uC744%20%uD3EC%uD568%20%uD560%20%uD30C%uC77C%uC744%20%uB9CC%uB4DC%uB294%20%uAC83%uC774%uB2E4.%20**%20%uC774%20%uD30C%uC77C%uC758%20%uC774%uB984%uC740%20Webpack%uC774%20%uC778%uC2DD%20%uD560%20%uC218%20%uC788%uB3C4%uB85D%20%uC774%uB984%uC774%20%60webpack.config.js%60%uB85C%20%uC815%uD574%uC838%20%uC788%uB2E4.%20%uC774%20%uD30C%uC77C%uC740%20%uD504%uB85C%uC81D%uD2B8%uC758%20%uB8E8%uD2B8%20%uB9AC%uB809%uD1A0%uB9AC%uC5D0%20%uC788%uC5B4%uC57C%20%uD55C%uB2E4.%20%0A%0A%uC774%uC81C%20%60webpack.config.js%60%20%uD30C%uC77C%uC744%20%uB9CC%uB4E4%uC5C8%uACE0%2C%20%20%uC774%20%uD30C%uC77C%uC774%20Webpack%uC758%20%uAD6C%uC131%uC744%20%uB098%uD0C0%uB0BC%20object%uB97C%20%uC81C%uB300%uB85C%20%uB0B4%uBCF4%uB0B4%uB294%uC9C0%20%uD655%uC778%uD574%uC57C%uD569%uB2C8%uB2E4.%20%uC790%uBC14%uC2A4%uD06C%uB9BD%uD2B8%20%uBAA8%uB4C8%uC5D0%20%uC775%uC219%uD558%uC9C0%20%uC54A%uB2E4%uBA74%20%5BPreethi%uC758%20%uBE14%uB85C%uADF8%20%uC2DC%uB9AC%uC988%5D%28https%3A//medium.freecodecamp.com/javascript-modules-a-beginner-s-guide-783f7d7a5fcc%23.q991f5q8e%29%uB97C%20%uBA3C%uC800%20%uC77D%uC5B4%uBCF4%uACE0%20%uC624%uC790.%0A%0A%60%60%60javascript%0A//%20In%20webpack.config.js%0Amodule.exports%20%3D%20%7B%7D%0A%60%60%60%0A%uC774%uC81C%20%uC704%uC758%20%uC5B8%uAE09%uB300%uB85C%20%uCF54%uB4DC%uB85C%20%uBCC0%uD658%uD574%uBCF4%uC790.%20%uBA3C%uC800%2C%20Webpack%uC5D0%20%uC5B4%uD50C%uB9AC%uCF00%uC774%uC158%uC758%20%uC9C4%uC785%20%uC9C0%uC810%uC744%20%uC54C%uB824%uC8FC%uC790.%0A%0A%60%60%60javascript%0A//%20In%20webpack.config.js%0Amodule.exports%20%3D%20%7B%0A%20%20entry%3A%20%5B%0A%20%20%20%20%27./app/index.js%27%0A%20%20%5D%0A%7D%0A%60%60%60%0A%0A%uC704%uC5D0%uC11C%20%uD55C%20%uAC83%uC740%20%uAC1D%uCCB4%uC5D0%20**entry%20%uC18D%uC131**%uACFC%20%uADF8%20%uAC12%uC744%20%uC815%uD574%uC900%20%uAC83%uC774%uB2E4.%20%uC5EC%uAE30%uC11C%20%uAC12%uC774%20%uC65C%20%uBB38%uC790%uC5F4%uC774%20%uC544%uB2CC%20%uBC30%uC5F4%uC778%uC9C0%20%uAD81%uAE08%uD560%20%uC218%20%uC788%uC744%20%uAC83%uC774%uB2E4.%20Webpack%uC744%20%uC0AC%uC6A9%uD558%uBA74%20%uC5B4%uD50C%uB9AC%uCF00%uC774%uC158%uC5D0%uC11C%20%uD558%uB098%20%uC774%uC0C1%uC758%20entry%20%uD3EC%uC778%uD2B8%uB97C%20%uAC00%uC9C8%20%uC218%20%uC788%uAE30%20%uB54C%uBB38%uC5D0%20%uB354%20%uB9CE%uC740%20%uC815%uBCF4%uB97C%20%uB2F4%uAE30%20%uC704%uD574%uC11C%20%uBC30%uC5F4%uC744%20%uC0AC%uC6A9%uD588%uB2E4.%20%28%uBB3C%uB860%20%uBC30%uC5F4%uC744%20%uC548%20%uC368%uB3C4%20%uB418%uC9C0%uB9CC%20%uC2B5%uAD00%uC744%20%uC704%uD574%20%uBC30%uC5F4%uC744%20%uC4F0%uC790%29%20%uC774%uB807%uAC8C%20%uD558%uBA74%20%uB098%uC911%uC5D0%20%uCD94%uAC00%20%uC2DC%20%uC27D%uAC8C%20%uCD94%uAC00%20%uD560%20%uC218%20%uC788%uB2E4.%0A%0A%uC5EC%uAE30%uAE4C%uC9C0%uB294%20Webpack%uC5D0%uAC8C%20%uC5B4%uB514%uC5D0%uC11C%20%uC2DC%uC791%uD574%uC57C%20%uD55C%uB2E4%uACE0%20%uC54C%uB824%uC8FC%uC5C8%uACE0%2C%20**%uC774%uC81C%20%uCF54%uB4DC%uB97C%20%uBCC0%uD615%uC744%20%uD574%uC57C%uD55C%uB2E4.**%uC774%20%uBCC0%uD615%uC5D0%uB294%20%60loader%60%uB77C%uB294%20%uAC83%uC744%20%uC0AC%uC6A9%uD55C%uB2E4.%0A%0Aloader%uB294%20%uD0C0%uCF13%20%uD30C%uC77C%uC758%20%uC885%uB958%uC5D0%20%uB9DE%uCDB0%uC5B4%uC11C%20%uC900%uBE44%uD558%uBA74%20%uB41C%uB2E4.%20TypeScript%uBA74%20%uADF8%uAC70%uC5D0%20%uB9DE%uB294%20loader%uB97C%20CoffeeScript%uBA74%20%uADF8%uAC70%uC5D0%20%uB9DE%uB294%20loader%uB97C%20%uC0AC%uC6A9%uD558%uBA74%20%uB41C%uB2E4.%20%uC0AC%uC6A9%uCC98%uC5D0%20%uB9DE%uAC8C%20loader%uB97C%20%uC124%uCE58%uD560%20%uAC83%uC778%uB370%20%60npm%60%uC744%20%uC0AC%uC6A9%uD558%uC790.%20%uC774%20%uAE00%uC5D0%uC11C%uB294%20%uC608%uC81C%uB85C%20CoffeeScript%uB97C%20%uBCC0%uD658%20%uC2DC%uD0AC%20%uAC83%uC774%uB2E4.%20%uD130%uBBF8%uB110%uC5D0%uC11C%20%uB2E4%uC74C%uACFC%20%uAC19%uC774%20loader%uB97C%20%uC124%uCE58%uD558%uC790.%0A%0A%60%60%60bash%0A%24%20npm%20install%20--save-dev%20coffee-loader%0A%60%60%60%0A%0A%uC774%uB97C%20%uC2E4%uD589%uD558%uBA74%20coffee-loader%uAC00%20%60package.json%60%20%uD30C%uC77C%uC758%20dev%20%uC885%uC18D%20%uD30C%uC77C%uB85C%20%uC800%uC7A5%uB41C%uB2E4.%20%uADF8%uB7F0%20%uB2E4%uC74C%20webpack.config.js%20%uD30C%uC77C%uC744%20%uBC18%uC601%uC2DC%uCF1C%uC8FC%uC790.%20%uC774%uB97C%20%uC704%uD574%20%uBA3C%uC800%20%60webpack.config.js%60%uC5D0%uC11C%20%uB0B4%uBCF4%uB0B4%uB294%20%uAC1D%uCCB4%uC5D0%20%uBAA8%uB4C8%20%uC18D%uC131%uC744%20%uCD94%uAC00%uD55C%uB2E4.%0A%0A%60%60%60javascript%0A//%20In%20webpack.config.js%0Amodule.exports%20%3D%20%7B%0A%20%20entry%3A%20%5B%0A%20%20%20%20%27./app/index.js%27%0A%20%20%5D%2C%0A%20%20module%3A%20%7B%0A%20%20%20%20loaders%3A%20%5B%5D%0A%20%20%7D%0A%7D%0A%60%60%60%0A%0A**loader**%20%uBC30%uC5F4%20%uB0B4%uBD80%uC5D0%uB294%20%uC6D0%uD558%uB294%20%uBAA8%uB4E0%20loader%uB97C%20%uB123%uC744%20%uAC83%uC774%uB2E4.%0A%0A%uAC01%20loader%uB294%20%uC138%20%uAC00%uC9C0%uB85C%20%uAD6C%uC131%uB418%uC5B4%uC57C%20%uD55C%uB2E4.%20%uCCAB%20%uBC88%uC9F8%uB294%20**%uD2B9%uC815%20%uBCC0%uD658%uC744%20%uC2E4%uD589%uD560%20%uD30C%uC77C%20%uC720%uD615%uC774%uB2E4.**%20%uC608%uB97C%20%uB4E4%uC5B4%2C%20%uC790%uBC14%uC2A4%uD06C%uB9BD%uD2B8%20%uD30C%uC77C%uC5D0%uC11C%20%uC790%uBC14%uC2A4%uD06C%uB9BD%uD2B8%uB85C%uB9CC%20%uBCC0%uD658%uD560%20%uC218%20%uC788%uB3C4%uB85D%20%uD558%uB294%20%uAC83%uC774%uB2E4.%20%uB2E4%uC74C%uC740%20**%uBCC0%uD658%20%uD560%20%uB514%uB809%uD1A0%uB9AC%uB97C%20%uD3EC%uD568%uD558%uAC70%uB098%20%uC81C%uC678%uD574%uC57C%uD558%uB294%20%uD56D%uBAA9%uC774%uB2E4.**%20%uC5EC%uAE30%uC11C%uB294%20node_modules%20%uD3F4%uB354%uC758%20%uBAA8%uB4E0%20%uD56D%uBAA9%uC5D0%20%uB300%uD574%20%uBCC0%uD658%uC744%20%uC2E4%uD589%uD558%uC9C0%20%uC54A%uC73C%uBBC0%uB85C%20node_modules%20%uACBD%uB85C%uB97C%20%uC81C%uC678%20%uAC12%uC73C%uB85C%20%uC0AC%uC6A9%uD558%uC790.%20%uB9C8%uC9C0%uB9C9%uC73C%uB85C%20**%uC2E4%uD589%uD558%uACE0%uC790%uD558%uB294%20%uD2B9%uC815%20loader%uC774%uB2E4.**%20%uC608%uB85C%20%uB4E4%uBA74%20%uC544%uB798%uC640%20%uAC19%uB2E4.%0A%0A%60%60%60javascript%0A//%20In%20webpack.config.js%0Amodule.exports%20%3D%20%7B%0A%20%20entry%3A%20%5B%0A%20%20%20%20%27./app/index.js%27%0A%20%20%5D%2C%0A%20%20module%3A%20%7B%0A%20%20%20%20loaders%3A%20%5B%0A%20%20%20%20%20%20%7Btest%3A%20/%5C.coffee%24/%2C%20exclude%3A%20/node_modules/%2C%20loader%3A%20%22coffee-loader%22%7D%0A%20%20%20%20%5D%0A%20%20%7D%2C%0A%7D%0A%60%60%60%0A%0A%uC704%uC5D0%uC11C%20%uB208%uC5EC%uACA8%uBD10%uC57C%20%uD560%20%uAC83%uC740%20%uC815%uADDC%uC2DD%uC774%uB2E4.%20**test**%uC5D0%20%uC788%uB294%20**%60/%20%5C.%20coffee%20%24%20/%60**%20%uC744%20%uC0AC%uC6A9%uD558%uAC8C%20%uB418%uBA74%20Webpack%uC774%20.coffee%uB85C%20%uB05D%uB098%uB294%20%uBAA8%uB4E0%20%uD655%uC7A5%20%uD504%uB85C%uADF8%uB7A8%uC5D0%uC11C%20coffe-loader%uB97C%20%uC2E4%uD589%uD558%uAC8C%20%uB41C%uB2E4.%0A%0A%uB2E4%uC74C%uC73C%uB85C%2C%20**exclude**%uB294%20%uBCC0%uD658%uC5D0%uC11C%20%uC81C%uC678%uC2DC%uD0AC%20%uAC83%uC744%20%uB098%uD0C0%uB0B8%uB2E4.%20%uC55E%uC11C%20%uB9D0%uD588%uB4EF%uC774%20node_modules%20%uD3F4%uB354%uB97C%20%uBCC0%uD615%uD558%uACE0%20%uC2F6%uC9C0%20%uC54A%uAE30%20%uB54C%uBB38%uC5D0%20%uC81C%uC678%uD55C%uB2E4.%20%uB9C8%uC9C0%uB9C9%uC73C%uB85C%uB294%20**loader**%uB85C%20Webpack%uC5D0%uAC8C%20**test**%uC758%20%uC815%uADDC%uC2DD%uACFC%20%uC77C%uCE58%uD558%uACE0%20**exclude**%uC5D0%20%uC5C6%uB294%20%uBAA8%uB4E0%20%uACBD%uB85C%uC5D0%uC11C%20%uC2E4%uD589%uB420%20%uBCC0%uD658%uC744%20%uC9C0%uC2DC%uD55C%uB2E4.%0A%0A%uB9CC%uC57D%20%uC5EC%uB7EC%20loader%uB97C%20%uCD94%uAC00%uD560%uB824%uBA74%20%60npm%60%uC73C%uB85C%20loader%uB97C%20%uC124%uCE58%uD558%uACE0%20loader%20%uBC30%uC5F4%uC5D0%20%uCD94%uAC00%uD574%uC8FC%uBA74%20%uB41C%uB2E4.%0A%0A%uC774%uC81C%20%uB9C8%uC9C0%uB9C9%20%uB2E8%uACC4%uB85C%20**%uC0C8%uB85C%uC6B4%20%uBCC0%uD658%20%uB41C%20%uCF54%uB4DC%uB97C%20%uCD9C%uB825%uD574%uC57C%20%uD558%uB294%20%uC704%uCE58**%uB97C%20%uC9C0%uC815%uD574%uC8FC%uC790.%0A%0A%60%60%60javascript%0A//%20In%20webpack.config.js%0Amodule.exports%20%3D%20%7B%0A%20%20entry%3A%20%5B%0A%20%20%20%20%27./app/index.js%27%0A%20%20%5D%2C%0A%20%20module%3A%20%7B%0A%20%20%20%20loaders%3A%20%5B%0A%20%20%20%20%20%20%7Btest%3A%20/%5C.coffee%24/%2C%20exclude%3A%20/node_modules/%2C%20loader%3A%20%22coffee-loader%22%7D%0A%20%20%20%20%5D%0A%20%20%7D%2C%0A%20%20output%3A%20%7B%0A%20%20%20%20filename%3A%20%22index_bundle.js%22%2C%0A%20%20%20%20path%3A%20__dirname%20+%20%27/dist%27%0A%20%20%7D%2C%0A%7D%0A%60%60%60%0A%0A%uC704%uC758%20%uCF54%uB4DC%uB97C%20%uBCF4%uBA74%20**filename**%uC740%20%uC0C8%uB85C%uC6B4%20%uBCC0%uD658%20%uB41C%20%uCF54%uB4DC%uAC00%20%uD3EC%uD568%20%uB41C%20Webpack%uC774%20%uB9CC%uB4E4%20%uD30C%uC77C%uC758%20%uC774%uB984%uC774%uB2E4.%20**path**%uB294%20%uC0C8%20%uD30C%uC77C%20%uC774%uB984%20%28%uC5EC%uAE30%uC11C%uB294%20index_bundle.js%29%uC774%20%uBC30%uCE58%20%uB420%20%uB514%uB809%uD1A0%uB9AC%uC774%uB2E4.%20%uCC38%uACE0%uB85C%20%60__dirname%60%uB294%20%uD604%uC7AC%20%uC2E4%uD589%20%uC911%uC778%20%uC2A4%uD06C%uB9BD%uD2B8%uC758%20%uC0C1%uC704%20%uB514%uB809%uD1A0%uB9AC%20%uC774%uB984%uC774%uB2E4.%0A%0A%uC774%uC81C%20Webpack%uC774%20%uC2E4%uD589%20%uC2DC%uD0A4%uBA74%2C%20%20%uCF54%uB4DC%uAC00%20%uBCC0%uD615%uB418%uC5B4%20ourApp%20/%20dist%20/%20index_bundle.js%uC5D0%uC11C%20%uCC38%uC870%uD560%20%uC218%20%uC788%uAC8C%20%uB41C%uB2E4.%20%uC774%uC81C%20HTML%20%uD30C%uC77C%uC774%20%60index_bundle.js%60%uB97C%20%uCC38%uC870%uD558%uB3C4%uB85D%20%uD574%uBCF4%uC790.%20%uC77C%uBC18%20%uC571%uC758%20%uC77C%uBC18%uC801%uC73C%uB85C%20%uAD6C%uC870%uB294%20%uB2E4%uC74C%uACFC%20%uAC19%uC744%20%uAC83%uC774%uB2E4.%0A%0A%60%60%60%0A/app%0A%20%20-%20components%0A%20%20-%20containers%0A%20%20-%20config%0A%20%20-%20utils%0A%20%20index.js%0A%20%20index.html%0A/dist%0A%20%20index.html%0A%20%20index_bundle.js%0Apackage.json%0Awebpack.config.js%0A.gitignore%0A%60%60%60%0A%uBCF4%uD1B5%20%uAC1C%uBC1C%20%uC911%uC778%20%uCF54%uB4DC%uB294%20app%20%uD3F4%uB354%uC5D0%20%uB450%uACE0%20%uBCC0%uD615%20%uD6C4%20%uBC30%uD3EC%uC5D0%20%uC0AC%uC6A9%uD560%20%uCF54%uB4DC%uB294%20dist%20%uD3F4%uB354%uC5D0%20%uC788%uB2E4.%20%uC5EC%uAE30%uC11C%20%uD55C%uAC00%uC9C0%20%uBB38%uC81C%uC810%uC774%20%uC0DD%uAE30%uB294%uB370%20app%20%uD3F4%uB354%uC5D0%uC788%uB294%20index.html%uC744%20%uBCC0%uACBD%uD560%20%uB54C%uC774%uB2E4.%20%uBE0C%uB77C%uC6B0%uC800%uAC00%20%uC2E4%uC81C%uB85C%20%uC0AC%uC6A9%uD558%uAC8C%20%uB420%20index.html%20%uD30C%uC77C%uC740%20dist%20%uD3F4%uB354%20%uB0B4%uC758%20%uD30C%uC77C%uC774%uAE30%20%uB54C%uBB38%uC5D0%20app%20%uC548%uC758%20html%20%uD30C%uC77C%uC744%20%uC62E%uACA8%uC8FC%uC5B4%uC57C%20%uD55C%uB2E4.%0A%0A%uC774%uB97C%20%uC704%uD574%20%uB450%uAC00%uC9C0%20%uBC29%uBC95%uC774%20%uC788%uB294%uB370%2C%20%uCCAB%uBC88%uC9F8%20%uBC29%uBC95%uC740%20**%uB450%20%uAC1C%uC758%20index.html%20%uD30C%uC77C%uC744%20%uAD00%uB9AC%uD558%uB294%20%uAC83%uC774%uB2E4.**%20%20app%uC5D0%20%uC788%uB294%20%uD30C%uC77C%uC744%20%uBCC0%uACBD%uD560%20%uB54C%uB9C8%uB2E4%20dist%uC5D0%20%uC788%uB294%20%uD30C%uC77C%uB85C%20%uC9C1%uC811%20%uBCF5%uC0AC%uD558%uB294%20%uAC83%uC774%uB2E4.%20%uD558%uC9C0%uB9CC%20%uC774%20%uBC29%uBC95%uC740%20%uB108%uBB34%20%uBB34%uC2DD%uD55C%20%uBC29%uBC95%uC774%uB2E4.%0A%0A%uB450%20%uBC88%uC9F8%20%uC635%uC158%uC740%20**Webpack%uC774%20%uC2E4%uD589%uB420%20%uB54C%uB9C8%uB2E4%20/app/index.html%uC774%20/dist/index.html%uC5D0%20%uBCF5%uC0AC**%uB418%uB3C4%uB85D%uD558%uB294%20%uBC29%uBC95%uC774%uB2E4.%20%uCCAB%uBC88%uC9F8%20%uBC29%uBC95%uBCF4%uB2E4%20%uD6E8%uC52C%20%uAE54%uB054%uD558%uACE0%20%uC190%uC774%20%uB35C%20%uAC00%uB294%20%uBC29%uBC95%uC774%uB2E4.%0A%0A%uB450%uBC88%uC9F8%20%uC77C%20Webpack%20tool%uC5D0%20%uC774%uBBF8%20%uC874%uC7AC%uD55C%uB2E4.%20%uBC14%uB85C%20%60html-webpack-plugin%60%uC774%uB2E4.%20npm%uC73C%uB85C%20%uB9C8%uCC2C%uAC00%uC9C0%uB85C%20%uC124%uCE58%uD574%uC8FC%uC790.%20%0A%0A%60%60%60bash%0Anpm%20install%20--save-dev%20html-webpack-plugin%0A%60%60%60%0A%0A%uC6B0%uC120%2C%20%60HTMLWebpackPlugin%60%uC758%20%uC0C8%20%uC778%uC2A4%uD134%uC2A4%uB97C%20%uB9CC%uB4E0%20%uD6C4%20%uC138%20%uAC00%uC9C0%uB97C%20%uC9C0%uC815%uD574%uC57C%20%uD55C%uB2E4.%20%uBA3C%uC800%2C%20%uC0C8%uB85C%20%uC0DD%uC131%20%uB41C%20%uD30C%uC77C%uC774%20%uC5B4%uB5BB%uAC8C%20%uBCF4%uC774%uAE38%20%uC6D0%uD558%uB294%uC9C0%uC5D0%20%uB300%uD55C%20%uD15C%uD50C%uB9BF%uC744%20%uC81C%uACF5%uD574%uC57C%uD55C%uB2E4.%20%uB450%uBC88%uC9F8%uB294%2C%20%uD30C%uC77C%20%uC774%uB984%uC744%20%uC9C0%uC815%uD558%uAC70%uB098%2C%20%uC0DD%uC131%uD55C%20%uC0C8%20%uD30C%uC77C%uC744%20%uD638%uCD9C%uD569%uB2C8%uB2E4.%20%uC14B%uBC88%uC9F8%uB294%20%60WebpackPluginConfig%60%uB85C%20%uD1B5%uD574%20%uBCC0%uD658%20%uB41C%20%uCF54%uB4DC%uC758%20%uCD9C%uB825%20%uD30C%uC77C%20%uC774%uB984%uC744%20%uAC10%uC9C0%uC2DC%uD0A4%uB294%20%uAC83%uC774%uB2E4%2C%20%28%uC5EC%uAE30%uC11C%uB294%20%60index_bundle.js%60%29.%20%uADF8%uB7F0%20%uB2E4%uC74C%20%3Chead%3E%20%uB610%uB294%20%3Cbody%3E%uC5D0%20%uC2A4%uD06C%uB9BD%uD2B8%uB97C%20%uC0BD%uC785%uD574%uC57C%uD55C%uB2E4.%20%uC0C8%uB85C%20%uC0DD%uC131%20%uB41C%20index.html%20%uD30C%uC77C%uC5D0%20**injection**%uC73C%uB85C%2C%20%uC2A4%uD06C%uB9BD%uD2B8%uB97C%20%60head%60%20%uB610%uB294%20%60body%60%uC5D0%20%uC0BD%uC785%uD558%uBA74%20%uB41C%uB2E4.%0A%0A%uC815%uB9AC%uD558%uBA74%20%uC544%uB798%uC640%20%uAC19%uB2E4.%0A%0A%60%60%60javascript%0A//%20In%20webpack.config.js%0Avar%20HtmlWebpackPlugin%20%3D%20require%28%27html-webpack-plugin%27%29%0Avar%20HTMLWebpackPluginConfig%20%3D%20new%20HtmlWebpackPlugin%28%7B%0A%20%20template%3A%20__dirname%20+%20%27/app/index.html%27%2C%0A%20%20filename%3A%20%27index.html%27%2C%0A%20%20inject%3A%20%27body%27%0A%7D%29%3B%0Amodule.exports%20%3D%20%7B%0A%20%20entry%3A%20%5B%0A%20%20%20%20%27./app/index.js%27%0A%20%20%5D%2C%0A%20%20module%3A%20%7B%0A%20%20%20%20loaders%3A%20%5B%0A%20%20%20%20%20%20%7Btest%3A%20/%5C.coffee%24/%2C%20exclude%3A%20/node_modules/%2C%20loader%3A%20%22coffee-loader%22%7D%0A%20%20%20%20%5D%0A%20%20%7D%2C%0A%20%20output%3A%20%7B%0A%20%20%20%20filename%3A%20%22index_bundle.js%22%2C%0A%20%20%20%20path%3A%20__dirname%20+%20%27/dist%27%0A%20%20%7D%2C%0A%20%20plugins%3A%20%5BHTMLWebpackPluginConfig%5D%0A%7D%3B%0A%60%60%60%0A%0A%uD30C%uC77C%uC758%20%uB9E8%20%uC704%uC5D0%20**HtmlWebpackPlugin**%uC758%20%uC0C8%20%uC778%uC2A4%uD134%uC2A4%uB97C%20%uB9CC%uB4E4%uACE0%20%uC694%uB188%uC740%20%uC138%20%uAC00%uC9C0%20%uC635%uC158%uC744%20%uC81C%uACF5%uD55C%uB2E4.%20**template**%uC740%20%uC571%20%uB514%uB809%uD1A0%uB9AC%uC5D0%uC788%uB294%20%uC77C%uBC18%20index.html%20%uD30C%uC77C%uC744%20%uAC00%uB9AC%uD0A8%uB2E4.%20**filename**%uC740%20index.html%uC73C%uB85C%20%uAE30%uC874%20%uD30C%uC77C%20%uC774%uB984%uACFC%20%uB3D9%uC77C%uD558%uAC8C%20%uC9C0%uC5C8%uB2E4.%20**inject**%uB294%20loader%uC758%20%uCD9C%uB825%20%uD30C%uC77C%20%28index_bundle.js%29%uC758%20%uC774%uB984%uC744%20%uCC38%uC870%uD558%uB294%20%uC2A4%uD06C%uB9BD%uD2B8%uB97C%20%uC0BD%uC785%uD558%uC5EC%20%uC0C8%uB85C%20%uC0DD%uC131%20%uB41C%20html%20%uD30C%uC77C%uC758%20%uBCF8%uBB38%uC5D0%20%uC0BD%uC785%uD55C%uB2E4.%20%uB9C8%uC9C0%uB9C9%uC73C%uB85C%20%uC791%uC131%uD55C%20**HTMLWebpackPluginConfig**%20%uBCC0%uC218%uB97C%20webpack%20config%uC758%20%uD50C%uB7EC%uADF8%uC778%20%uBC30%uC5F4%uC5D0%20%uD56D%uBAA9%uC73C%uB85C%20%uCD94%uAC00%uD55C%uB2E4.%0A%0A%uC774%uC81C%20Webpack%uC744%20%uC2E4%uD589%uD558%uBA74%20dist%20%uD3F4%uB354%20%uC548%uC5D0%20%uB450%20%uAC1C%uC758%20%uD30C%uC77C%uC774%20%uC0DD%uAE34%uB2E4.%20%60index_bundle.js%60%20%uC640%20%60index.html%60%uAC00%20%uC0DD%uACBC%uC744%20%uAC83%uC774%uB2E4.%20%60index_bundle.js%60%uB294%20**%60entry%60**%20%uCF54%uB4DC%uB97C%20%uAC00%uC838%20%uC640%uC11C%20loader%uB97C%20%uD1B5%uD574%20%uC2E4%uD589%20%uD55C%20%uACB0%uACFC%uC774%uB2E4.%20%60index.html%60%uC740%20**HTMLWebpackPluginConfig**%uB97C%20%uAC70%uCCD0%20%uB9CC%uB4E4%uC5B4%uC9C4%20%uD30C%uC77C%uC774%uB2E4.%0A%0Adist%uC758%20%uB0B4%uBD80%uC5D0%20%uC0C8%uB85C%20%uC0DD%uC131%20%uB41C%20%60index.html%60%20%uD30C%uC77C%uC774%20%uC5B4%uB5BB%uAC8C%20%uC0DD%uACBC%uB294%uC9C0%2C%20app%20%uD3F4%uB354%20%uC548%uC758%20%60index.html%60%20%uC640%20%uBE44%uAD50%uD574%uBCF4%uC790.%0A%0A***app/index.html***%0A%60%60%60vbscript-html%0A%3C%21DOCTYPE%20html%3E%0A%3Chtml%20lang%3D%22en%22%3E%0A%3Chead%3E%0A%20%20%3Cmeta%20charset%3D%22UTF-8%22%3E%0A%20%20%3Ctitle%3EMy%20App%3C/title%3E%0A%20%20%3Clink%20rel%3D%22stylesheet%22%20href%3D%22styles.css%22%3E%0A%3C/head%3E%0A%3Cbody%3E%0A%20%20%3Cdiv%20id%3D%22app%22%3E%3C/div%3E%0A%3C/body%3E%0A%3C/html%3E%0A%60%60%60%0A%0A***dist/index.html***%0A%60%60%60vbscript-html%0A%3C%21DOCTYPE%20html%3E%0A%3Chtml%20lang%3D%22en%22%3E%0A%3Chead%3E%0A%20%20%3Cmeta%20charset%3D%22UTF-8%22%3E%0A%20%20%3Ctitle%3EMy%20App%3C/title%3E%0A%20%20%3Clink%20rel%3D%22stylesheet%22%20href%3D%22styles.css%22%3E%0A%3C/head%3E%0A%3Cbody%3E%0A%20%20%3Cdiv%20id%3D%22app%22%3E%3C/div%3E%0A%20%20%3Cscript%20src%3D%22index_bundle.js%22%3E%3C/script%3E%0A%3C/body%3E%0A%3C/html%3E%0A%60%60%60%0A%0A%uB450%20%uD30C%uC77C%uC758%20%uCC28%uC774%uC810%uC740%20**dist**%20%28**HTMLWebpackPlugin**%uC73C%uB85C%20%uC0DD%uC131%uB41C%20%uD30C%uC77C%29%uC5D0%20%60index_bundle.js%60%uB97C%20%uAC00%uB9AC%uD0A4%uB294%20script%20%uD0DC%uADF8%uAC00%20%uC788%uB2E4%uB294%20%uAC83%uC774%uB2E4.%20%uB2E4%uC2DC%20%uB9D0%uD558%uC9C0%uB9CC%20**HTMLWebpackConfig**%uAC00%20Webpack%uC5D0%uC11C%20%uC0C8%uB85C%20%uC0DD%uC131%20%uB41C%20%uD30C%uC77C%uC758%20%uCD9C%uB825%20%uD30C%uC77C%20%uC774%uB984%uC744%20%uAC10%uC9C0%uD558%uACE0%20%uC0C8%uB85C%20%uB9CC%uB4E0%20%60index.html%60%20%uD30C%uC77C%uC758%20%uC2A4%uD06C%uB9BD%uD2B8%uB85C%20%uC790%uB3D9%20%uCD94%uAC00%uD55C%20%uAC83%uC774%uB2E4.%20%uC704%uC758%20%60index.html%60%20%uD30C%uC77C%uC5D0%uC11C%20%uBCFC%20%uC218%20%uC788%uB4EF%uC774%20%60body%60%uC5D0%uB294%20%60%3Cscript%20src%3D%22index_bundle.js%22%3E%3C/script%3E%60%uAC00%20%uC788%uB2E4.%20Webpack%20%uC124%uC815%uC5D0%uC11C%20%uCD9C%uB825%uC744%20%60test.js%60%uB85C%20%uBCC0%uACBD%uD588%uB2E4%uBA74%20%uC0C8%uB85C%20%uC0DD%uC131%20%uB41C%20%60index.html%60%20%uD30C%uC77C%uC758%20%60body%60%20%uC548%uC5D0%20%60%3Cscript%20src%3D%22test.js%22%3E%3C/script%3E%60%uAC00%20%uC0DD%uACBC%uC744%20%uAC83%uC774%uB2E4.%0A%0A%uC774%uC81C%20%uAC70%uC758%20%uB2E4%20%uB05D%uB0AC%uB2E4%20%uB9C8%uC9C0%uB9C9%uC73C%uB85C%uB294%20Webpack%uC5D0%20%uC2E4%uC81C%uB85C%20%uC2E4%uD589%uD558%uB294%20%uBC29%uBC95%uC774%uB2E4.%20Webpack%uC774%20%uC124%uCE58%uB418%uC5B4%20%uC788%uC9C0%20%uC54A%uC558%uB2E4%uBA74%20%uB2E4%uC74C%uACFC%20%uAC19%uC774%20%uC124%uCE58%uD574%uC8FC%uC790.%0A%0A%60%60%60bash%0A%24%20npm%20install%20-g%20webpack%0A%60%60%60%0A%0AWebpack%uC744%20%uC124%uCE58%uB97C%20%uD558%uBA74%20Webpack%20CLI%uC5D0%20%uC811%uADFC%20%uD560%20%uC218%20%uC788%uB2E4.%20%28%uB9CC%uC57D%20local%uC5D0%20%uC124%uCE58%uD588%uB2E4%uBA74%20npm%uC73C%uB85C%20%uC2E4%uD589%uC2DC%uCF1C%uC918%uC57C%20%uD55C%uB2E4.%29%0A%0A%uC5B4%uD50C%uB9AC%uCF00%uC774%uC158%uC758%20%uB8E8%uD2B8%20%uB514%uB809%uD1A0%uB9AC%20%28%uC5EC%uAE30%uC11C%uB294%20%60webpack.config.js%60%uC758%20%uC704%uCE58%29%uC5D0%uC11C%20Webpack%uC744%20%uD130%uBBF8%uB110%uB85C%20%uC2E4%uD589%uD560%20%uC218%20%uC788%uB2E4.%20%uC2E4%uD589%20%uC2DC%20Webpack%20%uC124%uC815%uC774%20%uD55C%20%uBC88%20%uC2E4%uD589%uB41C%uB2E4.%20%uD558%uC9C0%uB9CC%20%uD30C%uC77C%uC774%20%uC5EC%uB7EC%uBC88%20%uC218%uC815%uB420%20%uACBD%uC6B0%uB9C8%uB2E4%20Webpack%uC744%20%uB9E4%uBC88%20%uC2E4%uD589%20%uC2DC%uCF1C%uC918%uC57C%uD558%uB294%uB370%20%uADF8%uB7EC%uAE30%uC5D0%uB294%20%uB108%uBB34%20%uADC0%uCC2E%uB2E4.%20Webpack%uC740%20watch%uB77C%uB294%20%uAE30%uB2A5%uC744%20%uC81C%uACF5%uD558%uB294%uB370%20%uD30C%uC77C%uC774%20%uBCC0%uACBD%20%uB420%20%uB54C%uB9C8%uB2E4%20%uC2E4%uC2DC%uAC04%uC73C%uB85C%20Webpack%uC744%20%uC2E4%uD589%20%uC2DC%uCF1C%uC8FC%uB294%20%uAE30%uB2A5%uC774%uB2E4.%20%0A%0A%60%60%60bash%0A%24%20webpack%20-w%0A%60%60%60%0A%0A%uBC30%uD3EC%20%uB2E8%uACC4%uB85C%20%uB0B4%uB193%uC744%uB824%uBA74%20%uB2E4%uC74C%uC744%20%uC2E4%uD589%20%uC2DC%20%uBCC0%uD658%uACFC%20%uCF54%uB4DC%20%uCD95%uC18C%uAC00%20%uC2E4%uD589%uB41C%uB2E4.%0A%0A%60%60%60bash%0A%24%20webpack%20-p%0A%60%60%60%0A%0A%uC0AC%uC2E4%20Webpack%uB9CC%20%uBCF4%uACE0%20%uC654%uB2E4%uBA74%20%uC5EC%uAE30%uAE4C%uC9C0%20%uD574%uB3C4%20%uB41C%uB2E4.%20%uD558%uC9C0%uB9CC%20%uCD5C%uC885%20%uBAA9%uD45C%uB294%20%60React%60%20%uAD00%uB9AC%uB97C%20Webpack%uC73C%uB85C%20%uD558%uB294%20%uAC83%uC774%uAE30%20%uB54C%uBB38%uC5D0%20%60Babal%60%uC774%uB77C%uB294%20%uAC83%uC744%20loader%uB85C%20%uCD94%uAC00%uD574%uC57C%20%uD55C%uB2E4.%0A%0A%0A%60Babel.js%60%uB294%20%uC790%uBC14%uC2A4%uD06C%uB9BD%uD2B8%uB97C%20%uCEF4%uD30C%uC77C%20%uB3C4%uAD6C%uC778%uB370%2C%20Webpack%uC744%20%uC0AC%uC6A9%uD558%uBA74%20%uBC14%uBCA8%uC774%20%uD2B9%uC815%20%uBCC0%uD658%20%uC790%uCCB4%20%uC778%20%uB3D9%uC548%20%uCF54%uB4DC%uC5D0%uC11C%20%uC5B4%uB5A4%20%uBCC0%uD658%uC744%20%uC218%uD589%uD560%uC9C0%20%uC9C0%uC815%uD560%20%uC218%20%uC788%uB2E4.%20React%uC758%20%uAD00%uC810%uC5D0%uC11C%20%uBC14%uBCA8%uC740%20JSX%20%uB97C%20%uC2E4%uC81C%20JavaScript%uB85C%20%uBCC0%uD615%20%uD560%20%uC218%20%uC788%uAC8C%20%uD55C%uB2E4.%20**Babel**%uC774%20%uC88B%uC740%20%uC810%uC740%20JSX%20-%3E%20JS%20%uBCC0%uD615%20%uC678%uC5D0%uB3C4%20%uB9CE%uC740%20%uC6A9%uB3C4%uB85C%20%uC0AC%uC6A9%uD560%20%uC218%20%uC788%uB2E4%uB294%20%uAC83%uC774%uB2E4.%20Javascript%uB3C4%20%uB180%uB78D%uAC8C%uB3C4%20%uBC84%uC804%uB4E4%uC774%20%uC874%uC7AC%uD558%uB294%uB370%20%uCD5C%uC2E0%20Javascript%uB791%20%uC6B0%uB9AC%uAC00%20%uC54C%uACE0%20%uC788%uB294%20Javascript%uB791%uC740%20%uCC28%uC774%uC810%uC774%20%uB9E4%uC6B0%20%uB9CE%uB2E4.%20%uC774%uC5D0%20%uB530%uB77C%20%uBE0C%uB77C%uC6B0%uC800%uAC00%20%uCD5C%uC2E0%20Javascript%uB97C%20%uBABB%20%uB530%uB77C%uC624%uB294%20%uD604%uC0C1%uC774%20%uBC1C%uC0DD%uD588%uB294%uB370%20%uC774%uB97C%20%60Babel%60%uC774%uB77C%uB294%20%uB188%uC774%20%uBC14%uB85C%20%uC7A1%uC544%uC8FC%uB294%20%uAC83%uC774%uB2E4.%20%uCD5C%uC2E0%20JavaScript%20%28ES2015%2C%202016%20%uB4F1%29%uC744%20%uBE0C%uB77C%uC6B0%uC800%uAC00%20%uC54C%uACE0%20%uC788%uB294%20Javascript%uB85C%20%uBCC0%uD658%20%uC2DC%uCF1C%20%uBE0C%uB77C%uC6B0%uC800%uAC00%20%uC774%uD574%uD560%20%uC218%20%uC788%uB3C4%uB85D%20%uD574%uC900%uB2E4.%0A%0A**babel**%20%uC124%uCE58%uB3C4%20%60npm%60%uC73C%uB85C%20%uD574%uC8FC%uBA74%20%uB41C%uB2E4.%20**babel**%uC740%20%uC5EC%uB7EC%20%uBAA8%uB4C8%uB85C%20%uAD6C%uC131%uB418%uC5B4%20%uC788%uAE30%20%uB54C%uBB38%uC5D0%20%uC124%uCE58%20%uC804%uC5D0%20%20%uBA87%20%uAC00%uC9C0%uB97C%20%uC124%uCE58%uD574%uC57C%20%uD55C%uB2E4.%20%0A%0A%60%60%60bash%0A%24%20npm%20install%20--save-dev%20babel-core%20babel-loader%20babel-preset-react%0A%60%60%60%0A%0A%60babel-core%60%uB294%20babel%20%uC790%uCCB4%uC774%uACE0%2C%20%60babel-loader%60%uB294%20%uC0AC%uC6A9%uD560%20%20Webpack%20loader%uC774%uBA70%2C%20%60babel-preset-react%60%uB294%20JSX%20-%3E%20JS%20%uBCC0%uD615%uC744%20%uB3C4%uC640%uC900%uB2E4.%0A%0A%uC704%uC758%20%uC138%uAC00%uC9C0%20%uBAA8%uB4C8%uC744%20Webpack%uC5D0%20%uCD94%uAC00%uD574%uC918%uB3C4%20%uB418%uC9C0%uB9CC%20%uAD73%uC774%20%uADF8%uB7F4%20%uD544%uC694%uAC00%20%uC5C6%uB2E4.%20**babel**%20%uC124%uC815%uC744%20%uC704%uD574%20%uBCC4%uB3C4%uC758%20%uD30C%uC77C%uB85C%20%uAD00%uB9AC%uD558%uBA74%20%uB41C%uB2E4.%20%0A%0A%uBA3C%uC800%20%60webpack.config.js%60%20%uD30C%uC77C%uC774%20%uC788%uB294%20%uB8E8%uD2B8%20%uB514%uB809%uD1A0%uB9AC%uC5D0%20%60.babelrc%60%20%uD30C%uC77C%uC744%20%uB9CC%uB4E4%uC5B4%uC8FC%uC790.%0A%0A%60%60%60%0A%7B%0A%20%20%22presets%22%3A%20%5B%0A%20%20%20%20%22react%22%0A%20%20%5D%0A%7D%0A%60%60%60%0A%0A%uC5EC%uAE30%uC11C%uB294%20**babel**%20%uBCC0%uD658%uC774%20%uC2E4%uC81C%uB85C%20%uB9CC%uB4E4%uC5B4%20%uB0B4%uB294%20***babel%20loader***%uC5D0%20%uC9C0%uC2DC%uD558%uB294%20%uAC83%uC774%uB2E4.%20%uC880%20%uC804%uC5D0%20%60babel-preset-react%60%uB97C%20%uC124%uCE58%uD574%uC92C%uAE30%20%uB54C%uBB38%uC5D0%20**react**%uB85C%20%uC124%uC815%uD574%uC8FC%uBA74%20%uB41C%uB2E4.%0A%0A%uC774%uC81C%20***babel-loader***%uB97C%20%60webpack.config.js%60%uC758%20loader%uC5D0%20%uCD94%uAC00%uD574%uC8FC%uBA74%20%uB41C%uB2E4.%0A%0A%60%60%60javascript%0A//%20In%20webpack.config.js%0Avar%20HtmlWebpackPlugin%20%3D%20require%28%27html-webpack-plugin%27%29%0Avar%20HTMLWebpackPluginConfig%20%3D%20new%20HtmlWebpackPlugin%28%7B%0A%20%20template%3A%20__dirname%20+%20%27/app/index.html%27%2C%0A%20%20filename%3A%20%27index.html%27%2C%0A%20%20inject%3A%20%27body%27%0A%7D%29%3B%0Amodule.exports%20%3D%20%7B%0A%20%20entry%3A%20%5B%0A%20%20%20%20%27./app/index.js%27%0A%20%20%5D%2C%0A%20%20output%3A%20%7B%0A%20%20%20%20path%3A%20__dirname%20+%20%27/dist%27%2C%0A%20%20%20%20filename%3A%20%22index_bundle.js%22%0A%20%20%7D%2C%0A%20%20module%3A%20%7B%0A%20%20%20%20loaders%3A%20%5B%0A%20%20%20%20%20%20%7Btest%3A%20/%5C.js%24/%2C%20exclude%3A%20/node_modules/%2C%20loader%3A%20%22babel-loader%22%7D%0A%20%20%20%20%5D%0A%20%20%7D%2C%0A%20%20plugins%3A%20%5BHTMLWebpackPluginConfig%5D%0A%7D%3B%0A%60%60%60&lt;/center&gt;&lt;br/&gt;&lt;/div&gt;
</content>
  </entry>
  <entry xml:base="http://genius-project.postach.io/feed.xml">
    <title type="text">[Django]Iamport 연동하기 - 4</title>
    <id>https://genius-project.postach.io/post/django-iamport-yeondonghagi-4</id>
    <updated>2017-02-16T16:17:51.527000Z</updated>
    <published>2017-02-16T16:16:55Z</published>
    <link href="https://genius-project.postach.io/post/django-iamport-yeondonghagi-4" />
    <author>
      <name>Jaewon Kwon</name>
    </author>
    <category term="django" />
    <category term="iamport" />
    <content type="html">&lt;div&gt;&lt;del style=&quot;position:relative;display:block;z-index:10;&quot;&gt;&lt;a style=&quot;position: absolute;color: #FFF;text-decoration: none;font-size: 12px;height: 25px;border-radius: 0;margin-top: -20px;right: 15px;background: rgba(0, 0, 0, 0);border-left: 10px solid #BB3A34;border-right: 10px solid #BB3A34;border-bottom: 5px solid rgba(0, 0, 0, 0);width: 0;text-indent:-100000px;&quot; href=&quot;http://marxi.co/#/?provider=evernote_int&amp;guid=8c7382ca-2511-4f5d-ba58-b88c32779f62&amp;notebook=Django&quot;&gt;Edit&lt;/a&gt;&lt;/del&gt;&lt;div style=&quot;color: #2c3f51; line-height: 1.6;&quot;&gt;
                        
                    



&lt;h3 style=&quot;font-family: inherit; font-weight: bold; color: inherit; margin-top: 21px; margin-bottom: 10.5px; font-size: 1.7em; margin: 1.2em 0 .6em 0; text-align: start; line-height: 1.6;&quot;&gt;[Django]Iamport 연동하기 - 4&lt;/h3&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;/&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이번에는 template인 html를 작성해보자. 여기서 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;IMP.init()&lt;/code&gt; 값은 아엠포트 관리자 페이지에서 가맹점 코드를 넣어주면 된다.&lt;/p&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6;&quot;&gt;{% load staticfiles %}&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;&lt;!DOCTYPE html&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;html&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;lang&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;ko&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;head&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;meta&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;charset&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;title&lt;/span&gt;&gt;&lt;/span&gt;디제이비버&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;title&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;script&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;https://code.jquery.com/jquery-2.2.4.min.js&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;span style=&quot;line-height: 1.6;&quot;/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;script&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;script&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;https://service.iamport.kr/js/iamport.payment-1.1.1.js&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;span style=&quot;line-height: 1.6;&quot;/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;script&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;script&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; opacity: .5;&quot;&gt;&lt;br/&gt;        $(&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt; (&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;/&gt;) &lt;/span&gt;{&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; IMP = &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;window&lt;/span&gt;.IMP;&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;// 가맹점 코드&lt;/span&gt;&lt;br/&gt;            IMP.init(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'imp68762150'&lt;/span&gt;);&lt;br/&gt;&lt;br/&gt;            $(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'.charge-button'&lt;/span&gt;).on(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'click'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt; (&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;e&lt;/span&gt;) &lt;/span&gt;{&lt;br/&gt;                &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; amount = &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;parseInt&lt;/span&gt;($(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'.charge-total #total'&lt;/span&gt;).text().replace(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;','&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;''&lt;/span&gt;).slice(&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;0&lt;/span&gt;, -&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;1&lt;/span&gt;));&lt;br/&gt;                &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; type = $(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'.charge-type input:checked'&lt;/span&gt;).val();&lt;br/&gt;                &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; merchant_id = AjaxStoreTransaction(e, amount, type);&lt;br/&gt;&lt;br/&gt;                &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; (merchant_id !== &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;''&lt;/span&gt;) {&lt;br/&gt;                    IMP.request_pay({&lt;br/&gt;                        pg: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'html5_inicis'&lt;/span&gt;,&lt;br/&gt;                        escrow: &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;false&lt;/span&gt;,&lt;br/&gt;                        digital: &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;true&lt;/span&gt;,&lt;br/&gt;                        pay_method: type,&lt;br/&gt;                        merchant_uid: merchant_id,&lt;br/&gt;                        name: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'포인트'&lt;/span&gt; + amount + &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'원 충전'&lt;/span&gt;,&lt;br/&gt;                        amount: amount&lt;br/&gt;                    }, &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt; (&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;rsp&lt;/span&gt;) &lt;/span&gt;{&lt;br/&gt;                        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; (rsp.success) {&lt;br/&gt;                            &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; msg = &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'결제가 완료되었습니다.'&lt;/span&gt;;&lt;br/&gt;                            msg += &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'고유ID : '&lt;/span&gt; + rsp.imp_uid;&lt;br/&gt;                            msg += &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'상점 거래ID : '&lt;/span&gt; + rsp.merchant_uid;&lt;br/&gt;                            msg += &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'결제 금액 : '&lt;/span&gt; + rsp.paid_amount;&lt;br/&gt;                            msg += &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'카드 승인번호 : '&lt;/span&gt; + rsp.apply_num;&lt;br/&gt;                            ImpTransaction(e, rsp.merchant_uid, rsp.imp_uid, rsp.paid_amount);&lt;br/&gt;                        } &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;else&lt;/span&gt; {&lt;br/&gt;                            &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; msg = &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'결제에 실패하였습니다.'&lt;/span&gt;;&lt;br/&gt;                            msg += &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'에러내용 : '&lt;/span&gt; + rsp.error_msg;&lt;br/&gt;                            &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;console&lt;/span&gt;.log(msg);&lt;br/&gt;                        }&lt;br/&gt;                    });&lt;br/&gt;                }&lt;br/&gt;            });&lt;br/&gt;        });&lt;br/&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;AjaxStoreTransaction&lt;/span&gt;(&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;e, amount, type&lt;/span&gt;) &lt;/span&gt;{&lt;br/&gt;            e.preventDefault();&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; merchant_id = &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;''&lt;/span&gt;;&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; request = $.ajax({&lt;br/&gt;                method: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;POST&quot;&lt;/span&gt;,&lt;br/&gt;                url: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'{% url &quot;point_checkout&quot; %}'&lt;/span&gt;,&lt;br/&gt;                &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;async&lt;/span&gt;: &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;false&lt;/span&gt;,&lt;br/&gt;                data: {&lt;br/&gt;                    amount: amount,&lt;br/&gt;                    type: type,&lt;br/&gt;                    csrfmiddlewaretoken: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'{{ csrf_token }}'&lt;/span&gt;&lt;br/&gt;                }&lt;br/&gt;            });&lt;br/&gt;            request.done(&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt; (&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;data&lt;/span&gt;) &lt;/span&gt;{&lt;br/&gt;                &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; (data.works) {&lt;br/&gt;                    merchant_id = data.merchant_id;&lt;br/&gt;                }&lt;br/&gt;            });&lt;br/&gt;            request.fail(&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt; (&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;jqXHR, textStatus&lt;/span&gt;) &lt;/span&gt;{&lt;br/&gt;                &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; (jqXHR.status == &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;404&lt;/span&gt;) {&lt;br/&gt;                    alert(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;페이지가 존재하지 않습니다.&quot;&lt;/span&gt;);&lt;br/&gt;                } &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; (jqXHR.status == &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;403&lt;/span&gt;) {&lt;br/&gt;                    alert(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;로그인 해주세요.&quot;&lt;/span&gt;);&lt;br/&gt;                } &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;else&lt;/span&gt; {&lt;br/&gt;                    alert(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;문제가 발생했습니다. 다시 시도해주세요.&quot;&lt;/span&gt;);&lt;br/&gt;                }&lt;br/&gt;            });&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; merchant_id;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;ImpTransaction&lt;/span&gt;(&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;e, merchant_id, imp_id, amount&lt;/span&gt;) &lt;/span&gt;{&lt;br/&gt;            e.preventDefault();&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; request = $.ajax({&lt;br/&gt;                method: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;POST&quot;&lt;/span&gt;,&lt;br/&gt;                url: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'{% url &quot;point_validation&quot; %}'&lt;/span&gt;,&lt;br/&gt;                &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;async&lt;/span&gt;: &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;false&lt;/span&gt;,&lt;br/&gt;                data: {&lt;br/&gt;                    merchant_id: merchant_id,&lt;br/&gt;                    imp_id: imp_id,&lt;br/&gt;                    amount: amount,&lt;br/&gt;                    csrfmiddlewaretoken: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'{{ csrf_token }}'&lt;/span&gt;&lt;br/&gt;                }&lt;br/&gt;            });&lt;br/&gt;            request.done(&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt; (&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;data&lt;/span&gt;) &lt;/span&gt;{&lt;br/&gt;                &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; (data.works) {&lt;br/&gt;                }&lt;br/&gt;            });&lt;br/&gt;            request.fail(&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt; (&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;jqXHR, textStatus&lt;/span&gt;) &lt;/span&gt;{&lt;br/&gt;                &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; (jqXHR.status == &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;404&lt;/span&gt;) {&lt;br/&gt;                    alert(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;페이지가 존재하지 않습니다.&quot;&lt;/span&gt;);&lt;br/&gt;                } &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; (jqXHR.status == &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;403&lt;/span&gt;) {&lt;br/&gt;                    alert(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;로그인 해주세요.&quot;&lt;/span&gt;);&lt;br/&gt;                } &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;else&lt;/span&gt; {&lt;br/&gt;                    alert(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;문제가 발생했습니다. 다시 시도해주세요.&quot;&lt;/span&gt;);&lt;br/&gt;                }&lt;br/&gt;            });&lt;br/&gt;        }&lt;br/&gt;    &lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;script&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;head&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;body&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;{% if user.is_authenticated %}&lt;br/&gt;    {{ user }}으로 접속되어 있습니다.&lt;br/&gt;{% else %}&lt;br/&gt;    로그인 해주세요!&lt;br/&gt;{% endif %}&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;charge-type&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;billing-title&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;        결제방식&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;billing-radio&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;label&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;control control--radio&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;input&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;radio&quot;&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;type&quot;&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;card&quot;&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;checked&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;checked&quot;&lt;/span&gt;/&gt;&lt;/span&gt;&lt;br/&gt;            신용카드&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;label&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;label&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;control control--radio&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;input&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;radio&quot;&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;type&quot;&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;trans&quot;&lt;/span&gt;/&gt;&lt;/span&gt;&lt;br/&gt;            실시간 계좌이체&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;label&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;label&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;control control--radio&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;input&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;radio&quot;&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;type&quot;&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;phone&quot;&lt;/span&gt;/&gt;&lt;/span&gt;&lt;br/&gt;            휴대폰&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;label&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;label&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;control control--radio&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;input&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;radio&quot;&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;type&quot;&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;vbank&quot;&lt;/span&gt;/&gt;&lt;/span&gt;&lt;br/&gt;            가상계좌 입금&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;label&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;charge-total&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;    총 결제금액 &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;span&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;total&quot;&lt;/span&gt;&gt;&lt;/span&gt;1000원&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;span&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;charge-click&quot;&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;button&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;class&lt;/span&gt;=&lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;&quot;charge-button&quot;&lt;/span&gt;&gt;&lt;/span&gt;충전하기&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;button&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;div&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;body&lt;/span&gt;&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;&lt;/&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;html&lt;/span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 로컬 서버를 띄우고 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;localhost:8000&lt;/code&gt;에 접속해보자.&lt;/p&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;$ python manage.py runserver&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;참고로 결제를 하기 위해서는 로그인 되어 있는 상태이여야 한다.&lt;/p&gt;



&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;img src=&quot;https://cdn-images.postach.io/02c8394b-e7c3-4ece-a900-b88ef8c1ede9/eadc82a0-4983-4a65-bb2c-cb25c2e95f38/139618c7-52bb-4f55-82a4-fc5fbe7f12e0.png&quot;  longdesc=&quot;./스크린샷 2017-02-17 오전 1.14.24.png&quot; style=&quot;border: 0; vertical-align: middle; max-width: 100%;&quot; alt=&quot;Alt text&quot;/&gt;&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 결제를 진행해보면 실제로 돈이 빠지는걸 확인할수 있다.&lt;/p&gt;&lt;/div&gt;&lt;center style=&quot;display:none&quot;&gt;%23%23%23%5BDjango%5DIamport%20%uC5F0%uB3D9%uD558%uAE30%20-%204%0A@%28Django%29%5Bdjango%2C%20iamport%5D%0A%0A%uC774%uBC88%uC5D0%uB294%20template%uC778%20html%uB97C%20%uC791%uC131%uD574%uBCF4%uC790.%20%uC5EC%uAE30%uC11C%20%60IMP.init%28%29%60%20%uAC12%uC740%20%uC544%uC5E0%uD3EC%uD2B8%20%uAD00%uB9AC%uC790%20%uD398%uC774%uC9C0%uC5D0%uC11C%20%uAC00%uB9F9%uC810%20%uCF54%uB4DC%uB97C%20%uB123%uC5B4%uC8FC%uBA74%20%uB41C%uB2E4.%0A%0A%60%60%60vbscript-html%0A%7B%25%20load%20staticfiles%20%25%7D%0A%3C%21DOCTYPE%20html%3E%0A%3Chtml%20lang%3D%22ko%22%3E%0A%3Chead%3E%0A%20%20%20%20%3Cmeta%20charset%3D%22UTF-8%22%3E%0A%20%20%20%20%3Ctitle%3E%uB514%uC81C%uC774%uBE44%uBC84%3C/title%3E%0A%20%20%20%20%3Cscript%20src%3D%22https%3A//code.jquery.com/jquery-2.2.4.min.js%22%3E%3C/script%3E%0A%20%20%20%20%3Cscript%20type%3D%22text/javascript%22%20src%3D%22https%3A//service.iamport.kr/js/iamport.payment-1.1.1.js%22%3E%3C/script%3E%0A%20%20%20%20%3Cscript%20type%3D%22text/javascript%22%3E%0A%20%20%20%20%20%20%20%20%24%28function%20%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20IMP%20%3D%20window.IMP%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20//%20%uAC00%uB9F9%uC810%20%uCF54%uB4DC%0A%20%20%20%20%20%20%20%20%20%20%20%20IMP.init%28%27imp68762150%27%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%24%28%27.charge-button%27%29.on%28%27click%27%2C%20function%20%28e%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20amount%20%3D%20parseInt%28%24%28%27.charge-total%20%23total%27%29.text%28%29.replace%28%27%2C%27%2C%20%27%27%29.slice%280%2C%20-1%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20type%20%3D%20%24%28%27.charge-type%20input%3Achecked%27%29.val%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20merchant_id%20%3D%20AjaxStoreTransaction%28e%2C%20amount%2C%20type%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28merchant_id%20%21%3D%3D%20%27%27%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20IMP.request_pay%28%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pg%3A%20%27html5_inicis%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20escrow%3A%20false%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20digital%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pay_method%3A%20type%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20merchant_uid%3A%20merchant_id%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20%27%uD3EC%uC778%uD2B8%27%20+%20amount%20+%20%27%uC6D0%20%uCDA9%uC804%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20amount%3A%20amount%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%20function%20%28rsp%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28rsp.success%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20msg%20%3D%20%27%uACB0%uC81C%uAC00%20%uC644%uB8CC%uB418%uC5C8%uC2B5%uB2C8%uB2E4.%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20msg%20+%3D%20%27%uACE0%uC720ID%20%3A%20%27%20+%20rsp.imp_uid%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20msg%20+%3D%20%27%uC0C1%uC810%20%uAC70%uB798ID%20%3A%20%27%20+%20rsp.merchant_uid%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20msg%20+%3D%20%27%uACB0%uC81C%20%uAE08%uC561%20%3A%20%27%20+%20rsp.paid_amount%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20msg%20+%3D%20%27%uCE74%uB4DC%20%uC2B9%uC778%uBC88%uD638%20%3A%20%27%20+%20rsp.apply_num%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ImpTransaction%28e%2C%20rsp.merchant_uid%2C%20rsp.imp_uid%2C%20rsp.paid_amount%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20msg%20%3D%20%27%uACB0%uC81C%uC5D0%20%uC2E4%uD328%uD558%uC600%uC2B5%uB2C8%uB2E4.%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20msg%20+%3D%20%27%uC5D0%uB7EC%uB0B4%uC6A9%20%3A%20%27%20+%20rsp.error_msg%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.log%28msg%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20%20%20function%20AjaxStoreTransaction%28e%2C%20amount%2C%20type%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20merchant_id%20%3D%20%27%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20request%20%3D%20%24.ajax%28%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20method%3A%20%22POST%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20url%3A%20%27%7B%25%20url%20%22point_checkout%22%20%25%7D%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20async%3A%20false%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20data%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20amount%3A%20amount%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20type%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20csrfmiddlewaretoken%3A%20%27%7B%7B%20csrf_token%20%7D%7D%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20request.done%28function%20%28data%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28data.works%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20merchant_id%20%3D%20data.merchant_id%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20request.fail%28function%20%28jqXHR%2C%20textStatus%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28jqXHR.status%20%3D%3D%20404%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert%28%22%uD398%uC774%uC9C0%uAC00%20%uC874%uC7AC%uD558%uC9C0%20%uC54A%uC2B5%uB2C8%uB2E4.%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20%28jqXHR.status%20%3D%3D%20403%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert%28%22%uB85C%uADF8%uC778%20%uD574%uC8FC%uC138%uC694.%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert%28%22%uBB38%uC81C%uAC00%20%uBC1C%uC0DD%uD588%uC2B5%uB2C8%uB2E4.%20%uB2E4%uC2DC%20%uC2DC%uB3C4%uD574%uC8FC%uC138%uC694.%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20merchant_id%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20function%20ImpTransaction%28e%2C%20merchant_id%2C%20imp_id%2C%20amount%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20request%20%3D%20%24.ajax%28%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20method%3A%20%22POST%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20url%3A%20%27%7B%25%20url%20%22point_validation%22%20%25%7D%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20async%3A%20false%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20data%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20merchant_id%3A%20merchant_id%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20imp_id%3A%20imp_id%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20amount%3A%20amount%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20csrfmiddlewaretoken%3A%20%27%7B%7B%20csrf_token%20%7D%7D%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20request.done%28function%20%28data%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28data.works%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20request.fail%28function%20%28jqXHR%2C%20textStatus%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28jqXHR.status%20%3D%3D%20404%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert%28%22%uD398%uC774%uC9C0%uAC00%20%uC874%uC7AC%uD558%uC9C0%20%uC54A%uC2B5%uB2C8%uB2E4.%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20%28jqXHR.status%20%3D%3D%20403%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert%28%22%uB85C%uADF8%uC778%20%uD574%uC8FC%uC138%uC694.%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert%28%22%uBB38%uC81C%uAC00%20%uBC1C%uC0DD%uD588%uC2B5%uB2C8%uB2E4.%20%uB2E4%uC2DC%20%uC2DC%uB3C4%uD574%uC8FC%uC138%uC694.%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%3C/script%3E%0A%3C/head%3E%0A%3Cbody%3E%0A%7B%25%20if%20user.is_authenticated%20%25%7D%0A%20%20%20%20%7B%7B%20user%20%7D%7D%uC73C%uB85C%20%uC811%uC18D%uB418%uC5B4%20%uC788%uC2B5%uB2C8%uB2E4.%0A%7B%25%20else%20%25%7D%0A%20%20%20%20%uB85C%uADF8%uC778%20%uD574%uC8FC%uC138%uC694%21%0A%7B%25%20endif%20%25%7D%0A%0A%3Cdiv%20class%3D%22charge-type%22%3E%0A%20%20%20%20%3Cdiv%20class%3D%22billing-title%22%3E%0A%20%20%20%20%20%20%20%20%uACB0%uC81C%uBC29%uC2DD%0A%20%20%20%20%3C/div%3E%0A%20%20%20%20%3Cdiv%20class%3D%22billing-radio%22%3E%0A%20%20%20%20%20%20%20%20%3Clabel%20class%3D%22control%20control--radio%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20type%3D%22radio%22%20name%3D%22type%22%20value%3D%22card%22%20checked%3D%22checked%22/%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%uC2E0%uC6A9%uCE74%uB4DC%0A%20%20%20%20%20%20%20%20%3C/label%3E%0A%20%20%20%20%20%20%20%20%3Clabel%20class%3D%22control%20control--radio%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20type%3D%22radio%22%20name%3D%22type%22%20value%3D%22trans%22/%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%uC2E4%uC2DC%uAC04%20%uACC4%uC88C%uC774%uCCB4%0A%20%20%20%20%20%20%20%20%3C/label%3E%0A%20%20%20%20%20%20%20%20%3Clabel%20class%3D%22control%20control--radio%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20type%3D%22radio%22%20name%3D%22type%22%20value%3D%22phone%22/%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%uD734%uB300%uD3F0%0A%20%20%20%20%20%20%20%20%3C/label%3E%0A%20%20%20%20%20%20%20%20%3Clabel%20class%3D%22control%20control--radio%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20type%3D%22radio%22%20name%3D%22type%22%20value%3D%22vbank%22/%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%uAC00%uC0C1%uACC4%uC88C%20%uC785%uAE08%0A%20%20%20%20%20%20%20%20%3C/label%3E%0A%20%20%20%20%3C/div%3E%0A%3C/div%3E%0A%3Cdiv%20class%3D%22charge-total%22%3E%0A%20%20%20%20%uCD1D%20%uACB0%uC81C%uAE08%uC561%20%3Cspan%20id%3D%22total%22%3E1000%uC6D0%3C/span%3E%0A%3C/div%3E%0A%3Cdiv%20class%3D%22charge-click%22%3E%0A%20%20%20%20%3Cbutton%20class%3D%22charge-button%22%3E%uCDA9%uC804%uD558%uAE30%3C/button%3E%0A%3C/div%3E%0A%3C/body%3E%0A%3C/html%3E%0A%60%60%60%0A%0A%uC774%uC81C%20%uB85C%uCEEC%20%uC11C%uBC84%uB97C%20%uB744%uC6B0%uACE0%20%60localhost%3A8000%60%uC5D0%20%uC811%uC18D%uD574%uBCF4%uC790.%0A%60%60%60bash%0A%24%20python%20manage.py%20runserver%0A%60%60%60%0A%0A%uCC38%uACE0%uB85C%20%uACB0%uC81C%uB97C%20%uD558%uAE30%20%uC704%uD574%uC11C%uB294%20%uB85C%uADF8%uC778%20%uB418%uC5B4%20%uC788%uB294%20%uC0C1%uD0DC%uC774%uC5EC%uC57C%20%uD55C%uB2E4.%0A%0A%21%5BAlt%20text%5D%28./%u1109%u1173%u110F%u1173%u1105%u1175%u11AB%u1109%u1163%u11BA%202017-02-17%20%u110B%u1169%u110C%u1165%u11AB%201.14.24.png%29%0A%0A%uC774%uC81C%20%uACB0%uC81C%uB97C%20%uC9C4%uD589%uD574%uBCF4%uBA74%20%uC2E4%uC81C%uB85C%20%uB3C8%uC774%20%uBE60%uC9C0%uB294%uAC78%20%uD655%uC778%uD560%uC218%20%uC788%uB2E4.&lt;/center&gt;&lt;br/&gt;&lt;/div&gt;
</content>
  </entry>
  <entry xml:base="http://genius-project.postach.io/feed.xml">
    <title type="text">[Django]Iamport 연동하기 - 3</title>
    <id>https://genius-project.postach.io/post/django-iamport-yeondonghagi-3</id>
    <updated>2017-02-16T16:27:32.293000Z</updated>
    <published>2017-02-16T16:16:55Z</published>
    <link href="https://genius-project.postach.io/post/django-iamport-yeondonghagi-3" />
    <author>
      <name>Jaewon Kwon</name>
    </author>
    <category term="django" />
    <category term="iamport" />
    <content type="html">&lt;div&gt;&lt;del style=&quot;position:relative;display:block;z-index:10;&quot;&gt;&lt;a  style=&quot;position: absolute;color: #FFF;text-decoration: none;font-size: 12px;height: 25px;border-radius: 0;margin-top: -20px;right: 15px;background: rgba(0, 0, 0, 0);border-left: 10px solid #BB3A34;border-right: 10px solid #BB3A34;border-bottom: 5px solid rgba(0, 0, 0, 0);width: 0;text-indent:-100000px;&quot; href=&quot;http://marxi.co/#/?provider=evernote_int&amp;guid=d47a712a-532e-4bcd-8c60-aeab7002cdd7&amp;notebook=Postach.io&quot;&gt;Edit&lt;/a&gt;&lt;/del&gt;&lt;div  style=&quot;color: #2c3f51; line-height: 1.6;&quot;&gt;
                        
                    



&lt;h3 style=&quot;font-family: inherit; font-weight: bold; color: inherit; margin-top: 21px; margin-bottom: 10.5px; font-size: 1.7em; margin: 1.2em 0 .6em 0; text-align: start; line-height: 1.6;&quot;&gt;[Django]Iamport 연동하기 - 3&lt;/h3&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;/&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이전까진 결제에 대한 model 부분이였다면 이번에는 장고의 view를 다루어 볼 것이다. billing의 view를 작성해보자. &lt;br/&gt;
python 3.6 , django 1.10&lt;/p&gt;

&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# biliing/views.py&lt;/span&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; django.shortcuts &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; render&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; django.http &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; JsonResponse&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; .models &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; (&lt;br/&gt;    PointTransaction, &lt;br/&gt;    Point,&lt;br/&gt;)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;class&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;PointCheckoutAjaxView&lt;/span&gt;&lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(View)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;post&lt;/span&gt;&lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(self, request, *args, **kwargs)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;        &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;not&lt;/span&gt; request.user.is_authenticated():&lt;br/&gt;            &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; JsonResponse({}, status=&lt;span  style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;401&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;        user = request.user&lt;br/&gt;        amount = request.POST.get(&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'amount'&lt;/span&gt;)&lt;br/&gt;        type = request.POST.get(&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'type'&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;        &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;try&lt;/span&gt;:&lt;br/&gt;            trans = PointTransaction.objects.create_new(&lt;br/&gt;                user=user,&lt;br/&gt;                amount=amount,&lt;br/&gt;                type=type&lt;br/&gt;            )&lt;br/&gt;        &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;except&lt;/span&gt;:&lt;br/&gt;            trans = &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;None&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;        &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; trans &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;is&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;not&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;None&lt;/span&gt;:&lt;br/&gt;            data = {&lt;br/&gt;                &lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;works&quot;&lt;/span&gt;: &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;,&lt;br/&gt;                &lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;merchant_id&quot;&lt;/span&gt;: trans&lt;br/&gt;            }&lt;br/&gt;            &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; JsonResponse(data)&lt;br/&gt;        &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;else&lt;/span&gt;:&lt;br/&gt;            &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; JsonResponse({}, status=&lt;span  style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;401&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;class&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;PointImpAjaxView&lt;/span&gt;&lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(View)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;post&lt;/span&gt;&lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(self, request, *args, **kwargs)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;        &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;not&lt;/span&gt; request.user.is_authenticated():&lt;br/&gt;            &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; JsonResponse({}, status=&lt;span  style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;401&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;        user = request.user&lt;br/&gt;        merchant_id = request.POST.get(&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'merchant_id'&lt;/span&gt;)&lt;br/&gt;        imp_id = request.POST.get(&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'imp_id'&lt;/span&gt;)&lt;br/&gt;        amount = request.POST.get(&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'amount'&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;        &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;try&lt;/span&gt;:&lt;br/&gt;            trans = PointTransaction.objects.get(&lt;br/&gt;                user=user,&lt;br/&gt;                order_id=merchant_id,&lt;br/&gt;                amount=amount&lt;br/&gt;            )&lt;br/&gt;        &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;except&lt;/span&gt;:&lt;br/&gt;            trans = &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;None&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;        &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; trans &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;is&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;not&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;None&lt;/span&gt;:&lt;br/&gt;            trans.transaction_id = imp_id&lt;br/&gt;            trans.success = &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;&lt;br/&gt;            trans.save()&lt;br/&gt;&lt;br/&gt;            data = {&lt;br/&gt;                &lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;works&quot;&lt;/span&gt;: &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; JsonResponse(data)&lt;br/&gt;        &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;else&lt;/span&gt;:&lt;br/&gt;            &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; JsonResponse({}, status=&lt;span  style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;401&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;charge_point&lt;/span&gt;&lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(request)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    template = &lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'charge.html'&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;    &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; render(request, template)&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;실제 유저가 결제를 진행하게 되면 두 가지 과정을 거치게 된다. 첫번째는 유저가 서버에 요청한 금액을 아엠포트에 보내는 과정과 두 번째는 유저가 결제를 다 하고 나서 서버에 저장된 결제 정보와 아엠포트에 저장된 정보(실제 결제 정보)를 비교하는 과정이다. &lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 url.py에 view를 연결하자.&lt;/p&gt;



&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# urls.py&lt;/span&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; django.conf.urls &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; url&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; django.contrib &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; admin&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; billing.views &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; (&lt;br/&gt;    charge_point,&lt;br/&gt;    PointCheckoutAjaxView,&lt;br/&gt;    PointImpAjaxView,&lt;br/&gt;)&lt;br/&gt;&lt;br/&gt;urlpatterns = [&lt;br/&gt;    url(&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;r'^charge/$'&lt;/span&gt;, charge_point),&lt;br/&gt;    url(&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;r'^checkout/$'&lt;/span&gt;, PointCheckoutAjaxView.as_view(), name=&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'point_checkout'&lt;/span&gt;),&lt;br/&gt;    url(&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;r'^validation/$'&lt;/span&gt;, PointImpAjaxView.as_view(), name=&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'point_validation'&lt;/span&gt;),&lt;br/&gt;&lt;br/&gt;    url(&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;r'^admin/'&lt;/span&gt;, admin.site.urls),&lt;br/&gt;]&lt;br/&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이 다음으로는 유저가 실제 결제를 할 수 있는 화면을 만들어보자.&lt;/p&gt;&lt;/div&gt;&lt;center style='display:none'&gt;%23%23%23%5BDjango%5DIamport%20%uC5F0%uB3D9%uD558%uAE30%20-%203%0A@%28Postach.io%29%5Bdjango%2C%20iamport%2C%20published%5D%0A%0A%uC774%uC804%uAE4C%uC9C4%20%uACB0%uC81C%uC5D0%20%uB300%uD55C%20model%20%uBD80%uBD84%uC774%uC600%uB2E4%uBA74%20%uC774%uBC88%uC5D0%uB294%20%uC7A5%uACE0%uC758%20view%uB97C%20%uB2E4%uB8E8%uC5B4%20%uBCFC%20%uAC83%uC774%uB2E4.%20billing%uC758%20view%uB97C%20%uC791%uC131%uD574%uBCF4%uC790.%0Apython%203.6%20%2C%20django%201.10%0A%0A%60%60%60python%0A%23%20biliing/views.py%0Afrom%20django.shortcuts%20import%20render%0Afrom%20django.http%20import%20JsonResponse%0Afrom%20.models%20import%20%28%0A%09PointTransaction%2C%20%0A%09Point%2C%0A%29%0A%0A%0Aclass%20PointCheckoutAjaxView%28View%29%3A%0A%20%20%20%20def%20post%28self%2C%20request%2C%20*args%2C%20**kwargs%29%3A%0A%20%20%20%20%20%20%20%20if%20not%20request.user.is_authenticated%28%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20JsonResponse%28%7B%7D%2C%20status%3D401%29%0A%0A%20%20%20%20%20%20%20%20user%20%3D%20request.user%0A%20%20%20%20%20%20%20%20amount%20%3D%20request.POST.get%28%27amount%27%29%0A%20%20%20%20%20%20%20%20type%20%3D%20request.POST.get%28%27type%27%29%0A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20trans%20%3D%20PointTransaction.objects.create_new%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20user%3Duser%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20amount%3Damount%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3Dtype%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%20%20%20%20%20%20%20%20except%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20trans%20%3D%20None%0A%0A%20%20%20%20%20%20%20%20if%20trans%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20data%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22works%22%3A%20True%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22merchant_id%22%3A%20trans%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20JsonResponse%28data%29%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20JsonResponse%28%7B%7D%2C%20status%3D401%29%0A%0A%0Aclass%20PointImpAjaxView%28View%29%3A%0A%20%20%20%20def%20post%28self%2C%20request%2C%20*args%2C%20**kwargs%29%3A%0A%20%20%20%20%20%20%20%20if%20not%20request.user.is_authenticated%28%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20JsonResponse%28%7B%7D%2C%20status%3D401%29%0A%0A%20%20%20%20%20%20%20%20user%20%3D%20request.user%0A%20%20%20%20%20%20%20%20merchant_id%20%3D%20request.POST.get%28%27merchant_id%27%29%0A%20%20%20%20%20%20%20%20imp_id%20%3D%20request.POST.get%28%27imp_id%27%29%0A%20%20%20%20%20%20%20%20amount%20%3D%20request.POST.get%28%27amount%27%29%0A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20trans%20%3D%20PointTransaction.objects.get%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20user%3Duser%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20order_id%3Dmerchant_id%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20amount%3Damount%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%20%20%20%20%20%20%20%20except%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20trans%20%3D%20None%0A%0A%20%20%20%20%20%20%20%20if%20trans%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20trans.transaction_id%20%3D%20imp_id%0A%20%20%20%20%20%20%20%20%20%20%20%20trans.success%20%3D%20True%0A%20%20%20%20%20%20%20%20%20%20%20%20trans.save%28%29%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20data%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22works%22%3A%20True%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20JsonResponse%28data%29%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20JsonResponse%28%7B%7D%2C%20status%3D401%29%0A%0Adef%20charge_point%28request%29%3A%0A%20%20%20%20template%20%3D%20%27charge.html%27%0A%20%20%20%20%0A%20%20%20%20return%20render%28request%2C%20template%29%0A%60%60%60%0A%0A%uC2E4%uC81C%20%uC720%uC800%uAC00%20%uACB0%uC81C%uB97C%20%uC9C4%uD589%uD558%uAC8C%20%uB418%uBA74%20%uB450%20%uAC00%uC9C0%20%uACFC%uC815%uC744%20%uAC70%uCE58%uAC8C%20%uB41C%uB2E4.%20%uCCAB%uBC88%uC9F8%uB294%20%uC720%uC800%uAC00%20%uC11C%uBC84%uC5D0%20%uC694%uCCAD%uD55C%20%uAE08%uC561%uC744%20%uC544%uC5E0%uD3EC%uD2B8%uC5D0%20%uBCF4%uB0B4%uB294%20%uACFC%uC815%uACFC%20%uB450%20%uBC88%uC9F8%uB294%20%uC720%uC800%uAC00%20%uACB0%uC81C%uB97C%20%uB2E4%20%uD558%uACE0%20%uB098%uC11C%20%uC11C%uBC84%uC5D0%20%uC800%uC7A5%uB41C%20%uACB0%uC81C%20%uC815%uBCF4%uC640%20%uC544%uC5E0%uD3EC%uD2B8%uC5D0%20%uC800%uC7A5%uB41C%20%uC815%uBCF4%28%uC2E4%uC81C%20%uACB0%uC81C%20%uC815%uBCF4%29%uB97C%20%uBE44%uAD50%uD558%uB294%20%uACFC%uC815%uC774%uB2E4.%20%0A%0A%uC774%uC81C%20url.py%uC5D0%20view%uB97C%20%uC5F0%uACB0%uD558%uC790.%0A%60%60%60python%0A%23%20urls.py%0Afrom%20django.conf.urls%20import%20url%0Afrom%20django.contrib%20import%20admin%0Afrom%20billing.views%20import%20%28%0A%20%20%20%20charge_point%2C%0A%20%20%20%20PointCheckoutAjaxView%2C%0A%20%20%20%20PointImpAjaxView%2C%0A%29%0A%0Aurlpatterns%20%3D%20%5B%0A%20%20%20%20url%28r%27%5Echarge/%24%27%2C%20charge_point%29%2C%0A%20%20%20%20url%28r%27%5Echeckout/%24%27%2C%20PointCheckoutAjaxView.as_view%28%29%2C%20name%3D%27point_checkout%27%29%2C%0A%20%20%20%20url%28r%27%5Evalidation/%24%27%2C%20PointImpAjaxView.as_view%28%29%2C%20name%3D%27point_validation%27%29%2C%0A%0A%20%20%20%20url%28r%27%5Eadmin/%27%2C%20admin.site.urls%29%2C%0A%5D%0A%0A%60%60%60%0A%0A%uC774%20%uB2E4%uC74C%uC73C%uB85C%uB294%20%uC720%uC800%uAC00%20%uC2E4%uC81C%20%uACB0%uC81C%uB97C%20%uD560%20%uC218%20%uC788%uB294%20%uD654%uBA74%uC744%20%uB9CC%uB4E4%uC5B4%uBCF4%uC790.&lt;/center&gt;&lt;br/&gt;&lt;/div&gt;
</content>
  </entry>
  <entry xml:base="http://genius-project.postach.io/feed.xml">
    <title type="text">[Django]Iamport 연동하기 - 1</title>
    <id>https://genius-project.postach.io/post/django-iamport-yeondonghagi-1</id>
    <updated>2017-02-16T16:17:49.171000Z</updated>
    <published>2017-02-16T16:16:55Z</published>
    <link href="https://genius-project.postach.io/post/django-iamport-yeondonghagi-1" />
    <author>
      <name>Jaewon Kwon</name>
    </author>
    <category term="django" />
    <category term="iamport" />
    <content type="html">&lt;div&gt;&lt;del style=&quot;position:relative;display:block;z-index:10;&quot;&gt;&lt;a style=&quot;position: absolute;color: #FFF;text-decoration: none;font-size: 12px;height: 25px;border-radius: 0;margin-top: -20px;right: 15px;background: rgba(0, 0, 0, 0);border-left: 10px solid #BB3A34;border-right: 10px solid #BB3A34;border-bottom: 5px solid rgba(0, 0, 0, 0);width: 0;text-indent:-100000px;&quot; href=&quot;http://marxi.co/#/?provider=evernote_int&amp;guid=4dbe4e03-df05-4885-86cc-91f35d57585a&amp;notebook=Django&quot;&gt;Edit&lt;/a&gt;&lt;/del&gt;&lt;div style=&quot;color: #2c3f51; line-height: 1.6;&quot;&gt;
                        
                    



&lt;h3 style=&quot;font-family: inherit; font-weight: bold; color: inherit; margin-top: 21px; margin-bottom: 10.5px; font-size: 1.7em; margin: 1.2em 0 .6em 0; text-align: start; line-height: 1.6;&quot;&gt;[Django]Iamport 연동하기 - 1&lt;/h3&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;/&gt;



&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;img src=&quot;https://cdn-images.postach.io/02c8394b-e7c3-4ece-a900-b88ef8c1ede9/ff740d72-7b4d-402b-9940-c41469e6208a/c42149dd-4033-42b0-b65f-084d23c01ae2.png&quot;  longdesc=&quot;./스크린샷 2016-11-19 오후 6.39.05.png&quot; style=&quot;border: 0; vertical-align: middle; max-width: 100%;&quot; alt=&quot;Alt text&quot;/&gt;&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;오늘은 결제모듈계의 혁신 아엠포트에 대해 다뤄보도록 하자. 결제모듈을 처음부터 개발해본 개발자라면 ‘결’자만 들어도 부들부들하는데, 아엠포트는 진짜 이러한 개발자의 니즈를 정확히 비집고 들어와 서비스 하고 있다. &lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;특히, 우리나라 대표 밴더사들(이x시스, 다x 등등) python 모듈을 절대 안 가르쳐 주는데 (심지어 대부분 php로 되어 있어서 php를 python에 붙여야하는 개고생을 해야한다.) &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;Django&lt;/code&gt;에 이러한 결제모듈 하나 다는게 여간 쉽진 않다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;아엠포트를 들어가보면 1시간만에 결제모듈 달기라는 엄청난 비젼을 제시하고 있는데, 실제로 한시간도 안 걸린다.(물론 transaction 구현할려면 조금 복잡해지긴 한다.)&lt;/p&gt;



&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;img src=&quot;https://cdn-images.postach.io/02c8394b-e7c3-4ece-a900-b88ef8c1ede9/ff740d72-7b4d-402b-9940-c41469e6208a/766b5d44-b921-463e-b691-dfc53706423e.png&quot;  longdesc=&quot;./스크린샷 2017-02-16 오후 10.43.16.png&quot; style=&quot;border: 0; vertical-align: middle; max-width: 100%;&quot; alt=&quot;Alt text&quot;/&gt;&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;아엠포트에 가입을 하고 나서 로그인을 한 다음에  REST API 키와 REST API secret를 복사해오자. 이 정보를 바탕으로 아엠포트와 통신을 할 것이다..&lt;/p&gt;

&lt;blockquote style=&quot;padding: 15px 20px; margin: 0 0 1.1em; border-left: 5px solid rgba(102,128,153,0.075); border-left-width: 10px; background-color: rgba(102,128,153,0.05); border-top-right-radius: 5px; border-bottom-right-radius: 5px;&quot;&gt;
  &lt;p style=&quot;margin: 0 0 1.1em; font-size: 1em; font-weight: 300; margin-bottom: 0; line-height: 1.6;&quot;&gt;이번 목표는 포인트를 결제 시키는 것이다.  실제로 쇼핑몰 같은 것을 만들 때는 상품 여러개를 (장바구니에 있는 상품들) 결제 할 수 있는데 이번 편을 응용하면 충분히 할 수 있을 것이다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;먼저 결제를 담당할 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;billing&lt;/code&gt; 앱을 만들어보자.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;$ python manage.py startapp billing&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;간단하게 billing 앱을 등록해주자. 그리고 위에서 가지고온 API 키와 screte를 넣어주자.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# settings.py&lt;/span&gt;&lt;br/&gt;INSTALLED_APPS = [&lt;br/&gt;   ...&lt;br/&gt;   &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'billing'&lt;/span&gt;,&lt;br/&gt;   ...&lt;br/&gt;]&lt;br/&gt;&lt;br/&gt;IAMPORT_KEY = &lt;API Key&gt;&lt;br/&gt;IAMPORT_SECRET = &lt;API Secret&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 주문에 대한 모델을 작성해보자. 포인트 대한 주문을 Point라고 할 것이다.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# billing/models.py&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; django.db &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; models&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# User 모델은 알아서 가져오기&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; users.models &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; MyUser&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;Point&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(models.Model)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    user = models.OneToOneField(MyUser)&lt;br/&gt;    point = models.PositiveIntegerField(default=&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;0&lt;/span&gt;)&lt;br/&gt;    created = models.DateTimeField(auto_now_add=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;, auto_now=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;False&lt;/span&gt;)&lt;br/&gt;    timestamp = models.DateTimeField(auto_now_add=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;False&lt;/span&gt;, auto_now=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;__str__&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(self)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; str(self.point)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;PointTransaction&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(models.Model)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    user = models.ForeignKey(MyUser)&lt;br/&gt;    transaction_id = models.CharField(max_length=&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;120&lt;/span&gt;, null=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;, blank=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;)&lt;br/&gt;    order_id = models.CharField(max_length=&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;120&lt;/span&gt;, unique=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;)&lt;br/&gt;    amount = models.PositiveIntegerField(default=&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;0&lt;/span&gt;)&lt;br/&gt;    success = models.BooleanField(default=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;False&lt;/span&gt;)&lt;br/&gt;    transaction_status = models.CharField(max_length=&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;220&lt;/span&gt;, null=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;, blank=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;)&lt;br/&gt;    type = models.CharField(max_length=&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;120&lt;/span&gt;)&lt;br/&gt;    created = models.DateTimeField(auto_now_add=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;, auto_now=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;False&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;__str__&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(self)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; self.order_id&lt;br/&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e; font-style: italic;&quot;&gt;Meta&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;        ordering = [&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'-created'&lt;/span&gt;]&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;Point 모델은 유저가 결제를 시도한 정보이고, PointTransaction은 실제 결제모듈을 통해 결제가 이루어지는 정보를 담는 모델이다. 다음 편에서는 아임프토와 통신할 수 있는 모듈을 만들어보자.&lt;/p&gt;&lt;/div&gt;&lt;center style=&quot;display:none&quot;&gt;%23%23%23%5BDjango%5DIamport%20%uC5F0%uB3D9%uD558%uAE30%20-%201%0A@%28Django%29%5Bdjango%2C%20iamport%5D%0A%0A%21%5BAlt%20text%5D%28./%u1109%u1173%u110F%u1173%u1105%u1175%u11AB%u1109%u1163%u11BA%202016-11-19%20%u110B%u1169%u1112%u116E%206.39.05.png%29%0A%0A%uC624%uB298%uC740%20%uACB0%uC81C%uBAA8%uB4C8%uACC4%uC758%20%uD601%uC2E0%20%uC544%uC5E0%uD3EC%uD2B8%uC5D0%20%uB300%uD574%20%uB2E4%uB904%uBCF4%uB3C4%uB85D%20%uD558%uC790.%20%uACB0%uC81C%uBAA8%uB4C8%uC744%20%uCC98%uC74C%uBD80%uD130%20%uAC1C%uBC1C%uD574%uBCF8%20%uAC1C%uBC1C%uC790%uB77C%uBA74%20%27%uACB0%27%uC790%uB9CC%20%uB4E4%uC5B4%uB3C4%20%uBD80%uB4E4%uBD80%uB4E4%uD558%uB294%uB370%2C%20%uC544%uC5E0%uD3EC%uD2B8%uB294%20%uC9C4%uC9DC%20%uC774%uB7EC%uD55C%20%uAC1C%uBC1C%uC790%uC758%20%uB2C8%uC988%uB97C%20%uC815%uD655%uD788%20%uBE44%uC9D1%uACE0%20%uB4E4%uC5B4%uC640%20%uC11C%uBE44%uC2A4%20%uD558%uACE0%20%uC788%uB2E4.%20%0A%0A%uD2B9%uD788%2C%20%uC6B0%uB9AC%uB098%uB77C%20%uB300%uD45C%20%uBC34%uB354%uC0AC%uB4E4%28%uC774x%uC2DC%uC2A4%2C%20%uB2E4x%20%uB4F1%uB4F1%29%20python%20%uBAA8%uB4C8%uC744%20%uC808%uB300%20%uC548%20%uAC00%uB974%uCCD0%20%uC8FC%uB294%uB370%20%28%uC2EC%uC9C0%uC5B4%20%uB300%uBD80%uBD84%20php%uB85C%20%uB418%uC5B4%20%uC788%uC5B4%uC11C%20php%uB97C%20python%uC5D0%20%uBD99%uC5EC%uC57C%uD558%uB294%20%uAC1C%uACE0%uC0DD%uC744%20%uD574%uC57C%uD55C%uB2E4.%29%20%60Django%60%uC5D0%20%uC774%uB7EC%uD55C%20%uACB0%uC81C%uBAA8%uB4C8%20%uD558%uB098%20%uB2E4%uB294%uAC8C%20%uC5EC%uAC04%20%uC27D%uC9C4%20%uC54A%uB2E4.%0A%0A%uC544%uC5E0%uD3EC%uD2B8%uB97C%20%uB4E4%uC5B4%uAC00%uBCF4%uBA74%201%uC2DC%uAC04%uB9CC%uC5D0%20%uACB0%uC81C%uBAA8%uB4C8%20%uB2EC%uAE30%uB77C%uB294%20%uC5C4%uCCAD%uB09C%20%uBE44%uC83C%uC744%20%uC81C%uC2DC%uD558%uACE0%20%uC788%uB294%uB370%2C%20%uC2E4%uC81C%uB85C%20%uD55C%uC2DC%uAC04%uB3C4%20%uC548%20%uAC78%uB9B0%uB2E4.%28%uBB3C%uB860%20transaction%20%uAD6C%uD604%uD560%uB824%uBA74%20%uC870%uAE08%20%uBCF5%uC7A1%uD574%uC9C0%uAE34%20%uD55C%uB2E4.%29%0A%0A%21%5BAlt%20text%5D%28./%u1109%u1173%u110F%u1173%u1105%u1175%u11AB%u1109%u1163%u11BA%202017-02-16%20%u110B%u1169%u1112%u116E%2010.43.16.png%29%0A%0A%uC544%uC5E0%uD3EC%uD2B8%uC5D0%20%uAC00%uC785%uC744%20%uD558%uACE0%20%uB098%uC11C%20%uB85C%uADF8%uC778%uC744%20%uD55C%20%uB2E4%uC74C%uC5D0%20%20REST%20API%20%uD0A4%uC640%20REST%20API%20secret%uB97C%20%uBCF5%uC0AC%uD574%uC624%uC790.%20%uC774%20%uC815%uBCF4%uB97C%20%uBC14%uD0D5%uC73C%uB85C%20%uC544%uC5E0%uD3EC%uD2B8%uC640%20%uD1B5%uC2E0%uC744%20%uD560%20%uAC83%uC774%uB2E4..%0A%0A%3E%20%uC774%uBC88%20%uBAA9%uD45C%uB294%20%uD3EC%uC778%uD2B8%uB97C%20%uACB0%uC81C%20%uC2DC%uD0A4%uB294%20%uAC83%uC774%uB2E4.%20%20%uC2E4%uC81C%uB85C%20%uC1FC%uD551%uBAB0%20%uAC19%uC740%20%uAC83%uC744%20%uB9CC%uB4E4%20%uB54C%uB294%20%uC0C1%uD488%20%uC5EC%uB7EC%uAC1C%uB97C%20%28%uC7A5%uBC14%uAD6C%uB2C8%uC5D0%20%uC788%uB294%20%uC0C1%uD488%uB4E4%29%20%uACB0%uC81C%20%uD560%20%uC218%20%uC788%uB294%uB370%20%uC774%uBC88%20%uD3B8%uC744%20%uC751%uC6A9%uD558%uBA74%20%uCDA9%uBD84%uD788%20%uD560%20%uC218%20%uC788%uC744%20%uAC83%uC774%uB2E4.%0A%0A%uBA3C%uC800%20%uACB0%uC81C%uB97C%20%uB2F4%uB2F9%uD560%20%60billing%60%20%uC571%uC744%20%uB9CC%uB4E4%uC5B4%uBCF4%uC790.%0A%0A%60%60%60bash%0A%24%20python%20manage.py%20startapp%20billing%0A%60%60%60%0A%0A%uAC04%uB2E8%uD558%uAC8C%20billing%20%uC571%uC744%20%uB4F1%uB85D%uD574%uC8FC%uC790.%20%uADF8%uB9AC%uACE0%20%uC704%uC5D0%uC11C%20%uAC00%uC9C0%uACE0%uC628%20API%20%uD0A4%uC640%20screte%uB97C%20%uB123%uC5B4%uC8FC%uC790.%0A%0A%60%60%60python%0A%23%20settings.py%0AINSTALLED_APPS%20%3D%20%5B%0A%20%20%20...%0A%20%20%20%27billing%27%2C%0A%20%20%20...%0A%5D%0A%0AIAMPORT_KEY%20%3D%20%3CAPI%20Key%3E%0AIAMPORT_SECRET%20%3D%20%3CAPI%20Secret%3E%0A%60%60%60%0A%0A%uC774%uC81C%20%uC8FC%uBB38%uC5D0%20%uB300%uD55C%20%uBAA8%uB378%uC744%20%uC791%uC131%uD574%uBCF4%uC790.%20%uD3EC%uC778%uD2B8%20%uB300%uD55C%20%uC8FC%uBB38%uC744%20Point%uB77C%uACE0%20%uD560%20%uAC83%uC774%uB2E4.%0A%0A%60%60%60python%0A%23%20billing/models.py%0Afrom%20django.db%20import%20models%0A%23%20User%20%uBAA8%uB378%uC740%20%uC54C%uC544%uC11C%20%uAC00%uC838%uC624%uAE30%0Afrom%20users.models%20import%20MyUser%0A%0Aclass%20Point%28models.Model%29%3A%0A%20%20%20%20user%20%3D%20models.OneToOneField%28MyUser%29%0A%20%20%20%20point%20%3D%20models.PositiveIntegerField%28default%3D0%29%0A%20%20%20%20created%20%3D%20models.DateTimeField%28auto_now_add%3DTrue%2C%20auto_now%3DFalse%29%0A%20%20%20%20timestamp%20%3D%20models.DateTimeField%28auto_now_add%3DFalse%2C%20auto_now%3DTrue%29%0A%0A%20%20%20%20def%20__str__%28self%29%3A%0A%20%20%20%20%20%20%20%20return%20str%28self.point%29%0A%0A%0Aclass%20PointTransaction%28models.Model%29%3A%0A%20%20%20%20user%20%3D%20models.ForeignKey%28MyUser%29%0A%20%20%20%20transaction_id%20%3D%20models.CharField%28max_length%3D120%2C%20null%3DTrue%2C%20blank%3DTrue%29%0A%20%20%20%20order_id%20%3D%20models.CharField%28max_length%3D120%2C%20unique%3DTrue%29%0A%20%20%20%20amount%20%3D%20models.PositiveIntegerField%28default%3D0%29%0A%20%20%20%20success%20%3D%20models.BooleanField%28default%3DFalse%29%0A%20%20%20%20transaction_status%20%3D%20models.CharField%28max_length%3D220%2C%20null%3DTrue%2C%20blank%3DTrue%29%0A%20%20%20%20type%20%3D%20models.CharField%28max_length%3D120%29%0A%20%20%20%20created%20%3D%20models.DateTimeField%28auto_now_add%3DTrue%2C%20auto_now%3DFalse%29%0A%0A%20%20%20%20def%20__str__%28self%29%3A%0A%20%20%20%20%20%20%20%20return%20self.order_id%0A%0A%20%20%20%20class%20Meta%3A%0A%20%20%20%20%20%20%20%20ordering%20%3D%20%5B%27-created%27%5D%0A%60%60%60%0A%0APoint%20%uBAA8%uB378%uC740%20%uC720%uC800%uAC00%20%uACB0%uC81C%uB97C%20%uC2DC%uB3C4%uD55C%20%uC815%uBCF4%uC774%uACE0%2C%20PointTransaction%uC740%20%uC2E4%uC81C%20%uACB0%uC81C%uBAA8%uB4C8%uC744%20%uD1B5%uD574%20%uACB0%uC81C%uAC00%20%uC774%uB8E8%uC5B4%uC9C0%uB294%20%uC815%uBCF4%uB97C%20%uB2F4%uB294%20%uBAA8%uB378%uC774%uB2E4.%20%uB2E4%uC74C%20%uD3B8%uC5D0%uC11C%uB294%20%uC544%uC784%uD504%uD1A0%uC640%20%uD1B5%uC2E0%uD560%20%uC218%20%uC788%uB294%20%uBAA8%uB4C8%uC744%20%uB9CC%uB4E4%uC5B4%uBCF4%uC790.&lt;/center&gt;&lt;br/&gt;&lt;/div&gt;
</content>
  </entry>
  <entry xml:base="http://genius-project.postach.io/feed.xml">
    <title type="text">[Django]Iamport 연동하기 - 2</title>
    <id>https://genius-project.postach.io/post/django-iamport-yeondonghagi-2</id>
    <updated>2017-02-16T16:17:39.192000Z</updated>
    <published>2017-02-16T16:16:55Z</published>
    <link href="https://genius-project.postach.io/post/django-iamport-yeondonghagi-2" />
    <author>
      <name>Jaewon Kwon</name>
    </author>
    <category term="django" />
    <category term="iamport" />
    <content type="html">&lt;div&gt;&lt;del style=&quot;position:relative;display:block;z-index:10;&quot;&gt;&lt;a style=&quot;position: absolute;color: #FFF;text-decoration: none;font-size: 12px;height: 25px;border-radius: 0;margin-top: -20px;right: 15px;background: rgba(0, 0, 0, 0);border-left: 10px solid #BB3A34;border-right: 10px solid #BB3A34;border-bottom: 5px solid rgba(0, 0, 0, 0);width: 0;text-indent:-100000px;&quot; href=&quot;http://marxi.co/#/?provider=evernote_int&amp;guid=47407aa0-64c5-485b-a594-63659bca4a46&amp;notebook=Django&quot;&gt;Edit&lt;/a&gt;&lt;/del&gt;&lt;div style=&quot;color: #2c3f51; line-height: 1.6;&quot;&gt;
                        
                    



&lt;h3 style=&quot;font-family: inherit; font-weight: bold; color: inherit; margin-top: 21px; margin-bottom: 10.5px; font-size: 1.7em; margin: 1.2em 0 .6em 0; text-align: start; line-height: 1.6;&quot;&gt;[Django]Iamport 연동하기 - 2&lt;/h3&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;/&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;기본적으로 결제 모델을 만들 때 가장 중요한 것인 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;order_id&lt;/code&gt;와 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;transaction_id&lt;/code&gt;이다. &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;order_id&lt;/code&gt;는 서버 내에서 자동으로 생성하는 주문 번호이고 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;transaction_id&lt;/code&gt;는 아임포트에서 생성해주는 고유 번호이다. 서버에서 결제가 정상적으로 이루어졌는지 확인하기 위해서 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;transaction_id&lt;/code&gt;로 통해 조회하게 된다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 아임포트와 통신할 수 있는 모듈을 만들어 보자. billing 앱 안에 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;iamport.py&lt;/code&gt;을 만들어보자.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;#billing/iamport.py&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; requests&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; json&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; django.conf &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; settings&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;get_access_token&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;()&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    access_data = {&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'imp_key'&lt;/span&gt;: settings.IAMPORT_KEY,&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'imp_secret'&lt;/span&gt;: settings.IAMPORT_SECRET&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    url = &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;https://api.iamport.kr/users/getToken&quot;&lt;/span&gt;&lt;br/&gt;    req = requests.post(url, data=access_data)&lt;br/&gt;    access_res = req.json()&lt;br/&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; access_res[&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'code'&lt;/span&gt;] &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;is&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;0&lt;/span&gt;:&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; access_res[&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'response'&lt;/span&gt;][&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'access_token'&lt;/span&gt;]&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;else&lt;/span&gt;:&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;None&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;validation_prepare&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(merchant_id, amount, *args, **kwargs)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    access_token = get_access_token()&lt;br/&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; access_token:&lt;br/&gt;        access_data = {&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'merchant_uid'&lt;/span&gt;: merchant_id,&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'amount'&lt;/span&gt;: amount&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        url = &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;https://api.iamport.kr/payments/prepare&quot;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;        headers = {&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'Authorization'&lt;/span&gt;: access_token&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        req = requests.post(url, data=access_data, headers=headers)&lt;br/&gt;        res = req.json()&lt;br/&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; res[&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'code'&lt;/span&gt;] &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;is&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;not&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;0&lt;/span&gt;:&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;raise&lt;/span&gt; ValueError(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;API 연결에 문제가 생겼습니다.&quot;&lt;/span&gt;)&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;else&lt;/span&gt;:&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;raise&lt;/span&gt; ValueError(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;인증 토큰이 없습니다.&quot;&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;get_transaction&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(merchant_id, *args, **kwargs)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    access_token = get_access_token()&lt;br/&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; access_token:&lt;br/&gt;        url = &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;https://api.iamport.kr/payments/find/&quot;&lt;/span&gt; + merchant_id&lt;br/&gt;&lt;br/&gt;        headers = {&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'Authorization'&lt;/span&gt;: access_token&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        req = requests.post(url, headers=headers)&lt;br/&gt;        res = req.json()&lt;br/&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; res[&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'code'&lt;/span&gt;] &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;is&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;0&lt;/span&gt;:&lt;br/&gt;            context = {&lt;br/&gt;                &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'imp_id'&lt;/span&gt;: res[&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'response'&lt;/span&gt;][&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'imp_uid'&lt;/span&gt;],&lt;br/&gt;                &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'merchant_id'&lt;/span&gt;: res[&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'response'&lt;/span&gt;][&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'merchant_uid'&lt;/span&gt;],&lt;br/&gt;                &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'amount'&lt;/span&gt;: res[&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'response'&lt;/span&gt;][&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'amount'&lt;/span&gt;],&lt;br/&gt;                &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'status'&lt;/span&gt;: res[&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'response'&lt;/span&gt;][&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'status'&lt;/span&gt;],&lt;br/&gt;                &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'type'&lt;/span&gt;: res[&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'response'&lt;/span&gt;][&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'pay_method'&lt;/span&gt;],&lt;br/&gt;                &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'receipt_url'&lt;/span&gt;: res[&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'response'&lt;/span&gt;][&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'receipt_url'&lt;/span&gt;]&lt;br/&gt;            }&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; context&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;else&lt;/span&gt;:&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;None&lt;/span&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;else&lt;/span&gt;:&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;raise&lt;/span&gt; ValueError(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;인증 토큰이 없습니다.&quot;&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;아임포트와 통신 할 때는 크게 3가지 과정을 나누어 진행된다. &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;get_access_token&lt;/code&gt;은 아임포트 서버에 접근할 수 있는 토큰을 발급 받는 과정으로 발급 받은 토큰으로 유저가 결제한 정보를 가져오게 된다. &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;validation_prepare&lt;/code&gt;은 결제를 검증하는 단계로 유저가 요청한 금액과 아임포트에 있는 결제 금액이 일치하는지 검증하는 단계이다. &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;get_transaction&lt;/code&gt;은 결제가 끝나고 나서 결제에 대한 정보를 가져오는 단계이다. &lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 포인트에 대한 Manager를 만들어보자. model 부분을 수정하자.&lt;/p&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# billing/models.py&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; django.db &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; models&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# User 모델은 알아서 가져오기&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; users.models &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; MyUser&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; billing.iamport &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; validation_prepare, get_transaction&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;Point&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(models.Model)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    user = models.OneToOneField(MyUser)&lt;br/&gt;    point = models.PositiveIntegerField(default=&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;0&lt;/span&gt;)&lt;br/&gt;    created = models.DateTimeField(auto_now_add=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;, auto_now=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;False&lt;/span&gt;)&lt;br/&gt;    timestamp = models.DateTimeField(auto_now_add=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;False&lt;/span&gt;, auto_now=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;__str__&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(self)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; str(self.point)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;PointTransactionManager&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(models.Manager)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# 새로운 트랜젝션 생성&lt;/span&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;create_new&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(self, user, amount, type, success=None, transaction_status=None)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;not&lt;/span&gt; user:&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;raise&lt;/span&gt; ValueError(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;유저가 확인되지 않습니다.&quot;&lt;/span&gt;)&lt;br/&gt;        short_hash = hashlib.sha1(str(random.random())).hexdigest()[:&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;2&lt;/span&gt;]&lt;br/&gt;        time_hash = hashlib.sha1(str(int(time.time()))).hexdigest()[-&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;3&lt;/span&gt;:]&lt;br/&gt;        base = str(user.email).split(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;@&quot;&lt;/span&gt;)[&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;0&lt;/span&gt;]&lt;br/&gt;        key = hashlib.sha1(short_hash + time_hash + base).hexdigest()[:&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;10&lt;/span&gt;]&lt;br/&gt;        new_order_id = &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;%s&quot;&lt;/span&gt; % (key)&lt;br/&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# 아임포트 결제 사전 검증 단계&lt;/span&gt;&lt;br/&gt;        validation_prepare(new_order_id, amount)&lt;br/&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# 트랜젝션 저장&lt;/span&gt;&lt;br/&gt;        new_trans = self.model(&lt;br/&gt;            user=user,&lt;br/&gt;            order_id=new_order_id,&lt;br/&gt;            amount=amount,&lt;br/&gt;            type=type&lt;br/&gt;        )&lt;br/&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; success &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;is&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;not&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;None&lt;/span&gt;:&lt;br/&gt;            new_trans.success = success&lt;br/&gt;            new_trans.transaction_status = transaction_status&lt;br/&gt;&lt;br/&gt;        new_trans.save(using=self._db)&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; new_trans.order_id&lt;br/&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# 생선된 트랜잭션 검증&lt;/span&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;validation_trans&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(self, merchant_id)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;        result = get_transaction(merchant_id)&lt;br/&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; result[&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'status'&lt;/span&gt;] &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;is&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;not&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'paid'&lt;/span&gt;:&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; result&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;else&lt;/span&gt;:&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;None&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;all_for_user&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(self, user)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; super(PointTransactionManager, self).filter(user=user)&lt;br/&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;get_recent_user&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(self, user, num)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; super(PointTransactionManager, self).filter(user=user)[:num]&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;PointTransaction&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(models.Model)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    user = models.ForeignKey(MyUser)&lt;br/&gt;    transaction_id = models.CharField(max_length=&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;120&lt;/span&gt;, null=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;, blank=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;)&lt;br/&gt;    order_id = models.CharField(max_length=&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;120&lt;/span&gt;, unique=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;)&lt;br/&gt;    amount = models.PositiveIntegerField(default=&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;0&lt;/span&gt;)&lt;br/&gt;    success = models.BooleanField(default=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;False&lt;/span&gt;)&lt;br/&gt;    transaction_status = models.CharField(max_length=&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;220&lt;/span&gt;, null=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;, blank=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;)&lt;br/&gt;    type = models.CharField(max_length=&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;120&lt;/span&gt;)&lt;br/&gt;    created = models.DateTimeField(auto_now_add=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;, auto_now=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;False&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;    objects = PointTransactionManager()&lt;br/&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;__str__&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(self)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; self.order_id&lt;br/&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e; font-style: italic;&quot;&gt;Meta&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;        ordering = [&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'-created'&lt;/span&gt;]&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;그 다음으로는 Transaction이 일어나서 나서 검증하는 post_save를 만들어보자. 같은 model 안에서 작성하면 된다. &lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# billing/models.py&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; time&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; random&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; hashlib&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; django.db.models.signals &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; post_save&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;new_point_trans_validation&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(sender, instance, created, *args, **kwargs)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; instance.transaction_id:&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# 거래 후 아임포트에서 넘긴 결과&lt;/span&gt;&lt;br/&gt;        v_trans = PointTransaction.objects.validation_trans(&lt;br/&gt;            merchant_id=instance.order_id&lt;br/&gt;        )&lt;br/&gt;&lt;br/&gt;        res_merchant_id = v_trans[&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'merchant_id'&lt;/span&gt;]&lt;br/&gt;        res_imp_id = v_trans[&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'imp_id'&lt;/span&gt;]&lt;br/&gt;        res_amount = v_trans[&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'amount'&lt;/span&gt;]&lt;br/&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# 데이터베이스에 실제 결제된 정보가 있는지 체크&lt;/span&gt;&lt;br/&gt;        r_trans = PointTransaction.objects.filter(&lt;br/&gt;            order_id=res_merchant_id,&lt;br/&gt;            transaction_id=res_imp_id,&lt;br/&gt;            amount=res_amount&lt;br/&gt;        ).exists()&lt;br/&gt;&lt;br/&gt;        &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;not&lt;/span&gt; v_trans &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;or&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;not&lt;/span&gt; r_trans:&lt;br/&gt;            &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;raise&lt;/span&gt; ValueError(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'비정상적인 거래입니다.'&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;post_save.connect(new_point_trans_validation, sender=PointTransaction)&lt;br/&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;결제를 위한 model 부분은 거의 다 끝났다. 다음으로 진행 할 것은 view와 template 단으로 실제 유저가 결제를 할 수 있도록 만들어보자.&lt;/p&gt;&lt;/div&gt;&lt;center style=&quot;display:none&quot;&gt;%23%23%23%5BDjango%5DIamport%20%uC5F0%uB3D9%uD558%uAE30%20-%202%0A@%28Django%29%5Bdjango%2C%20iamport%5D%0A%0A%0A%20%uAE30%uBCF8%uC801%uC73C%uB85C%20%uACB0%uC81C%20%uBAA8%uB378%uC744%20%uB9CC%uB4E4%20%uB54C%20%uAC00%uC7A5%20%uC911%uC694%uD55C%20%uAC83%uC778%20%60order_id%60%uC640%20%60transaction_id%60%uC774%uB2E4.%20%60order_id%60%uB294%20%uC11C%uBC84%20%uB0B4%uC5D0%uC11C%20%uC790%uB3D9%uC73C%uB85C%20%uC0DD%uC131%uD558%uB294%20%uC8FC%uBB38%20%uBC88%uD638%uC774%uACE0%20%60transaction_id%60%uB294%20%uC544%uC784%uD3EC%uD2B8%uC5D0%uC11C%20%uC0DD%uC131%uD574%uC8FC%uB294%20%uACE0%uC720%20%uBC88%uD638%uC774%uB2E4.%20%uC11C%uBC84%uC5D0%uC11C%20%uACB0%uC81C%uAC00%20%uC815%uC0C1%uC801%uC73C%uB85C%20%uC774%uB8E8%uC5B4%uC84C%uB294%uC9C0%20%uD655%uC778%uD558%uAE30%20%uC704%uD574%uC11C%20%60transaction_id%60%uB85C%20%uD1B5%uD574%20%uC870%uD68C%uD558%uAC8C%20%uB41C%uB2E4.%0A%0A%uC774%uC81C%20%uC544%uC784%uD3EC%uD2B8%uC640%20%uD1B5%uC2E0%uD560%20%uC218%20%uC788%uB294%20%uBAA8%uB4C8%uC744%20%uB9CC%uB4E4%uC5B4%20%uBCF4%uC790.%20billing%20%uC571%20%uC548%uC5D0%20%60iamport.py%60%uC744%20%uB9CC%uB4E4%uC5B4%uBCF4%uC790.%0A%0A%60%60%60python%0A%23billing/iamport.py%0Aimport%20requests%0Aimport%20json%0A%0Afrom%20django.conf%20import%20settings%0A%0A%0Adef%20get_access_token%28%29%3A%0A%20%20%20%20access_data%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%27imp_key%27%3A%20settings.IAMPORT_KEY%2C%0A%20%20%20%20%20%20%20%20%27imp_secret%27%3A%20settings.IAMPORT_SECRET%0A%20%20%20%20%7D%0A%0A%20%20%20%20url%20%3D%20%22https%3A//api.iamport.kr/users/getToken%22%0A%20%20%20%20req%20%3D%20requests.post%28url%2C%20data%3Daccess_data%29%0A%20%20%20%20access_res%20%3D%20req.json%28%29%0A%0A%20%20%20%20if%20access_res%5B%27code%27%5D%20is%200%3A%0A%20%20%20%20%20%20%20%20return%20access_res%5B%27response%27%5D%5B%27access_token%27%5D%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%0A%0Adef%20validation_prepare%28merchant_id%2C%20amount%2C%20*args%2C%20**kwargs%29%3A%0A%20%20%20%20access_token%20%3D%20get_access_token%28%29%0A%0A%20%20%20%20if%20access_token%3A%0A%20%20%20%20%20%20%20%20access_data%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%27merchant_uid%27%3A%20merchant_id%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%27amount%27%3A%20amount%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20url%20%3D%20%22https%3A//api.iamport.kr/payments/prepare%22%0A%0A%20%20%20%20%20%20%20%20headers%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%27Authorization%27%3A%20access_token%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20req%20%3D%20requests.post%28url%2C%20data%3Daccess_data%2C%20headers%3Dheaders%29%0A%20%20%20%20%20%20%20%20res%20%3D%20req.json%28%29%0A%0A%20%20%20%20%20%20%20%20if%20res%5B%27code%27%5D%20is%20not%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20ValueError%28%22API%20%uC5F0%uACB0%uC5D0%20%uBB38%uC81C%uAC00%20%uC0DD%uACBC%uC2B5%uB2C8%uB2E4.%22%29%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20raise%20ValueError%28%22%uC778%uC99D%20%uD1A0%uD070%uC774%20%uC5C6%uC2B5%uB2C8%uB2E4.%22%29%0A%0A%0Adef%20get_transaction%28merchant_id%2C%20*args%2C%20**kwargs%29%3A%0A%20%20%20%20access_token%20%3D%20get_access_token%28%29%0A%0A%20%20%20%20if%20access_token%3A%0A%20%20%20%20%20%20%20%20url%20%3D%20%22https%3A//api.iamport.kr/payments/find/%22%20+%20merchant_id%0A%0A%20%20%20%20%20%20%20%20headers%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%27Authorization%27%3A%20access_token%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20req%20%3D%20requests.post%28url%2C%20headers%3Dheaders%29%0A%20%20%20%20%20%20%20%20res%20%3D%20req.json%28%29%0A%0A%20%20%20%20%20%20%20%20if%20res%5B%27code%27%5D%20is%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20context%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27imp_id%27%3A%20res%5B%27response%27%5D%5B%27imp_uid%27%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27merchant_id%27%3A%20res%5B%27response%27%5D%5B%27merchant_uid%27%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27amount%27%3A%20res%5B%27response%27%5D%5B%27amount%27%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27status%27%3A%20res%5B%27response%27%5D%5B%27status%27%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27type%27%3A%20res%5B%27response%27%5D%5B%27pay_method%27%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27receipt_url%27%3A%20res%5B%27response%27%5D%5B%27receipt_url%27%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20context%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20raise%20ValueError%28%22%uC778%uC99D%20%uD1A0%uD070%uC774%20%uC5C6%uC2B5%uB2C8%uB2E4.%22%29%0A%0A%60%60%60%0A%0A%uC544%uC784%uD3EC%uD2B8%uC640%20%uD1B5%uC2E0%20%uD560%20%uB54C%uB294%20%uD06C%uAC8C%203%uAC00%uC9C0%20%uACFC%uC815%uC744%20%uB098%uB204%uC5B4%20%uC9C4%uD589%uB41C%uB2E4.%20%60get_access_token%60%uC740%20%uC544%uC784%uD3EC%uD2B8%20%uC11C%uBC84%uC5D0%20%uC811%uADFC%uD560%20%uC218%20%uC788%uB294%20%uD1A0%uD070%uC744%20%uBC1C%uAE09%20%uBC1B%uB294%20%uACFC%uC815%uC73C%uB85C%20%uBC1C%uAE09%20%uBC1B%uC740%20%uD1A0%uD070%uC73C%uB85C%20%uC720%uC800%uAC00%20%uACB0%uC81C%uD55C%20%uC815%uBCF4%uB97C%20%uAC00%uC838%uC624%uAC8C%20%uB41C%uB2E4.%20%60validation_prepare%60%uC740%20%uACB0%uC81C%uB97C%20%uAC80%uC99D%uD558%uB294%20%uB2E8%uACC4%uB85C%20%uC720%uC800%uAC00%20%uC694%uCCAD%uD55C%20%uAE08%uC561%uACFC%20%uC544%uC784%uD3EC%uD2B8%uC5D0%20%uC788%uB294%20%uACB0%uC81C%20%uAE08%uC561%uC774%20%uC77C%uCE58%uD558%uB294%uC9C0%20%uAC80%uC99D%uD558%uB294%20%uB2E8%uACC4%uC774%uB2E4.%20%60get_transaction%60%uC740%20%uACB0%uC81C%uAC00%20%uB05D%uB098%uACE0%20%uB098%uC11C%20%uACB0%uC81C%uC5D0%20%uB300%uD55C%20%uC815%uBCF4%uB97C%20%uAC00%uC838%uC624%uB294%20%uB2E8%uACC4%uC774%uB2E4.%20%0A%0A%uC774%uC81C%20%uD3EC%uC778%uD2B8%uC5D0%20%uB300%uD55C%20Manager%uB97C%20%uB9CC%uB4E4%uC5B4%uBCF4%uC790.%20model%20%uBD80%uBD84%uC744%20%uC218%uC815%uD558%uC790.%0A%0A%60%60%60python%0A%23%20billing/models.py%0Afrom%20django.db%20import%20models%0A%23%20User%20%uBAA8%uB378%uC740%20%uC54C%uC544%uC11C%20%uAC00%uC838%uC624%uAE30%0Afrom%20users.models%20import%20MyUser%0Afrom%20billing.iamport%20import%20validation_prepare%2C%20get_transaction%0A%0Aclass%20Point%28models.Model%29%3A%0A%20%20%20%20user%20%3D%20models.OneToOneField%28MyUser%29%0A%20%20%20%20point%20%3D%20models.PositiveIntegerField%28default%3D0%29%0A%20%20%20%20created%20%3D%20models.DateTimeField%28auto_now_add%3DTrue%2C%20auto_now%3DFalse%29%0A%20%20%20%20timestamp%20%3D%20models.DateTimeField%28auto_now_add%3DFalse%2C%20auto_now%3DTrue%29%0A%0A%20%20%20%20def%20__str__%28self%29%3A%0A%20%20%20%20%20%20%20%20return%20str%28self.point%29%0A%0A%0Aclass%20PointTransactionManager%28models.Manager%29%3A%0A%20%20%20%20%23%20%uC0C8%uB85C%uC6B4%20%uD2B8%uB79C%uC81D%uC158%20%uC0DD%uC131%0A%20%20%20%20def%20create_new%28self%2C%20user%2C%20amount%2C%20type%2C%20success%3DNone%2C%20transaction_status%3DNone%29%3A%0A%20%20%20%20%20%20%20%20if%20not%20user%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20ValueError%28%22%uC720%uC800%uAC00%20%uD655%uC778%uB418%uC9C0%20%uC54A%uC2B5%uB2C8%uB2E4.%22%29%0A%20%20%20%20%20%20%20%20short_hash%20%3D%20hashlib.sha1%28str%28random.random%28%29%29%29.hexdigest%28%29%5B%3A2%5D%0A%20%20%20%20%20%20%20%20time_hash%20%3D%20hashlib.sha1%28str%28int%28time.time%28%29%29%29%29.hexdigest%28%29%5B-3%3A%5D%0A%20%20%20%20%20%20%20%20base%20%3D%20str%28user.email%29.split%28%22@%22%29%5B0%5D%0A%20%20%20%20%20%20%20%20key%20%3D%20hashlib.sha1%28short_hash%20+%20time_hash%20+%20base%29.hexdigest%28%29%5B%3A10%5D%0A%20%20%20%20%20%20%20%20new_order_id%20%3D%20%22%25s%22%20%25%20%28key%29%0A%0A%20%20%20%20%20%20%20%20%23%20%uC544%uC784%uD3EC%uD2B8%20%uACB0%uC81C%20%uC0AC%uC804%20%uAC80%uC99D%20%uB2E8%uACC4%0A%20%20%20%20%20%20%20%20validation_prepare%28new_order_id%2C%20amount%29%0A%0A%20%20%20%20%20%20%20%20%23%20%uD2B8%uB79C%uC81D%uC158%20%uC800%uC7A5%0A%20%20%20%20%20%20%20%20new_trans%20%3D%20self.model%28%0A%20%20%20%20%20%20%20%20%20%20%20%20user%3Duser%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20order_id%3Dnew_order_id%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20amount%3Damount%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20type%3Dtype%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%20%20%20%20if%20success%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20new_trans.success%20%3D%20success%0A%20%20%20%20%20%20%20%20%20%20%20%20new_trans.transaction_status%20%3D%20transaction_status%0A%0A%20%20%20%20%20%20%20%20new_trans.save%28using%3Dself._db%29%0A%20%20%20%20%20%20%20%20return%20new_trans.order_id%0A%0A%20%20%20%20%23%20%uC0DD%uC120%uB41C%20%uD2B8%uB79C%uC7AD%uC158%20%uAC80%uC99D%0A%20%20%20%20def%20validation_trans%28self%2C%20merchant_id%29%3A%0A%20%20%20%20%20%20%20%20result%20%3D%20get_transaction%28merchant_id%29%0A%0A%20%20%20%20%20%20%20%20if%20result%5B%27status%27%5D%20is%20not%20%27paid%27%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20result%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20def%20all_for_user%28self%2C%20user%29%3A%0A%20%20%20%20%20%20%20%20return%20super%28PointTransactionManager%2C%20self%29.filter%28user%3Duser%29%0A%0A%20%20%20%20def%20get_recent_user%28self%2C%20user%2C%20num%29%3A%0A%20%20%20%20%20%20%20%20return%20super%28PointTransactionManager%2C%20self%29.filter%28user%3Duser%29%5B%3Anum%5D%0A%0A%0Aclass%20PointTransaction%28models.Model%29%3A%0A%20%20%20%20user%20%3D%20models.ForeignKey%28MyUser%29%0A%20%20%20%20transaction_id%20%3D%20models.CharField%28max_length%3D120%2C%20null%3DTrue%2C%20blank%3DTrue%29%0A%20%20%20%20order_id%20%3D%20models.CharField%28max_length%3D120%2C%20unique%3DTrue%29%0A%20%20%20%20amount%20%3D%20models.PositiveIntegerField%28default%3D0%29%0A%20%20%20%20success%20%3D%20models.BooleanField%28default%3DFalse%29%0A%20%20%20%20transaction_status%20%3D%20models.CharField%28max_length%3D220%2C%20null%3DTrue%2C%20blank%3DTrue%29%0A%20%20%20%20type%20%3D%20models.CharField%28max_length%3D120%29%0A%20%20%20%20created%20%3D%20models.DateTimeField%28auto_now_add%3DTrue%2C%20auto_now%3DFalse%29%0A%0A%09objects%20%3D%20PointTransactionManager%28%29%0A%0A%20%20%20%20def%20__str__%28self%29%3A%0A%20%20%20%20%20%20%20%20return%20self.order_id%0A%0A%20%20%20%20class%20Meta%3A%0A%20%20%20%20%20%20%20%20ordering%20%3D%20%5B%27-created%27%5D%0A%60%60%60%0A%0A%uADF8%20%uB2E4%uC74C%uC73C%uB85C%uB294%20Transaction%uC774%20%uC77C%uC5B4%uB098%uC11C%20%uB098%uC11C%20%uAC80%uC99D%uD558%uB294%20post_save%uB97C%20%uB9CC%uB4E4%uC5B4%uBCF4%uC790.%20%uAC19%uC740%20model%20%uC548%uC5D0%uC11C%20%uC791%uC131%uD558%uBA74%20%uB41C%uB2E4.%20%0A%0A%60%60%60python%0A%23%20billing/models.py%0Aimport%20time%0Aimport%20random%0Aimport%20hashlib%0Afrom%20django.db.models.signals%20import%20post_save%0A%0Adef%20new_point_trans_validation%28sender%2C%20instance%2C%20created%2C%20*args%2C%20**kwargs%29%3A%0A%20%20%20%20if%20instance.transaction_id%3A%0A%20%20%20%20%20%20%20%20%23%20%uAC70%uB798%20%uD6C4%20%uC544%uC784%uD3EC%uD2B8%uC5D0%uC11C%20%uB118%uAE34%20%uACB0%uACFC%0A%20%20%20%20%20%20%20%20v_trans%20%3D%20PointTransaction.objects.validation_trans%28%0A%20%20%20%20%20%20%20%20%20%20%20%20merchant_id%3Dinstance.order_id%0A%20%20%20%20%20%20%20%20%29%0A%0A%20%20%20%20%20%20%20%20res_merchant_id%20%3D%20v_trans%5B%27merchant_id%27%5D%0A%20%20%20%20%20%20%20%20res_imp_id%20%3D%20v_trans%5B%27imp_id%27%5D%0A%20%20%20%20%20%20%20%20res_amount%20%3D%20v_trans%5B%27amount%27%5D%0A%0A%20%20%20%20%20%20%20%20%23%20%uB370%uC774%uD130%uBCA0%uC774%uC2A4%uC5D0%20%uC2E4%uC81C%20%uACB0%uC81C%uB41C%20%uC815%uBCF4%uAC00%20%uC788%uB294%uC9C0%20%uCCB4%uD06C%0A%20%20%20%20%20%20%20%20r_trans%20%3D%20PointTransaction.objects.filter%28%0A%20%20%20%20%20%20%20%20%20%20%20%20order_id%3Dres_merchant_id%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20transaction_id%3Dres_imp_id%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20amount%3Dres_amount%0A%20%20%20%20%20%20%20%20%29.exists%28%29%0A%0A%20%20%20%20%20%20%20%20if%20not%20v_trans%20or%20not%20r_trans%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20ValueError%28%27%uBE44%uC815%uC0C1%uC801%uC778%20%uAC70%uB798%uC785%uB2C8%uB2E4.%27%29%0A%0A%0Apost_save.connect%28new_point_trans_validation%2C%20sender%3DPointTransaction%29%0A%0A%60%60%60%0A%0A%uACB0%uC81C%uB97C%20%uC704%uD55C%20model%20%uBD80%uBD84%uC740%20%uAC70%uC758%20%uB2E4%20%uB05D%uB0AC%uB2E4.%20%uB2E4%uC74C%uC73C%uB85C%20%uC9C4%uD589%20%uD560%20%uAC83%uC740%20view%uC640%20template%20%uB2E8%uC73C%uB85C%20%uC2E4%uC81C%20%uC720%uC800%uAC00%20%uACB0%uC81C%uB97C%20%uD560%20%uC218%20%uC788%uB3C4%uB85D%20%uB9CC%uB4E4%uC5B4%uBCF4%uC790.&lt;/center&gt;&lt;br/&gt;&lt;/div&gt;
</content>
  </entry>
  <entry xml:base="http://genius-project.postach.io/feed.xml">
    <title type="text">[Django]Grunt + LiveReload를 이용한 자동 테스크 환경 구축</title>
    <id>https://genius-project.postach.io/post/django-grunt-livereloadreul-iyonghan-jadong-teseukeu-hwangyeong-gucug</id>
    <updated>2017-02-14T20:41:23.361000Z</updated>
    <published>2017-02-14T20:40:46Z</published>
    <link href="https://genius-project.postach.io/post/django-grunt-livereloadreul-iyonghan-jadong-teseukeu-hwangyeong-gucug" />
    <author>
      <name>Jaewon Kwon</name>
    </author>
    <category term="django" />
    <category term="grunt" />
    <category term="livereload" />
    <content type="html">&lt;div&gt;&lt;del style=&quot;position:relative;display:block;z-index:10;&quot;&gt;&lt;a style=&quot;position: absolute;color: #FFF;text-decoration: none;font-size: 12px;height: 25px;border-radius: 0;margin-top: -20px;right: 15px;background: rgba(0, 0, 0, 0);border-left: 10px solid #BB3A34;border-right: 10px solid #BB3A34;border-bottom: 5px solid rgba(0, 0, 0, 0);width: 0;text-indent:-100000px;&quot; href=&quot;http://marxi.co/#/?provider=evernote_int&amp;guid=699276b5-114b-4dbb-a98e-26952b245aa9&amp;notebook=Django&quot;&gt;Edit&lt;/a&gt;&lt;/del&gt;&lt;div style=&quot;color: #2c3f51; line-height: 1.6;&quot;&gt;
                        
                    



&lt;h1 style=&quot;font-size: 2.6em; margin: 1.2em 0 .6em 0; font-family: inherit; font-weight: bold; line-height: 1.1; color: inherit; margin-top: 21px; margin-bottom: 10.5px; text-align: start;&quot;&gt;[Django]Grunt + LiveReload를 이용한 자동 테스크 환경 구축&lt;/h1&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;/&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;Grunt&lt;/code&gt;를 이용하면 프론트 단계에서 필요한 다양한 테스크들을 자동화 시킬 수 있다. &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;Grunt&lt;/code&gt; 중에서 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;grunt-contrib-connect&lt;/code&gt;와 watch를 결합하면 css나 js 파일들의 변경 사항이 있을 경우, 화면을 자동으로 refresh 해준다. 하지만 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;grunt-contrib-connect&lt;/code&gt;는 express로 local server를 띄우는 것이기 때문에 Django의 localserver와 같이 사용하기 힘들다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;따라서 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;Grunt&lt;/code&gt;의 watch로 static 파일의 변경사항이 있을 경우, 자동으로 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;concat&lt;/code&gt;을 시키고 Django에서 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;concat&lt;/code&gt;를 watch를 시켜 static 파일들이 변동이 생겼을 때 자동으로 페이지를 reload 시켜주는 것을 해보고자 한다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;먼저 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;Grunt&lt;/code&gt;를 설정해보자.(기본 npm, grunt 설치는 생략) &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;Gruntfile.js&lt;/code&gt;는 자신 입맛대로 변경하면 된다. 중요한 것은 Django가 watch 할 수 있는 static 파일만 제대로 만들어주면 된다.&lt;/p&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;$ npm install --save-dev grunt-contrib-sass grunt-contrib-concat grunt-contrib-cssmin grunt-contrib-watch grunt-contrib-uglify&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;// Gruntfile.js&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;module&lt;/span&gt;.exports = &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt; (&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;grunt&lt;/span&gt;) &lt;/span&gt;{&lt;br/&gt;    grunt.initConfig({&lt;br/&gt;            sass: {&lt;br/&gt;                dist: {&lt;br/&gt;                    files: {&lt;br/&gt;                        ...&lt;br/&gt;                    }&lt;br/&gt;                }&lt;br/&gt;            },&lt;br/&gt;&lt;br/&gt;            concat: {&lt;br/&gt;                js: {&lt;br/&gt;                    src: [&lt;br/&gt;                        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'static/app/js/**/*.js'&lt;/span&gt;&lt;br/&gt;                    ],&lt;br/&gt;                    dest: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'public/js/app.js'&lt;/span&gt;&lt;br/&gt;                },&lt;br/&gt;                vendor_js: {&lt;br/&gt;                    src: [&lt;br/&gt;                        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'static/vendor/js/**/*.js'&lt;/span&gt;&lt;br/&gt;                    ],&lt;br/&gt;                    dest: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'public/js/vendor.js'&lt;/span&gt;&lt;br/&gt;                },&lt;br/&gt;                css: {&lt;br/&gt;                    src: [&lt;br/&gt;                        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'static/app/css/**/*.css'&lt;/span&gt;&lt;br/&gt;                    ],&lt;br/&gt;                    dest: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'public/css/styles.css'&lt;/span&gt;&lt;br/&gt;                },&lt;br/&gt;                vendor_css: {&lt;br/&gt;                    src: [&lt;br/&gt;                        &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'static/vendor/css/**/*.css'&lt;/span&gt;&lt;br/&gt;                    ],&lt;br/&gt;                    dest: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'public/css/vendor.css'&lt;/span&gt;&lt;br/&gt;                }&lt;br/&gt;            },&lt;br/&gt;&lt;br/&gt;            uglify: {&lt;br/&gt;                target: {&lt;br/&gt;                    files: [{&lt;br/&gt;                        expand: &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;true&lt;/span&gt;,&lt;br/&gt;                        cwd: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'public/js'&lt;/span&gt;,&lt;br/&gt;                        src: [&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'*.js'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'!*.min.js'&lt;/span&gt;],&lt;br/&gt;                        dest: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'public/js'&lt;/span&gt;,&lt;br/&gt;                        ext: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'.min.js'&lt;/span&gt;&lt;br/&gt;                    }]&lt;br/&gt;                }&lt;br/&gt;            },&lt;br/&gt;&lt;br/&gt;            cssmin: {&lt;br/&gt;                target: {&lt;br/&gt;                    files: [{&lt;br/&gt;                        expand: &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;true&lt;/span&gt;,&lt;br/&gt;                        cwd: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'public/css'&lt;/span&gt;,&lt;br/&gt;                        src: [&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'*.css'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'!*.min.css'&lt;/span&gt;],&lt;br/&gt;                        dest: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'public/css'&lt;/span&gt;,&lt;br/&gt;                        ext: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'.min.css'&lt;/span&gt;&lt;br/&gt;                    }]&lt;br/&gt;                }&lt;br/&gt;            },&lt;br/&gt;&lt;br/&gt;            watch: {&lt;br/&gt;                sass: {&lt;br/&gt;                    files: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'static/app/sass/**/*.scss'&lt;/span&gt;,&lt;br/&gt;                    tasks: [&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'sass:dist'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'concat:css'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'cssmin:target'&lt;/span&gt;],&lt;br/&gt;                    options: {&lt;br/&gt;                        interrupt: &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;true&lt;/span&gt;&lt;br/&gt;                    }&lt;br/&gt;                },&lt;br/&gt;                js: {&lt;br/&gt;                    files: &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'static/app/js/**/*.js'&lt;/span&gt;,&lt;br/&gt;                    tasks: [&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'concat:js'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'uglify:target'&lt;/span&gt;],&lt;br/&gt;                    options: {&lt;br/&gt;                        interrupt: &lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;true&lt;/span&gt;&lt;br/&gt;                    }&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    )&lt;br/&gt;    ;&lt;br/&gt;&lt;br/&gt;    grunt.loadNpmTasks(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'grunt-contrib-sass'&lt;/span&gt;);&lt;br/&gt;    grunt.loadNpmTasks(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'grunt-contrib-concat'&lt;/span&gt;);&lt;br/&gt;    grunt.loadNpmTasks(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'grunt-contrib-cssmin'&lt;/span&gt;);&lt;br/&gt;    grunt.loadNpmTasks(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'grunt-contrib-watch'&lt;/span&gt;);&lt;br/&gt;    grunt.loadNpmTasks(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'grunt-contrib-uglify'&lt;/span&gt;);&lt;br/&gt;&lt;br/&gt;    grunt.registerTask(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'s'&lt;/span&gt;, [&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'watch:sass'&lt;/span&gt;]);&lt;br/&gt;    grunt.registerTask(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'w'&lt;/span&gt;, [&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'watch:js'&lt;/span&gt;]);&lt;br/&gt;&lt;br/&gt;};&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 Django가 static 파일을 watch 할 수 있도록 라이브러리를 설치하자. &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;Livereload&lt;/code&gt; 와 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;dj-static&lt;/code&gt;를 사용할 것이다.&lt;/p&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;$ pip install dj-static&lt;br/&gt;$ pip install livereload&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;livereload&lt;/code&gt;를 INSTALLED_APPS에 추가해주자.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# settings.py&lt;/span&gt;&lt;br/&gt;INSTALLED_APPS = [&lt;br/&gt;    ...&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'livereload'&lt;/span&gt;,&lt;br/&gt;    ...&lt;br/&gt;]&lt;br/&gt;&lt;br/&gt;STATIC_ROOT = os.path.join(BASE_DIR, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'public'&lt;/span&gt;)&lt;br/&gt;STATIC_URL = &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'/static/'&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;그 다음 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;wsgi.py&lt;/code&gt;에 추가하자.&lt;/p&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; os&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; django.conf &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; settings&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; django.core.wsgi &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; get_wsgi_application&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; dj_static &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; Cling&lt;br/&gt;&lt;br/&gt;os.environ.setdefault(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;DJANGO_SETTINGS_MODULE&quot;&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;&quot;server.settings&quot;&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;if&lt;/span&gt; settings.DEBUG:&lt;br/&gt;    application = Cling(get_wsgi_application())&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;else&lt;/span&gt;:&lt;br/&gt;    application = get_wsgi_application()&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;livereload&lt;/code&gt;를 시키자. live 시키기 전에 grunt watch 걸어주는 걸 잊지 말자.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;$grunt&lt;/span&gt; w&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;$grunt&lt;/span&gt; s&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;$python&lt;/span&gt; manage.py livereload&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;localhost:8000&lt;/code&gt;에 접속하면 잘 적용 된 것을 볼 수 있다.&lt;/p&gt;&lt;/div&gt;&lt;center style=&quot;display:none&quot;&gt;%23%5BDjango%5DGrunt%20+%20LiveReload%uB97C%20%uC774%uC6A9%uD55C%20%uC790%uB3D9%20%uD14C%uC2A4%uD06C%20%uD658%uACBD%20%uAD6C%uCD95%0A@%28Django%29%5Bdjango%7Cgrunt%7Clivereload%5D%0A%0A%60Grunt%60%uB97C%20%uC774%uC6A9%uD558%uBA74%20%uD504%uB860%uD2B8%20%uB2E8%uACC4%uC5D0%uC11C%20%uD544%uC694%uD55C%20%uB2E4%uC591%uD55C%20%uD14C%uC2A4%uD06C%uB4E4%uC744%20%uC790%uB3D9%uD654%20%uC2DC%uD0AC%20%uC218%20%uC788%uB2E4.%20%60Grunt%60%20%uC911%uC5D0%uC11C%20%60grunt-contrib-connect%60%uC640%20watch%uB97C%20%uACB0%uD569%uD558%uBA74%20css%uB098%20js%20%uD30C%uC77C%uB4E4%uC758%20%uBCC0%uACBD%20%uC0AC%uD56D%uC774%20%uC788%uC744%20%uACBD%uC6B0%2C%20%uD654%uBA74%uC744%20%uC790%uB3D9%uC73C%uB85C%20refresh%20%uD574%uC900%uB2E4.%20%uD558%uC9C0%uB9CC%20%60grunt-contrib-connect%60%uB294%20express%uB85C%20local%20server%uB97C%20%uB744%uC6B0%uB294%20%uAC83%uC774%uAE30%20%uB54C%uBB38%uC5D0%20Django%uC758%20localserver%uC640%20%uAC19%uC774%20%uC0AC%uC6A9%uD558%uAE30%20%uD798%uB4E4%uB2E4.%0A%0A%uB530%uB77C%uC11C%20%60Grunt%60%uC758%20watch%uB85C%20static%20%uD30C%uC77C%uC758%20%uBCC0%uACBD%uC0AC%uD56D%uC774%20%uC788%uC744%20%uACBD%uC6B0%2C%20%uC790%uB3D9%uC73C%uB85C%20%60concat%60%uC744%20%uC2DC%uD0A4%uACE0%20Django%uC5D0%uC11C%20%60concat%60%uB97C%20watch%uB97C%20%uC2DC%uCF1C%20static%20%uD30C%uC77C%uB4E4%uC774%20%uBCC0%uB3D9%uC774%20%uC0DD%uACBC%uC744%20%uB54C%20%uC790%uB3D9%uC73C%uB85C%20%uD398%uC774%uC9C0%uB97C%20reload%20%uC2DC%uCF1C%uC8FC%uB294%20%uAC83%uC744%20%uD574%uBCF4%uACE0%uC790%20%uD55C%uB2E4.%0A%0A%uBA3C%uC800%20%60Grunt%60%uB97C%20%uC124%uC815%uD574%uBCF4%uC790.%28%uAE30%uBCF8%20npm%2C%20grunt%20%uC124%uCE58%uB294%20%uC0DD%uB7B5%29%20%60Gruntfile.js%60%uB294%20%uC790%uC2E0%20%uC785%uB9DB%uB300%uB85C%20%uBCC0%uACBD%uD558%uBA74%20%uB41C%uB2E4.%20%uC911%uC694%uD55C%20%uAC83%uC740%20Django%uAC00%20watch%20%uD560%20%uC218%20%uC788%uB294%20static%20%uD30C%uC77C%uB9CC%20%uC81C%uB300%uB85C%20%uB9CC%uB4E4%uC5B4%uC8FC%uBA74%20%uB41C%uB2E4.%0A%0A%60%60%60bash%0A%24%20npm%20install%20--save-dev%20grunt-contrib-sass%20grunt-contrib-concat%20grunt-contrib-cssmin%20grunt-contrib-watch%20grunt-contrib-uglify%0A%60%60%60%0A%0A%60%60%60javascript%0A//%20Gruntfile.js%0Amodule.exports%20%3D%20function%20%28grunt%29%20%7B%0A%20%20%20%20grunt.initConfig%28%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20sass%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dist%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20files%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20...%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20concat%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20js%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20src%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27static/app/js/**/*.js%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dest%3A%20%27public/js/app.js%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vendor_js%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20src%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27static/vendor/js/**/*.js%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dest%3A%20%27public/js/vendor.js%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20css%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20src%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27static/app/css/**/*.css%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dest%3A%20%27public/css/styles.css%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vendor_css%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20src%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27static/vendor/css/**/*.css%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dest%3A%20%27public/css/vendor.css%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20uglify%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20target%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20files%3A%20%5B%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20expand%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cwd%3A%20%27public/js%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20src%3A%20%5B%27*.js%27%2C%20%27%21*.min.js%27%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dest%3A%20%27public/js%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ext%3A%20%27.min.js%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20cssmin%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20target%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20files%3A%20%5B%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20expand%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cwd%3A%20%27public/css%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20src%3A%20%5B%27*.css%27%2C%20%27%21*.min.css%27%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dest%3A%20%27public/css%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ext%3A%20%27.min.css%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20watch%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sass%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20files%3A%20%27static/app/sass/**/*.scss%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tasks%3A%20%5B%27sass%3Adist%27%2C%20%27concat%3Acss%27%2C%20%27cssmin%3Atarget%27%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20options%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20interrupt%3A%20true%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20js%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20files%3A%20%27static/app/js/**/*.js%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tasks%3A%20%5B%27concat%3Ajs%27%2C%20%27uglify%3Atarget%27%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20options%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20interrupt%3A%20true%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%29%0A%20%20%20%20%3B%0A%0A%20%20%20%20grunt.loadNpmTasks%28%27grunt-contrib-sass%27%29%3B%0A%20%20%20%20grunt.loadNpmTasks%28%27grunt-contrib-concat%27%29%3B%0A%20%20%20%20grunt.loadNpmTasks%28%27grunt-contrib-cssmin%27%29%3B%0A%20%20%20%20grunt.loadNpmTasks%28%27grunt-contrib-watch%27%29%3B%0A%20%20%20%20grunt.loadNpmTasks%28%27grunt-contrib-uglify%27%29%3B%0A%0A%20%20%20%20grunt.registerTask%28%27s%27%2C%20%5B%27watch%3Asass%27%5D%29%3B%0A%20%20%20%20grunt.registerTask%28%27w%27%2C%20%5B%27watch%3Ajs%27%5D%29%3B%0A%0A%7D%3B%0A%60%60%60%0A%0A%0A%0A%uC774%uC81C%20Django%uAC00%20static%20%uD30C%uC77C%uC744%20watch%20%uD560%20%uC218%20%uC788%uB3C4%uB85D%20%uB77C%uC774%uBE0C%uB7EC%uB9AC%uB97C%20%uC124%uCE58%uD558%uC790.%20%60Livereload%60%20%uC640%20%60dj-static%60%uB97C%20%uC0AC%uC6A9%uD560%20%uAC83%uC774%uB2E4.%0A%0A%60%60%60bash%0A%24%20pip%20install%20dj-static%0A%24%20pip%20install%20livereload%0A%60%60%60%0A%0A%uC774%uC81C%20%60livereload%60%uB97C%20INSTALLED_APPS%uC5D0%20%uCD94%uAC00%uD574%uC8FC%uC790.%0A%60%60%60python%0A%23%20settings.py%0AINSTALLED_APPS%20%3D%20%5B%0A%20%20%20%20...%0A%20%20%20%20%27livereload%27%2C%0A%20%20%20%20...%0A%5D%0A%0ASTATIC_ROOT%20%3D%20os.path.join%28BASE_DIR%2C%20%27public%27%29%0ASTATIC_URL%20%3D%20%27/static/%27%0A%60%60%60%0A%0A%uADF8%20%uB2E4%uC74C%20%60wsgi.py%60%uC5D0%20%uCD94%uAC00%uD558%uC790.%0A%60%60%60python%0Aimport%20os%0Afrom%20django.conf%20import%20settings%0Afrom%20django.core.wsgi%20import%20get_wsgi_application%0Afrom%20dj_static%20import%20Cling%0A%0Aos.environ.setdefault%28%22DJANGO_SETTINGS_MODULE%22%2C%20%22server.settings%22%29%0A%0Aif%20settings.DEBUG%3A%0A%20%20%20%20application%20%3D%20Cling%28get_wsgi_application%28%29%29%0Aelse%3A%0A%20%20%20%20application%20%3D%20get_wsgi_application%28%29%0A%60%60%60%0A%0A%uC774%uC81C%20%60livereload%60%uB97C%20%uC2DC%uD0A4%uC790.%20live%20%uC2DC%uD0A4%uAE30%20%uC804%uC5D0%20grunt%20watch%20%uAC78%uC5B4%uC8FC%uB294%20%uAC78%20%uC78A%uC9C0%20%uB9D0%uC790.%0A%0A%60%60%60bash%0A%24grunt%20w%0A%24grunt%20s%0A%60%60%60%0A%0A%60%60%60bash%0A%24python%20manage.py%20livereload%0A%60%60%60%0A%0A%60localhost%3A8000%60%uC5D0%20%uC811%uC18D%uD558%uBA74%20%uC798%20%uC801%uC6A9%20%uB41C%20%uAC83%uC744%20%uBCFC%20%uC218%20%uC788%uB2E4.&lt;/center&gt;&lt;br/&gt;&lt;/div&gt;
</content>
  </entry>
  <entry xml:base="http://genius-project.postach.io/feed.xml">
    <title type="text">[Django]Custom Command Line</title>
    <id>https://genius-project.postach.io/post/django-custom-command-line</id>
    <updated>2017-01-02T02:43:33.304000Z</updated>
    <published>2017-01-02T02:41:13Z</published>
    <link href="https://genius-project.postach.io/post/django-custom-command-line" />
    <author>
      <name>Jaewon Kwon</name>
    </author>
    <category term="django" />
    <category term="manage" />
    <category term="command" />
    <content type="html">&lt;div&gt;&lt;del style=&quot;position:relative;display:block;z-index:10;&quot;&gt;&lt;a style=&quot;position: absolute;color: #FFF;text-decoration: none;font-size: 12px;height: 25px;border-radius: 0;margin-top: -20px;right: 15px;background: rgba(0, 0, 0, 0);border-left: 10px solid #BB3A34;border-right: 10px solid #BB3A34;border-bottom: 5px solid rgba(0, 0, 0, 0);width: 0;text-indent:-100000px;&quot; href=&quot;http://marxi.co/#/?provider=evernote_int&amp;guid=8df3e0d3-b1a9-4ee8-a883-3d1f0e0b13f8&amp;notebook=Django&quot;&gt;Edit&lt;/a&gt;&lt;/del&gt;&lt;div style=&quot;color: #2c3f51; font-family: 'Helvetica Neue', Arial, 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', 'WenQuanYi Micro Hei', SimSun, Song, sans-serif; line-height: 1.6;&quot;&gt;
                        
                    



&lt;h1 style=&quot;font-size: 2.6em; margin: 1.2em 0 .6em 0; font-family: inherit; font-weight: bold; line-height: 1.1; color: inherit; margin-top: 21px; margin-bottom: 10.5px; text-align: start;&quot;&gt;[Django]Custom Command Line&lt;/h1&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;/&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;Django를 다루면 가장 익숙한 파일이 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;manage.py&lt;/code&gt; 일 것이다. &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;manage.py&lt;/code&gt;에는 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;runserver&lt;/code&gt;, &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;makemigrations&lt;/code&gt;, &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;migrate&lt;/code&gt; 등 다양한 명령어들이 있는데 이러한 Command를 자신 입맛에 맞춰 만들 수 있다.&lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;Custom Command Line을 만들기 위해서는 다음과 같은 구조로 되어야한다.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;practice&lt;br/&gt;    -&lt;span style=&quot;line-height: 1.6;&quot;&gt; practice&lt;br/&gt;&lt;/span&gt;        -&lt;span style=&quot;line-height: 1.6;&quot;&gt; __init_&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;_&lt;/span&gt;.py&lt;br/&gt;&lt;/span&gt;        -&lt;span style=&quot;line-height: 1.6;&quot;&gt; settings.py&lt;br/&gt;&lt;/span&gt;        -&lt;span style=&quot;line-height: 1.6;&quot;&gt; urls.py&lt;br/&gt;&lt;/span&gt;        -&lt;span style=&quot;line-height: 1.6;&quot;&gt; wsgi.py&lt;br/&gt;&lt;/span&gt;    -&lt;span style=&quot;line-height: 1.6;&quot;&gt; custom&lt;br/&gt;&lt;/span&gt;        -&lt;span style=&quot;line-height: 1.6;&quot;&gt; __init_&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;_&lt;/span&gt;.py&lt;br/&gt;&lt;/span&gt;        -&lt;span style=&quot;line-height: 1.6;&quot;&gt; management&lt;br/&gt;&lt;/span&gt;            -&lt;span style=&quot;line-height: 1.6;&quot;&gt; __init_&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;_&lt;/span&gt;.py&lt;br/&gt;&lt;/span&gt;            -&lt;span style=&quot;line-height: 1.6;&quot;&gt; commands&lt;br/&gt;&lt;/span&gt;                -&lt;span style=&quot;line-height: 1.6;&quot;&gt; __init_&lt;span style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;_&lt;/span&gt;.py&lt;br/&gt;&lt;/span&gt;                -&lt;span style=&quot;line-height: 1.6;&quot;&gt; custom.py&lt;br/&gt;&lt;/span&gt;        -&lt;span style=&quot;line-height: 1.6;&quot;&gt; models.py&lt;br/&gt;&lt;/span&gt;        -&lt;span style=&quot;line-height: 1.6;&quot;&gt; views.py&lt;br/&gt;&lt;/span&gt;        -&lt;span style=&quot;line-height: 1.6;&quot;&gt; apps.py&lt;br/&gt;&lt;/span&gt;        -&lt;span style=&quot;line-height: 1.6;&quot;&gt; admin.py&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;custom 앱이 있다고 했을 경우에 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;settings.py&lt;/code&gt;에 custom 앱을 등록해주고, management 디렉토리를 만든 다음, commands 디렉토리를 생성해 그 안에 python 파일 하나를 생성해 주면 된다. 조심해야할 것은 python 파일이 있다는 것을 나타내기 위해 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;___init__.py&lt;/code&gt;이 필요하다.&lt;/p&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# custom.py&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; django.core.management.base &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; BaseCommand&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;Command&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(BaseCommand)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;handle&lt;/span&gt;&lt;span style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(self, *args, **kwargs)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;        print(&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'Hi'&lt;/span&gt;)&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이제 manage.py와 함께 custom 명령어를 쳐보자.&lt;/p&gt;



&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;$ python manage.py custom&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# Hi&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;center style=&quot;display:none&quot;&gt;%23%5BDjango%5DCustom%20Command%20Line%0A@%28Django%29%5Bdjango%7Cmanage%7Ccommand%5D%0A%0ADjango%uB97C%20%uB2E4%uB8E8%uBA74%20%uAC00%uC7A5%20%uC775%uC219%uD55C%20%uD30C%uC77C%uC774%20%60manage.py%60%20%uC77C%20%uAC83%uC774%uB2E4.%20%60manage.py%60%uC5D0%uB294%20%60runserver%60%2C%20%60makemigrations%60%2C%20%60migrate%60%20%uB4F1%20%uB2E4%uC591%uD55C%20%uBA85%uB839%uC5B4%uB4E4%uC774%20%uC788%uB294%uB370%20%uC774%uB7EC%uD55C%20Command%uB97C%20%uC790%uC2E0%20%uC785%uB9DB%uC5D0%20%uB9DE%uCDB0%20%uB9CC%uB4E4%20%uC218%20%uC788%uB2E4.%0A%0ACustom%20Command%20Line%uC744%20%uB9CC%uB4E4%uAE30%20%uC704%uD574%uC11C%uB294%20%uB2E4%uC74C%uACFC%20%uAC19%uC740%20%uAD6C%uC870%uB85C%20%uB418%uC5B4%uC57C%uD55C%uB2E4.%0A%0A%60%60%60%0Apractice%0A%09-%20practice%0A%09%09-%20__init__.py%0A%09%09-%20settings.py%0A%09%09-%20urls.py%0A%09%09-%20wsgi.py%0A%09-%20custom%0A%09%09-%20__init__.py%0A%09%09-%20management%0A%09%09%09-%20__init__.py%0A%09%09%09-%20commands%0A%09%09%09%09-%20__init__.py%0A%09%09%09%09-%20custom.py%0A%09%09-%20models.py%0A%09%09-%20views.py%0A%09%09-%20apps.py%0A%09%09-%20admin.py%0A%60%60%60%0A%0Acustom%20%uC571%uC774%20%uC788%uB2E4%uACE0%20%uD588%uC744%20%uACBD%uC6B0%uC5D0%20%60settings.py%60%uC5D0%20custom%20%uC571%uC744%20%uB4F1%uB85D%uD574%uC8FC%uACE0%2C%20management%20%uB514%uB809%uD1A0%uB9AC%uB97C%20%uB9CC%uB4E0%20%uB2E4%uC74C%2C%20commands%20%uB514%uB809%uD1A0%uB9AC%uB97C%20%uC0DD%uC131%uD574%20%uADF8%20%uC548%uC5D0%20python%20%uD30C%uC77C%20%uD558%uB098%uB97C%20%uC0DD%uC131%uD574%20%uC8FC%uBA74%20%uB41C%uB2E4.%20%uC870%uC2EC%uD574%uC57C%uD560%20%uAC83%uC740%20python%20%uD30C%uC77C%uC774%20%uC788%uB2E4%uB294%20%uAC83%uC744%20%uB098%uD0C0%uB0B4%uAE30%20%uC704%uD574%20%60___init__.py%60%uC774%20%uD544%uC694%uD558%uB2E4.%0A%0A%60%60%60python%0A%23%20custom.py%0Afrom%20django.core.management.base%20import%20BaseCommand%0A%0Aclass%20Command%28BaseCommand%29%3A%0A%20%20%20%20def%20handle%28self%2C%20*args%2C%20**kwargs%29%3A%0A%09%20%20%20%20print%28%27Hi%27%29%0A%60%60%60%0A%0A%0A%uC774%uC81C%20manage.py%uC640%20%uD568%uAED8%20custom%20%uBA85%uB839%uC5B4%uB97C%20%uCCD0%uBCF4%uC790.%0A%0A%60%60%60bash%0A%24%20python%20manage.py%20custom%0A%23%20Hi%0A%60%60%60&lt;/center&gt;&lt;br/&gt;&lt;/div&gt;
</content>
  </entry>
  <entry xml:base="http://genius-project.postach.io/feed.xml">
    <title type="text">[Python] 특정 룰에 맞추어 리스트 정렬하기</title>
    <id>https://genius-project.postach.io/post/python-teugjeong-rule-majcueo-riseuteu-jeongryeolhagi</id>
    <updated>2016-12-16T04:26:12.227000Z</updated>
    <published>2016-12-16T04:25:00Z</published>
    <link href="https://genius-project.postach.io/post/python-teugjeong-rule-majcueo-riseuteu-jeongryeolhagi" />
    <author>
      <name>Jaewon Kwon</name>
    </author>
    <category term="python" />
    <category term="list" />
    <category term="sort" />
    <category term="lambda" />
    <content type="html">&lt;div&gt;&lt;del style=&quot;position:relative;display:block;z-index:10;&quot;&gt;&lt;a style=&quot;position: absolute;color: #FFF;text-decoration: none;font-size: 12px;height: 25px;border-radius: 0;margin-top: -20px;right: 15px;background: rgba(0, 0, 0, 0);border-left: 10px solid #BB3A34;border-right: 10px solid #BB3A34;border-bottom: 5px solid rgba(0, 0, 0, 0);width: 0;text-indent:-100000px;&quot; href=&quot;http://marxi.co/#/?provider=evernote_int&amp;guid=89323b1a-1b41-4102-8dac-a1b0e0587938&amp;notebook=Python&quot;&gt;Edit&lt;/a&gt;&lt;/del&gt;&lt;div style=&quot;color: #2c3f51; font-family: 'Helvetica Neue', Arial, 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', 'WenQuanYi Micro Hei', SimSun, Song, sans-serif; line-height: 1.6;&quot;&gt;
                        
                    



&lt;h1 style=&quot;font-size: 2.6em; margin: 1.2em 0 .6em 0; font-family: inherit; font-weight: bold; line-height: 1.1; color: inherit; margin-top: 21px; margin-bottom: 10.5px; text-align: start;&quot;&gt;[Python] 특정 룰에 맞추어 리스트 정렬하기&lt;/h1&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;/&gt;

&lt;blockquote style=&quot;padding: 15px 20px; margin: 0 0 1.1em; border-left: 5px solid rgba(102,128,153,0.075); border-left-width: 10px; background-color: rgba(102,128,153,0.05); border-top-right-radius: 5px; border-bottom-right-radius: 5px;&quot;&gt;
  &lt;p style=&quot;margin: 0 0 1.1em; font-size: 1em; font-weight: 300; margin-bottom: 0; line-height: 1.6;&quot;&gt;python에는 리스트를 정렬하기 위해서는 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;sorted&lt;/code&gt;가 있다. 하지만 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;sorted&lt;/code&gt;는 기본적으로 리스트의 아이템 이름 순으로 정렬하는데 우리가 원하는 특정 규칙대로 정렬 하는 방법은 없을까?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;list = [&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'DB'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'DS'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'AI'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'OB'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'MF'&lt;/span&gt;]&lt;br/&gt;new_list = sorted(list)&lt;br/&gt;print(new_list)&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# ['AI', 'DB', 'DS', 'MF', 'OB']&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;다음과 같이 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;list&lt;/code&gt;를 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;sorted&lt;/code&gt; 시킬 때 아이템의 이름순으로 정렬 됨을 알 수 있다. 하지만 만약 &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;&lt;em style=&quot;line-height: 1.6;&quot;&gt;DB &gt; DS &gt; AI &gt; OB &gt; MF&lt;/em&gt;&lt;/strong&gt; 순으로 정렬을 하고 싶을 때 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;lambda&lt;/code&gt;를 이용하면 쉽게 구현할 수 있다.&lt;/p&gt;

&lt;pre style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;rule = [&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'DB'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'DS'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'AI'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'OB'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'MF'&lt;/span&gt;]&lt;br/&gt;order = {key: i &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;for&lt;/span&gt; i, key &lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;in&lt;/span&gt; enumerate(rule)}&lt;br/&gt;&lt;br/&gt;list = [&lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'DB'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'DS'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'AI'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'OB'&lt;/span&gt;, &lt;span style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'MF'&lt;/span&gt;]&lt;br/&gt;new_list = sorted(list, key=&lt;span style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;lambda&lt;/span&gt; k: order[k])&lt;br/&gt;print(new_list)&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# ['DB', 'DS', 'AI', 'OB', 'MF']&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;center style=&quot;display:none&quot;&gt;%23%5BPython%5D%20%uD2B9%uC815%20%uB8F0%uC5D0%20%uB9DE%uCD94%uC5B4%20%uB9AC%uC2A4%uD2B8%20%uC815%uB82C%uD558%uAE30%0A@%28Python%29%5Blist%2Csort%2Cpython%5D%0A%0A%3E%20python%uC5D0%uB294%20%uB9AC%uC2A4%uD2B8%uB97C%20%uC815%uB82C%uD558%uAE30%20%uC704%uD574%uC11C%uB294%20%60sorted%60%uAC00%20%uC788%uB2E4.%20%uD558%uC9C0%uB9CC%20%60sorted%60%uB294%20%uAE30%uBCF8%uC801%uC73C%uB85C%20%uB9AC%uC2A4%uD2B8%uC758%20%uC544%uC774%uD15C%20%uC774%uB984%20%uC21C%uC73C%uB85C%20%uC815%uB82C%uD558%uB294%uB370%20%uC6B0%uB9AC%uAC00%20%uC6D0%uD558%uB294%20%uD2B9%uC815%20%uADDC%uCE59%uB300%uB85C%20%uC815%uB82C%20%uD558%uB294%20%uBC29%uBC95%uC740%20%uC5C6%uC744%uAE4C%3F%0A%0A%60%60%60python%0Alist%20%3D%20%5B%27DB%27%2C%20%27DS%27%2C%20%27AI%27%2C%20%27OB%27%2C%20%27MF%27%5D%0Anew_list%20%3D%20sorted%28list%29%0Aprint%28new_list%29%0A%0A%23%20%5B%27AI%27%2C%20%27DB%27%2C%20%27DS%27%2C%20%27MF%27%2C%20%27OB%27%5D%0A%60%60%60%0A%uB2E4%uC74C%uACFC%20%uAC19%uC774%20%60list%60%uB97C%20%60sorted%60%20%uC2DC%uD0AC%20%uB54C%20%uC544%uC774%uD15C%uC758%20%uC774%uB984%uC21C%uC73C%uB85C%20%uC815%uB82C%20%uB428%uC744%20%uC54C%20%uC218%20%uC788%uB2E4.%20%uD558%uC9C0%uB9CC%20%uB9CC%uC57D%20***DB%20%3E%20DS%20%3E%20AI%20%3E%20OB%20%3E%20MF***%20%uC21C%uC73C%uB85C%20%uC815%uB82C%uC744%20%uD558%uACE0%20%uC2F6%uC744%20%uB54C%20%60lambda%60%uB97C%20%uC774%uC6A9%uD558%uBA74%20%uC27D%uAC8C%20%uAD6C%uD604%uD560%20%uC218%20%uC788%uB2E4.%0A%0A%60%60%60python%0Arule%20%3D%20%5B%27DB%27%2C%20%27DS%27%2C%20%27AI%27%2C%20%27OB%27%2C%20%27MF%27%5D%0Aorder%20%3D%20%7Bkey%3A%20i%20for%20i%2C%20key%20in%20enumerate%28rule%29%7D%0A%0Alist%20%3D%20%5B%27DB%27%2C%20%27DS%27%2C%20%27AI%27%2C%20%27OB%27%2C%20%27MF%27%5D%0Anew_list%20%3D%20sorted%28list%2C%20key%3Dlambda%20k%3A%20order%5Bk%5D%29%0Aprint%28new_list%29%0A%0A%23%20%5B%27DB%27%2C%20%27DS%27%2C%20%27AI%27%2C%20%27OB%27%2C%20%27MF%27%5D%0A%60%60%60%0A&lt;/center&gt;&lt;br/&gt;&lt;/div&gt;
</content>
  </entry>
  <entry xml:base="http://genius-project.postach.io/feed.xml">
    <title type="text">[Django] Related Field got invalid lookup: icontains</title>
    <id>https://genius-project.postach.io/post/django-related-field-got-invalid-lookup-icontains</id>
    <updated>2016-12-15T13:58:50.975000Z</updated>
    <published>2016-12-15T05:18:00Z</published>
    <link href="https://genius-project.postach.io/post/django-related-field-got-invalid-lookup-icontains" />
    <author>
      <name>Jaewon Kwon</name>
    </author>
    <category term="django" />
    <category term="error" />
    <category term="admin" />
    <category term="icontains" />
    <content type="html">&lt;div&gt;&lt;del style=&quot;position:relative;display:block;z-index:10;&quot;&gt;&lt;a  style=&quot;position: absolute;color: #FFF;text-decoration: none;font-size: 12px;height: 25px;border-radius: 0;margin-top: -20px;right: 15px;background: rgba(0, 0, 0, 0);border-left: 10px solid #BB3A34;border-right: 10px solid #BB3A34;border-bottom: 5px solid rgba(0, 0, 0, 0);width: 0;text-indent:-100000px;&quot; href=&quot;http://marxi.co/#/?provider=evernote_int&amp;guid=d0349e0e-3c98-41b9-9436-51004f906221&amp;notebook=Postach.io&quot;&gt;Edit&lt;/a&gt;&lt;/del&gt;&lt;div  style=&quot;color: #2c3f51; line-height: 1.6;&quot;&gt;
                        
                    

&lt;h1 style=&quot;font-size: 2.6em; margin: 1.2em 0 .6em 0; font-family: inherit; font-weight: bold; line-height: 1.1; color: inherit; margin-top: 21px; margin-bottom: 10.5px; text-align: start;&quot;&gt;[Django] Related Field got invalid lookup: icontains&lt;/h1&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;/&gt;

&lt;blockquote style=&quot;padding: 15px 20px; margin: 0 0 1.1em; border-left: 5px solid rgba(102,128,153,0.075); border-left-width: 10px; background-color: rgba(102,128,153,0.05); border-top-right-radius: 5px; border-bottom-right-radius: 5px;&quot;&gt;
  &lt;p style=&quot;margin: 0 0 1.1em; font-size: 1em; font-weight: 300; margin-bottom: 0; line-height: 1.6;&quot;&gt;django admin에 search field를 붙이지 Related Field got invalid lookup: icontains를 내밷는다.&lt;/p&gt;
&lt;/blockquote&gt;



&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;#models.py&lt;/span&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; django.db &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; models&lt;br/&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;class&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;User&lt;/span&gt;&lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(models.Model)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    email = models.EmailField()&lt;br/&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;class&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;Post&lt;/span&gt;&lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(models.Model)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    user = models.ForeignKey(User)&lt;br/&gt;    title = models.CharField(max_length=&lt;span  style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;255&lt;/span&gt;, null=&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;, blank=&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;True&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;    &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;def&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #a6e22e;&quot;&gt;__str__&lt;/span&gt;&lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(self)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;        &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; self.title&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;#admin.py&lt;/span&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; django.contrib &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; admin&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; .models &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; Post&lt;br/&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;class&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;PostAdmin&lt;/span&gt;&lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(admin.ModelAdmin)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    list_display = (&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'__str__'&lt;/span&gt;,)&lt;br/&gt;    search_fields = (&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'user'&lt;/span&gt;,)&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;post admin 내에서 user를 검색하기 위해 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;search_fields&lt;/code&gt;를 단둔히 user로 넣으면 안된다. 우리는 user의 email로 통해 검색을 할 것이기 때문에 user의 email을 검색하도록 해야한다. 이렇게 변경하자.&lt;/p&gt;



&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;#admin.py&lt;/span&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; django.contrib &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; admin&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;from&lt;/span&gt; .models &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;import&lt;/span&gt; Post&lt;br/&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;class&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;PostAdmin&lt;/span&gt;&lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(admin.ModelAdmin)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    list_display = (&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'__str__'&lt;/span&gt;,)&lt;br/&gt;    search_fields = (&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'user__email'&lt;/span&gt;,)&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;center style='display:none'&gt;%23%5BDjango%5D%20Related%20Field%20got%20invalid%20lookup%3A%20icontains%0A@%28Postach.io%29%5Bdjango%7Cerror%7Cadmin%7Cicontains%7Cpublished%5D%0A%0A%3E%20django%20admin%uC5D0%20search%20field%uB97C%20%uBD99%uC774%uC9C0%20Related%20Field%20got%20invalid%20lookup%3A%20icontains%uB97C%20%uB0B4%uBC37%uB294%uB2E4.%0A%0A%60%60%60python%0A%23models.py%0Afrom%20django.db%20import%20models%0A%0Aclass%20User%28models.Model%29%3A%0A%09email%20%3D%20models.EmailField%28%29%0A%0Aclass%20Post%28models.Model%29%3A%0A%09user%20%3D%20models.ForeignKey%28User%29%0A%09title%20%3D%20models.CharField%28max_length%3D255%2C%20null%3DTrue%2C%20blank%3DTrue%29%0A%0A%09def%20__str__%28self%29%3A%0A%09%09return%20self.title%0A%60%60%60%0A%0A%60%60%60python%20%0A%23admin.py%0Afrom%20django.contrib%20import%20admin%0Afrom%20.models%20import%20Post%0A%0Aclass%20PostAdmin%28admin.ModelAdmin%29%3A%0A%09list_display%20%3D%20%28%27__str__%27%2C%29%0A%09search_fields%20%3D%20%28%27user%27%2C%29%0A%60%60%60%0A%0Apost%20admin%20%uB0B4%uC5D0%uC11C%20user%uB97C%20%uAC80%uC0C9%uD558%uAE30%20%uC704%uD574%20%60search_fields%60%uB97C%20%uB2E8%uB454%uD788%20user%uB85C%20%uB123%uC73C%uBA74%20%uC548%uB41C%uB2E4.%20%uC6B0%uB9AC%uB294%20user%uC758%20email%uB85C%20%uD1B5%uD574%20%uAC80%uC0C9%uC744%20%uD560%20%uAC83%uC774%uAE30%20%uB54C%uBB38%uC5D0%20user%uC758%20email%uC744%20%uAC80%uC0C9%uD558%uB3C4%uB85D%20%uD574%uC57C%uD55C%uB2E4.%20%uC774%uB807%uAC8C%20%uBCC0%uACBD%uD558%uC790.%0A%0A%60%60%60python%0A%23admin.py%0Afrom%20django.contrib%20import%20admin%0Afrom%20.models%20import%20Post%0A%0Aclass%20PostAdmin%28admin.ModelAdmin%29%3A%0A%09list_display%20%3D%20%28%27__str__%27%2C%29%0A%09search_fields%20%3D%20%28%27user__email%27%2C%29%0A%60%60%60&lt;/center&gt;&lt;br/&gt;&lt;/div&gt;
</content>
  </entry>
  <entry xml:base="http://genius-project.postach.io/feed.xml">
    <title type="text">[Django]Django App 이름 변경</title>
    <id>https://genius-project.postach.io/post/django-django-app-ireum-byeongyeong</id>
    <updated>2016-12-15T14:09:47.472000Z</updated>
    <published>2016-12-15T04:34:49Z</published>
    <link href="https://genius-project.postach.io/post/django-django-app-ireum-byeongyeong" />
    <author>
      <name>Jaewon Kwon</name>
    </author>
    <category term="django" />
    <category term="mysql" />
    <content type="html">&lt;div&gt;&lt;del style=&quot;position:relative;display:block;z-index:10;&quot;&gt;&lt;a  style=&quot;position: absolute;color: #FFF;text-decoration: none;font-size: 12px;height: 25px;border-radius: 0;margin-top: -20px;right: 15px;background: rgba(0, 0, 0, 0);border-left: 10px solid #BB3A34;border-right: 10px solid #BB3A34;border-bottom: 5px solid rgba(0, 0, 0, 0);width: 0;text-indent:-100000px;&quot; href=&quot;http://marxi.co/#/?provider=evernote_int&amp;guid=c820f7e9-5de8-45f4-bb29-fd16a38141eb&amp;notebook=Postach.io&quot;&gt;Edit&lt;/a&gt;&lt;/del&gt;&lt;div  style=&quot;color: #2c3f51; line-height: 1.6;&quot;&gt;
                        
                    



&lt;h1 style=&quot;font-size: 2.6em; margin: 1.2em 0 .6em 0; font-family: inherit; font-weight: bold; line-height: 1.1; color: inherit; margin-top: 21px; margin-bottom: 10.5px; text-align: start;&quot;&gt;[Django]Django App 이름 변경&lt;/h1&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;/&gt;

&lt;blockquote style=&quot;padding: 15px 20px; margin: 0 0 1.1em; border-left: 5px solid rgba(102,128,153,0.075); border-left-width: 10px; background-color: rgba(102,128,153,0.05); border-top-right-radius: 5px; border-bottom-right-radius: 5px;&quot;&gt;
  &lt;p style=&quot;margin: 0 0 1.1em; font-size: 1em; font-weight: 300; margin-bottom: 0; line-height: 1.6;&quot;&gt;장고 앱 이름을 변경할 상황이 발생. 문제는 migrate까지 이미 다 시킨 상태. 단순히 이름 변경으로는 해결이 되지 않는다. &lt;br/&gt;
  &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;klamer&lt;/code&gt;이라는 앱을 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;klymer&lt;/code&gt;로 변경해보자. (MySQL)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;장고는 migrate 실행시 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;django_migration&lt;/code&gt;과 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;django_content_type&lt;/code&gt;에 앱 이름이 들어가고 MySQl의 테이블 이름에 앱 이름이 들어간다. 따라서 단순히 폴더나 클래스 이름을 바꾸는 것에 끝나는 것이 아니라 직접 sql문으로 고쳐주어야 한다.&lt;/p&gt;

&lt;ol style=&quot;margin-top: 0; margin-bottom: 1.1em; line-height: 1.6;&quot;&gt;&lt;li style=&quot;line-height: 1.6;&quot;&gt;&lt;p style=&quot;margin: 0 0 1.1em; margin-bottom: 0; line-height: 1.6;&quot;&gt;앱 디렉토리 이름 변경 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;klamer&lt;/code&gt; &gt; &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;klymer&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li style=&quot;line-height: 1.6;&quot;&gt;&lt;p style=&quot;margin: 0 0 1.1em; margin-bottom: 0; line-height: 1.6;&quot;&gt;settings.py 의 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;klamer&lt;/code&gt;를  &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;klymer&lt;/code&gt;로 변경&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;#settings.py&lt;/span&gt;&lt;br/&gt;INSTALLED_APPS = [&lt;br/&gt;    ...&lt;br/&gt;    &lt;span  style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;#'klamer',&lt;/span&gt;&lt;br/&gt;    &lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'klymer'&lt;/span&gt;,&lt;br/&gt;]&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;ol start=&quot;3&quot; style=&quot;margin-top: 0; margin-bottom: 1.1em; line-height: 1.6;&quot;&gt;&lt;li style=&quot;line-height: 1.6;&quot;&gt;klymer.apps.py의 app 이름 변경&lt;/li&gt;
&lt;/ol&gt;



&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;#class KlamerConfig(AppConfing):&lt;/span&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;#   name = 'klamer'&lt;/span&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;class&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;KlymerConfig&lt;/span&gt;&lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;(AppConfig)&lt;/span&gt;:&lt;/span&gt;&lt;br/&gt;    name = &lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'klymer'&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;ol start=&quot;4&quot; style=&quot;margin-top: 0; margin-bottom: 1.1em; line-height: 1.6;&quot;&gt;&lt;li style=&quot;line-height: 1.6;&quot;&gt;MySQL에 접속&lt;/li&gt;
&lt;/ol&gt;



&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;python manage.py dbshell&lt;br/&gt;&lt;br/&gt;mysql&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;ol start=&quot;5&quot; style=&quot;margin-top: 0; margin-bottom: 1.1em; line-height: 1.6;&quot;&gt;&lt;li style=&quot;line-height: 1.6;&quot;&gt;table 목록을 보면 다음과 같이 나온다. 변경 해주어야하는 거는 저 3개다.&lt;/li&gt;
&lt;/ol&gt;

&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;mysql &gt; &lt;span  style=&quot;line-height: 1.6;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;show&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;tables&lt;/span&gt;;&lt;/span&gt;&lt;br/&gt;+&lt;span  style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;-------------------+&lt;/span&gt;&lt;br/&gt;|   Tables_in_...   |&lt;br/&gt;+&lt;span  style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;-------------------+&lt;/span&gt;&lt;br/&gt;|       ...         |&lt;br/&gt;|django_content_type|&lt;br/&gt;| django_migrations |&lt;br/&gt;|   klamer_input    |&lt;br/&gt;+&lt;span  style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;-------------------+&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;ol start=&quot;6&quot; style=&quot;margin-top: 0; margin-bottom: 1.1em; line-height: 1.6;&quot;&gt;&lt;li style=&quot;line-height: 1.6;&quot;&gt;klamer 앱 table 이름을 바꾸자.&lt;/li&gt;
&lt;/ol&gt;



&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;mysql &gt; &lt;span  style=&quot;line-height: 1.6;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;alter&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;table&lt;/span&gt; klamer_input &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;rename&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;to&lt;/span&gt; klymer_input&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;ol start=&quot;7&quot; style=&quot;margin-top: 0; margin-bottom: 1.1em; line-height: 1.6;&quot;&gt;&lt;li style=&quot;line-height: 1.6;&quot;&gt;django content_type 과 django_migrations 내 klamer 이름을 변경하자.&lt;/li&gt;
&lt;/ol&gt;



&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;mysql &gt; &lt;span  style=&quot;line-height: 1.6;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;update&lt;/span&gt; django_content_type &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;set&lt;/span&gt; app_label=&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'klymer'&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;where&lt;/span&gt; app_label=&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'klamer'&lt;/span&gt;&lt;br/&gt;mysql &gt; &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;update&lt;/span&gt; django_migrations &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;set&lt;/span&gt; app=&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'klymer'&lt;/span&gt; &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;where&lt;/span&gt; app=&lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'klamer'&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;8 . &lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;klymer/migrations 폴더 내 모든 파일 삭제 후&lt;/strong&gt; migrate&lt;/p&gt;



&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;python manage.py makemigrations&lt;br/&gt;python manage.py migrate&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;center style='display:none'&gt;%23%20%5BDjango%5DDjango%20App%20%uC774%uB984%20%uBCC0%uACBD%0A@%28Postach.io%29%5Bdjango%7Cmysql%7Cpublished%5D%0A%0A%3E%20%uC7A5%uACE0%20%uC571%20%uC774%uB984%uC744%20%uBCC0%uACBD%uD560%20%uC0C1%uD669%uC774%20%uBC1C%uC0DD.%20%uBB38%uC81C%uB294%20migrate%uAE4C%uC9C0%20%uC774%uBBF8%20%uB2E4%20%uC2DC%uD0A8%20%uC0C1%uD0DC.%20%uB2E8%uC21C%uD788%20%uC774%uB984%20%uBCC0%uACBD%uC73C%uB85C%uB294%20%uD574%uACB0%uC774%20%uB418%uC9C0%20%uC54A%uB294%uB2E4.%0A%3E%20%60klamer%60%uC774%uB77C%uB294%20%uC571%uC744%20%60klymer%60%uB85C%20%uBCC0%uACBD%uD574%uBCF4%uC790.%20%28MySQL%29%0A%0A%uC7A5%uACE0%uB294%20migrate%20%uC2E4%uD589%uC2DC%20%60django_migration%60%uACFC%20%60django_content_type%60%uC5D0%20%uC571%20%uC774%uB984%uC774%20%uB4E4%uC5B4%uAC00%uACE0%20MySQl%uC758%20%uD14C%uC774%uBE14%20%uC774%uB984%uC5D0%20%uC571%20%uC774%uB984%uC774%20%uB4E4%uC5B4%uAC04%uB2E4.%20%uB530%uB77C%uC11C%20%uB2E8%uC21C%uD788%20%uD3F4%uB354%uB098%20%uD074%uB798%uC2A4%20%uC774%uB984%uC744%20%uBC14%uAFB8%uB294%20%uAC83%uC5D0%20%uB05D%uB098%uB294%20%uAC83%uC774%20%uC544%uB2C8%uB77C%20%uC9C1%uC811%20sql%uBB38%uC73C%uB85C%20%uACE0%uCCD0%uC8FC%uC5B4%uC57C%20%uD55C%uB2E4.%0A%0A1.%20%uC571%20%uB514%uB809%uD1A0%uB9AC%20%uC774%uB984%20%uBCC0%uACBD%20%60klamer%60%20%3E%20%60klymer%60%0A%0A2.%20settings.py%20%uC758%20%60klamer%60%uB97C%20%20%60klymer%60%uB85C%20%uBCC0%uACBD%0A%0A%60%60%60%20python%0A%23settings.py%0AINSTALLED_APPS%20%3D%20%5B%0A%09...%0A%09%23%27klamer%27%2C%0A%09%27klymer%27%2C%0A%5D%0A%60%60%60%0A%0A3.%20klymer.apps.py%uC758%20app%20%uC774%uB984%20%uBCC0%uACBD%0A%60%60%60python%0A%23class%20KlamerConfig%28AppConfing%29%3A%0A%23%09name%20%3D%20%27klamer%27%0Aclass%20KlymerConfig%28AppConfig%29%3A%0A%09name%20%3D%20%27klymer%27%0A%60%60%60%0A%0A4.%20MySQL%uC5D0%20%uC811%uC18D%0A%60%60%60bash%0Apython%20manage.py%20dbshell%0A%0Amysql%3E%0A%60%60%60%0A%0A5.%20table%20%uBAA9%uB85D%uC744%20%uBCF4%uBA74%20%uB2E4%uC74C%uACFC%20%uAC19%uC774%20%uB098%uC628%uB2E4.%20%uBCC0%uACBD%20%uD574%uC8FC%uC5B4%uC57C%uD558%uB294%20%uAC70%uB294%20%uC800%203%uAC1C%uB2E4.%0A%60%60%60sql%0Amysql%20%3E%20show%20tables%3B%0A+-------------------+%0A%7C%20%20%09Tables_in_...%20%20%20%7C%0A+-------------------+%0A%7C%09%09...%09%09%09%7C%0A%7Cdjango_content_type%7C%0A%7C%20django_migrations%09%7C%0A%7C%09klamer_input%09%7C%0A+-------------------+%0A%60%60%60%0A%0A6.%20klamer%20%uC571%20table%20%uC774%uB984%uC744%20%uBC14%uAFB8%uC790.%0A%60%60%60sql%0Amysql%20%3E%20alter%20table%20klamer_input%20rename%20to%20klymer_input%0A%60%60%60%0A%0A7.%20django%20content_type%20%uACFC%20django_migrations%20%uB0B4%20klamer%20%uC774%uB984%uC744%20%uBCC0%uACBD%uD558%uC790.%0A%60%60%60%09sql%0Amysql%20%3E%20update%20django_content_type%20set%20app_label%3D%27klymer%27%20where%20app_label%3D%27klamer%27%0Amysql%20%3E%20update%20django_migrations%20set%20app%3D%27klymer%27%20where%20app%3D%27klamer%27%0A%60%60%60%0A%0A8%20.%20**klymer/migrations%20%uD3F4%uB354%20%uB0B4%20%uBAA8%uB4E0%20%uD30C%uC77C%20%uC0AD%uC81C%20%uD6C4**%20migrate%0A%60%60%60bash%0Apython%20manage.py%20makemigrations%0Apython%20manage.py%20migrate%0A%60%60%60&lt;/center&gt;&lt;br/&gt;&lt;/div&gt;
</content>
  </entry>
  <entry xml:base="http://genius-project.postach.io/feed.xml">
    <title type="text">[Django]’ManyRelatedManager’ object does not support indexing</title>
    <id>https://genius-project.postach.io/post/django-manyrelatedmanager-object-does-not-support-indexing</id>
    <updated>2016-11-19T09:36:01.743000Z</updated>
    <published>2016-11-19T09:35:56Z</published>
    <link href="https://genius-project.postach.io/post/django-manyrelatedmanager-object-does-not-support-indexing" />
    <author>
      <name>Jaewon Kwon</name>
    </author>
    <category term="django" />
    <category term="error" />
    <content type="html">&lt;div&gt;&lt;del style=&quot;position:relative;display:block;z-index:10;&quot;&gt;&lt;a  style=&quot;position: absolute;color: #FFF;text-decoration: none;font-size: 12px;height: 25px;border-radius: 0;margin-top: -20px;right: 15px;background: rgba(0, 0, 0, 0);border-left: 10px solid #BB3A34;border-right: 10px solid #BB3A34;border-bottom: 5px solid rgba(0, 0, 0, 0);width: 0;text-indent:-100000px;&quot; href=&quot;http://marxi.co/#/?provider=evernote_int&amp;guid=c6f1c325-c7cd-402e-9fea-7ad5f9b4f58b&amp;notebook=Postach.io&quot;&gt;Edit&lt;/a&gt;&lt;/del&gt;&lt;div  style=&quot;color: #2c3f51; font-family: 'Helvetica Neue', Arial, 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', 'WenQuanYi Micro Hei', SimSun, Song, sans-serif; line-height: 1.6;&quot;&gt;
                        
                    



&lt;h3 style=&quot;font-family: inherit; font-weight: bold; color: inherit; margin-top: 21px; margin-bottom: 10.5px; font-size: 1.7em; margin: 1.2em 0 .6em 0; text-align: start; line-height: 1.6;&quot;&gt;[Django]’ManyRelatedManager’ object does not support indexing&lt;/h3&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;/&gt;

&lt;blockquote style=&quot;padding: 15px 20px; margin: 0 0 1.1em; border-left: 5px solid rgba(102,128,153,0.075); border-left-width: 10px; background-color: rgba(102,128,153,0.05); border-top-right-radius: 5px; border-bottom-right-radius: 5px;&quot;&gt;
  &lt;p style=&quot;margin: 0 0 1.1em; font-size: 1em; font-weight: 300; margin-bottom: 0; line-height: 1.6;&quot;&gt;&lt;strong style=&quot;font-weight: bold; line-height: 1.6;&quot;&gt;상황 : &lt;/strong&gt; &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;order&lt;/code&gt; 와 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;ManytoMany&lt;/code&gt; 관계인 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;product&lt;/code&gt;들을 모조리 불러들이고 싶음.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;# terminal&lt;/span&gt;&lt;br/&gt;TypeError: &lt;span  style=&quot;line-height: 1.6; color: #e6db74;&quot;&gt;'ManyRelatedManager'&lt;/span&gt; object does not support indexing&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;Django에서 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;ManytoMany&lt;/code&gt; 관계를 사용 시 iterable하게 사용하고 싶을 때가 있다. 하지만 안타깝게도 Django의 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;ManytoMany&lt;/code&gt;는 이러한 기능을 지원하지 않는다. &lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;따라서 관련된 objects들을 가져오기 위해서는 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;all()&lt;/code&gt;을 사용하면 된다. &lt;/p&gt;

&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;Order.product.all()&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이러한 이유는 Django의 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;ManytoManyField()&lt;/code&gt;가 실제 Field가 아니라 단순 Manager() 역할을 하기 때문이다. &lt;/p&gt;&lt;/div&gt;&lt;center style='display:none'&gt;%23%23%23%20%5BDjango%5D%27ManyRelatedManager%27%20object%20does%20not%20support%20indexing%0A@%28Postach.io%29%5Bdjango%7Cerror%7Cpublished%5D%0A%0A%3E**%uC0C1%uD669%20%3A%20**%20%60order%60%20%uC640%20%60ManytoMany%60%20%uAD00%uACC4%uC778%20%60product%60%uB4E4%uC744%20%uBAA8%uC870%uB9AC%20%uBD88%uB7EC%uB4E4%uC774%uACE0%20%uC2F6%uC74C.%0A%0A%60%60%60bash%0A%23%20terminal%0ATypeError%3A%20%27ManyRelatedManager%27%20object%20does%20not%20support%20indexing%0A%60%60%60%0A%0ADjango%uC5D0%uC11C%20%60ManytoMany%60%20%uAD00%uACC4%uB97C%20%uC0AC%uC6A9%20%uC2DC%20iterable%uD558%uAC8C%20%uC0AC%uC6A9%uD558%uACE0%20%uC2F6%uC744%20%uB54C%uAC00%20%uC788%uB2E4.%20%uD558%uC9C0%uB9CC%20%uC548%uD0C0%uAE5D%uAC8C%uB3C4%20Django%uC758%20%60ManytoMany%60%uB294%20%uC774%uB7EC%uD55C%20%uAE30%uB2A5%uC744%20%uC9C0%uC6D0%uD558%uC9C0%20%uC54A%uB294%uB2E4.%20%0A%0A%uB530%uB77C%uC11C%20%uAD00%uB828%uB41C%20objects%uB4E4%uC744%20%uAC00%uC838%uC624%uAE30%20%uC704%uD574%uC11C%uB294%20%60all%28%29%60%uC744%20%uC0AC%uC6A9%uD558%uBA74%20%uB41C%uB2E4.%20%0A%0A%60%60%60python%0AOrder.product.all%28%29%0A%60%60%60%0A%0A%uC774%uB7EC%uD55C%20%uC774%uC720%uB294%20Django%uC758%20%60ManytoManyField%28%29%60%uAC00%20%uC2E4%uC81C%20Field%uAC00%20%uC544%uB2C8%uB77C%20%uB2E8%uC21C%20Manager%28%29%20%uC5ED%uD560%uC744%20%uD558%uAE30%20%uB54C%uBB38%uC774%uB2E4.%20&lt;/center&gt;&lt;br/&gt;&lt;/div&gt;
</content>
  </entry>
  <entry xml:base="http://genius-project.postach.io/feed.xml">
    <title type="text">[React]선언형(declarative) 프로그래밍에 대하여</title>
    <id>https://genius-project.postach.io/post/piecing-the-puzzle</id>
    <updated>2016-11-14T06:18:45.136000Z</updated>
    <published>2016-11-14T05:35:18Z</published>
    <link href="https://genius-project.postach.io/post/piecing-the-puzzle" />
    <author>
      <name>Jaewon Kwon</name>
    </author>
    <category term="react" />
    <category term="declarative" />
    <category term="reactjs" />
    <content type="html">&lt;div&gt;&lt;del style=&quot;position:relative;display:block;z-index:10;&quot;&gt;&lt;a  style=&quot;position: absolute;color: #FFF;text-decoration: none;font-size: 12px;height: 25px;border-radius: 0;margin-top: -20px;right: 15px;background: rgba(0, 0, 0, 0);border-left: 10px solid #BB3A34;border-right: 10px solid #BB3A34;border-bottom: 5px solid rgba(0, 0, 0, 0);width: 0;text-indent:-100000px;&quot; href=&quot;http://marxi.co/#/?provider=evernote_int&amp;guid=5118600a-1f7c-4e9a-80e6-1685b237fbe9&amp;notebook=Postach.io&quot;&gt;Edit&lt;/a&gt;&lt;/del&gt;&lt;div  style=&quot;color: #2c3f51; font-family: 'Helvetica Neue', Arial, 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', 'WenQuanYi Micro Hei', SimSun, Song, sans-serif; line-height: 1.6;&quot;&gt;
                        
                    



&lt;h3 style=&quot;font-family: inherit; font-weight: bold; color: inherit; margin-top: 21px; margin-bottom: 10.5px; font-size: 1.7em; margin: 1.2em 0 .6em 0; text-align: start; line-height: 1.6;&quot;&gt;[React]선언형(declarative) 프로그래밍에 대하여&lt;/h3&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;/&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;React를 들어가기 전에 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;선언형(declarative)&lt;/code&gt;에 대하여 알아보도록 하자. &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;declarative programming&lt;/code&gt;에 대하여 설명하기 위해서는 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;imperative programming&lt;/code&gt;이 빠질 수는 없다. &lt;/p&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;기본적으로 프로그래밍에 입문을 하였다면 다음 코드가 어떤 것인 지를 금방 파악 할 수 있다.&lt;/p&gt;

&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;// Imperative (How)&lt;/span&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; numbers = [&lt;span  style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;4&lt;/span&gt;,&lt;span  style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;2&lt;/span&gt;,&lt;span  style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;3&lt;/span&gt;,&lt;span  style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;6&lt;/span&gt;]&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; total = &lt;span  style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;0&lt;/span&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;for&lt;/span&gt; (&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; i = &lt;span  style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;0&lt;/span&gt;; i &lt; numbers.length; i++) {&lt;br/&gt;    total += numbers[i]&lt;br/&gt;}&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;for&lt;/code&gt;문을 이용하여 배열 안에 있는 숫자들을 다 더하는 걸 수행하게 되는데 결과값은 당연히 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;15&lt;/code&gt;가 나온다는 것을 금방 알아챌 수 있다. &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;15&lt;/code&gt;라는 값을 예상하기 위해서는 우리 뇌에서는 아마 다음과 같은 과정을 거칠 것이다.&lt;/p&gt;

&lt;ol style=&quot;margin-top: 0; margin-bottom: 1.1em; line-height: 1.6;&quot;&gt;&lt;li style=&quot;line-height: 1.6;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;total&lt;/code&gt;이라는 변수가 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;0&lt;/code&gt;으로 선언이 되어 있고&lt;/li&gt;
&lt;li style=&quot;line-height: 1.6;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;for&lt;/code&gt;문을 지나면서 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;numbers&lt;/code&gt;의 0번째 원소를 더하고&lt;/li&gt;
&lt;li style=&quot;line-height: 1.6;&quot;&gt;다시 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;for&lt;/code&gt;에 의해 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;numbers&lt;/code&gt;의 1번쨰 원소를 더하고&lt;/li&gt;
&lt;li style=&quot;line-height: 1.6;&quot;&gt;반복반복 우걱우걱&lt;/li&gt;
&lt;li style=&quot;line-height: 1.6;&quot;&gt;다 더하면 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;15&lt;/code&gt;가 될 것이다!&lt;/li&gt;
&lt;/ol&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;이렇게 생각한 것은 컴퓨터가 위에서부터 아래로 순차적으로 진행될 것이라  염두 해 두고 진행된 것이다. &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;total&lt;/code&gt;이라는 값을 구하기 위해서 단순히 알고리즘을 제공했을 뿐이다. 이런 방식이 바로   &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;명령형(imperative)&lt;/code&gt; 프로그래밍이다.&lt;/p&gt;

&lt;hr style=&quot;-moz-box-sizing: content-box; box-sizing: content-box; height: 0; margin-top: 21px; margin-bottom: 21px; border: 0; border-top: 1px solid rgba(102,128,153,0.1); margin: 2em 0; line-height: 1.6;&quot;/&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;그럼 오늘 알아볼 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;선언형(Declarative)&lt;/code&gt;프로그래밍을 그대로  적용해보면 어떻게 될까?&lt;/p&gt;



&lt;pre  style=&quot;font-family: 'Source Code Pro',monospace; white-space: pre-wrap; display: block; background-color: rgba(102,128,153,0.05); color: #333; word-wrap: break-word; font-size: .9em; background: #f6f6f6; line-height: 1.6; margin: 0 0 1.1em; padding: 0; border: 0; border-radius: 5px; text-align: start; word-break: break-all;&quot;&gt;&lt;code  style=&quot;font-family: 'Source Code Pro',monospace; font-size: inherit; background-color: transparent; white-space: pre-wrap; border-radius: 0; color: #f8f8f2; display: block; background: #23241f; padding: 1.3em 2em;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #75715e;&quot;&gt;// Declarative (What)&lt;/span&gt;&lt;br/&gt;&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;var&lt;/span&gt; numbers = [&lt;span  style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;4&lt;/span&gt;,&lt;span  style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;2&lt;/span&gt;,&lt;span  style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;3&lt;/span&gt;,&lt;span  style=&quot;line-height: 1.6; color: #ae81ff;&quot;&gt;6&lt;/span&gt;]&lt;br/&gt;numbers.reduce(&lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;&lt;span  style=&quot;line-height: 1.6; color: #66d9ef;&quot;&gt;function&lt;/span&gt; (&lt;span  style=&quot;line-height: 1.6; color: #f8f8f2;&quot;&gt;previous, current&lt;/span&gt;) &lt;/span&gt;{&lt;br/&gt;    &lt;span  style=&quot;line-height: 1.6; color: #f92672;&quot;&gt;return&lt;/span&gt; previous + current&lt;br/&gt;})&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style=&quot;margin: 0 0 1.1em; line-height: 1.6;&quot;&gt;&lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;React.js&lt;/code&gt;는 &lt;code style=&quot;font-family: 'Source Code Pro',monospace; font-size: .9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; white-space: normal; border-radius: 4px;&quot;&gt;declarative&lt;/code&gt; 스타일이라 할 수 있다. “이건 이렇게 생겨야 해!&quot; 하면서 flow나 state를 조절 하게 할 수 있다. &lt;/p&gt;&lt;/div&gt;&lt;center style='display:none'&gt;%23%23%23%5BReact%5D%uC120%uC5B8%uD615%28declarative%29%20%uD504%uB85C%uADF8%uB798%uBC0D%uC5D0%20%uB300%uD558%uC5EC%0A@%28Postach.io%29%5BReact%2C%20ReactJs%2C%20Declarative%2C%20published%5D%0A%0A%20%20React%uB97C%20%uB4E4%uC5B4%uAC00%uAE30%20%uC804%uC5D0%20%60%uC120%uC5B8%uD615%28declarative%29%60%uC5D0%20%uB300%uD558%uC5EC%20%uC54C%uC544%uBCF4%uB3C4%uB85D%20%uD558%uC790.%20%60declarative%20programming%60%uC5D0%20%uB300%uD558%uC5EC%20%uC124%uBA85%uD558%uAE30%20%uC704%uD574%uC11C%uB294%20%60imperative%20programming%60%uC774%20%uBE60%uC9C8%20%uC218%uB294%20%uC5C6%uB2E4.%20%0A%0A%20%20%20%uAE30%uBCF8%uC801%uC73C%uB85C%20%uD504%uB85C%uADF8%uB798%uBC0D%uC5D0%20%uC785%uBB38%uC744%20%uD558%uC600%uB2E4%uBA74%20%uB2E4%uC74C%20%uCF54%uB4DC%uAC00%20%uC5B4%uB5A4%20%uAC83%uC778%20%uC9C0%uB97C%20%uAE08%uBC29%20%uD30C%uC545%20%uD560%20%uC218%20%uC788%uB2E4.%0A%0A%60%60%60javascript%0A//%20Imperative%20%28How%29%0Avar%20numbers%20%3D%20%5B4%2C2%2C3%2C6%5D%0Avar%20total%20%3D%200%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20numbers.length%3B%20i++%29%20%7B%0A%09total%20+%3D%20numbers%5Bi%5D%0A%7D%0A%60%60%60%0A%0A%60for%60%uBB38%uC744%20%uC774%uC6A9%uD558%uC5EC%20%uBC30%uC5F4%20%uC548%uC5D0%20%uC788%uB294%20%uC22B%uC790%uB4E4%uC744%20%uB2E4%20%uB354%uD558%uB294%20%uAC78%20%uC218%uD589%uD558%uAC8C%20%uB418%uB294%uB370%20%uACB0%uACFC%uAC12%uC740%20%uB2F9%uC5F0%uD788%20%6015%60%uAC00%20%uB098%uC628%uB2E4%uB294%20%uAC83%uC744%20%uAE08%uBC29%20%uC54C%uC544%uCC4C%20%uC218%20%uC788%uB2E4.%20%6015%60%uB77C%uB294%20%uAC12%uC744%20%uC608%uC0C1%uD558%uAE30%20%uC704%uD574%uC11C%uB294%20%uC6B0%uB9AC%20%uB1CC%uC5D0%uC11C%uB294%20%uC544%uB9C8%20%uB2E4%uC74C%uACFC%20%uAC19%uC740%20%uACFC%uC815%uC744%20%uAC70%uCE60%20%uAC83%uC774%uB2E4.%0A%0A1.%20%60total%60%uC774%uB77C%uB294%20%uBCC0%uC218%uAC00%20%600%60%uC73C%uB85C%20%uC120%uC5B8%uC774%20%uB418%uC5B4%20%uC788%uACE0%0A2.%20%20%60for%60%uBB38%uC744%20%uC9C0%uB098%uBA74%uC11C%20%60numbers%20%60%uC758%200%uBC88%uC9F8%20%uC6D0%uC18C%uB97C%20%uB354%uD558%uACE0%0A3.%20%20%uB2E4%uC2DC%20%60for%60%uC5D0%20%uC758%uD574%20%60numbers%60%uC758%201%uBC88%uCA30%20%uC6D0%uC18C%uB97C%20%uB354%uD558%uACE0%0A4.%20%20%uBC18%uBCF5%uBC18%uBCF5%20%uC6B0%uAC71%uC6B0%uAC71%0A5.%20%20%uB2E4%20%uB354%uD558%uBA74%20%6015%60%uAC00%20%uB420%20%uAC83%uC774%uB2E4%21%0A%0A%uC774%uB807%uAC8C%20%uC0DD%uAC01%uD55C%20%uAC83%uC740%20%uCEF4%uD4E8%uD130%uAC00%20%uC704%uC5D0%uC11C%uBD80%uD130%20%uC544%uB798%uB85C%20%uC21C%uCC28%uC801%uC73C%uB85C%20%uC9C4%uD589%uB420%20%uAC83%uC774%uB77C%20%20%uC5FC%uB450%20%uD574%20%uB450%uACE0%20%uC9C4%uD589%uB41C%20%uAC83%uC774%uB2E4.%20%60total%60%uC774%uB77C%uB294%20%uAC12%uC744%20%uAD6C%uD558%uAE30%20%uC704%uD574%uC11C%20%uB2E8%uC21C%uD788%20%uC54C%uACE0%uB9AC%uC998%uC744%20%uC81C%uACF5%uD588%uC744%20%uBFD0%uC774%uB2E4.%20%uC774%uB7F0%20%uBC29%uC2DD%uC774%20%uBC14%uB85C%20%09%60%uBA85%uB839%uD615%28imperative%29%60%20%uD504%uB85C%uADF8%uB798%uBC0D%uC774%uB2E4.%0A%0A---%0A%0A%uADF8%uB7FC%20%uC624%uB298%20%uC54C%uC544%uBCFC%20%60%uC120%uC5B8%uD615%28Declarative%29%20%60%uD504%uB85C%uADF8%uB798%uBC0D%uC744%20%uADF8%uB300%uB85C%20%20%uC801%uC6A9%uD574%uBCF4%uBA74%20%uC5B4%uB5BB%uAC8C%20%uB420%uAE4C%3F%0A%0A%60%60%60javascript%0A//%20Declarative%20%28What%29%0Avar%20numbers%20%3D%20%5B4%2C2%2C3%2C6%5D%0Anumbers.reduce%28function%20%28previous%2C%20current%29%20%7B%0A%09return%20previous%20+%20current%0A%7D%29%0A%60%60%60%0A%0A%0A%0A%60React.js%60%uB294%20%60declarative%60%20%uC2A4%uD0C0%uC77C%uC774%uB77C%20%uD560%20%uC218%20%uC788%uB2E4.%20%22%uC774%uAC74%20%uC774%uB807%uAC8C%20%uC0DD%uACA8%uC57C%20%uD574%21%22%20%uD558%uBA74%uC11C%20flow%uB098%20state%uB97C%20%uC870%uC808%20%uD558%uAC8C%20%uD560%20%uC218%20%uC788%uB2E4.%20&lt;/center&gt;&lt;br/&gt;&lt;/div&gt;
</content>
  </entry>
</feed>
