<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Ziks</title>
    <link>https://bassyun.tistory.com/</link>
    <description>Bassist</description>
    <language>ko</language>
    <pubDate>Wed, 1 Jul 2026 23:59:39 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>YunZiks</managingEditor>
    <image>
      <title>Ziks</title>
      <url>https://tistory1.daumcdn.net/tistory/2895532/attach/dfc8adf2d250499c9b42f7bb2d895520</url>
      <link>https://bassyun.tistory.com</link>
    </image>
    <item>
      <title>[QT] Signal 과 Slot (Event 처리)</title>
      <link>https://bassyun.tistory.com/40</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Signal &amp;harr; Slot은 객체간의 통신을 위한 기능&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QT에서는 이벤트를 처리할 때 관찰자 패턴인 &lt;code&gt;Signal&lt;/code&gt;&amp;amp; &lt;code&gt;Slot&lt;/code&gt;을 사용한다. 객체를 클릭하거나 잡는 등의 여러가지 이벤트들을 캐치하고 각 이벤트들에 맞는 함수를 실행한다. 기본적으로 QT에서 제공되는 위젯들은 여러가지 Signal이 제공된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 &lt;code&gt;Signal&lt;/code&gt;은 다수의 &lt;code&gt;Slot&lt;/code&gt;과 연결하여 사용할 수 있다. 하나의 &lt;code&gt;Signal&lt;/code&gt;에 여러개의 &lt;code&gt;Slot&lt;/code&gt;을 등록하여 여러개의 핸들러를 실행할 수 있다. 또한, Signal 과 Slot은 GUI 이벤트 루프와 완전히 독립적으로 수행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QT는 타입 안정성을 가지고 있으며 OOP를 사용하는 언어들에서 주로 쓰이는 인터페이스를 사용하면 객체와 객체의 커플링으로 상호 참조 및 강한 커플링이 생기는 것을 방지하기 위해 핸들러 오브젝트간 서로 참조하지 않게하여 아무런 연관관계 없이 사용이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Connect&lt;/code&gt;함수를 사용하여 &lt;code&gt;Signal&lt;/code&gt;과 &lt;code&gt;Slot&lt;/code&gt;을 객체간의 연관관계를 맺어주고 연결한다. &lt;code&gt;Slot&lt;/code&gt;이 처리해야할 &lt;code&gt;Signal&lt;/code&gt;을 관찰하고 있다가 이벤트가 발생하면 &lt;code&gt;Slot&lt;/code&gt;이 실행되는 것.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Singal : 이벤트를 캐치하고 처리하는 것&lt;/li&gt;
&lt;li&gt;Slot : Signal로부터 받은 이벤트를 처리할 함수를 지정함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;505&quot; data-filename=&quot;signalandslot.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4o66x/btq9I4sd6nh/az2v6bNYM1HpHpo1C7Wx9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4o66x/btq9I4sd6nh/az2v6bNYM1HpHpo1C7Wx9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4o66x/btq9I4sd6nh/az2v6bNYM1HpHpo1C7Wx9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4o66x%2Fbtq9I4sd6nh%2Faz2v6bNYM1HpHpo1C7Wx9K%2Fimg.png&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;505&quot; data-filename=&quot;signalandslot.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Development/QT</category>
      <category>c++</category>
      <category>QT</category>
      <category>QT Event</category>
      <category>QT SIgnal</category>
      <category>qt signal slot</category>
      <category>Signal</category>
      <category>Signal Slot</category>
      <category>Slot</category>
      <author>YunZiks</author>
      <guid isPermaLink="true">https://bassyun.tistory.com/40</guid>
      <comments>https://bassyun.tistory.com/40#entry40comment</comments>
      <pubDate>Thu, 15 Jul 2021 18:06:02 +0900</pubDate>
    </item>
    <item>
      <title>Node.js에서의 Development Mode, Production Mode 분기</title>
      <link>https://bassyun.tistory.com/39</link>
      <description>&lt;p&gt;개발을 완료하고 서비스를 배포하거나 오픈소스로서 깃 허브에 배포되지 말아야하는 정보들이 있습니다. DB의 Password나 외부 API의 Key값, 클라이언트에게 보이지 말아야 할 에러 메시지등 이러한 정보들은 배포시에 함께 배포되면 안되기에 &lt;b&gt;NODE_ENV&lt;/b&gt; 환경변수를 설정하고 &lt;b&gt;Development 모드&lt;/b&gt;와 &lt;b&gt;Production 모드&lt;/b&gt;로 나누고 이를 활용해야 합니다.&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;config/&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;├── development.js&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;├──&amp;nbsp;key.js&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;└──&amp;nbsp;production.js&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;먼저, Project 내에 config폴더를 만들고 다음과 같이 구성해주세요. 모듈명에서 이미 들어나듯 deveopment와 production모드를 나누고 key.js에서 환경을 파악한 후에 맞는 모듈을 찾아 Export 하는 방식입니다.&lt;/p&gt;
&lt;h2&gt;구성하기&lt;/h2&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;18&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;config/development.js&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;module.exports&amp;nbsp;&lt;span style=&quot;color: #aaffaa;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;PORT:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;5000&lt;/span&gt;,&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;config/production.js&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;module.exports&amp;nbsp;&lt;span style=&quot;color: #aaffaa;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;PORT:&amp;nbsp;process.env.PORT,&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;};&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;// config/key.js&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;(process.env.NODE_ENV&amp;nbsp;&lt;span style=&quot;color: #aaffaa;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #aaffaa;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #aaffaa;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'production'&lt;/span&gt;){&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;module.exports&amp;nbsp;&lt;span style=&quot;color: #aaffaa;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;require(&lt;span style=&quot;color: #ffd500;&quot;&gt;'./production'&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;}&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;else&lt;/span&gt;&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;module.exports&amp;nbsp;&lt;span style=&quot;color: #aaffaa;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;require(&lt;span style=&quot;color: #ffd500;&quot;&gt;'./devopment'&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;}&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;development.js&lt;/b&gt; 모듈에는 Express 서버 환경의 개발 포트가 설정 되어있고 이를 module.exports를 이용해 export 해줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;production.js&lt;/b&gt; 모듈은 배포환경에 맞도록 작성해주시면 됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;key.js&lt;/b&gt;에서 &lt;b&gt;process.env.NODE_ENV&lt;/b&gt;를 활용하여 각 환경에 맞는 라우팅이 이루어 질 것입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이렇게 개발, 배포환경에 맞게 각 변수들을 모듈별로 나눈 후에 &lt;b&gt;.gitignore&lt;/b&gt;에 &lt;b&gt;development.js&lt;/b&gt; 를 설정 해주시면 배포시 개발환경에 대한 정보들은 배포되지 않을것입니다. 분기를 통해 얻는 장점은 프로젝트 내의 공통된 변수를 정의함으로서 쉽게 관리가 가능한 편리함과 프로젝트의 민감한 정보를 보호할 수 있을 것입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Development/Nodejs</category>
      <category>devlopment mode</category>
      <category>nodejs</category>
      <category>NODE_ENV</category>
      <category>production mode</category>
      <category>환경변수</category>
      <author>YunZiks</author>
      <guid isPermaLink="true">https://bassyun.tistory.com/39</guid>
      <comments>https://bassyun.tistory.com/39#entry39comment</comments>
      <pubDate>Tue, 8 Dec 2020 23:38:40 +0900</pubDate>
    </item>
    <item>
      <title>Mongoose 스키마 및 모델</title>
      <link>https://bassyun.tistory.com/38</link>
      <description>&lt;ul&gt;
&lt;li&gt;Mongoose는 MongoDB 및 Node.js를위한 ODM (Object Data Modeling) 라이브러리&lt;/li&gt;
&lt;li&gt;객체안의 속성들이 필드 이름이 되며 객체 형태로 작성됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-12-08 오전 12.29.29.png&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;868&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lnLkC/btqPnbeMK8d/jB5ZEi7GaSYc5AOEAXNu7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lnLkC/btqPnbeMK8d/jB5ZEi7GaSYc5AOEAXNu7K/img.png&quot; data-alt=&quot;SQL, Mongo 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lnLkC/btqPnbeMK8d/jB5ZEi7GaSYc5AOEAXNu7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlnLkC%2FbtqPnbeMK8d%2FjB5ZEi7GaSYc5AOEAXNu7K%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-12-08 오전 12.29.29.png&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;868&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SQL, Mongo 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;Mongoose 스키마 및 모델 정의&lt;/h2&gt;
&lt;p&gt;Mongoose에서는 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;스키마&lt;/span&gt;와 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;모델&lt;/span&gt;의 개념이 가장 중요합니다. 스키마를 정의할 때는 주로 데이터의 형식, 데이터의 타입등을 고려하며 작성합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;스키마&lt;/span&gt;는 문서에 어떤 값 또는 특성이 들어가는지 정의&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;데이터베이스의 테이블, 컬렉션 타입 및 속성을 정의하는 문서의 형태 또는 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;모델&lt;/span&gt;은 위에서 만들었던 스키마를 통해 만드는 인스턴스&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;작성된 스키마를 인스턴스화 하여 사용할 수 있게 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Collection&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;관계형 데이터베이스의 테이블과 동일&lt;/li&gt;
&lt;li&gt;여러 JSON 문서 보유 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Document&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQL의 레코드와 동일&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;스키마 작성 및 모델 활용&lt;/h2&gt;
&lt;pre id=&quot;code_1607355071460&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const mongoose = require('mongoose');

const bookSchema = mongoose.Schema({
  bookName: {
    type: String,
    required: [true, '책 이름이 필요합니다.'],
    minlength: 3,
    maxlength: 50
  },
  author: {
    type: String,
    required: true,
    maxlength: 30
  },

  publishedDate: {
    type: Date,
    default: Date.now()
  },
  price: {
    type: Number,
    default: 0
  }
  

});
const Book = mongoose.model('Book', bookSchema);

module.exports = {Book}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;mongoose.Schema&lt;/span&gt;를 활용하여 스키마 작성을 진행합니다. bookName, author, publishedDate, price는 각각 필드명을 뜻하며 필드명 내에는 속성을 지정할 수 있습니다. 위의 코드를 예를 들며 설명해보겠습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bookName
&lt;ul&gt;
&lt;li&gt;type은 String(문자열)&lt;/li&gt;
&lt;li&gt;required[true, '책 이름이 필요합니다.']
&lt;ul&gt;
&lt;li&gt;required는 반드시 존재하여야 하는 여부를 나타내는 속성이며 만약 작성되지 않을 경우 유효성 검사를 통해 배열의 두번째 값인 '책 이름이 필요합니다.' 가 리턴됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;minlength &amp;amp; maxlength
&lt;ul&gt;
&lt;li&gt;최소 , 최대길이&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;publishedDate
&lt;ul&gt;
&lt;li&gt;type은 Date(날짜형식)&lt;/li&gt;
&lt;li&gt;default
&lt;ul&gt;
&lt;li&gt;기본값을 지정해 줄 수 있는 속성입니다.&lt;/li&gt;
&lt;li&gt;Date.now()는 현재 시간을 저장하는 메소드입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;price
&lt;ul&gt;
&lt;li&gt;type은 Number(숫자형)&lt;/li&gt;
&lt;li&gt;default는 0으로 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;mongoose.model()을 통해 스키마를 인스턴스 화 시켜 타 모듈에서 import하여 사용할 수 있게끔 export 합니다.
&lt;ul&gt;
&lt;li&gt;mongoose.model('모델 이름', 스키마)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이외의 다양한&amp;nbsp;스키마 속성은 &lt;a href=&quot;https://mongoosejs.com/docs/guide.html&quot;&gt;Mongoose Document&lt;/a&gt;를 참고해주세요&lt;/p&gt;</description>
      <category>DB/MongoDB</category>
      <category>mern</category>
      <category>MongoDB</category>
      <category>mongoose</category>
      <category>mongoose schema</category>
      <category>nosql</category>
      <category>schema</category>
      <category>몽구스</category>
      <category>몽구스스키마</category>
      <author>YunZiks</author>
      <guid isPermaLink="true">https://bassyun.tistory.com/38</guid>
      <comments>https://bassyun.tistory.com/38#entry38comment</comments>
      <pubDate>Tue, 8 Dec 2020 00:34:52 +0900</pubDate>
    </item>
    <item>
      <title>Dev-Ops? Docker?</title>
      <link>https://bassyun.tistory.com/37</link>
      <description>&lt;h3&gt;개발팀 vs 운영팀 (Dev-Ops)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;개발의 Dev + 운영의 Ops
&lt;ul&gt;
&lt;li&gt;개발팀과 운영팀의 서로 추구하는 목표가 다르기에, 개발과 운영의 조화를 위함
&lt;ul&gt;
&lt;li&gt;개발팀
&lt;ul&gt;
&lt;li&gt;개발자의 언어, 프레임워크, 신기술들을 적용해보고 싶은 갈구하는 마음 추구!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;운영팀
&lt;ul&gt;
&lt;li&gt;안정적인 Infra 추구!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;즉 DevOps는 개발 및 배포환경을 개발팀과 운영팀의 작업을 수월하게 진행할 수 있게 함을 목적으로 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;VMware vs Docker ?&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;docker-vm-container.png&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;435&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q1Q3T/btqGRSaq3pv/4iYE7eIJLeI5yTaIZSaG8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q1Q3T/btqGRSaq3pv/4iYE7eIJLeI5yTaIZSaG8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q1Q3T/btqGRSaq3pv/4iYE7eIJLeI5yTaIZSaG8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq1Q3T%2FbtqGRSaq3pv%2F4iYE7eIJLeI5yTaIZSaG8k%2Fimg.png&quot; data-filename=&quot;docker-vm-container.png&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;435&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;VMware&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;HostOS 위로 Hypervisor 기술을 활용하여 가상의 H/W 구현 후 실제 OS (Guest OS)를 쌓아 올려 만든다&lt;/li&gt;
&lt;li&gt;H/W 를 구현하고 실제 OS를 올리기에 굉장히 무거움
&lt;ul&gt;
&lt;li&gt;용량이 크고 무겁다!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이미지를 생성하고 실행하는 기능 존재
&lt;ul&gt;
&lt;li&gt;하지만, 배포 / 관리 기능이 부족하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Docker&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;Docker는 하드웨어를 가상화하는 계층이 없음
&lt;ul&gt;
&lt;li&gt;때문에, 메모리접근, 파일시스템 등의 속도가 VMware에 비해 훨씬 빠르다!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;리눅스 계열에서는 &lt;b&gt;리눅스 컨트롤 그룹( C-Group)을 활용&lt;/b&gt;하여 가상화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리눅스 네임스페이스&lt;/b&gt; 사용
&lt;ul&gt;
&lt;li&gt;파일이나 네트워크 인터페이스를 가상화해서 자신만의 것을 가질 수 있는 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;윈도우 계열에서는 Hyper-V 기술 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;On-premise&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;클라우드가 아닌 직접 사내 전산실, 집 데스크톱에 H/W 및 S/W를 직접 구축하여 운용하는 서버 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Kubernetes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;수 많은 Docker들을 관리하는 프로그램
&lt;ul&gt;
&lt;li&gt;Docker 오케스트레이션 할 수 있는 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Google에서 Go로 만들고 있음. (2014년 런칭)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;참고자료&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;급부상 하는 Docker Container&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://t.ly/c6yo&quot;&gt;[IT트렌드] 급부상 하는 Docker Container | manTech&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Development/Dev-Ops</category>
      <category>dev-ops</category>
      <category>DevOps</category>
      <category>Docker</category>
      <category>VMware</category>
      <author>YunZiks</author>
      <guid isPermaLink="true">https://bassyun.tistory.com/37</guid>
      <comments>https://bassyun.tistory.com/37#entry37comment</comments>
      <pubDate>Thu, 20 Aug 2020 12:04:28 +0900</pubDate>
    </item>
    <item>
      <title>스마일게이트 서버개발캠프 5주차까지의 기록</title>
      <link>https://bassyun.tistory.com/34</link>
      <description>&lt;h2&gt;&lt;i&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;s&gt;이전에 Notion에 써놓았던 글을 이제야 올립니다 ..&amp;nbsp;&lt;/s&gt;&lt;/span&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;h2&gt;서버개발캠프 절반!&lt;/h2&gt;
&lt;p&gt;어느 덧 서버개발캠프 5주차! 이제는 사람들과 어느정도 친분을 쌓아 사무실로 들어오는게 어색하지 않다. 첫 2주간은 내가 여기에 있어도 되는걸까? 라는 생각과 함께 나보다 이 캠프가 간절한 사람들에게 왠지 모를 미안한 마음이 가득했다. 시작부터 다사다난 했던 캠프 생활은 겨울이라는 차가운 계절도 느낄 새도 없이 내 손가락을 불타게 해주었다. 10시부터 오후 4시가 아닌 10시 11시까지 프로젝트 생각만 하고 있다. 여러 공모전에서 수상하고 학부연구생을 경험하며 국내지만 논문도 등재하였고, 여튼 이전 학교생활과 비교해 보았을 때 나름 열심히 4학년을 불태웠지만, 그런 대회들에 내 온전한 시간을 할애하지는 않았다. 하루동안 할 일을 어느 정도 끝내놓았다 싶으면 친구들과 술을 마시고 여자친구를 만나고, 밴드 친구들과 공연을 하며 나의 음악을 알렸다. 여가 생활을 절대 뺏기고 싶지 않아 어떻게든 열심히 놀았다. 놀기위해 공부하는 느낌?&lt;/p&gt;
&lt;p&gt;스마일게이트 서버개발캠프의 주어진 2달이라는 &lt;s&gt;(아직은 한달차 이지만)&lt;/s&gt; 절대적으로 짧은 시간동안 원하는 결과물이 나올 수 있게 집중하고 구현 해야하는 시간은 나에게 있어서 많은 변화를 가져다 주었다. 먼저 여태까지 프로젝트에서는 솔직하게 말하자면, 정확한 직무 분배가 이루어지지 않았었다. 서로 서로 모르는 부분이 있으면 당장 달려가서 해결하고 약간 어거지로 끝내는 프로젝트의 느낌이랄까? 이번 서버개발캠프에서는 내가 해보지 못한 프론트엔드 분야를 맡고, 정말 울면서 공부하고있다ㅎㅎㅎㅎㅎ..... 사람은 원래 혼나면서 성장한다고 하던데, 나는 좀 더 혼나야 할 것 같다.&lt;/p&gt;
&lt;h2&gt;28년 돌고 돌다 이제는 개발&lt;/h2&gt;
&lt;p&gt;28년 인생 정말 많은 일들이 있었다. 군인이 되고 싶어 육군3사관학교를 두번이나 갔다왔지만, 신체적인 문제로 인해 결국 공익으로 복무하고 멜로딕 펑크 록에 미쳐 &quot;나는 슈퍼간지 베이시스트가 될거야!&quot; 하고 엄청난 시간과 돈을 투자한 음악생활 또한 결국 찢겨져 나갔다. 인생의 나락까지 찍은 내 자존심은 셀수 없이 안좋은 생각을 했지만, 결국에는 개발자의 삶이었나 보다. 인하사대부중에서 단지 전공이 정보통신공학이라는 이유로 서버실에서 공익으로 복무하게 되었을 때, 나는 자존감도 바닥이었고 될대로 되라 하며 하루하루를 버텼다. 내가 이곳에 있는게 맞는건지, 나와 함께 가입교 생활을 보내었던 동기 생도들은 임관을 앞두고 있는데, 나는 결국 공익이구나. 지금 생각해보면 정말 이때가 인생의 터닝 포인트였지 싶다. 우연히 맡게된 서버실의 생활은 내인생에서 가장 행복했던 시간이었다. 정보선생님과 로봇부 아이들과의 만남을 통해 나는 개발자라는 진로에 대해 신중히 고민하였고, 공부를 시작하였다. 이때 이후로 멋쟁이 사자처럼이라는 동아리를 통해 더욱 더 개발자에 가까워 졌달까..?&amp;nbsp;&lt;/p&gt;
&lt;p&gt;지금은 스마일게이트 서버개발캠프에서 잘 모르는 분야를 공부하며 밑바닥 인생을 경험하고 있다. 내가 부족한것에 대해 집중적으로 공부할 수 있는 환경과 시간은 아마 지금뿐이지 않을까..? 남은 약 4주간 내가 얻을 수 있는 것들을 모조리 가져가야겠다.&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;어떤것을 얻을 수 있을까?&lt;/h2&gt;
&lt;p&gt;또한 나에게 없는 다양한 장점을 가진 친구들 한명 한명이 정말 귀중한 선생님들이다. 이 캠프를 시작하기 전 다짐했던 다양한 장점을 가진 사람들과의 만남을 통해 나이 성별 불문하고 그들의 장점(개발스킬 뿐만 아닌)을 내것으로 만들고 싶다. 남은 4주간의 캠프생활을 통해 좀더 문제에 대해 깊게 생각하고 진지해질 수 있는 나 자신이 되었으면 좋겠다. 그리고 여기에서 만나는 인연들이 쭈욱 이어질 수 있기를!&lt;/p&gt;</description>
      <category>활동/서버개발캠프</category>
      <category>quadcore</category>
      <category>serverDevCamp</category>
      <category>smilegate</category>
      <category>서버개발캠프</category>
      <category>서캠</category>
      <category>스마일게이트</category>
      <category>스마일게이트 서버개발캠프</category>
      <author>YunZiks</author>
      <guid isPermaLink="true">https://bassyun.tistory.com/34</guid>
      <comments>https://bassyun.tistory.com/34#entry34comment</comments>
      <pubDate>Thu, 12 Mar 2020 18:33:21 +0900</pubDate>
    </item>
    <item>
      <title>MySQL 설치 및 설정</title>
      <link>https://bassyun.tistory.com/33</link>
      <description>&lt;h1&gt;MySQL-server&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;ubuntu 18.04 기준&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MySQL-server 설치&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt-get install mysql-server&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MySQL (3306) 포트 개방 및 실행 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# MySQL 포트허용
sudo ufw allow mysql
# 실행
sudo systemctl start mysql
# MySQL 자동 시작
sudo systemctl enable mysql&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;root 계정으로 MySQL 실행&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;    sudo /usr/bin/mysql -u root -p &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MySQL 버전 확인&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;    SHOW VARIABLES LIKE &amp;quot;%version%&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MySQL root 계정 패스워드 추가  &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;    ALTER USER &amp;#39;root&amp;#39;@&amp;#39;MySQL 서버 주소&amp;#39; IDENTIFIED BY &amp;#39;패스워드&amp;#39;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MySQL 계정 정보 확인 방법&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;    SELECT User, Host authentication_string FROM mysql.user;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Database 생성 및 계정 추가&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;    CREATE DATABASE &amp;lt;데이터베이스 이름&amp;gt;;
    # 데이터베이스 확인 
    SHOW DATABASES;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MySQL의 user 테이블 변경 시 반드시 &lt;strong&gt;flush privilege;&lt;/strong&gt; 쿼리를 날려줄 것 !&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;추가, 삭제, 권한변경 등 모든 유저 관련 행위시!&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;  FLUSH PRIVILEGES;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;계정에 데이터베이스 권한 부여&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;    GRANT ALL PRIVILEGES ON &amp;lt;데이터베이스 이름&amp;gt;.* TO &amp;#39;계정명&amp;#39;@&amp;#39;MySQL 서버 주소&amp;#39;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;계정이 데이터베이스 서버에서 어떤 권한을 가지고 있는지 확인&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;    SHOW GRANTS FOR &amp;#39;계정명&amp;#39;@&amp;#39;MySQL 서버 주소&amp;#39;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;계정 접속 위치 설정&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;    # 특정 IP 에서만
    CREATE USER &amp;#39;계정명&amp;#39;@&amp;#39;ip 주소&amp;#39; IDENTIFIED BY &amp;#39;패스워드&amp;#39;;
    GRANT ALL PRIVILEGES ON *.* TO &amp;#39;계정명&amp;#39;@&amp;#39;ip 주소&amp;#39; WITH GRANT OPTION;
    FLUSH PRIVILEGES;

    # 특정 주소 지정 안함 
    CREATE USER &amp;#39;계정명&amp;#39;@&amp;#39;%&amp;#39; IDENTIFIED BY &amp;#39;패스워드&amp;#39;;
    GRANT ALL PRIVILEGES ON *.* TO &amp;#39;계정명&amp;#39;@&amp;#39;%&amp;#39; WITH GRANT OPTION;
    FLUSH PRIVILEGES;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;이 글은 제가 쓴 글이 아닌  &lt;strong&gt;TongChun&lt;/strong&gt;님 블로그를 참고해서 제가 까먹지 않게 정리한 글 입니다. &lt;/li&gt;
&lt;li&gt;원글 출처 : &lt;a href=&quot;https://dejavuqa.tistory.com/317#recentComments&quot;&gt;TongChun 블로그&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>DB/MySQL</category>
      <category>grant</category>
      <category>MySQL</category>
      <category>mysql grant</category>
      <category>mysql-server</category>
      <author>YunZiks</author>
      <guid isPermaLink="true">https://bassyun.tistory.com/33</guid>
      <comments>https://bassyun.tistory.com/33#entry33comment</comments>
      <pubDate>Wed, 4 Mar 2020 00:00:59 +0900</pubDate>
    </item>
    <item>
      <title>yarnpkg 서명키 업데이트 관련 에러</title>
      <link>https://bassyun.tistory.com/32</link>
      <description>&lt;h2&gt;apt update중 yarn 서명 키 사용 불가 관련에러 처리 방법&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://dl.yarnpkg.com/debian stable InRelease: The following signatures were invalid: EXPKEYSIG 23E7166788B63E1E Yarn Packaging &amp;lt;yarn@dan.cx&amp;gt;
W: Failed to fetch https://dl.yarnpkg.com/debian/dists/stable/InRelease  The following signatures were invalid: EXPKEYSIG 23E7166788B63E1E Yarn Packaging &amp;lt;yarn@dan.cx&amp;gt;
W: Some index files failed to download. They have been ignored, or old ones used instead.
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;서명 키 유효기간 오버된 경우인 듯&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;wget -qO - https://raw.githubusercontent.com/yarnpkg/releases/gh-pages/debian/pubkey.gpg | sudo apt-key add -&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;wget로 새로운 키를 받아 적용합니다. &lt;/li&gt;
&lt;/ul&gt;</description>
      <category>OS/Linux</category>
      <category>apt</category>
      <category>apt-get</category>
      <category>apt-key list</category>
      <category>error</category>
      <category>LinX</category>
      <category>ubuntu</category>
      <category>Yarn</category>
      <category>yarnpkg</category>
      <category>yarnpkg update</category>
      <author>YunZiks</author>
      <guid isPermaLink="true">https://bassyun.tistory.com/32</guid>
      <comments>https://bassyun.tistory.com/32#entry32comment</comments>
      <pubDate>Sun, 2 Feb 2020 18:07:51 +0900</pubDate>
    </item>
    <item>
      <title>소금을 친 해싱 (hash + salt)</title>
      <link>https://bassyun.tistory.com/31</link>
      <description>&lt;h1&gt;맛 좋은 해싱&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2v6su/btqBj65HUTR/vOEbBk4Nf0cqTP5bH454u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2v6su/btqBj65HUTR/vOEbBk4Nf0cqTP5bH454u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2v6su/btqBj65HUTR/vOEbBk4Nf0cqTP5bH454u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2v6su%2FbtqBj65HUTR%2FvOEbBk4Nf0cqTP5bH454u1%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;Salt 인증방식&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Salt → 단순히 임의의 난수 값&lt;/li&gt;
&lt;li&gt;일반적으로 Salt값은 DB가 털렸을때를 위한 것이 아닌 테이블(Rainbow Table)을 이용한 공격을 막기위한 수단&lt;/li&gt;
&lt;li&gt;SHA256, SHA512등 검증된 암호화 이용&lt;ul&gt;
&lt;li&gt;MD5, SHA-1같은 알고리즘은 이미 저세상으로 갔기에 .. (뚫려버림)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;순서&lt;ul&gt;
&lt;li&gt;가입 시&lt;ol&gt;
&lt;li&gt;hash_value = hash(Password + salt )&lt;/li&gt;
&lt;li&gt;hash_value 를 DB table에 저장&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;로그인 시(validation check)&lt;ol&gt;
&lt;li&gt;Login_Password 입력&lt;/li&gt;
&lt;li&gt;사용자의 salt 값, hash_value를 DB에서 가져온다.&lt;/li&gt;
&lt;li&gt;if hash(Login_Password + salt) == hash_value:&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;어디에서 해싱해야 하나요?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;클라에서 해싱? ⇒ 땡&lt;ul&gt;
&lt;li&gt;브라우저에서 JS로 해싱된 후 서버에 저장되었다는 가정하에.&lt;ul&gt;
&lt;li&gt;클라에서 hashing 후 서버에서 전달 도중 hash값이 가로채면 고대로~&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;만일, 브라우저에서 해싱되었다면 서버에서도 해싱을 진행 할 것.&lt;/li&gt;
&lt;li&gt;고려사항이 많음&lt;ul&gt;
&lt;li&gt;클라이언트 브라우저별 JS 버젼 지원 유무&lt;ul&gt;
&lt;li&gt;js기능을 꺼놓을 경우 서버에서 Hashing 진행해야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;https를 대신 할 수 없다.&lt;ul&gt;
&lt;li&gt;중간에 가로채면 답없다~&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;서버에서 해싱? ⇒ 정답!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;참고&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://starplatina.tistory.com/entry/%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%ED%95%B4%EC%8B%9C%EC%97%90-%EC%86%8C%EA%B8%88%EC%B9%98%EA%B8%B0-%EB%B0%94%EB%A5%B4%EA%B2%8C-%EC%93%B0%EA%B8%B0&quot;&gt;비밀번호 해시에 소금치기 - 바르게 쓰기&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://velog.io/@stampid/bcryptjs&quot;&gt;bcryptjs&lt;/a&gt;&lt;/p&gt;</description>
      <category>활동/서버개발캠프</category>
      <category>hashing</category>
      <category>salt</category>
      <category>sha256</category>
      <category>서버개발캠프</category>
      <category>서캠</category>
      <category>스마일게이트</category>
      <category>해싱</category>
      <author>YunZiks</author>
      <guid isPermaLink="true">https://bassyun.tistory.com/31</guid>
      <comments>https://bassyun.tistory.com/31#entry31comment</comments>
      <pubDate>Sun, 19 Jan 2020 22:36:52 +0900</pubDate>
    </item>
    <item>
      <title>PMP 멘토링 이후</title>
      <link>https://bassyun.tistory.com/30</link>
      <description>&lt;h1&gt;이사님 멘토링 이후의 정리 및 나의 생각&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;PMP내의 관리 영역의 부재 &lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;스크럼의 의미를 파악할것 &lt;ul&gt;
&lt;li&gt;스프린트 - 벽을 돌파하기 위해 꽁꽁 싸매서 돌파! &lt;/li&gt;
&lt;li&gt;스크럼 - 여태까지 방법으로만 생각을 했지만,,,&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스크럼 시 어떻게 진행할지&lt;/li&gt;
&lt;li&gt;&amp;#39;나는 ~이렇게 진행했어&amp;#39; 가 아닌 &amp;#39;무엇인가..?&amp;#39;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;관리방법 및 목표 설정 &lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;이사님 : Data PipeLine에 인력이 쏠릴 수 있다&lt;ul&gt;
&lt;li&gt;&lt;em&gt;어떻게 인력 및 개발을 관리할 거니?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Clone을 진행하는 데 있어서&lt;ul&gt;
&lt;li&gt;우리 의견 : TweetDeck 개발자들이 고민했던 것들을 똑같이 고민하고, Data Flow를 이해할 수 있다.&lt;/li&gt;
&lt;li&gt;이사님 의견 : 이미 개발자들이 다 고민해서 만들어 놓은 것을 뭐하러 똑같이 고민하냐. 좀 더 욕심을! 개개인이 서버 개발 캠프에서 얻어 갈 수 있는 것을 좀 더 고민해봐라&lt;/li&gt;
&lt;li&gt;내가 이해하고 나서의 생각 : 기능적 차별점 및 내 욕심을 좀 더 들어내야겠다고 생각.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PMP문서는 끝나지 않는다!&lt;ul&gt;
&lt;li&gt;작성 시 -&amp;gt; 우리들의 목표(얻고자 하는 것, 욕심, 의지, 여러 가지) -&amp;gt; 정리 -&amp;gt; 프로젝트 -&amp;gt; Risk Point, Pain Point 어떻게 찾을지?  -&amp;gt; 최종 프로젝트가 끝날 때 모든 게 끝난다.&lt;/li&gt;
&lt;li&gt;PMP가 근사 할 수록 뭔가 잘못 된 것 -&amp;gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;팀 빌딩의 의미 &lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;각 구성원이 한 명분의 commitment를 측정하여 실천해야 한다. &lt;ul&gt;
&lt;li&gt;&lt;del&gt;내 commitment는&lt;/del&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;팀을 위해 희생할 것인가? 나에게 남는 것은?&lt;ul&gt;
&lt;li&gt;개인마다 생각이 다를 듯,,&lt;/li&gt;
&lt;li&gt;욕심을 조금 부려도 괜찮을 것 같다. &lt;/li&gt;
&lt;li&gt;하지만, Team의 Job 분배는?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;나의 의견 &lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Frontend를 똑같이 구현해보고 싶었지만, 나의 의견 전달을 잘못 드린것 같다. &lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;사실 서버를 좀 해보고 싶은 마음도 있었음. &lt;del&gt;(욕심이 과한 것 같다.)&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;2달 동안의 짧은 기간(어쩌면 6주)에서 개개인의 욕심을 부려 진행한다면 과연 이 프로젝트는 성공할 수 있을까?&lt;/li&gt;
&lt;li&gt;이사님 말씀대로, Clone이 아닌 우리만의 생각을 고민해 보는 프로젝트를 진행한다면, 과연 6주 내로 성공할 수 있을까?&lt;/li&gt;
&lt;li&gt;분명, 프로젝트를 진행하는 데에 있어서 개개인의 욕심과 다른 사람들의 비판이 맞물린다면, 팀의 불화는 어떻게 대처할 것인지?&lt;/li&gt;
&lt;li&gt;이사님 말씀대로라면 기능 추가가 필요해 보임 (5번에서)&lt;/li&gt;
&lt;li&gt;Project의 성공을 위해서라면 한 명의 커밋 먼트는 솔직하게 측정해보자.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;기능 추가 건의 및 의견&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;BTS Column의 실시간 단어별 통계 시각화 Column. (d3.js)&lt;ul&gt;
&lt;li&gt;어떤 단어들이 주로 쓰이는지, 시간은 언제인지, Data들에 대한 세부적인 통계가 필요할 듯.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;FrontEnd의 &lt;strong&gt;그놈의 감각!&lt;/strong&gt; 적인 디자인 변경&lt;ul&gt;
&lt;li&gt;&lt;del&gt;감각이 중요한 건 맞지만 노력이 감각을 이길 수 있을 것 같다는 말을 하고 싶었는데..&lt;/del&gt;  &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프록시 서버가 굳이 필요할까 싶지만&lt;ul&gt;
&lt;li&gt;필요가 없더라도 넣어보자.&lt;/li&gt;
&lt;li&gt;milestone3를 위한 단계라고 생각하면 될 듯.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;나의 벽?&lt;ul&gt;
&lt;li&gt;솔직하지 못한 게 벽인 것 같다.&lt;ul&gt;
&lt;li&gt;이전까지 프로젝트들을 진행하며 너무 &lt;strong&gt;완성에만 신경을 쓰다 보니 자연스레 역할 분배가 안되었음.&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;역할 분배로 딱 개발하기보다는 뭔가 개발은 개발인데, 유지보수의 느낌..? &lt;/li&gt;
&lt;li&gt;좀 더 욕심을 부려보자. &lt;del&gt;욕심이 과하다가 완성도 못하면 어떡하지.. ~&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;해결책 : 너무 Project의 완성에 신경 쓰기보다는 이 캠프를 통해 내가 진짜로 얻어 갈 수 있는 것들에 대해 생각해보자.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>활동/서버개발캠프</category>
      <category>서버개발캠프</category>
      <category>서캠</category>
      <category>스마일게이트</category>
      <category>스마일게이트 서버개발캠프</category>
      <category>회고록</category>
      <author>YunZiks</author>
      <guid isPermaLink="true">https://bassyun.tistory.com/30</guid>
      <comments>https://bassyun.tistory.com/30#entry30comment</comments>
      <pubDate>Wed, 15 Jan 2020 11:05:52 +0900</pubDate>
    </item>
    <item>
      <title>Lambda Architecture</title>
      <link>https://bassyun.tistory.com/29</link>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;여러 오픈소스들을 조합하여 실시간 처리를 할 수 있는 구조&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;효율적인 방식으로 대량의 데이터를 처리할 수 있는 데이터 처리 기술&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;폴리글랏 프로세싱이라고도 함&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speed Layer + Batch Layer + Serving Layer의 3계층으로 구성된 실시간 아키텍쳐&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;lambda.png&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;745&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beYdfK/btqA5732CyX/2wXjpdPgKmTAkweNhwgEd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beYdfK/btqA5732CyX/2wXjpdPgKmTAkweNhwgEd1/img.png&quot; data-alt=&quot;Lambda Architecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beYdfK/btqA5732CyX/2wXjpdPgKmTAkweNhwgEd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeYdfK%2FbtqA5732CyX%2F2wXjpdPgKmTAkweNhwgEd1%2Fimg.png&quot; data-filename=&quot;lambda.png&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;745&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Lambda Architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;장점&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;지연 시간 감소&lt;/li&gt;
&lt;li&gt;높은 처리량, 낮은 대기 시간 (= 실시간)&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Batch Layer&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;데이터를 단위(시간, 크기 등) 만큼 잘라 처리한다.&lt;/li&gt;
&lt;li&gt;immutable data set의 성질을 갖는다.&lt;/li&gt;
&lt;li&gt;모든 새로운 Data Stream은 Data Lake 위에서 처리됨&lt;/li&gt;
&lt;li&gt;메모리 데이터베이스(ex. Redis)나 NoSQL기반 데이터베이스를 사용하여 Data Lake에 저장하는 경우
&lt;ul&gt;
&lt;li&gt;MapReduce / Machine Learning 을 사용, 데이터 처리하여 Batch View를 예측한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Batch Layer의 master dataset에는 처리 전의 Raw Data들을 저장한다.
&lt;ul&gt;
&lt;li&gt;Batch View의 데이터가 잘못되었을 때 복구를 위함&lt;/li&gt;
&lt;li&gt;새로운 뷰를 제공 할 때 통계 분석이 가능함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Speed Layer&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Batch Layer 작업 후 들어오는 실시간 데이터 처리&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Batch Layer에서 수행되는 도중 결실된 데이터를 위한 실시간 분석&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Queue, Buffer등의 빠르고 효율적인 구조 사용&lt;/li&gt;
&lt;li&gt;효율적인 스트림 처리를 위한 증분 처리방식을 사용함&lt;/li&gt;
&lt;li&gt;Batch Process가 완료된 시점에 처리된 Real Time View는 삭제됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Serving Layer&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Batch View + Real Time View&lt;/li&gt;
&lt;li&gt;두 과정의 뷰를 merge하여 사용자의 쿼리에 대한 응답&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Development/Big Data</category>
      <category>Big Data</category>
      <category>Lambda Architecture</category>
      <category>tweet deck</category>
      <category>람다</category>
      <category>람다아키텍처</category>
      <category>서버개발캠프</category>
      <category>서캠</category>
      <category>스마일게이트</category>
      <author>YunZiks</author>
      <guid isPermaLink="true">https://bassyun.tistory.com/29</guid>
      <comments>https://bassyun.tistory.com/29#entry29comment</comments>
      <pubDate>Fri, 10 Jan 2020 18:30:47 +0900</pubDate>
    </item>
  </channel>
</rss>