<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Zero to One</title>
    <link>https://0to1.tistory.com/</link>
    <description>Programming, Soccer, Travel, Game, Other things ...</description>
    <language>ko</language>
    <pubDate>Tue, 7 Jul 2026 08:44:00 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>지로원</managingEditor>
    <image>
      <title>Zero to One</title>
      <url>https://tistory1.daumcdn.net/tistory/2823168/attach/b1dd80f5594a42d9843435ded7ff6dbd</url>
      <link>https://0to1.tistory.com</link>
    </image>
    <item>
      <title>React 프로젝트 설정 (CRA + mobx + twin.macro)</title>
      <link>https://0to1.tistory.com/entry/React-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%A4%EC%A0%95-CRA-mobx-twinmacro</link>
      <description>&lt;p&gt;새로운 프로젝트를 들어가기에 앞서 새로운 라이브러리를 적용해보기로 했다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mobx.js.org/README.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MobX&lt;/a&gt;는 Redux와 같이 상태관리를 목표로 하는 라이브러리인데 Redux 보다 훨씬 쉽고 코드도 간편하고 단점보다는 장점이 많다고 생각되어 최근에 작업하는 모든 프로젝트를 MobX로 작업하고 있다. 생각같아서는 순수 React Context를 사용하여 상태관리를 하고 싶은데 아직 관리할 수 있는 디테일(?)이 살짝 부족하다고 생각되고 귀찮기도 해서 미루는 중이다.&lt;/p&gt;
&lt;p&gt;(MobX 와 Redux 의 차이점은 &lt;a href=&quot;https://woowabros.github.io/experience/2019/01/02/kimcj-react-mobx.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;에 자세히 나와있다.)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ben-rogerson/twin.macro&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;twin.macro&lt;/a&gt; 라는 라이브러리인데 요즘 유행(?)하는 tailwind.css 와 emotion 혹은 styled-component를 합쳐놓은 라이브러리다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tailwindcss.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;tailwind.css&lt;/a&gt; 는 &lt;span&gt;Utility-First 컨셉을 가진 CSS 프레임워크로 bootstrap이랑 어느정도 비슷하다고 생각하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a href=&quot;https://github.com/emotion-js/emotion&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;emotion&lt;/a&gt; 혹은 &lt;a href=&quot;https://github.com/styled-components/styled-components&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;styled components&lt;/a&gt; 는 CSS in JS 라는 개념을 도입한 라이브러리다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;(더 자세한 설명은 직접 찾아보는게 빠르다)&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;예전에는 리액트 개발을 위해서 css, sass, less 등의 css 파일을 분리해서 작성했고 그게 좋아보였지만&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;요즘에는 해당 파일들이 굳이 필요없다고 생각되고 괜히 프로젝트에 파일이 많아지면서 프로젝트 자체가 좀 지저분(?) 해보여서&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;tailwind와 styled-components 를 본격적으로 사용하게 된 것 같다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;styled-components는 사용한지 조금되었고 tailwind는 사용한지 얼마 되지 않았는데 각각의 장단점이 명확했고&amp;nbsp;&lt;/p&gt;
&lt;p&gt;두가지를 따로 사용해본 경험은 많았지만 둘 다 동시에 사용해본 경험은 없던 와중에 각각이 필요한 부분이 미묘하게 다른데&lt;/p&gt;
&lt;p&gt;둘 다 사용하면 훨씬 더 많은 케이스에 적용할 수 있을 것이라는 생각이 들었고 관련 케이스를 구글링하던 와중에&amp;nbsp;&lt;/p&gt;
&lt;p&gt;twin.macro 라는 라이브러리를 발견했다. 처음은 항상 어렵지만 시간이 지나면 잘했다는 생각이 들 수 있게끔 잘 사용해보려고 한다.&lt;/p&gt;
&lt;p&gt;그에 앞서 세팅을 정리해보려고 오랜만에 블로그 글을 쓴다!! 정말 오랜만에..... (작성하던 시리즈는 여러개인데 항상 중간에 관뒀었다...ㅠ)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;자 이제 드가자~!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Chapter1&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1615170926414&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx create-react-app react-twin-boilerplate&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;명령어를 통해 cra 기반 프로젝트를 생성한다.&lt;/p&gt;
&lt;p&gt;프로젝트가 생성되면 우선 mobx 설정부터 해보자,&lt;/p&gt;
&lt;pre id=&quot;code_1615171268198&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn add mobx mobx-react-lite&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;mobx-react 가 아닌 mobx-react-lite 을 설치한 이유는 어차피 훅 형태로 개발할거고 데코레이터 없이 사용하기 위해서이다. (Mobx 측에서도 데코레이터는 deprecated 되었다)&lt;/p&gt;
&lt;p&gt;mobx를 성공적으로 추가했다면 store를 만들어보자.&lt;/p&gt;
&lt;p&gt;간단하게 appStore를 만들고 title을 넣고 변경해보겠다.&lt;/p&gt;
&lt;p&gt;Store를 만드는 방법은 여러가지가 있는데 3가지 방법으로 간단하게 만들어보겠다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. makeObservable을 이용한 class 형태의 store&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1615189388623&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// stores/ClassAppStore.js
import { makeObservable, observable, action } from 'mobx'

class ClassAppStore {
  constructor() {
    makeObservable(this, {
      appInfo: observable,
      changeAppTitle: action
    })
  }
  appInfo = {
    title: 'Hello React'
  }

  changeAppTitle = (title) =&amp;gt; {
    this.appInfo.title = title
  }
}

const classAppStore = new ClassAppStore()
export default classAppStore
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;2. makeAutoObservable을 이용한 class 형태의 store&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1615189585289&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// stores/ClassAppStore2.js
import { makeAutoObservable } from 'mobx'

class ClassAppStore2 {
  constructor() {
    makeAutoObservable(this)
  }

  appInfo = {
    title: 'Hello React'
  }

  changeAppTitle = (title) =&amp;gt; {
    this.appInfo.title = title
  }
}

const classAppStore2 = new ClassAppStore2()
export default classAppStore2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;1번과 2번을 보면 2번이 훨씬 깔끔하다. 하지만 2번은 &lt;span&gt;class에서 super 혹은 subclassed가 있을 경우 사용할 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;그러므로 두 방법 모두 알고 있는 것이 좋을 듯?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;3. observable 을 이용한 function 형태의 store&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1615189747828&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// stores/FuncAppStore.js
import { observable } from 'mobx'

const funcAppStore = observable({
  appInfo: {
    title: 'Hello React'
  },
  changeAppTitle(title) {
    this.appInfo.title = title
  }
})

export default funcAppStore
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;제일 간단하다. 하지만 이 방식은 내부적으로&amp;nbsp;&lt;span&gt;클론을 하고 observable 상태로 만드는 것이기에 쓸데없는 과정이 하나 더 있다고 보면 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;또한 Proxy object 형태로 생성하기 때문에 콘솔을 찍어보면 굉장히 복잡한 형태로 나오는 것을 확인할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;MobX 에서 가장 추천하는 방식은 2번이기 때문에 이 방법을 기본으로 사용하되 super 혹은 subclass 가 있을 경우에는 1번 방법을 사용하자! :)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;store/index.js&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1615190977529&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// stores/index.js
import { createContext, useContext } from 'react'
import funcAppStore from 'stores/FuncAppStore'
import classAppStore from 'stores/ClassAppStore'
import classAppStore2 from 'stores/ClassAppStore2'

export const stores = {
  funcAppStore,
  classAppStore,
  classAppStore2
}

export const storesContext = createContext({
  ...stores
})

export const useStores = () =&amp;gt; {
  const store = useContext(storesContext)
  if (!store) {
    throw new Error('useStore must be used within a StoreProvider')
  }
  return store
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;각기 다른 페이지 혹은 컴포넌트 들에서 각각에 필요한 store들을 각각 호출해서 사용할 수 있지만&lt;/p&gt;
&lt;p&gt;stores라는 변수 한 곳에 모아놓고 그때그때 호출해서 사용할 수 있게 useStore을 만들어준다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;App.js&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1615191387911&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// src/App.js
import logo from './logo.svg'
import './App.css'
import { useStores } from 'stores'
import { observer } from 'mobx-react-lite'

const App = observer(() =&amp;gt; {
  const { classAppStore, classAppStore2 } = useStores()
  const { appInfo: appInfo2, changeAppTitle: changeAppTitle2 } = classAppStore2
  const { appInfo, changeAppTitle } = classAppStore

  return (
    &amp;lt;div className='App'&amp;gt;
      &amp;lt;header className='App-header'&amp;gt;
        &amp;lt;img src={logo} className='App-logo' alt='logo' /&amp;gt;
        &amp;lt;p&amp;gt;makeObservable class store&amp;lt;/p&amp;gt;
        &amp;lt;div&amp;gt;Title: {appInfo.title}&amp;lt;/div&amp;gt;
        &amp;lt;input onChange={(e) =&amp;gt; changeAppTitle(e.currentTarget.value)} /&amp;gt;
        &amp;lt;p&amp;gt;makeAutoObservable class store&amp;lt;/p&amp;gt;
        &amp;lt;div&amp;gt;Title: {appInfo2.title}&amp;lt;/div&amp;gt;
        &amp;lt;input onChange={(e) =&amp;gt; changeAppTitle2(e.currentTarget.value)} /&amp;gt;
      &amp;lt;/header&amp;gt;
    &amp;lt;/div&amp;gt;
  )
})

export default App
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;가볍게&lt;/span&gt; App.js 를 바꾸고 테스트를 해보자&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biKMad/btqZDOTNQQh/SJWor29xqSK7Cc1TFIf4C1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biKMad/btqZDOTNQQh/SJWor29xqSK7Cc1TFIf4C1/img.png&quot; data-alt=&quot;초기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biKMad/btqZDOTNQQh/SJWor29xqSK7Cc1TFIf4C1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiKMad%2FbtqZDOTNQQh%2FSJWor29xqSK7Cc1TFIf4C1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;초기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;다음과 같은 화면이 나오고 input 값을 변경하게 되면,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRSpKA/btqZtzclfkQ/tPgLgzKwdEU4XnH473Skzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRSpKA/btqZtzclfkQ/tPgLgzKwdEU4XnH473Skzk/img.png&quot; data-alt=&quot;input 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRSpKA/btqZtzclfkQ/tPgLgzKwdEU4XnH473Skzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRSpKA%2FbtqZtzclfkQ%2FtPgLgzKwdEU4XnH473Skzk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;input 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위와 같은 화면으로 바뀐다. 물론 아래도 똑같이 동작한다.&lt;/p&gt;
&lt;p&gt;그럼 이제 twin.macro를 세팅해보자!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Chapter2&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1615194049261&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn add twin.macro tailwindcss styled-components&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;tail.macro, tailwindcss, styled-components를 설치한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그 다음 tailwindcss를 사용하기 위해서 twin.macro에서 GlobalStyles을 가져와서 적용해줘야 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1615194341409&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// src/GlobalStyles.js
import React from 'react'
import { GlobalStyles } from 'twin.macro'

export default function GlobalStylesComponent() {
  return &amp;lt;GlobalStyles /&amp;gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1615194592171&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// src/index.js
import React from 'react'
import ReactDOM from 'react-dom'
import './index.css'
import App from './App'
import reportWebVitals from './reportWebVitals'
import GlobalStyles from './GlobalStyles'

ReactDOM.render(
  &amp;lt;React.StrictMode&amp;gt;
    &amp;lt;GlobalStyles /&amp;gt;
    &amp;lt;App /&amp;gt;
  &amp;lt;/React.StrictMode&amp;gt;,
  document.getElementById('root')
)

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;굳이 이렇게 불편하게 한번 거쳐서 작업하는 이유는 styled-components 와 관련된 &lt;a href=&quot;https://github.com/styled-components/styled-components/issues/3146&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이슈&lt;/a&gt;때문이다.&lt;/p&gt;
&lt;p&gt;그 후 babel macro 설정까지 해주면 twin.macro를 사용할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1615195554782&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// package.json
&quot;babelMacros&quot;: {
  &quot;twin&quot;: {
    &quot;preset&quot;: &quot;styled-components&quot;,
    &quot;styled&quot;: {
      &quot;import&quot;: &quot;default&quot;,
      &quot;from&quot;: &quot;styled-components&quot;
    },
    &quot;css&quot;: {
      &quot;import&quot;: &quot;css&quot;,
      &quot;from&quot;: &quot;styled-components&quot;
    },
  }
},&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;원래는 @babel-core 와 babel-plugin-macros 라이브러리들을 설치해줘야 되지만 CRA에 기본적으로 포함되어있으니 추가로 설정만 해주면 된다. package.json 안에서 styled-components 에 대한 설정을 마무리하자.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;마지막으로 tailwindcss 를 적용해보자!&lt;/p&gt;
&lt;pre id=&quot;code_1615197380463&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// src/App.js
import logo from './logo.svg'
import './App.css'
import { useStores } from 'stores'
import { observer } from 'mobx-react-lite'
import tw, { styled } from 'twin.macro'

const Input = tw.input`border hover:border-black px-2 outline-none`
const PurpleInput = tw(Input)`border-purple-500 text-purple-700`
const StyledP = styled.p(({ isPurple }) =&amp;gt; [`color: black;`, isPurple &amp;amp;&amp;amp; tw`text-purple-700`])
const StyledDiv = styled.div`
  color: black;
  ${({ isPurple }) =&amp;gt; isPurple &amp;amp;&amp;amp; tw`text-purple-700`}
`

const App = observer(() =&amp;gt; {
  const { classAppStore, classAppStore2 } = useStores()
  const { appInfo: appInfo2, changeAppTitle: changeAppTitle2 } = classAppStore2
  const { appInfo, changeAppTitle } = classAppStore

  return (
    &amp;lt;div className='App'&amp;gt;
      &amp;lt;header className='App-header'&amp;gt;
        &amp;lt;img src={logo} className='App-logo' alt='logo' /&amp;gt;
        &amp;lt;p&amp;gt;makeObservable class store&amp;lt;/p&amp;gt;
        &amp;lt;div tw={'my-2 font-bold'}&amp;gt;Title: {appInfo.title}&amp;lt;/div&amp;gt;
        &amp;lt;input css={[tw`rounded-2xl hocus: (outline-none) text-black`]} onChange={(e) =&amp;gt; changeAppTitle(e.currentTarget.value)} /&amp;gt;
        &amp;lt;StyledP isPurple={false}&amp;gt;makeAutoObservable class store&amp;lt;/StyledP&amp;gt;
        &amp;lt;StyledDiv isPurple&amp;gt;Title: {appInfo2.title}&amp;lt;/StyledDiv&amp;gt;
        &amp;lt;PurpleInput onChange={(e) =&amp;gt; changeAppTitle2(e.currentTarget.value)} /&amp;gt;
      &amp;lt;/header&amp;gt;
    &amp;lt;/div&amp;gt;
  )
})

export default App
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WCM5u/btqZrgROMMo/7bMRMKrIRV4mbmTEyfKNIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WCM5u/btqZrgROMMo/7bMRMKrIRV4mbmTEyfKNIK/img.png&quot; data-alt=&quot;결과 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WCM5u/btqZrgROMMo/7bMRMKrIRV4mbmTEyfKNIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWCM5u%2FbtqZrgROMMo%2F7bMRMKrIRV4mbmTEyfKNIK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;결과 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위와 같이 여러가지 방법을 사용해서 적용시킬 수 있다. 이밖에도 다양한 방법으로 자신한테 편하게 골라서 쓸 수 있다!!&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;이로써 tailwindcss와 styled-components가 아주 잘 어우러지게 적용할 수 있었고 이로써 프로젝트에는 css파일이 필요없게 되었고 tailwindcss를 씀으로써 불필요하게 많은 코드도 사용할 필요가 없어졌다....!! 으메이징... &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;아 그리고 tailwind 설정파일을 정의하여 사전에 더욱 많은 스타일들을 정의할 수 있다. (프로젝트에서 빈번하게 쓰일수록 유용)&lt;/p&gt;
&lt;p&gt;1. 처음부터 세팅 (tailwind doc페이지를 보면서 추가해나가면 됨.)&lt;/p&gt;
&lt;pre id=&quot;code_1615198028618&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// {project Root}/tailwind.config.js
module.exports = {
  theme: {
    extend: {
      colors: {},
    },
  },
  plugins: [],
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2. 풀세팅 파일 생성 (&lt;span style=&quot;color: #333333;&quot;&gt;엄청난 설정파일이 하나 생성된다.)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1615198113874&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx tailwindcss-cli@latest init --full&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그리고 아까 package.json 에 설정한 babelMacros 에 명시해주면 된다!&lt;/p&gt;
&lt;pre id=&quot;code_1615198454509&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 최종 package.json
{
  &quot;name&quot;: &quot;cra-twin-boilerplate&quot;,
  &quot;version&quot;: &quot;0.1.0&quot;,
  &quot;private&quot;: true,
  &quot;author&quot;: &quot;zer01ne&quot;,
  &quot;description&quot;: &quot;cra-twin-boilerplate&quot;,
  &quot;dependencies&quot;: {
    &quot;@testing-library/jest-dom&quot;: &quot;^5.11.4&quot;,
    &quot;@testing-library/react&quot;: &quot;^11.1.0&quot;,
    &quot;@testing-library/user-event&quot;: &quot;^12.1.10&quot;,
    &quot;mobx&quot;: &quot;^6.1.8&quot;,
    &quot;mobx-react-lite&quot;: &quot;^3.2.0&quot;,
    &quot;react&quot;: &quot;^17.0.1&quot;,
    &quot;react-dom&quot;: &quot;^17.0.1&quot;,
    &quot;react-scripts&quot;: &quot;4.0.2&quot;,
    &quot;styled-components&quot;: &quot;^5.2.1&quot;,
    &quot;tailwindcss&quot;: &quot;^2.0.3&quot;,
    &quot;twin.macro&quot;: &quot;^2.3.0&quot;,
    &quot;web-vitals&quot;: &quot;^1.0.1&quot;
  },
  &quot;devDependencies&quot;: {
    &quot;prettier&quot;: &quot;^2.2.1&quot;
  },
  &quot;scripts&quot;: {
    &quot;start&quot;: &quot;react-scripts start&quot;,
    &quot;build&quot;: &quot;react-scripts build&quot;,
    &quot;test&quot;: &quot;react-scripts test&quot;,
    &quot;eject&quot;: &quot;react-scripts eject&quot;,
    &quot;prettier&quot;: &quot;prettier --write --config ./.prettierrc 'src/**/*.{js,jsx}'&quot;
  },
  &quot;eslintConfig&quot;: {
    &quot;extends&quot;: [
      &quot;react-app&quot;,
      &quot;react-app/jest&quot;
    ]
  },
  &quot;babelMacros&quot;: {
    &quot;twin&quot;: {
      &quot;preset&quot;: &quot;styled-components&quot;,
      &quot;styled&quot;: {
        &quot;import&quot;: &quot;default&quot;,
        &quot;from&quot;: &quot;styled-components&quot;
      },
      &quot;css&quot;: {
        &quot;import&quot;: &quot;css&quot;,
        &quot;from&quot;: &quot;styled-components&quot;
      }
    }
  },
  &quot;browserslist&quot;: {
    &quot;production&quot;: [
      &quot;&amp;gt;0.2%&quot;,
      &quot;not dead&quot;,
      &quot;not op_mini all&quot;
    ],
    &quot;development&quot;: [
      &quot;last 1 chrome version&quot;,
      &quot;last 1 firefox version&quot;,
      &quot;last 1 safari version&quot;
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fin.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아참, twin.macro가 좋은 이유는 정말 여러개가 있는데 이중에 하나는 잘못 썼으면 뭐가 틀렸는지, 어떤 옵션들이 있는지 보여준다. (그냥 tailwindcss만 쓰면 가끔 에러가 발생했을 때 찾기 어려울 수 있다)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 외에도 많은 기능이 더 있고 현재도 활발하게 개발중이니 땡큐! 하면서 잘 사용해보자!&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v63yM/btqZFtuY2Ow/11VFcH6QQaLFYVboNr50MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v63yM/btqZFtuY2Ow/11VFcH6QQaLFYVboNr50MK/img.png&quot; data-alt=&quot;twin.macro 장점&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v63yM/btqZFtuY2Ow/11VFcH6QQaLFYVboNr50MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv63yM%2FbtqZFtuY2Ow%2F11VFcH6QQaLFYVboNr50MK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;twin.macro 장점&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;정말 오랜만에 블로그 글을 쓰니까 뿌듯하긴한데 넘나 힘들다리...&lt;/p&gt;</description>
      <category>Web Study/React</category>
      <category>CRA</category>
      <category>css-in-js</category>
      <category>mobx</category>
      <category>REACT</category>
      <category>styled-components</category>
      <category>tailwindcss</category>
      <category>twin.macro</category>
      <author>지로원</author>
      <guid isPermaLink="true">https://0to1.tistory.com/29</guid>
      <comments>https://0to1.tistory.com/entry/React-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%84%A4%EC%A0%95-CRA-mobx-twinmacro#entry29comment</comments>
      <pubDate>Mon, 8 Mar 2021 19:16:25 +0900</pubDate>
    </item>
    <item>
      <title>AWS 를 사용한 서버리스 아키텍쳐 적용기(삽질기) (7) - IAM role 세팅</title>
      <link>https://0to1.tistory.com/entry/AWS-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%84%9C%EB%B2%84%EB%A6%AC%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90-%EC%A0%81%EC%9A%A9%EA%B8%B0%EC%82%BD%EC%A7%88%EA%B8%B0-7-IAM-role-%EC%84%B8%ED%8C%85</link>
      <description>&lt;p&gt;저번 글에서 빠르게 만들면서 AdministratorAccess 정책을 이용해서 권한을 설정해줬습니다.&lt;/p&gt;
&lt;p&gt;하지만&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;AdministratorAccess 는 모든 권한에 접근할 수 있기 때문에 혹시나 잘못되면 과금등에도 손댈 수 있기 때문에&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;role 변경이 필요해보입니다. 그럼 어떤 권한을 부여해야되는지 알아보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;0. 기존 권한 확인 및 사용된 권한 확인.&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;AWS에서 IAM Management Console 로 이동해서 왼쪽 메뉴 중에서 '사용자' 를 클릭하면 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정의된 사용자를 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOROu3/btqvIlAuv43/dKTAkqONN8RNFyXvCEh7Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOROu3/btqvIlAuv43/dKTAkqONN8RNFyXvCEh7Yk/img.png&quot; data-alt=&quot;serverless 사용자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOROu3/btqvIlAuv43/dKTAkqONN8RNFyXvCEh7Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOROu3%2FbtqvIlAuv43%2FdKTAkqONN8RNFyXvCEh7Yk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;serverless 사용자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;해당 사용자를 클릭하면 아래와 같이 AdministratorAccess 권한이 설정된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;정확하게 어떤 서비스들이 사용되었는지 확인하기 위에 엑세스 관리자를 클릭해 확인해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bliQ0L/btqvJKNhDcS/6kbk7a9uGU1ZKU5jjjz081/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bliQ0L/btqvJKNhDcS/6kbk7a9uGU1ZKU5jjjz081/img.png&quot; data-alt=&quot;serverless-demo 권한&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bliQ0L/btqvJKNhDcS/6kbk7a9uGU1ZKU5jjjz081/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbliQ0L%2FbtqvJKNhDcS%2F6kbk7a9uGU1ZKU5jjjz081%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;serverless-demo 권한&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음과 같은 결과를 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;7개의 서비스를 이용했을 때 AdministratorAccess 권한이 사용된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;security token, s3, cloudwatch logs, cloudformation, api gw, lambda, IAM 서비스들이 사용됐네요.&lt;/p&gt;
&lt;p&gt;그럼 이 서비스에 해당하는 권한들만 따로 모아서 부여해주면 정상적으로 작동하겠지요 ??&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2p8nn/btqvHhkOSjl/NOrlHm2MfIEg7pBrMz7lH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2p8nn/btqvHhkOSjl/NOrlHm2MfIEg7pBrMz7lH0/img.png&quot; data-alt=&quot;사용된 서비스들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2p8nn/btqvHhkOSjl/NOrlHm2MfIEg7pBrMz7lH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2p8nn%2FbtqvHhkOSjl%2FNOrlHm2MfIEg7pBrMz7lH0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;사용된 서비스들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;1. 새로운 정책 생성.&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;위의 서비스들에 대한 권한을 새로 생성해보겠습니다.&lt;/p&gt;
&lt;p&gt;좌측에 정책 메뉴를 클릭해서 정책 생성을 클릭해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz7W4O/btqvHixjGH8/FUYL8o9Gzz9KJzlEmkzYU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz7W4O/btqvHixjGH8/FUYL8o9Gzz9KJzlEmkzYU1/img.png&quot; data-alt=&quot;정책생성1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz7W4O/btqvHixjGH8/FUYL8o9Gzz9KJzlEmkzYU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz7W4O%2FbtqvHixjGH8%2FFUYL8o9Gzz9KJzlEmkzYU1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;정책생성1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;정책 생성 버튼을 누르면 다음과 같은 화면을 확인하실 수 있습니다.&lt;/p&gt;
&lt;p&gt;권한 추가 버튼을 눌러 하나씩 추가해줍시다. 그 후 작업은 모든 작업을 체크해주고 리소스도 모두 선택을 체크해 모든 유형의 리소스를 통과시키도록 해줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXzrnk/btqvJ5XKJ6Q/Jx6vHHCTMYMEfoxRs24XQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXzrnk/btqvJ5XKJ6Q/Jx6vHHCTMYMEfoxRs24XQk/img.png&quot; data-alt=&quot;S3 권한&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXzrnk/btqvJ5XKJ6Q/Jx6vHHCTMYMEfoxRs24XQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXzrnk%2FbtqvJ5XKJ6Q%2FJx6vHHCTMYMEfoxRs24XQk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;S3 권한&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아래와 같이 하나씩 해주기는 귀찮고 복잡하니깐 JSON 을 통해 한번에 정의해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;일단 이렇게 해놓은 뒤 정책을 적용하고 sls deploy를 해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1559279362085&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;cloudformation:*&quot;,
        &quot;s3:*&quot;,
        &quot;logs:*&quot;,
        &quot;iam:*&quot;,
        &quot;apigateway:*&quot;,
        &quot;lambda:*&quot;
      ],
      &quot;Resource&quot;: [
        &quot;*&quot;
      ]
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;정책 검토 버튼을 클릭해줍니다.&lt;/p&gt;
&lt;p&gt;이름은 적당히 full_serverless_role 로 명명해줍니다.&lt;/p&gt;
&lt;p&gt;정책을 생성해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/briTUz/btqvFWodytb/kCHuSJh6WPZ88jDKcjKTr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/briTUz/btqvFWodytb/kCHuSJh6WPZ88jDKcjKTr1/img.png&quot; data-alt=&quot;정책 검토&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/briTUz/btqvFWodytb/kCHuSJh6WPZ88jDKcjKTr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbriTUz%2FbtqvFWodytb%2FkCHuSJh6WPZ88jDKcjKTr1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;정책 검토&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래와 같은 메시지가 출력된다면 정책이 제대로 생성된 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fx7iH/btqvIkIDya9/7RY4UDYZGqde5yMb1seM11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fx7iH/btqvIkIDya9/7RY4UDYZGqde5yMb1seM11/img.png&quot; data-alt=&quot;success msg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fx7iH/btqvIkIDya9/7RY4UDYZGqde5yMb1seM11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFx7iH%2FbtqvIkIDya9%2F7RY4UDYZGqde5yMb1seM11%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;success msg&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;2. 정책 적용&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;다시 사용자로 돌아가 serverless-demo 사용자를 클릭해주고 권한 탭에서 권한 추가 버튼을 눌러줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;518&quot; height=&quot;342&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CV2Ea/btqvFW9y7n2/aZVB2AKqjOvXMUBKnGslwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CV2Ea/btqvFW9y7n2/aZVB2AKqjOvXMUBKnGslwK/img.png&quot; data-alt=&quot;사용자 권한&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CV2Ea/btqvFW9y7n2/aZVB2AKqjOvXMUBKnGslwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCV2Ea%2FbtqvFW9y7n2%2FaZVB2AKqjOvXMUBKnGslwK%2Fimg.png&quot; width=&quot;518&quot; height=&quot;342&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;사용자 권한&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래와 같이 방금 생성한 정책을 체크하고 다음으로 넘어가서 권한을 추가해줍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;648&quot; height=&quot;334&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXxBSn/btqvIku4Hbp/7Ws1SAFlscwJfRqC8qtw1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXxBSn/btqvIku4Hbp/7Ws1SAFlscwJfRqC8qtw1K/img.png&quot; data-alt=&quot;serverless-demo 권한추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXxBSn/btqvIku4Hbp/7Ws1SAFlscwJfRqC8qtw1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXxBSn%2FbtqvIku4Hbp%2F7Ws1SAFlscwJfRqC8qtw1K%2Fimg.png&quot; width=&quot;648&quot; height=&quot;334&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;serverless-demo 권한추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 후 AdministratorAccess 정책을 삭제해주면 아래와 같은 화면이 됩니다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;여기까지 끝났으면 이제 제대로 돌아가는지 확인해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;412&quot; height=&quot;280&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkZVPN/btqvKD74IFf/Ywovn5hKJsBfrk9MphiYe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkZVPN/btqvKD74IFf/Ywovn5hKJsBfrk9MphiYe0/img.png&quot; data-alt=&quot;full serverless role&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkZVPN/btqvKD74IFf/Ywovn5hKJsBfrk9MphiYe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkZVPN%2FbtqvKD74IFf%2FYwovn5hKJsBfrk9MphiYe0%2Fimg.png&quot; width=&quot;412&quot; height=&quot;280&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;full serverless role&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;3. 배포&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;sls deploy -v 명령어를 통해 배포해주겠습니다.&lt;/p&gt;
&lt;p&gt;문제없이 배포 완료됩니다. (문제 발생시 다시 차례대로 설정을 진행해주세요.)&lt;/p&gt;
&lt;p&gt;curl 명령어를 통해 배포된 api endpoint에 테스트를 해봐도 잘 동작하는 것을 확인할 수 있습니다!!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;477&quot; height=&quot;321&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEkzNo/btqvI5j9Aoi/Kkr1YU7aFiCTQsk74NKEkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEkzNo/btqvI5j9Aoi/Kkr1YU7aFiCTQsk74NKEkk/img.png&quot; data-alt=&quot;배포&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEkzNo/btqvI5j9Aoi/Kkr1YU7aFiCTQsk74NKEkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEkzNo%2FbtqvI5j9Aoi%2FKkr1YU7aFiCTQsk74NKEkk%2Fimg.png&quot; width=&quot;477&quot; height=&quot;321&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;배포&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;cloudwatch에 로그도 제대로 쌓입니다 :)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;지금까지 IAM role 변경을 해봤습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;4. 세부 설정 및 응용&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;이제 조금 더 설정을 세부적으로 변경해보겠습니다.&lt;/p&gt;
&lt;p&gt;앞서 한 IAM role setting은 serverless framework를 사용할 때 기본적으로 사용하는 권한 이외에도 모든 권한을 포함시켰습니다.&lt;/p&gt;
&lt;p&gt;조금 더 필요한 권한 위주로만 세팅하고 region, account, service 도 제한을 두는 role을 설정해주겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1559281712096&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;Version&quot;: &quot;2012-10-17&quot;,
  &quot;Statement&quot;: [
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;cloudformation:Describe*&quot;,
        &quot;cloudformation:List*&quot;,
        &quot;cloudformation:Get*&quot;,
        &quot;cloudformation:CreateStack&quot;,
        &quot;cloudformation:UpdateStack&quot;,
        &quot;cloudformation:DeleteStack&quot;
      ],
      &quot;Resource&quot;: &quot;arn:aws:cloudformation:&amp;lt;region&amp;gt;:&amp;lt;account_no&amp;gt;:stack/&amp;lt;service_name&amp;gt;*/*&quot;
    },
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;cloudformation:ValidateTemplate&quot;
      ],
      &quot;Resource&quot;: &quot;*&quot;
    },
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;s3:CreateBucket&quot;,
        &quot;s3:DeleteBucket&quot;,
        &quot;s3:Get*&quot;,
        &quot;s3:List*&quot;
      ],
      &quot;Resource&quot;: [
        &quot;arn:aws:s3:::*&quot;
      ]
    },
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;s3:*&quot;
      ],
      &quot;Resource&quot;: [
        &quot;arn:aws:s3:::*/*&quot;
      ]
    },
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;logs:DescribeLogGroups&quot;
      ],
      &quot;Resource&quot;: &quot;arn:aws:logs:&amp;lt;region&amp;gt;:&amp;lt;account_no&amp;gt;:log-group::log-stream:*&quot;
    },
    {
      &quot;Action&quot;: [
        &quot;logs:CreateLogGroup&quot;,
        &quot;logs:CreateLogStream&quot;,
        &quot;logs:DeleteLogGroup&quot;,
        &quot;logs:DeleteLogStream&quot;,
        &quot;logs:DescribeLogStreams&quot;,
        &quot;logs:FilterLogEvents&quot;
      ],
      &quot;Resource&quot;: &quot;arn:aws:logs:&amp;lt;region&amp;gt;:&amp;lt;account_no&amp;gt;:log-group:/aws/lambda/&amp;lt;service_name&amp;gt;*:log-stream:*&quot;,
      &quot;Effect&quot;: &quot;Allow&quot;
    },
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;iam:GetRole&quot;,
        &quot;iam:PassRole&quot;,
        &quot;iam:CreateRole&quot;,
        &quot;iam:DeleteRole&quot;,
        &quot;iam:DetachRolePolicy&quot;,
        &quot;iam:PutRolePolicy&quot;,
        &quot;iam:AttachRolePolicy&quot;,
        &quot;iam:DeleteRolePolicy&quot;
      ],
      &quot;Resource&quot;: [
        &quot;arn:aws:iam::&amp;lt;account_no&amp;gt;:role/&amp;lt;service_name&amp;gt;*-lambdaRole&quot;
      ]
    },
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;apigateway:GET&quot;,
        &quot;apigateway:POST&quot;,
        &quot;apigateway:PUT&quot;,
        &quot;apigateway:DELETE&quot;
      ],
      &quot;Resource&quot;: [
        &quot;arn:aws:apigateway:&amp;lt;region&amp;gt;::/restapis&quot;
      ]
    },
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;apigateway:GET&quot;,
        &quot;apigateway:POST&quot;,
        &quot;apigateway:PUT&quot;,
        &quot;apigateway:DELETE&quot;
      ],
      &quot;Resource&quot;: [
        &quot;arn:aws:apigateway:&amp;lt;region&amp;gt;::/restapis/*&quot;
      ]
    },
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;lambda:GetFunction&quot;,
        &quot;lambda:CreateFunction&quot;,
        &quot;lambda:DeleteFunction&quot;,
        &quot;lambda:UpdateFunctionConfiguration&quot;,
        &quot;lambda:UpdateFunctionCode&quot;,
        &quot;lambda:ListVersionsByFunction&quot;,
        &quot;lambda:PublishVersion&quot;,
        &quot;lambda:CreateAlias&quot;,
        &quot;lambda:DeleteAlias&quot;,
        &quot;lambda:UpdateAlias&quot;,
        &quot;lambda:GetFunctionConfiguration&quot;,
        &quot;lambda:AddPermission&quot;,
        &quot;lambda:RemovePermission&quot;,
        &quot;lambda:InvokeFunction&quot;
      ],
      &quot;Resource&quot;: [
        &quot;arn:aws:lambda:*:&amp;lt;account_no&amp;gt;:function:&amp;lt;service_name&amp;gt;*&quot;
      ]
    },
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;ec2:DescribeSecurityGroups&quot;,
        &quot;ec2:DescribeSubnets&quot;,
        &quot;ec2:DescribeVpcs&quot;
      ],
      &quot;Resource&quot;: [
        &quot;*&quot;
      ]
    },
    {
      &quot;Effect&quot;: &quot;Allow&quot;,
      &quot;Action&quot;: [
        &quot;events:Put*&quot;,
        &quot;events:Remove*&quot;,
        &quot;events:Delete*&quot;,
        &quot;events:Describe*&quot;
      ],
      &quot;Resource&quot;: &quot;arn:aws:events::&amp;lt;account_no&amp;gt;:rule/&amp;lt;service_name&amp;gt;*&quot;
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;에러가 발생한다...&lt;/p&gt;
&lt;p&gt;내용을 읽어보니 apigateway:PATCH 권한이 없어서 생기는 문제입니다.&lt;/p&gt;
&lt;p&gt;위로 올라가서 apigateway 권한 Action 들이 쭉 있는곳에 추가해주면 문제해결!&lt;/p&gt;
&lt;p&gt;(두군데 다 추가해주셔야 됩니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkSNYP/btqvI5kvgQT/TyxzQn3poBPgP9fbjw7d90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkSNYP/btqvI5kvgQT/TyxzQn3poBPgP9fbjw7d90/img.png&quot; data-alt=&quot;deploy error 발생&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkSNYP/btqvI5kvgQT/TyxzQn3poBPgP9fbjw7d90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkSNYP%2FbtqvI5kvgQT%2FTyxzQn3poBPgP9fbjw7d90%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;deploy error 발생&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;최종적으로 배포하면 정상적으로 작동합니다!&lt;/p&gt;
&lt;p&gt;IAM 에 대해선 다음에 기회가 되면 더 자세히 다루겠습니다. (워낙 양도 많고 들어갈수록&amp;nbsp; 어렵습니다..)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;+ 추가.. 나중에 production 모드로 추가배포했는데 배포 오류가 떠서 보니깐 s3 bucket 오류였습니다.&lt;/p&gt;
&lt;p&gt;정책에서 &quot;s3:Put*&quot; 한줄 추가해주면 잘 작동합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;* 참고&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=mQqVarM5mOY&quot;&gt;https://www.youtube.com/watch?v=mQqVarM5mOY&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://serverless.com/blog/abcs-of-iam-permissions/&quot;&gt;https://serverless.com/blog/abcs-of-iam-permissions/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/serverless/serverless/issues/1439&quot;&gt;https://github.com/serverless/serverless/issues/1439&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Web Study/Server</category>
      <category>AWS IAM</category>
      <category>AWS Lambda</category>
      <category>IAM role</category>
      <category>IAM role setting</category>
      <category>rambda setting</category>
      <category>serverless framework IAM</category>
      <category>serverless IAM</category>
      <category>람다 개발</category>
      <category>람다 세팅</category>
      <category>서버리스 아키텍쳐</category>
      <author>지로원</author>
      <guid isPermaLink="true">https://0to1.tistory.com/22</guid>
      <comments>https://0to1.tistory.com/entry/AWS-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%84%9C%EB%B2%84%EB%A6%AC%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90-%EC%A0%81%EC%9A%A9%EA%B8%B0%EC%82%BD%EC%A7%88%EA%B8%B0-7-IAM-role-%EC%84%B8%ED%8C%85#entry22comment</comments>
      <pubDate>Tue, 11 Jun 2019 12:33:30 +0900</pubDate>
    </item>
    <item>
      <title>AWS 를 사용한 서버리스 아키텍쳐 적용기(삽질기) (6) - serverless 프레임워크 2</title>
      <link>https://0to1.tistory.com/entry/AWS-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%84%9C%EB%B2%84%EB%A6%AC%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90-%EC%A0%81%EC%9A%A9%EA%B8%B0%EC%82%BD%EC%A7%88%EA%B8%B0-6-serverless-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-2</link>
      <description>&lt;p&gt;저번 글에서 서버리스 프레임워크를 간단하게 사용해봤습니다.&lt;/p&gt;
&lt;p&gt;이번 글에선 좀 더 많은 기능을 테스트해보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;0. 새로운 프로젝트 생성&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1557798644952&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sls create -t aws-nodejs -p &amp;lt;프로젝트명&amp;gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;명령어를 통해 다시 프로젝트를 생성하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;생성한 다음 해당 폴더에 들어가서&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1557798692412&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn init -y&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;명령어를 통해 package.json을 만들어줍니다.&lt;/p&gt;
&lt;p&gt;또한 이번에는 좀 더 편하게 사용할 수 있도록 serverless-http, serverless-webpack 등을 사용할 예정입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;* serverless-http? 기존 node 기반 백엔드 서버 구축에 사용되는 express, koa 등의 프레임워크로 람다 함수를 wrapping 해서 사용할 수 있게 만들어주는 일종의 툴.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;* serverless-webpack? serverless용 웹팩이다. 웹팩은 검색해보면 관련된 좋은 설명들이 너무 많다. 많은 번들러 중에 굳이 왜 웹팩을 쓰느냐? 제일 좋아서 쓴다.&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;* serverless-offline? serverless는 코드를 수정하고 테스트를 해보고 싶으면 배포를 해야 테스트를 해볼 수 있다. 배포는 s3를 통해 배포되므로 곧 비용과 직결되는 문제이다. serverless-offline을 사용하면 로컬에서도 테스트를 해볼 수 있다!!&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;1. 본격적인 준비.&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;1-1. serverless.yml&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;우선 serverless.yml 파일을 수정해줘야 합니다.&lt;/p&gt;
&lt;p&gt;serverless-http는 따로 설정 안 해주시고 npm 또는 yarn을 통해 install만 해주시면 됩니다. serverless-webpack과 serverless-offline은 yml에 설정해줘야 사용할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1557823595098&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;service: sls-assistant # 서비스 명.

plugins:
  - serverless-webpack # webpack이 먼저 와야됨.
  - serverless-offline

custom:
  webpack: # serverless-webpack 관련 설정
    webpackConfig: 'webpack.config.js'
    includeModules: true
    packager: 'yarn' # npm을 사용한다면, npm 으로 설정.

provider:
  name: aws
  runtime: nodejs8.10
  stage: dev
  region: ap-northeast-2 # 한국으로 설정.

functions:
  app:
    handler: src/app.handler
    events:
      - http: ANY /
      - http: 'ANY {proxy+}'&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;1-2. webpack.config.js&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;명시된 것과 같이 webpack.config.js 파일을 통해 webpack 설정을 해줘야 합니다.&lt;/p&gt;
&lt;p&gt;webpack.config.js 파일은 다음과 같이 작성해주시면 되겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1557823791972&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const path = require('path');
const serverlessWebpack = require('serverless-webpack');
const nodeExternals = require('webpack-node-externals');

module.exports = {
  // entry를 따로 설정하지 않아도 됨
  entry: serverlessWebpack.lib.entries,
  target: 'node',
  mode: serverlessWebpack.lib.webpack.isLocal ? 'development' : 'production',
  // webpack의 critical warning 메시지를 피하기 위한 용도
  externals: [nodeExternals()],
  resolve: {
    modules: [path.resolve('./src'), 'node_modules'] // src 디렉토리 내부에서 absolute import를 사용하기 위한 용도
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: [
          {
            loader: 'babel-loader'
          }
        ]
      }
    ]
  },
  output: {
    libraryTarget: 'commonjs',
    path: path.join(__dirname, '.webpack'),
    filename: '[name].js'
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;코드를 보면 loader는 바벨을 쓰는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;따라서 install을 통해 바벨도 설치해주고 여러 가지 설치를 해줘야 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;1-3. package.json&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;그럼 어떤 것들이 설치되어야 하는지 package.json 파일을 잠시 보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1558404363203&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;sls-assistant&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;main&quot;: &quot;index.js&quot;,
  &quot;license&quot;: &quot;MIT&quot;,
  &quot;dependencies&quot;: {
    &quot;axios&quot;: &quot;^0.18.0&quot;,
    &quot;express&quot;: &quot;^4.16.4&quot;,
    &quot;serverless-http&quot;: &quot;^2.0.1&quot;
  },
  &quot;devDependencies&quot;: {
    &quot;@babel/core&quot;: &quot;^7.4.4&quot;,
    &quot;@babel/preset-env&quot;: &quot;^7.4.4&quot;,
    &quot;babel-loader&quot;: &quot;^8.0.6&quot;,
    &quot;serverless-offline&quot;: &quot;^4.10.0&quot;,
    &quot;serverless-webpack&quot;: &quot;^5.3.0&quot;,
    &quot;webpack&quot;: &quot;^4.31.0&quot;,
    &quot;webpack-node-externals&quot;: &quot;^1.7.2&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;바벨 관련된 패키지, serverless-offline, serverless-webpack 등등은 전부 개발할 때 빌드용으로 사용할 것이므로&lt;/p&gt;
&lt;p&gt;devDependencies에 추가해주시면 되겠습니다.&lt;/p&gt;
&lt;p&gt;dependencies 에는 저 같은 경우 람다에서 post, get 등의 http request를 보낼 것이므로 axios, body-parser, express 등을 사용합니다.&lt;/p&gt;
&lt;p&gt;모두 yarn 또는 npm을 이용해서 옵션을 주고 install 해주시면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;2. 구조&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;위에 webpack.config.js 파일에서 './src' 경로를 절대 경로로 설정해주었습니다.&lt;/p&gt;
&lt;p&gt;그럼 폴더 구조가 어떻게 되어있는지 간단하게 보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F6Vki/btqvusZ6dLS/6CyzQc1yXCaVtVRlBuvuO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F6Vki/btqvusZ6dLS/6CyzQc1yXCaVtVRlBuvuO1/img.png&quot; data-alt=&quot;디렉토리 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F6Vki/btqvusZ6dLS/6CyzQc1yXCaVtVRlBuvuO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF6Vki%2FbtqvusZ6dLS%2F6CyzQc1yXCaVtVRlBuvuO1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;디렉토리 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;순서대로 보면&lt;/p&gt;
&lt;p&gt;.serverless -&amp;gt; 어느 시점에 생긴 건지 정확히 확인하지 못했습니다...ㅜㅜ&amp;nbsp; 대충 유추해보면 deploy를 할 때 생기는 폴더 같습니다. cloudformation 관련 설정 파일들과 람다에 올라가는 압축파일이 있습니다.&lt;/p&gt;
&lt;p&gt;.webpack -&amp;gt; 위의 webpack.config.js 파일의 output을 보면 path가 .webpack 으로 설정해놓은 것을 볼 수 있습니다. 프로젝트가 빌드될 때 생성된 빌드 output 폴더입니다.&lt;/p&gt;
&lt;p&gt;node_modules -&amp;gt; 패스&lt;/p&gt;
&lt;p&gt;src -&amp;gt; 실질적으로 모든 코드가 있는 폴더입니다. 저 같은 경우 components 폴더 안에 express로 전달되는 각 경로에 따라 폴더를 따로 생성해서 알아보기 쉽도록 하였습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;3. 코드 실행 흐름&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;3-1. app.js&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;단순합니다. server.js를 가져와서 handler로 export 해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1558406004395&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import Server from './server';

const server = new Server();

// serverless-http 의 entry point
export const { handler } = server;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이를 통해 serverless.yml 파일에서 handler: src/app.handler로 설정해놓은 entry point를 server.js로 연결시킵니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;3-2. server.js&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;사실상 모든 코드가 시작되는 부분입니다.&lt;/p&gt;
&lt;p&gt;간단하게 구성해봤습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1558408385817&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import serverless from 'serverless-http';
import express from 'express';
import axios from 'axios';
import beginning from 'components/apart-evaluation/beginning';

export default class Server {
  constructor() {
    this.app = express();
    // this.app.use(express.urlencoded({extended: false}));
    this.app.use(express.json());

    this.app.get('/', (req, res) =&amp;gt; { //get
      res.json({ hello: &quot;world&quot;});
    });

    this.app.post('/apart_evaluation/beginning', (req, res) =&amp;gt; {
      beginning(req.body).then((data) =&amp;gt; {
        console.log(JSON.stringify(data));
        res.json(data);
      });
    });
  }

  get handler() {
    // serverless-http 관련 설정
    return serverless(this.app);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;평범한 node의 express 프레임워크입니다.&lt;/p&gt;
&lt;p&gt;beginning이라는 함수를 components 폴더 안의 어딘가에서 가져와서 사용합니다. 이때, Promise를 이용해서 결과 값을 전송해줍니다.&lt;/p&gt;
&lt;p&gt;http request에는 항상 필수적으로 동기/비동기 제어가 중요합니다. (계속 써도 계속 헷갈리긴 하는데...ㅋㅋㅋㅋㅋ)&lt;/p&gt;
&lt;p&gt;당연히 beginning 함수의 리턴에서 return new Promise 형태로 값을 리턴해줘야 되겠죠?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;3-3. beginning.js&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1558408908788&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import axios from 'axios';

const Beginning = async (data) =&amp;gt; {
  // console.log(data);
  let blockId = data.userRequest.block.id;
  let botUserId = data.userRequest.user.id;
  let plusFriendUserId = data.userRequest.user.properties.plusfriendUserKey;
  let key, msg, label;
  let webUrl = &quot;http://kakao.chatbot/api/test/&quot;;
  let returnView;

  await axios.get(&quot;http://kakao.chatbot/api/test&quot;,{
    data : {
      block_id: blockId,
      user_id: botUserId,
      plus_friend_id: blockId
    }
  }).then(response =&amp;gt; {
    if(response.data.status == &quot;success&quot;) {
     ...
      returnView = {
        &quot;version&quot;: &quot;2.0&quot;,
        &quot;template&quot;: {
         ...
        }
      };
    } else {
      msg = response.data.msg;
      returnView = {
        &quot;version&quot;: &quot;2.0&quot;,
        &quot;template&quot;: {
          &quot;outputs&quot;: [
            {
              &quot;simpleText&quot;: {
                &quot;text&quot;: msg
              }
            }
          ]
        }
      };
    }
  }).catch(error =&amp;gt; {
    console.log(error);
    returnView = {
      &quot;version&quot;: &quot;2.0&quot;,
      &quot;template&quot;: {
        &quot;outputs&quot;: [
          {
            &quot;simpleText&quot;: {
              &quot;text&quot;: &quot;error&quot;
            }
          }
        ]
      }
    };
  });
  // promise returnView
  return new Promise(resolve =&amp;gt; {
    console.log(returnView);
    resolve(returnView);
  });
};

export default Beginning;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;저 같은 경우에는 카카오 챗봇에 연결했기 때문에 챗봇에 맞는 템플릿을 연결해줬습니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;async &amp;amp; await 그리고 promise를&lt;/b&gt; 사용해서 비동기의 늪에서 헤어 나올 수 있었습니다ㅠㅠ (맨날 해도 맨날 헷갈리는 게 함정)&lt;/p&gt;
&lt;p&gt;마지막 라인 쪽을 보시면 return new Promise 구문을 이용해 위의 axios를 이용한 api콜이 끝나면 그 결과를 리턴해줍니다.&lt;/p&gt;
&lt;p&gt;리턴 받은 결과값을 위의 server.js 에서 최종적으로 처리합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;사실 server.js에서 다 처리해도 됩니다. 하지만 api콜이 여러 개 붙을수록 server.js 코드가 복잡해지겠죵?&lt;/p&gt;
&lt;p&gt;그렇기 때문에 굳이 &lt;b&gt;폴더를 나눠서 처리&lt;/b&gt;했습니다. (저는 하나의 함수는 하나의 기능만 수행하는 것이 모든 면에서 좋다고 생각합니다.)&lt;/p&gt;
&lt;p&gt;추후에 api endpoint url 같은 경우도 따로 빼고 중요한 부분은 람다 함수의 환경변수로 모두 빼서 보안도 챙기고 나중에 수정할 때 편하게 수정할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;4. 실행&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;그럼 이제 대충 코드가 완성되었으니 배포해야겠죠?&lt;/p&gt;
&lt;p&gt;아 배포하기 전에&lt;/p&gt;
&lt;pre id=&quot;code_1558492089202&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sls offline start&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;명령어를 통해 테스트를 해보고 에러처리를 한 뒤에 배포해줍시다!&lt;/p&gt;
&lt;pre id=&quot;code_1558491298658&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sls deploy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;명령어를 치게 되면 자동으로 파일들이 빌드되고 aws에 배포됩니다.&lt;/p&gt;
&lt;p&gt;배포한 뒤 테스트를 해보면 성공적으로 돌아가는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;5. 결론&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;serverless 프레임워크가 정말진짜레알완전 편리한 것을 느낄 수 있었습니다.&lt;/p&gt;
&lt;p&gt;기존의 정말 복잡한 여러 가지 세팅들을 할 필요 없이 바로 뚝딱뚝딱 간단하게 프로젝트에 적용할 수 있습니다.&lt;/p&gt;
&lt;p&gt;물론 조금 더 세밀하게 구축하고 보안적인 부분도 신경 쓰려면 세팅을 조금씩 바꿔줘야 됩니다.&lt;/p&gt;
&lt;p&gt;다음 글은 이렇게 만든 람다 함수를 실제로 적용하려면 어떠한 추가 작업들을 거쳐야 하는지 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;(공부를 많이 해야 될 것 같아서 오래 걸릴 듯....? 그냥 넘어갈수도?ㅋㅋㅋ)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;p.s 카카오 챗봇 관련해서는 나중에 기회가 되면 포스팅...?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Web Study/Server</category>
      <category>API Gateway</category>
      <category>AWS Lambda</category>
      <category>aws serverless</category>
      <category>lambda</category>
      <category>serverless</category>
      <category>람다 개발</category>
      <category>람다 세팅</category>
      <category>마이크로서비스</category>
      <category>서버리스 아키텍쳐</category>
      <category>서버리스 프레임워크</category>
      <author>지로원</author>
      <guid isPermaLink="true">https://0to1.tistory.com/21</guid>
      <comments>https://0to1.tistory.com/entry/AWS-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%84%9C%EB%B2%84%EB%A6%AC%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90-%EC%A0%81%EC%9A%A9%EA%B8%B0%EC%82%BD%EC%A7%88%EA%B8%B0-6-serverless-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-2#entry21comment</comments>
      <pubDate>Wed, 22 May 2019 11:27:09 +0900</pubDate>
    </item>
    <item>
      <title>AWS 를 사용한 서버리스 아키텍쳐 적용기(삽질기) (5) - serverless 프레임워크 1</title>
      <link>https://0to1.tistory.com/entry/AWS-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%84%9C%EB%B2%84%EB%A6%AC%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90-%EC%A0%81%EC%9A%A9%EA%B8%B0%EC%82%BD%EC%A7%88%EA%B8%B0-4-serverless-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC</link>
      <description>&lt;h4&gt;&lt;b&gt;0. serverless framework란?&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;serverless framework는 서버없는 아키텍쳐를 배치하고 운영하기 위한 프레임워크 입니다.&lt;/p&gt;
&lt;p&gt;-&amp;gt; serverless architecture를 쉽게 설계, 운영하도록 도와주는 툴킷.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;1. serverless 설치&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;공식 홈페이지인&amp;nbsp;&lt;a href=&quot;https://serverless.com/&quot;&gt;https://serverless.com/&lt;/a&gt;&amp;nbsp;에 들어가면 아래와 같은 메인 화면이 보입니다.&lt;/p&gt;
&lt;p&gt;오른쪽에 커맨드를 보고 따라해보겠습니다!&lt;/p&gt;
&lt;p&gt;그전에! npm을 사용하기 때문에 기본적으로 nodejs와 npm이 설치되어 있어야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;제 기준으로 nodejs는 현재 10.15.0, npm은 6.8.0 입니다.&lt;/p&gt;
&lt;p&gt;람다에서 요구하는 노드 버전이 8.10 이므로&amp;nbsp; 최소&amp;nbsp; 8.10 이상으로 설치해야 되겠죠 ?!&lt;/p&gt;
&lt;p&gt;준비를 끝낸 뒤에 보이는 것과 같이&lt;/p&gt;
&lt;pre id=&quot;code_1557463677413&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i -g serverless&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;명령을 커맨드라인에 입력해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBc3tF/btqu61iZa9w/94vRhnlFwN7TLFw2AykfSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBc3tF/btqu61iZa9w/94vRhnlFwN7TLFw2AykfSK/img.png&quot; data-alt=&quot;serverless 공홈 메인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBc3tF/btqu61iZa9w/94vRhnlFwN7TLFw2AykfSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBc3tF%2Fbtqu61iZa9w%2F94vRhnlFwN7TLFw2AykfSK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;serverless 공홈 메인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그 후 바로 밑에 명령어를 타이핑해줘도 되지만 aws-nodejs 라는 다른 템플릿을 사용하도록 하겠습니다.&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;2. aws-nodejs 템플릿 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;잠깐 서버리스에서 제공하는 템플릿들이 무엇이 있는지 알아보도록 하겠습니다!&lt;/p&gt;
&lt;p&gt;아래와 같은 명령어를 입력하면 어떤 템플릿들이 제공되는지 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;추가 옵션들도 확인 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1557466610925&quot; class=&quot;javascript&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;serverless create --help&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k8fKU/btqu9ys3nzM/w58mkWdtJzxVnQ6rNwpak0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k8fKU/btqu9ys3nzM/w58mkWdtJzxVnQ6rNwpak0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k8fKU/btqu9ys3nzM/w58mkWdtJzxVnQ6rNwpak0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk8fKU%2Fbtqu9ys3nzM%2Fw58mkWdtJzxVnQ6rNwpak0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;pre id=&quot;code_1557463781224&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sls create -t aws-nodejs -p sls-sample&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;sls = serverless, -t = --template 의 줄임말 입니다. aws-nodejs 는 서버리스에서 제공하는 템플릿 중에 하나입니다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;-p sls-sample 명령어는 sls-sample 폴더 안에 해당 템플릿으로 생성하겠다는 뜻입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;명령어를 실행하면 다음과 같은 결과를 보실 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-05-10 오전 10.47.26.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8aUj1/btqvbIor6Zp/8hQV1k5St6L1kE9xLCa3K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8aUj1/btqvbIor6Zp/8hQV1k5St6L1kE9xLCa3K0/img.png&quot; data-alt=&quot;create 입력 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8aUj1/btqvbIor6Zp/8hQV1k5St6L1kE9xLCa3K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8aUj1%2FbtqvbIor6Zp%2F8hQV1k5St6L1kE9xLCa3K0%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-05-10 오전 10.47.26.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;create 입력 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;템플릿 생성.... 완료!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUCFFr/btqu9Aq0hFF/SuieyWOCGkCWthIWYCKbr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUCFFr/btqu9Aq0hFF/SuieyWOCGkCWthIWYCKbr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUCFFr/btqu9Aq0hFF/SuieyWOCGkCWthIWYCKbr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUCFFr%2Fbtqu9Aq0hFF%2FSuieyWOCGkCWthIWYCKbr0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;p&gt;&lt;b&gt;3. 배포&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;이제&lt;/p&gt;
&lt;pre id=&quot;code_1557464670430&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sls deploy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;명령어를 실행하면 아래와 같은 결과가 뜹니다.. Error ?!&lt;/p&gt;
&lt;p&gt;aws credential 관련 에러내요.&lt;/p&gt;
&lt;p&gt;IAM 을 통해 키를 발급받아야 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-05-10 오전 11.06.09.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bexPY7/btqu8uZjQEa/C124F55HxVhJMlKRVUJrak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bexPY7/btqu8uZjQEa/C124F55HxVhJMlKRVUJrak/img.png&quot; data-alt=&quot;deploy 에러&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bexPY7/btqu8uZjQEa/C124F55HxVhJMlKRVUJrak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbexPY7%2Fbtqu8uZjQEa%2FC124F55HxVhJMlKRVUJrak%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-05-10 오전 11.06.09.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;deploy 에러&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;일단 에러를 해결하기 전에 템플릿으로 생성한 함수를 실행시켜 보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1557465310577&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sls invoke local --function hello&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;명령어 실행 시&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-05-10 오전 10.59.44.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/95PLo/btqu9m0K3Q4/5qiw0bgY0PL6RlPcMbmtI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/95PLo/btqu9m0K3Q4/5qiw0bgY0PL6RlPcMbmtI0/img.png&quot; data-alt=&quot;로컬에서 함수 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/95PLo/btqu9m0K3Q4/5qiw0bgY0PL6RlPcMbmtI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F95PLo%2Fbtqu9m0K3Q4%2F5qiw0bgY0PL6RlPcMbmtI0%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-05-10 오전 10.59.44.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;로컬에서 함수 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;와 같은 결과화면을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;잘되네요 :)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다시 에러로 돌아가서...&lt;/p&gt;
&lt;p&gt;공식 홈페이지를 통해 에러를 해결하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://serverless.com/framework/docs/providers/aws/guide/credentials/&quot;&gt;https://serverless.com/framework/docs/providers/aws/guide/credentials/&lt;/a&gt;&amp;nbsp;에서 어떻게 해야되는지 자세하게 나와 있습니다.&lt;/p&gt;
&lt;p&gt;그런데 영어를 읽으니까 토할꺼 같다고요??&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=KngM5bfpttA&quot;&gt;https://www.youtube.com/watch?v=KngM5bfpttA&lt;/a&gt;&amp;nbsp;에서 영상보시고 편하게 하세요 :)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아무튼 알려주는 대로 따라하면 iam을&amp;nbsp; 통해 자격증명을 생성하고 키를 발급받을 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그럼 아래와 같이 명령어를 통해 credetial 등록을 해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1557464949866&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sls config credentials --provider aws --key &amp;lt;키&amp;gt; --secret &amp;lt;비밀키&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #f41a18;&quot;&gt;&lt;b&gt;*** 만약 이전에 등록했던 aws credential 이 있다면 기본적으로 '~/.aws/credentials' 파일에 [default] 값으로 세팅이 되어있어 새로운 credential 등록이 되지 않습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;이 때, 2가지 방법이 있습니다. 덮어 씌우거나 다른 이름으로 credential 생성을 해주거나.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;1번의 경우 -o 옵션을 붙여서 위의 명령어를 실행시켜주면 덮어씌워줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2번의 경우 직접 credentials 파일을 수정해서 아래와 같이 [default] 밑에 넣어주시면 됩니다. 그 후, sls deploy --aws-profile othercredential 옵션을 줘서 배포를 하시면 됩니다!! :)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1562735956385&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[othercredential] 
aws_access_key_id = &amp;lt;키&amp;gt;
aws_secret_access_key = &amp;lt;비밀키&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 다시 sls deploy... 를 하기 전에!! region하고 rest api 세팅을 해줘야 합니다. (안그러면 default region인 버지니아에 생성됩니다.)&lt;/p&gt;
&lt;p&gt;아까 템플릿 생성할 때 생성된 serverless.yml 파일을 수정해줍니다.&lt;/p&gt;
&lt;p&gt;저는 서울인 ap-northeast-2 로 설정해 줬습니다.&lt;/p&gt;
&lt;p&gt;stage는 개발 버전으로 만들지, 배포 버전으로 만들지 설정해주는 부분입니다. (dev, prod)&lt;/p&gt;
&lt;p&gt;events - http 에서 정말 쉽게 API Gateway를 통해 rest api를 만들 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1557465824341&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;service: sls-sample # NOTE: update this with your service name

provider:
  name: aws
  runtime: nodejs8.10
  stage: dev
  region: ap-northeast-2

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: hello
          method: get&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위의 과정을 다 끝낸 후 다시 한번&lt;/p&gt;
&lt;pre id=&quot;code_1557466174899&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sls deploy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;를 입력합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-05-10 오후 1.27.24.png&quot; width=&quot;633&quot; height=&quot;537&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXtzZI/btqu6N6opiu/HRdTkdp1BFlCToSrD9WKWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXtzZI/btqu6N6opiu/HRdTkdp1BFlCToSrD9WKWK/img.png&quot; data-alt=&quot;deploy 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXtzZI/btqu6N6opiu/HRdTkdp1BFlCToSrD9WKWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXtzZI%2Fbtqu6N6opiu%2FHRdTkdp1BFlCToSrD9WKWK%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-05-10 오후 1.27.24.png&quot; width=&quot;633&quot; height=&quot;537&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;deploy 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;짜잔!! 자동으로 모든게 생성됐습니다.&lt;/p&gt;
&lt;p&gt;API Gateway, S3, lambda, cloudformation .... 이렇게 쉽게?!&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;직접하려면 이것저것 세팅하고 만들어주기 정말 힘듭니다ㅠㅜ (직접 해봐서 앎.. 프레임워크 짱!)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;화면에 보이는 엔드포인트로 콜을 날려서 테스트 해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4. 테스트&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1557466352801&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl  https://jyw45r6pjk.execute-api.ap-northeast-2.amazonaws.com/dev/hello&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아래와 같은 리턴 값이 돌아옵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; width=&quot;533&quot; height=&quot;268&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nnnam/btqvi5YgE0M/BBazhGO6BSi3oxc2Pg4Z81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nnnam/btqvi5YgE0M/BBazhGO6BSi3oxc2Pg4Z81/img.png&quot; data-alt=&quot;api call GET 실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nnnam/btqvi5YgE0M/BBazhGO6BSi3oxc2Pg4Z81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnnnam%2Fbtqvi5YgE0M%2FBBazhGO6BSi3oxc2Pg4Z81%2Fimg.png&quot; data-filename=&quot;blob&quot; width=&quot;533&quot; height=&quot;268&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;api call GET 실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;끝... 너무 쉽네요.&lt;/p&gt;
&lt;p&gt;이제 본격적으로 사용해보기 위해 다음 글에선 POST method와 기회가 되면 db 까지 연결해 보겠습니다.&lt;/p&gt;</description>
      <category>Web Study/Server</category>
      <category>API Gateway</category>
      <category>AWS Lambda</category>
      <category>aws serverless</category>
      <category>cloudformation</category>
      <category>lambda</category>
      <category>serverless framework</category>
      <category>람다 개발</category>
      <category>람다 세팅</category>
      <category>서버리스</category>
      <category>서버리스 프레임워크</category>
      <author>지로원</author>
      <guid isPermaLink="true">https://0to1.tistory.com/17</guid>
      <comments>https://0to1.tistory.com/entry/AWS-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%84%9C%EB%B2%84%EB%A6%AC%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90-%EC%A0%81%EC%9A%A9%EA%B8%B0%EC%82%BD%EC%A7%88%EA%B8%B0-4-serverless-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC#entry17comment</comments>
      <pubDate>Tue, 14 May 2019 18:03:31 +0900</pubDate>
    </item>
    <item>
      <title>AWS 를 사용한 서버리스 아키텍쳐 적용기(삽질기) (3) - API Gateway 1</title>
      <link>https://0to1.tistory.com/entry/AWS-lambda-gateway-%EC%82%AC%EC%9A%A9%EA%B8%B0%EC%82%BD%EC%A7%88%EA%B8%B0-3</link>
      <description>&lt;h4&gt;&lt;b&gt;0. API Gateway 란?&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;이름에 보이는 것 처럼 API 와 관련이 있다는 것을 유추할 수 있숩니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;AWS에서 정의되어 있는 것을 살펴보면, '&lt;span&gt;Amazon API Gateway는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;규모와 상관없이 REST 및 WebSocket API를 생성, 게시, 유지하고 모니터링 및 보안하기 위한 AWS 서비스입니다.' 라고 명시되어 있숩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;쉽게 말해, API를 조금 더 쉽게 작성하고 사용할 수 있게 해주는 API 호스팅 서비스라고 해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;357&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfrHBm/btqu2GLKQ8o/CuSYlMW7B2KKXBqjSIXFj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfrHBm/btqu2GLKQ8o/CuSYlMW7B2KKXBqjSIXFj0/img.png&quot; data-alt=&quot;API gateway architecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfrHBm/btqu2GLKQ8o/CuSYlMW7B2KKXBqjSIXFj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfrHBm%2Fbtqu2GLKQ8o%2FCuSYlMW7B2KKXBqjSIXFj0%2Fimg.png&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;357&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;API gateway architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위는 api gateway의 아키텍쳐 입니다.&lt;/p&gt;
&lt;p&gt;왼쪽에서부터 enduser가 사용하는 client App, API Gateway, AWS의 각종 서비스들로 구분됩니다.&lt;/p&gt;
&lt;p&gt;AWS 클라우드 기반 어플리케이션을 구축할 때의 편리성, 보안성 등을 쉽게 얻을 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f41a18;&quot;&gt;&lt;b&gt;API Gateway 기능&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p&gt;Amazon API Gateway는 다음과 같은 기능을 제공합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;상태 저장(&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/apigateway-websocket-api.html&quot;&gt;WebSocket&lt;/a&gt;) 및 상태 비저장(&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/apigateway-rest-api.html&quot;&gt;REST&lt;/a&gt;) API에 대한 지원.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/apigateway-control-access-to-api.html&quot;&gt;REST&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/apigateway-websocket-api-control-access.html&quot;&gt;WebSocket&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;API에 대한 액세스를 제어하기 위한 다양한 옵션.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;API를 게시하기 위한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/apigateway-developer-portal.html&quot;&gt;개발자 포털&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;변경 사항을 안전하게 롤아웃하기 위한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/canary-release.html&quot;&gt;Canary 릴리스 배포&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;API 사용 및 API 변경에 대한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/cloudtrail.html&quot;&gt;CloudTrail&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;로깅 및 모니터링.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;경보 설정 기능을 포함한 CloudWatch 액세스 로깅 및 실행 로깅. 자세한 내용은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/monitoring-cloudwatch.html&quot;&gt;Amazon CloudWatch로 API execution 모니터링&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/apigateway-websocket-api-logging.html&quot;&gt;CloudWatch로 WebSocket API 실행 모니터링&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;단원을 참조하십시오.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS CloudFormation 템플릿을 사용하여 API 생성을 활성화할 수 있는 기능. 자세한 내용은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-reference-apigateway.html&quot;&gt;Amazon API Gateway 리소스 유형 참조 정보&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-reference-apigatewayv2.html&quot;&gt;Amazon API Gateway V2 리소스 유형 참조 정보&lt;/a&gt;.를 참조하십시오.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/how-to-custom-domains.html&quot;&gt;사용자 지정 도메인 이름&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;지원.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;일반적인 웹 익스플로잇으로부터 API를 보호하기 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html&quot;&gt;AWS WAF&lt;/a&gt;와 통합.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;성능 지연 시간 파악 및 학습을 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/apigateway-xray.html&quot;&gt;AWS X-Ray&lt;/a&gt;와 통합.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;API Gateway 기능의 전체 목록은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/history.html&quot;&gt;문서 이력&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;단원을 참조하십시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;일단 이정도에서 각설하고.... 실습을 해봅시다!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;1. 람다에서 트리거 추가&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;앞에서 생성했던 람다함수에서 Designer 메뉴 좌측에 트리거 추가라고 있고 이를 통해 트리거를 간단하게 추가할 수 있습니다.&lt;/p&gt;
&lt;p&gt;다양한 트리거를 추가할 수 있지만 API gateway 트리거를 추가해보겠습니다.&lt;/p&gt;
&lt;p&gt;클릭하게 되면 우측과 같이 'lambdaTest' 함수 밑에 'API 게이트웨이' 라는 항목이 생깁니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1611&quot; data-origin-height=&quot;540&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/62IAf/btqu3rAYLZo/nrrrQk8mxo5396g1ukOTZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/62IAf/btqu3rAYLZo/nrrrQk8mxo5396g1ukOTZ1/img.png&quot; data-alt=&quot;트리거 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/62IAf/btqu3rAYLZo/nrrrQk8mxo5396g1ukOTZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F62IAf%2Fbtqu3rAYLZo%2FnrrrQk8mxo5396g1ukOTZ1%2Fimg.png&quot; data-origin-width=&quot;1611&quot; data-origin-height=&quot;540&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;트리거 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;클릭하게 되면 밑의 화면과 같이 트리거 구성 설정을 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;맨 위의 설정부터 차례대로 보면, 우선 API는 기존에 생성된 API가 없으므로 새 API 생성을 그대로 두면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;보안 같은 경우 'IAM','API 키 설정', '열기' 가 있는데 저는 API 키 설정을 선택하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;'IAM 설정'을 하실 경우 추가적으로 IAM 구성을 해줘야 합니다. '열기'의 경우 말그대로 열어놓는 것인데 내부적으로만 사용되는 것이 아닌 이상 당연히 안쓰는게 좋습니다. 왜? 그냥 열어놨다가 제한없이 사용되면 돈이 줄줄....&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그 후 추가 세팅 탭에서 API 이름과 배포 단계 이름을 설정하면 됩니당.&lt;/p&gt;
&lt;p&gt;전 건드릴게 없어서 그냥 다 냅뒀습니다. 나머지는 읽어보면 다 아니깐 건너뛰겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1581&quot; data-origin-height=&quot;935&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTgHcy/btqu1tNLOHq/zgBC6JmSJAXdqGHcslHye1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTgHcy/btqu1tNLOHq/zgBC6JmSJAXdqGHcslHye1/img.png&quot; data-alt=&quot;트리거 구성 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTgHcy/btqu1tNLOHq/zgBC6JmSJAXdqGHcslHye1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTgHcy%2Fbtqu1tNLOHq%2FzgBC6JmSJAXdqGHcslHye1%2Fimg.png&quot; data-origin-width=&quot;1581&quot; data-origin-height=&quot;935&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;트리거 구성 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;구성을 완료하면 새로운 트리거가 생성된 것을 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;맨 위에 저장을 눌러줘야 저장됩니다.&lt;/p&gt;
&lt;p&gt;완료되면 아래와 같이 api 엔드포인트와 키가 발급됩니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1602&quot; data-origin-height=&quot;423&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw1KQL/btqu14tfJq9/AkIzeLg2jdpO9UaPrSs04k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw1KQL/btqu14tfJq9/AkIzeLg2jdpO9UaPrSs04k/img.png&quot; data-alt=&quot;트리거 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw1KQL/btqu14tfJq9/AkIzeLg2jdpO9UaPrSs04k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw1KQL%2Fbtqu14tfJq9%2FAkIzeLg2jdpO9UaPrSs04k%2Fimg.png&quot; data-origin-width=&quot;1602&quot; data-origin-height=&quot;423&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;트리거 정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;2. REST 구성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;lambdaTest-API를 클릭하면 api 세팅화면으로 들어가게 됩니다.&lt;/p&gt;
&lt;p&gt;최초에 보이는 것은 ANY라는 메소드가 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2538&quot; data-origin-height=&quot;641&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAVnJD/btqu3BpSHvB/kMkM1KrxEBoO29xJ7wFzZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAVnJD/btqu3BpSHvB/kMkM1KrxEBoO29xJ7wFzZk/img.png&quot; data-alt=&quot;API gateway 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAVnJD/btqu3BpSHvB/kMkM1KrxEBoO29xJ7wFzZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAVnJD%2Fbtqu3BpSHvB%2FkMkM1KrxEBoO29xJ7wFzZk%2Fimg.png&quot; data-origin-width=&quot;2538&quot; data-origin-height=&quot;641&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;API gateway 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;리소스에서 /lambdaTest를 클릭한 뒤 작업에서 메서드 생성을 눌러 POST 메서드를 만들어 줍니다.&lt;/p&gt;
&lt;p&gt;lambda 함수 입력부분에는 앞에서 만든 lambdaTest 를 쓰면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;436&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br3uih/btqu3rui4PJ/0VBXpLb7Y07tLXSe2cSOU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br3uih/btqu3rui4PJ/0VBXpLb7Y07tLXSe2cSOU1/img.png&quot; data-alt=&quot;POST 메서드 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br3uih/btqu3rui4PJ/0VBXpLb7Y07tLXSe2cSOU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr3uih%2Fbtqu3rui4PJ%2F0VBXpLb7Y07tLXSe2cSOU1%2Fimg.png&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;436&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;POST 메서드 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;3. lambda 함수 변형 및 테스트&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;아래와 같이 람다함수를 조금 수정해 주겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;253&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tmaX7/btqu2ViatQC/8b1yOzDWAiZMz523Kc95vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tmaX7/btqu2ViatQC/8b1yOzDWAiZMz523Kc95vk/img.png&quot; data-alt=&quot;람다 함수 수정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tmaX7/btqu2ViatQC/8b1yOzDWAiZMz523Kc95vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtmaX7%2Fbtqu2ViatQC%2F8b1yOzDWAiZMz523Kc95vk%2Fimg.png&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;253&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;람다 함수 수정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;게이트웨이에서 생성한 POST 메서드를 클릭하면 클라이언트에서 테스트를 해볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;요청 본문에 아래와 같이 key값과 value 값을 설정해주고 테스트 버튼을 돌린 결과,&lt;/p&gt;
&lt;p&gt;우측에 상태 200으로 성공한 것을 확인할 수 있습니다. response 전체가 리턴되기 때문에 응답 본문에 response가 리턴된 것을 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2330&quot; data-origin-height=&quot;966&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3IwHI/btqu2HqSdf2/rRF2b17FESCfbj3C2JHDI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3IwHI/btqu2HqSdf2/rRF2b17FESCfbj3C2JHDI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3IwHI/btqu2HqSdf2/rRF2b17FESCfbj3C2JHDI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3IwHI%2Fbtqu2HqSdf2%2FrRF2b17FESCfbj3C2JHDI1%2Fimg.png&quot; data-origin-width=&quot;2330&quot; data-origin-height=&quot;966&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;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;4. 배포&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;본격적으로 사용하기 위해 배포를 해주겠습니다.&lt;/p&gt;
&lt;p&gt;배포에 앞서 아무나 접근해서 api콜을 마구잡이로 날리면 안되기 때문에 설정을 변경해줘야 합니다.&lt;/p&gt;
&lt;p&gt;메서드 요청을 클릭한 뒤 보이는 설정에서 'API 키가 필요함' 을 false에서 true 로 변경해줍니다.&lt;/p&gt;
&lt;p&gt;그 후 작업 메뉴에서 API 배포를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2347&quot; data-origin-height=&quot;526&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBP66U/btqu5zycIWQ/MxmHhbRj6IRjnIR821LUTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBP66U/btqu5zycIWQ/MxmHhbRj6IRjnIR821LUTk/img.png&quot; data-alt=&quot;설정 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBP66U/btqu5zycIWQ/MxmHhbRj6IRjnIR821LUTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBP66U%2Fbtqu5zycIWQ%2FMxmHhbRj6IRjnIR821LUTk%2Fimg.png&quot; data-origin-width=&quot;2347&quot; data-origin-height=&quot;526&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;설정 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;600&quot; height=&quot;399&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;508&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd6xVj/btqu5fta6fr/KKIjuNKivr3qTl1CUXQB6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd6xVj/btqu5fta6fr/KKIjuNKivr3qTl1CUXQB6k/img.png&quot; data-alt=&quot;API 키 설정 변경 뒤 배포&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd6xVj/btqu5fta6fr/KKIjuNKivr3qTl1CUXQB6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd6xVj%2Fbtqu5fta6fr%2FKKIjuNKivr3qTl1CUXQB6k%2Fimg.png&quot; width=&quot;600&quot; height=&quot;399&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;508&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;API 키 설정 변경 뒤 배포&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;배포를 클릭하면 아래와 같이 확인 창이 하나 뜨게 되는데 배포 스테이지를 설정할 수 있습니다.&lt;/p&gt;
&lt;p&gt;배포 버전을 관리할 때 변경해서 사용하면 됩니다. 여기선 default 그대로 배포하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;495&quot; height=&quot;261&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;315&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPUzzn/btqu5zrqVkP/GXMQkBVyfh4u1NOhqPYp9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPUzzn/btqu5zrqVkP/GXMQkBVyfh4u1NOhqPYp9k/img.png&quot; data-alt=&quot;API 배포&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPUzzn/btqu5zrqVkP/GXMQkBVyfh4u1NOhqPYp9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPUzzn%2Fbtqu5zrqVkP%2FGXMQkBVyfh4u1NOhqPYp9k%2Fimg.png&quot; width=&quot;495&quot; height=&quot;261&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;315&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;API 배포&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;기존에 post 요청을 보냈을 때와 배포를 완료한 후 post 요청을 보냈을 경우에 다른 응답이 오게 됩니다.&lt;/p&gt;
&lt;p&gt;'Forbidden' 이라는 응답이 오는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1107&quot; data-origin-height=&quot;776&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zxmeq/btqu36QNCWy/OwMUaqYKHVd0NS2Fknlssk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zxmeq/btqu36QNCWy/OwMUaqYKHVd0NS2Fknlssk/img.png&quot; data-alt=&quot;기존&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zxmeq/btqu36QNCWy/OwMUaqYKHVd0NS2Fknlssk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZxmeq%2Fbtqu36QNCWy%2FOwMUaqYKHVd0NS2Fknlssk%2Fimg.png&quot; data-origin-width=&quot;1107&quot; data-origin-height=&quot;776&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;기존&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;626&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FU5XM/btqu13819Rr/LuiY4NvrUVKKCaE1FIcOy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FU5XM/btqu13819Rr/LuiY4NvrUVKKCaE1FIcOy0/img.png&quot; data-alt=&quot;설정 변경 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FU5XM/btqu13819Rr/LuiY4NvrUVKKCaE1FIcOy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFU5XM%2Fbtqu13819Rr%2FLuiY4NvrUVKKCaE1FIcOy0%2Fimg.png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;626&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;설정 변경 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;5. 최종 수정 후 테스트&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;그 후 사용량 계획에 API키 탭에서 API 키를 추가하면 됩니다.&lt;/p&gt;
&lt;p&gt;배포 스테이지까지 연결되면 끝!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;605&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r7a04/btqu6NErXgR/2cSlRgsBQJc6uAlC5PRDa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r7a04/btqu6NErXgR/2cSlRgsBQJc6uAlC5PRDa1/img.png&quot; data-alt=&quot;사용량계획 메뉴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r7a04/btqu6NErXgR/2cSlRgsBQJc6uAlC5PRDa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr7a04%2Fbtqu6NErXgR%2F2cSlRgsBQJc6uAlC5PRDa1%2Fimg.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;605&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;사용량계획 메뉴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;모든 설정을 끝내준 뒤에 Header에 x-api-key라는 이름에 API 키 값을 넣어서 요청하면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;정상적으로 작동하는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;606&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqEeOB/btqu55ZW1zx/gZAhK0g4qjOiaHZ7QhKmX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqEeOB/btqu55ZW1zx/gZAhK0g4qjOiaHZ7QhKmX0/img.png&quot; data-alt=&quot;x-api-key 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqEeOB/btqu55ZW1zx/gZAhK0g4qjOiaHZ7QhKmX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqEeOB%2Fbtqu55ZW1zx%2FgZAhK0g4qjOiaHZ7QhKmX0%2Fimg.png&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;606&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;x-api-key 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이 API key는 헤더에 넣고 요청하면 노출되기 때문에 숨기는 것이 좋습니다.&lt;/p&gt;
&lt;p&gt;API gateway에서 권한 부여자를 만들어서 이 부분을 제어할 수 있습니다.&lt;/p&gt;
&lt;p&gt;cognito 또는 lambda를 통해 제어할 수 있다고 나와있는데&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 부분은 다음에 알아보도록 하겠슴다.&lt;/p&gt;</description>
      <category>Web Study/Server</category>
      <category>API Gateway</category>
      <category>aws</category>
      <category>aws api</category>
      <category>AWS Lambda</category>
      <category>lambda setting</category>
      <category>serverless</category>
      <category>람다 개발</category>
      <category>람다 세팅</category>
      <category>서버리스</category>
      <author>지로원</author>
      <guid isPermaLink="true">https://0to1.tistory.com/16</guid>
      <comments>https://0to1.tistory.com/entry/AWS-lambda-gateway-%EC%82%AC%EC%9A%A9%EA%B8%B0%EC%82%BD%EC%A7%88%EA%B8%B0-3#entry16comment</comments>
      <pubDate>Thu, 9 May 2019 16:52:03 +0900</pubDate>
    </item>
    <item>
      <title>AWS 를 사용한 서버리스 아키텍쳐 적용기(삽질기) (2) - 람다함수 2</title>
      <link>https://0to1.tistory.com/entry/AWS-lambda-%EB%9E%8C%EB%8B%A4-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%EA%B8%B0%EC%82%BD%EC%A7%88%EA%B8%B0-2</link>
      <description>&lt;h4&gt;1. 환경변수와 태그&lt;/h4&gt;
&lt;p&gt;람다에서는 &lt;b&gt;환경 변수와 태그&lt;/b&gt;를 구성할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;환경변수&lt;/b&gt;는 말 그대로 환경변수 입니다. 코드와 상관없이 함수 코드와 라이브러리에 설정을 동적으로 전달할 수 있게끔 만들어줍니다.&lt;/p&gt;
&lt;p&gt;Node의 process.env 와 같다고 보면 됩니다. 예를 들어 api endpoint url, api 키 값 등 변할 수 있는 것들을 넣어서 사용할 수 있습니다.&lt;/p&gt;
&lt;p&gt;(도커가 '짜잔!' 하고 뜬 이유? 어디서든 환경 설정할 필요없이 도커 이미지만 있으면 바로 사용할 수 있기 때문입니다.)&lt;/p&gt;
&lt;p&gt;환경변수는 그러한 기능을 한다고 보면 됩니다. API 바꾸고 키 바꾸고 로컬 저장 장소등을 바꾸려고 할 때마다 코드를 수정하려면 너~무 귀찮고 시간 낭비가 생깁니다. 하지만 환경변수는 그때그때 값만 바꿔주면 된다는 점에서 훨씬 편리합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;또한 암호화 기능도 있어서 API 키를 숨기거나 할 수 있지만 여기서는 다루지 않겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;태그&lt;/b&gt;는 간단하게 해시태그라고 생각해도 무방합니다. 람다 함수를 많이 사용할 때 재활용하기 유용합니다.&lt;/p&gt;
&lt;p&gt;예를 들어, 결제 모듈을 여기저기 달아서 사용하고 싶다면 결제 관련된 함수들에 동일한 태그를 지정해놓으면&lt;/p&gt;
&lt;p&gt;검색해서 쉽게 가져다 쓸 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;565&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b88LDd/btquTSMhP4F/MKxs9jiZ8h4uqAwYgNjsi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b88LDd/btquTSMhP4F/MKxs9jiZ8h4uqAwYgNjsi1/img.png&quot; data-alt=&quot;환경 변수와 태그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b88LDd/btquTSMhP4F/MKxs9jiZ8h4uqAwYgNjsi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb88LDd%2FbtquTSMhP4F%2FMKxs9jiZ8h4uqAwYgNjsi1%2Fimg.png&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;565&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;환경 변수와 태그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위와 같이 사용하면 된다.&lt;/p&gt;
&lt;p&gt;또한 아래와 같이 기본적으로 제공되는 환경 변수도 있어서 잘 사용하면 편리할 것 같습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1935&quot; data-origin-height=&quot;944&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coNNEq/btquVglpigb/AJ5mQ2cORC1AfIO090HK01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coNNEq/btquVglpigb/AJ5mQ2cORC1AfIO090HK01/img.png&quot; data-alt=&quot;사전정의된 환경 변수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coNNEq/btquVglpigb/AJ5mQ2cORC1AfIO090HK01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoNNEq%2FbtquVglpigb%2FAJ5mQ2cORC1AfIO090HK01%2Fimg.png&quot; data-origin-width=&quot;1935&quot; data-origin-height=&quot;944&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;사전정의된 환경 변수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;2. 실행 역할과 기본 설정&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;실행 역할&lt;/b&gt;에서는&amp;nbsp;함수에 대한 권한을 정의할 수 있습니다. 아직 여기를 건드리긴 너무 어설프기 때문에 패스..&lt;/p&gt;
&lt;p&gt;&lt;b&gt;기본 설정&lt;/b&gt;같은 경우는 메모리와 제한 시간 설정해줄 수 있습니다. 당연하지만 메모리가 많이 필요한 작업을 함수에서 처리하면 그에 맞게 메모리를 설정해줘야 됩니다. 제한 시간은 사용자가 함수에 접근할 수 있는 시간.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;람다 함수의 경우 사용하는 만큼 과금이 되는 방식이기 때문에 두 요소 모두 과금과 직접적인 관련이 있습니다.&lt;/p&gt;
&lt;p&gt;적절히 잘 설계하고 사용해야 된다는 말!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;358&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRsBhb/btquSgAQpGI/tX7DcbTnR8GOqb1TAYZnlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRsBhb/btquSgAQpGI/tX7DcbTnR8GOqb1TAYZnlK/img.png&quot; data-alt=&quot;실행 역할과 기본 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRsBhb/btquSgAQpGI/tX7DcbTnR8GOqb1TAYZnlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRsBhb%2FbtquSgAQpGI%2FtX7DcbTnR8GOqb1TAYZnlK%2Fimg.png&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;358&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;실행 역할과 기본 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;3. 나머지 (네트워크, 디버깅, 동시성 등)&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;네트워크&lt;/b&gt;의 경우 VPC를 설정해줄 수 있습니다. 접근을 제한한 DB등의 AWS 서비스가 있다면 VPC를 통해 접근해서 처리할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;디버깅 및 오류 처리&lt;/b&gt;는 그냥 설명 그대로... 별거없음.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;동시성&lt;/b&gt;은 람다함수에 동시에 접근할 수 있는 횟수입니다. 설정된 1000번 보다 많은 회수의 접근이 필요할 때는 (ex. 특수 이벤트) 그냥 늘려주면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1612&quot; data-origin-height=&quot;507&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpxEA8/btquVxH4O0U/L0qdKFNDhWdAqQeOosRom0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpxEA8/btquVxH4O0U/L0qdKFNDhWdAqQeOosRom0/img.png&quot; data-alt=&quot;나머지 요소&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpxEA8/btquVxH4O0U/L0qdKFNDhWdAqQeOosRom0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpxEA8%2FbtquVxH4O0U%2FL0qdKFNDhWdAqQeOosRom0%2Fimg.png&quot; data-origin-width=&quot;1612&quot; data-origin-height=&quot;507&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;나머지 요소&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이렇게 모든 과정을 끝마치면 람다 함수를 저장하여 사용할 수 있습니다!!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;4. 테스트&lt;/h4&gt;
&lt;p&gt;아래와 같이 테스트 코드를 작성해서 테스트를 할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;json 형태로 테스트 이벤트 구성을 해보자!&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;아래와 같이 코드를 작성해봅니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1633&quot; data-origin-height=&quot;203&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u0RPV/btquW4LWJmU/yoSJE5qEDPafkl245huoKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u0RPV/btquW4LWJmU/yoSJE5qEDPafkl245huoKk/img.png&quot; data-alt=&quot;테스트 코드 작성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u0RPV/btquW4LWJmU/yoSJE5qEDPafkl245huoKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu0RPV%2FbtquW4LWJmU%2FyoSJE5qEDPafkl245huoKk%2Fimg.png&quot; data-origin-width=&quot;1633&quot; data-origin-height=&quot;203&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;테스트 코드 작성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;823&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjB4qF/btquVytruWp/vfcI2ppkkUoYY4zHGQdOqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjB4qF/btquVytruWp/vfcI2ppkkUoYY4zHGQdOqk/img.png&quot; data-alt=&quot;테스트 코드 작성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjB4qF/btquVytruWp/vfcI2ppkkUoYY4zHGQdOqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjB4qF%2FbtquVytruWp%2FvfcI2ppkkUoYY4zHGQdOqk%2Fimg.png&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;823&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;테스트 코드 작성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위와 같은 과정을 마치고 나서 저장을 누르면 작성한 테스트 이벤트가 저장됩니다.&lt;/p&gt;
&lt;p&gt;그 후 테스트 버튼을 클릭해주면...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1621&quot; data-origin-height=&quot;722&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT3rg1/btquVgs2Ixn/c8FtO3BrT0QtVTOjN5giHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT3rg1/btquVgs2Ixn/c8FtO3BrT0QtVTOjN5giHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT3rg1/btquVgs2Ixn/c8FtO3BrT0QtVTOjN5giHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT3rg1%2FbtquVgs2Ixn%2Fc8FtO3BrT0QtVTOjN5giHK%2Fimg.png&quot; data-origin-width=&quot;1621&quot; data-origin-height=&quot;722&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;p&gt;이런식으로 실행 결과를 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여러가지 정보가 있는데 대충 여기 나오는 정보들을 참고해서 설정 등을 다시 조정한 뒤에 함수를 저장해주면 될듯!! (메모리, 실행시간 등)&lt;/p&gt;
&lt;p&gt;물론 위와 같이 하면 테스트 코드를 작성한 의미가 없기에 함수 코드를 변형해서 다시 테스트를 해보겠습니다!&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;409&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GIbZ1/btquUCJTNaw/iOp4991mAUPEAWir68aJa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GIbZ1/btquUCJTNaw/iOp4991mAUPEAWir68aJa0/img.png&quot; data-alt=&quot;response에 event 추가.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GIbZ1/btquUCJTNaw/iOp4991mAUPEAWir68aJa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGIbZ1%2FbtquUCJTNaw%2FiOp4991mAUPEAWir68aJa0%2Fimg.png&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;409&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;response에 event 추가.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;코드에 event를 추가!!&lt;/p&gt;
&lt;p&gt;결과는...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1611&quot; data-origin-height=&quot;766&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ixttp/btquWjCR9Cr/M8MDQ0KaTH4njqeK8UJ2uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ixttp/btquWjCR9Cr/M8MDQ0KaTH4njqeK8UJ2uk/img.png&quot; data-alt=&quot;코드 변경 후 테스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ixttp/btquWjCR9Cr/M8MDQ0KaTH4njqeK8UJ2uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIxttp%2FbtquWjCR9Cr%2FM8MDQ0KaTH4njqeK8UJ2uk%2Fimg.png&quot; data-origin-width=&quot;1611&quot; data-origin-height=&quot;766&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;코드 변경 후 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위와 같이 함수가 반환한 response 안에 테스트에서 설정한 key와 value값을 결과에서 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;조금 더 재미있게 테스트를 해보자 !&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1579&quot; data-origin-height=&quot;497&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDzD55/btquTiSVz96/flHCnvmhdofmZwMKh59GwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDzD55/btquTiSVz96/flHCnvmhdofmZwMKh59GwK/img.png&quot; data-alt=&quot;함수 수정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDzD55/btquTiSVz96/flHCnvmhdofmZwMKh59GwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDzD55%2FbtquTiSVz96%2FflHCnvmhdofmZwMKh59GwK%2Fimg.png&quot; data-origin-width=&quot;1579&quot; data-origin-height=&quot;497&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;함수 수정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;함수를 수정해서 랜덤으로 숫자를 생성해서 해당 위치 키 값을 넣어서 결과를 출력해 봤습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1604&quot; data-origin-height=&quot;737&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bH1Dfi/btquW3M8rNI/lRB5AYSjj2IycZzJZowL7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bH1Dfi/btquW3M8rNI/lRB5AYSjj2IycZzJZowL7k/img.png&quot; data-alt=&quot;결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bH1Dfi/btquW3M8rNI/lRB5AYSjj2IycZzJZowL7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbH1Dfi%2FbtquW3M8rNI%2FlRB5AYSjj2IycZzJZowL7k%2Fimg.png&quot; data-origin-width=&quot;1604&quot; data-origin-height=&quot;737&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;결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;미친 개발자....ㅋㅋㅋㅋ 기분 묘하네 ^_^&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아무튼 이런식으로 해서 기본적인 사용법을 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;외부에서도 함수를 호출하면 되는데 다음 글에서 해보겠습니다!&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;ps. 계속 쓸 수 있을까... 블로그만 쓰면 넘나 귀찮아 진다...ㅠ&lt;/p&gt;</description>
      <category>Web Study/Server</category>
      <category>AWS Lambda</category>
      <category>AWS 람다</category>
      <category>lambda setting</category>
      <category>serverless</category>
      <category>람다 개발</category>
      <category>람다 사용법</category>
      <category>람다 세팅</category>
      <category>람다함수</category>
      <category>서버리스</category>
      <author>지로원</author>
      <guid isPermaLink="true">https://0to1.tistory.com/15</guid>
      <comments>https://0to1.tistory.com/entry/AWS-lambda-%EB%9E%8C%EB%8B%A4-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%EA%B8%B0%EC%82%BD%EC%A7%88%EA%B8%B0-2#entry15comment</comments>
      <pubDate>Tue, 7 May 2019 11:54:04 +0900</pubDate>
    </item>
    <item>
      <title>AWS 를 사용한 서버리스 아키텍쳐 적용기(삽질기) (1) - 람다함수 1</title>
      <link>https://0to1.tistory.com/entry/AWS-lambda-%EB%9E%8C%EB%8B%A4-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%EA%B8%B0%EC%82%BD%EC%A7%88%EA%B8%B0-1</link>
      <description>&lt;h4&gt;서버리스 아키텍쳐 (serverless architecture) 란?&lt;/h4&gt;
&lt;p&gt;기존에 서버를 가지고 하던 서비스를 서버가 없이 동작하게 만드는 구조.&lt;/p&gt;
&lt;p&gt;(그렇다고 진짜 서버가 없는 것은 아니고, 클라우드를 통해 서버가 없는 것처럼 사용한다는 뜻. 진짜 물리서버는 어딘가에 당연히 있음.)&lt;/p&gt;
&lt;p&gt;서버리스를 구축하기 위한 방법에는 여러가지가 있지만 여기서는 서버리스를 구축하기 위해 AWS를 사용합니다.&lt;/p&gt;
&lt;h4&gt;0. AWS lambda란?&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;serverless event handling computing service.&lt;/p&gt;
&lt;p&gt;다시말해, 서버가 없는 클라우드 함수 기반 마이크로 서비스. 기존의 서비스들은 서버에 코드를 올려 배포한 뒤 서비스를 제공하는 방식이었다면, 람다는 서버에 따로 올려서 서버를 관리할 필요가 없다는 것!! 넘나 좋은 것~&amp;nbsp;&lt;/p&gt;
&lt;p&gt;서버가 따로 필요없이 코드만 따로 배포가능. 그리고 서버가 없기 때문에 과금방식은 함수 실행 시 과금되는 방식.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여러가지 장점이 있으니 구글 교수님과 알아보도록 하겠습니다. 물론 단점도 존재. 제대로 사용하려면 이것저것 따져보고 공부도 많이 해야될 듯...&lt;/p&gt;
&lt;p&gt;아무튼 이제부터 기초부터 살살 들여다 보겠습니다~!&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;1. 람다를 클릭해서 들어간 다음 region을 서울로 설정&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1CbCI/btquP3mEruI/XxS3KEj8SWa1xURKOoqE11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1CbCI/btquP3mEruI/XxS3KEj8SWa1xURKOoqE11/img.png&quot; data-alt=&quot;람다 최초 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1CbCI/btquP3mEruI/XxS3KEj8SWa1xURKOoqE11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1CbCI%2FbtquP3mEruI%2FXxS3KEj8SWa1xURKOoqE11%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;람다 최초 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4&gt;2. 함수 생성 버튼 클릭.&lt;/h4&gt;
&lt;p&gt;아래와 같은 화면이 나옵니다. (검색해보니 블루프린트는 사용 용도별 샘플 코드가 모여있음 !! 니즈가 잘 맞으면 사용하면 편할수도?)&lt;/p&gt;
&lt;p&gt;하지만 저는 새로 작성 하겠습니다. 왜? (개발자 특, 자기가 다 만들어보고 싶음). Node로 할꺼니깐 node 버전은 8.10 선택! 밑에 권한 설정하는게 있는데 기본 Lambda 권한으로 세팅해주면 됩니다.&lt;/p&gt;
&lt;p&gt;함수 생성 버튼 클릭 !&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSLEyZ/btquOHLmGf4/F4JbHqzQrLZu6UyILuzww1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSLEyZ/btquOHLmGf4/F4JbHqzQrLZu6UyILuzww1/img.png&quot; data-alt=&quot;함수 생성 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSLEyZ/btquOHLmGf4/F4JbHqzQrLZu6UyILuzww1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSLEyZ%2FbtquOHLmGf4%2FF4JbHqzQrLZu6UyILuzww1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;함수 생성 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4&gt;3. 본격적으로 함수 생성.&lt;/h4&gt;
&lt;p&gt;세부적으로 여러가지 메뉴가 있는데 차근차근 araboza.&lt;/p&gt;
&lt;p&gt;맨 처음 보이는 Designer 탭.... 보아하니 다른 아마존 서비스와 묶어 사용할 수 있도록 트리거가 제공되는듯..?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;나중에 살펴보도록 하고 함수 코드 부분으로 넘어가겠습니다. 에디터가 요기잉네 ㅎ&amp;nbsp;&lt;/p&gt;
&lt;p&gt;저는 드라큘라를 사랑하기 때문에 다크 테마로 바꿨습니다ㅎㅎ. 앞단계에서 런타임을 node로 설정해줬는데 여기서 다시 바꿀 수 있습니다.&lt;/p&gt;
&lt;p&gt;이제부터 공식문서를 살펴보면서 코드 분석 시작!!&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcGsIQ/btquN7jt6zz/KTZ58r1PPHooyeRKRP5Ak1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcGsIQ/btquN7jt6zz/KTZ58r1PPHooyeRKRP5Ak1/img.png&quot; data-alt=&quot;함수 생성 화면2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcGsIQ/btquN7jt6zz/KTZ58r1PPHooyeRKRP5Ak1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcGsIQ%2FbtquN7jt6zz%2FKTZ58r1PPHooyeRKRP5Ak1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;함수 생성 화면2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KTIgH/btquRcXLmvg/kWD6SXDkXG1BDwwrrF5KGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KTIgH/btquRcXLmvg/kWD6SXDkXG1BDwwrrF5KGK/img.png&quot; data-alt=&quot;hello로 함수 이름 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KTIgH/btquRcXLmvg/kWD6SXDkXG1BDwwrrF5KGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKTIgH%2FbtquRcXLmvg%2FkWD6SXDkXG1BDwwrrF5KGK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;hello로 함수 이름 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1556249438270&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;exports.hello = async (event) =&amp;gt; {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;요로케 생겼는데 문서를 읽어보니 람다 함수는 기본적으로&amp;nbsp; handler 객체를 통해 호출된다고 합니다.&lt;/p&gt;
&lt;p&gt;물론 handler 객체는 이름 입력하기 나름. helloWorld 출력할 꺼니깐 함수이름을 hello로 바꾸겠습니다.&lt;/p&gt;
&lt;p&gt;그리고 우측 상단에 보면 핸들러 라고 써져있는데 이 부분엔 문맥상 파일 이름하고 함수로 구성된듯 (파일이름.함수 == index.hello)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;4. 공식 문서에 람다 함수가 지원하는 호출 유형은 두가지.&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;첫 번째는 RequestResponse 또는 동기식 실행. &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1556251447945&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;exports.myHandler = function(event, context, callback) {
   console.log(&quot;value1 = &quot; + event.key1);
   console.log(&quot;value2 = &quot; + event.key2);  
   callback(null, &quot;some success message&quot;);
   // or 
   // callback(&quot;some error type&quot;); 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;실행 완료시 코드에서 callback을 호출할 수 있는데 callback이 없으면 Lambda가 자체적으로 callback 호출을 하고 반환 값은 null을 반환합니다. 콜백 형식은 callback(Error error, Object result) 형식. 귀찮으니깐 예제로 ㄱㄱ&lt;/p&gt;
&lt;pre id=&quot;code_1556251047412&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;callback();     // Indicates success but no information returned to the caller.
callback(null); // Indicates success but no information returned to the caller.
callback(null, &quot;success&quot;);  // Indicates success with information returned to the caller.
callback(error);    //  Indicates error with error information returned to the caller.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;result 값은 JSON.stringify와 호환이 가능해야 한다고 나와있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;두 번째는 event 또는 비동기 실행 방식.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1556251466755&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;exports.myHandler = async function(event, context) {
   console.log(&quot;value1 = &quot; + event.key1);
   console.log(&quot;value2 = &quot; + event.key2);  
   return &quot;some success message&quot;;
   // or 
   // throw new Error(&quot;some error type&quot;); 
}  &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 경우 람다는 함수 호출의 결과를 모두 폐기합니다. api call 등을 할 때, await나 promise 쓰면 결과적으로 동일하게 작동할 듯.&lt;/p&gt;
&lt;p&gt;console.log 를 통해 생성하는 로그 메시지들은 cloudWatch를 통해 기록할 수 있습니다.&lt;/p&gt;
&lt;p&gt;이때 함수 인자로 있는 context는 람다에서 핸들러로 쓰이는 객체입니다. 여러 정보를 제공하는 메서드와 속성들을 포함.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p&gt;&lt;b&gt;컨텍스트 메서드&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;getRemainingTimeInMillis()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; Returns the number of milliseconds left before the execution times out.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;컨텍스트 속성&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;functionName&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; The name of the Lambda function.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;functionVersion&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; The&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/versioning-aliases.html&quot;&gt;version&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;of the function.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;invokedFunctionArn&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; The Amazon Resource Name (ARN) used to invoke the function. Indicates if the invoker specified a version number or alias.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;memoryLimitInMB&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; The amount of memory configured on the function.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;awsRequestId&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; The identifier of the invocation request.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;logGroupName&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; The log group for the function.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;logStreamName&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; The log stream for the function instance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;identity&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; (mobile apps) Information about the Amazon Cognito identity that authorized the request.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;cognitoIdentityId&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; The authenticated Amazon Cognito identity.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cognitoIdentityPoolId&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; The Amazon Cognito identity pool that authorized the invocation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;clientContext&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; (mobile apps) Client context provided to the Lambda invoker by the client application.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;client.installation_id&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client.app_title&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client.app_version_name&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client.app_version_code&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client.app_package_name&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;env.platform_version&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;env.platform&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;env.make&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;env.model&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;env.locale&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Custom&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 모바일 애플리케이션에서 설정된 사용자 지정 값입니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;callbackWaitsForEmptyEventLoop&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; Node.js 이벤트 루프가 빌 때까지 대기하는 대신,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/nodejs-prog-model-handler.html#nodejs-prog-model-handler-callback&quot;&gt;콜백&lt;/a&gt;이 실행될 때 즉시 응답을 보내려면 false로 설정합니다. false인 경우, 대기 중인 이벤트는 다음 번 호출 중에 계속 실행됩니다&amp;nbsp;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;다음 예제는 컨텍스트 정보를 기록하는 핸들러 함수를 보여줍니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예 index.js&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1556257855159&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;exports.handler = function(event, context, callback) {
    console.log('remaining time =', context.getRemainingTimeInMillis());
    console.log('functionName =', context.functionName);
    console.log('AWSrequestID =', context.awsRequestId);
    callback(null, context.functionName);
};&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;나머지는 다음 글에서 이어서 작성!&lt;/p&gt;</description>
      <category>Web Study/Server</category>
      <category>AWS Lambda</category>
      <category>AWS 람다</category>
      <category>lambda setting</category>
      <category>serverless</category>
      <category>람다 개발</category>
      <category>람다 세팅</category>
      <category>람다함수</category>
      <category>서버리스</category>
      <author>지로원</author>
      <guid isPermaLink="true">https://0to1.tistory.com/14</guid>
      <comments>https://0to1.tistory.com/entry/AWS-lambda-%EB%9E%8C%EB%8B%A4-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%EA%B8%B0%EC%82%BD%EC%A7%88%EA%B8%B0-1#entry14comment</comments>
      <pubDate>Tue, 7 May 2019 11:43:29 +0900</pubDate>
    </item>
    <item>
      <title>Maria DB (1. HeidiSQL 설정)</title>
      <link>https://0to1.tistory.com/entry/Maria-DB-1-HeidiSQL-%EC%84%A4%EC%A0%95</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;1. HeidiSQL 설정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;HeidiSQL 이란?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;쉽게 말하면 MySQL, MSSQL 등의 관계형 데이터베이스의 GUI 컨트롤러 이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;단순히 타이핑으로만 작동하면 CUI 환경에서 좀 더 편하게 데이터베이스를 사용하기 위해&amp;nbsp;&lt;/p&gt;&lt;p&gt;만든 GUI 툴이다. 편하게 사용하기 위해 만들었기 때문에 기존 CUI 환경보다 명령도 훨씬 편리하고 사용자가 보기도 편하다.&lt;/p&gt;&lt;p&gt;기존에 사용하지 않고 작업했던 때보다 훨씬 편하고 좋기 때문에 한번 사용하고 나면 CUI 환경으로 돌아가기가 힘들다는 단점이 있다(?)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;Maria DB를 설치할 때, HeidiSQL도 같이 설치된 것을 확인했었습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;설치된 HeidiSQL을 실행시켜줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;하단의 신규 버튼을 클릭해줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 685px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/993C9F3A5C44058C0F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F993C9F3A5C44058C0F&quot; width=&quot;685&quot; height=&quot;392&quot; filename=&quot;1.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;그럼 세션이 하나 생성됩니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;오른쪽의 네트워크 유형에서 MySQL을 고르고 세션 이름을 Maria_test로 변경해줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 687px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99CD4D3A5C44058D13&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99CD4D3A5C44058D13&quot; width=&quot;687&quot; height=&quot;396&quot; filename=&quot;2.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;그 후 하단에 보시는 것과 같이 여러가지를 세팅해줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;암호는 처음에 마리아 DB를 설치할 떄 설정한 암호를 넣어줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;포트는 마리아 DB와 맞춰줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;코멘트는 중요하지 않습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 675px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/995C3B3A5C44058D0E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F995C3B3A5C44058D0E&quot; width=&quot;675&quot; height=&quot;394&quot; filename=&quot;3.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;세팅을 마치고 열기 버튼을 누르게 되면 하단과 같은 창이 뜨게 됩니다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;보시는 것과 같이 마우스 우클릭을 통해 객체를 유형별로 묶기를 활성화 시켜줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;그럼 왼쪽에 보시는 것과 같이 유형별로 정돈된 모습으로 데이터베이스를 확인할 수 있습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A0C83A5C44058D0C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A0C83A5C44058D0C&quot; width=&quot;820&quot; height=&quot;517&quot; filename=&quot;4.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;1번에 위치한 쿼리 탭을 클릭하면&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;2번에 보시는 것과 같이 쿼리를 입력할 수 있습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;그 후 3번의 화살표를 클릭하게 되면 쿼리가 실행되고 실패시 에러가 발생합니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;이 과정을 거치지 않더라도 단순히 클릭으로 'table'을 만들고 편하게 'column' 들을 생성할 수도 있습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;그렇게 쓰기 위해서 GUI 툴을 쓰는 것이겠지요? ㅎㅎ&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;아무튼 사용하면 훨씬 편하고 작업 능률이 올라가는 HeidiSQL에 대해 알아보았습니다!!!&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99DCBA3A5C44058E0A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99DCBA3A5C44058E0A&quot; width=&quot;820&quot; height=&quot;518&quot; filename=&quot;5.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;다음에는 기본적인 SQL 명령어들을 알아볼 수 있으면 좋겠...네요..&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;시간이 된다면..ㅠ&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Basic Programming/Database</category>
      <category>DB GUI</category>
      <category>HeidiSQL</category>
      <category>maria db</category>
      <category>MySQL</category>
      <category>하이디 세팅</category>
      <author>지로원</author>
      <guid isPermaLink="true">https://0to1.tistory.com/13</guid>
      <comments>https://0to1.tistory.com/entry/Maria-DB-1-HeidiSQL-%EC%84%A4%EC%A0%95#entry13comment</comments>
      <pubDate>Mon, 21 Jan 2019 19:43:14 +0900</pubDate>
    </item>
    <item>
      <title>MariaDB (0. 설치)</title>
      <link>https://0to1.tistory.com/entry/MariaDB-0-%EC%84%A4%EC%B9%98</link>
      <description>&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;0. Maria DB 설치&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&amp;lt;https://downloads.mariadb.org&amp;gt; 에 들어가서 다운로드를 받아줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;Stable 버전과 beta 버전이 있고 저는 Stable 버전을 다운받겠습니다~&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 820px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99C312495C43F82402&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99C312495C43F82402&quot; width=&quot;820&quot; height=&quot;576&quot; filename=&quot;1.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;Stable 버전을 클릭하시게 되면 아래와 같이 다운받을 수 있는 목록이 쭉 뜨게 됩니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;저는 윈도우에 설치할 것이므로 바로 설치할 수 있는 win64용 msi 파일을 다운받겠습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;클릭하게 되면 정보를 입력하는 박스들이 나오지만 No thanks 를 클릭하고 넘어갑니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 583px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A75E495C43F82503&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A75E495C43F82503&quot; width=&quot;583&quot; height=&quot;901&quot; filename=&quot;2.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;이제 본격적인 설치입니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;다운받은 msi 파일을 실행시키게 되면 아래와 같이 창이 뜹니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;우선 Next를 눌러 설치를 진행합니다~!~!&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 495px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9991EF495C43F82504&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9991EF495C43F82504&quot; width=&quot;495&quot; height=&quot;389&quot; filename=&quot;3.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;그러면, 라이센스 동의서가 뜨고 체크박스를 클릭한 후 Next를 누르면 다음 단계로 넘어갑니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;참고로 Maria DB는 오픈소스 라이센스 중 GPL v2 라이센스를 따릅니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 493px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9902D8495C43F82509&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9902D8495C43F82509&quot; width=&quot;493&quot; height=&quot;385&quot; filename=&quot;4.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;그 후 설치할 폴더를 정해주고 Next를 클릭합니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 489px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99481E495C43F8253A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99481E495C43F8253A&quot; width=&quot;489&quot; height=&quot;383&quot; filename=&quot;5.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;다음으로 넘어가면 아래와 같이 root 를 설정하고 비밀번호를 설정해줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;또한, 한글 사용을 위해 UTF8 체크박스를 클릭해줍니다.&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 492px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A801495C43F82603&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A801495C43F82603&quot; width=&quot;492&quot; height=&quot;383&quot; filename=&quot;6.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;이름, 포트, 버퍼사이즈, 페이징 사이즈 등을 정해줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;저는 딱히 건드릴 것이 없으므로 다음으로 넘어가겠습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;서비스 이름이 왜 MySQL 인지 궁금하신 분들이 계실 수 있습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;Maria DB는 MySQL과 소스코드가 같습니다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;왜냐하면, MySQL의 핵심 개발자인 몬티 와이드니어스가&amp;nbsp;개발 신조와 회사가&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&amp;nbsp;맞지 않는다고 생각했고 이로인해 기존 회사를 나와 만든 것이 Maria DB이기 때문입니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;그렇기 때문에 거의 대부분의 파일, 폴더구조, 명령어 등이 MySQL과 동일하다고 보시면 됩니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;하지만 성능 면에서나 호환성 등 여러가지 부분에서 MySQL보다 훨씬 뛰어난 성능을 보유하고 있습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;간단하게 말해 MySQL의 상위버전이라 보시면 됩니다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 492px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/998A58495C43F82631&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F998A58495C43F82631&quot; width=&quot;492&quot; height=&quot;390&quot; filename=&quot;7.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;마지막으로 서비스 피드백에 관련된 부분입니다. 체크하셔도 되고 안하셔도 됩니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 493px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99DC29495C43F82601&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99DC29495C43F82601&quot; width=&quot;493&quot; height=&quot;385&quot; filename=&quot;8.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;설치가 완료되면 다음과 같이 설치된 목록이 보이게 됩니다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;지금은 간단하게 DB 실행만 해볼 것이므로 MySQL Client를 클릭해 줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 316px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9972874C5C43F82630&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9972874C5C43F82630&quot; width=&quot;316&quot; height=&quot;250&quot; filename=&quot;9.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;실행하게 되면 아래와 같이 설정한 비밀번호를 통해 Maria DB 실행이 가능합니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;이 때, 프로그램이 존재하는 디렉토리를 확인합니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 511px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99B6294C5C43F82702&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99B6294C5C43F82702&quot; width=&quot;511&quot; height=&quot;217&quot; filename=&quot;10.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;그 후 '고급 시스템 설정' 에서 환경 변수를 클릭합니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 479px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/991AB84C5C43F82707&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F991AB84C5C43F82707&quot; width=&quot;479&quot; height=&quot;526&quot; filename=&quot;11.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;환경변수에서 Path 를 클릭해 편집을 누르면 아래와 같이 편집할 수 있는 창이 뜹니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;우측에 새로 만들기를 클릭한 후 Maria DB가 위치한 폴더의 bin 까지 경로에 포함시켜 추가시켜 줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 529px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99B8A94C5C43F82702&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99B8A94C5C43F82702&quot; width=&quot;529&quot; height=&quot;496&quot; filename=&quot;12.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;그 후 cmd 창에서 'mysql' 명령어를 실행시키면 에러가 발생하게 되는데 이는 권한 문제이므로&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;사용하는 유저를 '-u root' 옵션으로 고정시켜주고 '-p' 옵션으로 패스워드 활성화를 시켜줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;그 후 이전과 같이 비밀번호를 치고 Maria DB에 접속할 수 있습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;아래는 간단하게 show databases; 명령어로 현재 존재하는 db 목록을 확인할 수 있습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 692px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99F7B64C5C43F82808&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99F7B64C5C43F82808&quot; width=&quot;692&quot; height=&quot;498&quot; filename=&quot;13.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Basic Programming/Database</category>
      <category>maria db</category>
      <category>MySQL</category>
      <category>RDBMS</category>
      <category>SQL DB</category>
      <category>마리아 디비</category>
      <author>지로원</author>
      <guid isPermaLink="true">https://0to1.tistory.com/12</guid>
      <comments>https://0to1.tistory.com/entry/MariaDB-0-%EC%84%A4%EC%B9%98#entry12comment</comments>
      <pubDate>Sun, 20 Jan 2019 13:51:32 +0900</pubDate>
    </item>
    <item>
      <title>Data Structures and Algorithms (자료구조와 알고리즘)</title>
      <link>https://0to1.tistory.com/entry/Data-Structures-and-Algorithms-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%99%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</link>
      <description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;- Data Structures and Algorithms&amp;nbsp;-&lt;/span&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;Linear structures &amp;lt;선형 구조&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;- array&lt;/p&gt;&lt;p&gt;- list (linked, double linked)&lt;/p&gt;&lt;p&gt;- stack&lt;/p&gt;&lt;p&gt;- queue, priority queue&lt;/p&gt;&lt;p&gt;- deque (double ended queue)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;Non-linear structures &amp;lt;비선형 구조&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;- sets&lt;/p&gt;&lt;p&gt;- trees (binary tree, b-tree, heaps, other trees)&lt;/p&gt;&lt;p&gt;- graphs&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;Dictionary structures &amp;lt;딕셔너리 구조&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;- hash table&lt;/p&gt;&lt;p&gt;- hash map&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;Paradigms (패러다임 및 설계 기법)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;- Dynamic programming&lt;/p&gt;&lt;p&gt;- Greedy algorithm&lt;/p&gt;&lt;p&gt;- Divide and Conquer&amp;nbsp;&lt;/p&gt;&lt;p&gt;- Back-tracking&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;Sort Algorithms (정렬 알고리즘)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;- Bubble Sort&lt;/p&gt;&lt;p&gt;- Insertion Sort&lt;/p&gt;&lt;p&gt;- Selection Sort&amp;nbsp;&lt;/p&gt;&lt;p&gt;- Quick Sort&lt;/p&gt;&lt;p&gt;- Merge Sort&lt;/p&gt;&lt;p&gt;- Heap Sort&lt;/p&gt;&lt;p&gt;- Counting Sort&lt;/p&gt;&lt;p&gt;- Radix Sort&lt;/p&gt;&lt;p&gt;- Shell Sort&lt;/p&gt;&lt;p&gt;- Tim Sort&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;Search Algorithms (탐색&amp;nbsp;알고리즘)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;- Binary search&lt;/p&gt;&lt;p&gt;- Binary tree search&lt;/p&gt;&lt;p&gt;- Depth-first search&lt;/p&gt;&lt;p&gt;- Breadth-first search&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;Heap Algorithms (힙 알고리즘)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;- Binary heap&lt;/p&gt;&lt;p&gt;- Binomial heap&lt;/p&gt;&lt;p&gt;- (Binary) Indexed tree&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;최소 비용 신장 트리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;- Prim&lt;/p&gt;&lt;p&gt;- Kruskal&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;Shortest path&amp;nbsp;Algorithms (최단 경로&amp;nbsp;알고리즘)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;- Dijkstra's algorithm&lt;/p&gt;&lt;p&gt;- Floyd's algorithm&lt;/p&gt;&lt;p&gt;- Bellman-ford's algorithm&lt;/p&gt;&lt;p&gt;- A* algorithm&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;Machine Learning (기계 학습 알고리즘)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;- Unsupervised&amp;nbsp;&lt;/p&gt;&lt;p&gt;- Supervised&lt;/p&gt;&lt;p&gt;- Reinforcement&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;Mathematics (수학)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;- Euclidian&amp;nbsp;(최대공약수 &amp;amp; 최소공배수)&lt;/p&gt;&lt;p&gt;- 소인수분해&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;기하, P&amp;amp;NP, 문자열&amp;amp;오토마타&amp;amp;구조, 정수론 기타 등등&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;제 기준에서 정리한 것이므로 다른 사람과는 다를 수 있습니다.&lt;/p&gt;&lt;p&gt;하나씩 천천히 구현해 볼 계획입니다... 천천히....&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[참고] wikipedia, stackoverflow, blog(rats'go 등), etc ...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Basic Programming</category>
      <author>지로원</author>
      <guid isPermaLink="true">https://0to1.tistory.com/11</guid>
      <comments>https://0to1.tistory.com/entry/Data-Structures-and-Algorithms-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%99%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98#entry11comment</comments>
      <pubDate>Thu, 13 Dec 2018 12:55:33 +0900</pubDate>
    </item>
  </channel>
</rss>