<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>타닥타닥 개발자의 일상</title>
    <link>https://developerson.tistory.com/</link>
    <description>복기용 블로그</description>
    <language>ko</language>
    <pubDate>Sun, 9 Aug 2026 22:25:06 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>NomadHaven</managingEditor>
    <image>
      <title>타닥타닥 개발자의 일상</title>
      <url>https://tistory1.daumcdn.net/tistory/4990132/attach/3506f22ebfb74b4aa25701da6e0b0b99</url>
      <link>https://developerson.tistory.com</link>
    </image>
    <item>
      <title>connection error: MongoServerSelectionError: connect ECONNREFUSED ::1:27017 에러해결</title>
      <link>https://developerson.tistory.com/178</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app.js 파일에서 아래와 같은 코드로 mongoose와 mongodb 서버를 연결하려 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 출처: &lt;a href=&quot;https://github.com/Colt/YelpCamp/blob/c12b6ca9576b48b579bc304f701ebb71d6f9879a/app.js#L7&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/Colt/YelpCamp/blob/c12b6ca9576b48b579bc304f701ebb71d6f9879a/app.js#L7&lt;/a&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1715130145851&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mongoose.connect('mongodb://localhost:27017/yelp-camp', {
    useNewUrlParser: true,
    useCreateIndex: true,
    useUnifiedTopology: true
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러니까 이런 오류가 나왔다.&lt;/p&gt;
&lt;pre id=&quot;code_1715130210612&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;connection error: MongoServerSelectionError: connect ECONNREFUSED ::1:27017
    at EventTarget.&amp;lt;anonymous&amp;gt; (C:\Program Files\Web Developer Bootcamp\Web-Developer-Bootcamp\section39-YelpCamp\node_modules\mongodb\lib\sdam\topology.js:289:34)
    at [nodejs.internal.kHybridDispatch] (node:internal/event_target:741:20)
    at EventTarget.dispatchEvent (node:internal/event_target:683:26)
    at abortSignal (node:internal/abort_controller:368:10)
    at TimeoutController.abort (node:internal/abort_controller:402:5)
    at Timeout.&amp;lt;anonymous&amp;gt; (C:\Program Files\Web Developer Bootcamp\Web-Developer-Bootcamp\section39-YelpCamp\node_modules\mongodb\lib\utils.js:976:92)
    at listOnTimeout (node:internal/timers:569:17)
    at process.processTimers (node:internal/timers:512:7) {
  reason: TopologyDescription {
    type: 'Unknown',
    servers: Map(1) { 'localhost:27017' =&amp;gt; [ServerDescription] },
    stale: false,
    compatible: true,
    heartbeatFrequencyMS: 10000,
    localThresholdMS: 15,
    setName: null,
    maxElectionId: null,
    maxSetVersion: null,
    commonWireVersion: 0,
    logicalSessionTimeoutMinutes: null
  },
  code: undefined,
  [Symbol(errorLabels)]: Set(0) {},
  [cause]: MongoNetworkError: connect ECONNREFUSED ::1:27017
      at connectionFailureError (C:\Program Files\Web Developer Bootcamp\Web-Developer-Bootcamp\section39-YelpCamp\node_modules\mongodb\lib\cmap\connect.js:353:20)
      at Socket.&amp;lt;anonymous&amp;gt; (C:\Program Files\Web Developer Bootcamp\Web-Developer-Bootcamp\section39-YelpCamp\node_modules\mongodb\lib\cmap\connect.js:268:44)
      at Object.onceWrapper (node:events:629:26)
      at Socket.emit (node:events:514:28)
      at emitErrorNT (node:internal/streams/destroy:151:8)
      at emitErrorCloseNT (node:internal/streams/destroy:116:3)
      at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
    [Symbol(errorLabels)]: Set(1) { 'ResetPool' },
    [cause]: Error: connect ECONNREFUSED ::1:27017
        at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1495:16) {
      errno: -4078,
      code: 'ECONNREFUSED',
      syscall: 'connect',
      address: '::1',
      port: 27017
    }
  }
}
C:\Program Files\Web Developer Bootcamp\Web-Developer-Bootcamp\section39-YelpCamp\node_modules\mongoose\lib\connection.js:875
    err = new ServerSelectionError();
          ^

MongooseServerSelectionError: connect ECONNREFUSED ::1:27017
    at _handleConnectionErrors (C:\Program Files\Web Developer Bootcamp\Web-Developer-Bootcamp\section39-YelpCamp\node_modules\mongoose\lib\connection.js:875:11)
    at NativeConnection.openUri (C:\Program Files\Web Developer Bootcamp\Web-Developer-Bootcamp\section39-YelpCamp\node_modules\mongoose\lib\connection.js:826:11)
    at runNextTicks (node:internal/process/task_queues:60:5)
    at listOnTimeout (node:internal/timers:538:9)
    at process.processTimers (node:internal/timers:512:7) {
  reason: TopologyDescription {
    type: 'Unknown',
    servers: Map(1) {
      'localhost:27017' =&amp;gt; ServerDescription {
        address: 'localhost:27017',
        type: 'Unknown',
        hosts: [],
        passives: [],
        arbiters: [],
        tags: {},
        minWireVersion: 0,
        maxWireVersion: 0,
        roundTripTime: -1,
        lastUpdateTime: 5756880,
        lastWriteDate: 0,
        error: MongoNetworkError: connect ECONNREFUSED ::1:27017
            at connectionFailureError (C:\Program Files\Web Developer Bootcamp\Web-Developer-Bootcamp\section39-YelpCamp\node_modules\mongodb\lib\cmap\connect.js:353:20)
            at Socket.&amp;lt;anonymous&amp;gt; (C:\Program Files\Web Developer Bootcamp\Web-Developer-Bootcamp\section39-YelpCamp\node_modules\mongodb\lib\cmap\connect.js:268:44)
            at Object.onceWrapper (node:events:629:26)
            at Socket.emit (node:events:514:28)
            at emitErrorNT (node:internal/streams/destroy:151:8)
            at emitErrorCloseNT (node:internal/streams/destroy:116:3)
            at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
          [Symbol(errorLabels)]: Set(1) { 'ResetPool' },
          [cause]: Error: connect ECONNREFUSED ::1:27017
              at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1495:16) {
            errno: -4078,
            code: 'ECONNREFUSED',
            syscall: 'connect',
            address: '::1',
            port: 27017
          }
        },
        topologyVersion: null,
        setName: null,
        setVersion: null,
        electionId: null,
        logicalSessionTimeoutMinutes: null,
        primary: null,
        me: null,
        '$clusterTime': null
      }
    },
    stale: false,
    compatible: true,
    heartbeatFrequencyMS: 10000,
    localThresholdMS: 15,
    setName: null,
    maxElectionId: null,
    maxSetVersion: null,
    commonWireVersion: 0,
    logicalSessionTimeoutMinutes: null
  },
  code: undefined
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 몽구스와 mongodb를 연결하는 코드에서 주소를 아래와 같이 바꿨다.&lt;/p&gt;
&lt;pre id=&quot;code_1715130282181&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mongoose.connect(&quot;mongodb://127.0.0.1:27017/yelp-camp&quot;, {
  useNewUrlParser: true,
  // useCreateIndex: true,
  useUnifiedTopology: true,
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러니까 잘 연결된다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcjyc7/btsHcJDnMjz/rNSrlVsmVHRVAzffButyok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcjyc7/btsHcJDnMjz/rNSrlVsmVHRVAzffButyok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcjyc7/btsHcJDnMjz/rNSrlVsmVHRVAzffButyok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcjyc7%2FbtsHcJDnMjz%2FrNSrlVsmVHRVAzffButyok%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;274&quot; height=&quot;52&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/178</guid>
      <comments>https://developerson.tistory.com/178#entry178comment</comments>
      <pubDate>Wed, 8 May 2024 10:07:17 +0900</pubDate>
    </item>
    <item>
      <title>윈도우에서 MongoDB, Mongosh 설치. Mongoose 이용해서 Node 환경에서 JS 파일로 데이터 삽입하기</title>
      <link>https://developerson.tistory.com/177</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. MongoDB 를 윈도우에서 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?si=VdpwP_r8PRZJOupG&amp;amp;v=MCpbfYvvoPY&amp;amp;feature=youtu.be&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?si=VdpwP_r8PRZJOupG&amp;amp;v=MCpbfYvvoPY&amp;amp;feature=youtu.be&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=MCpbfYvvoPY&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/c55L26/hyVuhZrMgG/MJtRe23wtlVQ0TtypawBfk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;How to install MongoDB version 4 or version 5 for development on Windows 10&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/MCpbfYvvoPY&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 튜토리얼을 참고하면 되는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고해야할 부분은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 몽고디비 인스톨시에 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 환경 변수 설정하고 몽고 디비 커맨드 환경에서 바로 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 커맨드 창에서 mongod 입력하고 서버 잘 구동되는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 3번 부분에서 멋대로 커맨드창을 닫기 하면 안된다. ctrl+C를 통해서 안정적으로 서버를 종료한뒤 커맨드 창을 닫아야 한다. 이 절차 없이 커맨드 창을 닫았다가, 몽고가 비정상적 서버종료로 인식해서 프로그램에 lock을 거는 경우가 생긴다. lock이 걸리면 몽고 서버 자체에 연결 안되는 오류가 생겨서 골치 아파진다. 혹자는 .lock 파일을 삭제하면 된다고 하지만.. 본인 같은 경우에는 그냥 몽고를 삭제하고 다시 깔아서 오류를 해결했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기 까지다. 이후에 파워쉘 추가로 하나 더 켜서 mongo입력하고 몽고db 서버에 연결하는 부분 부터는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류가 난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에 mongodb가 업데이트 되어서 mongo라는 명령어가 먹히지 않게 되었기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 mongosh라는 커맨드를 써서 몽고 서버와 연결해야 하는데, 이때는 추가로 설치 및 환경변수 구성이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그부분 역시 다행히 mongodb 사이트에 나와 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.mongodb.com/docs/mongodb-shell/install/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.mongodb.com/docs/mongodb-shell/install/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1709598961523&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Install mongosh &amp;mdash; MongoDB Shell&quot; data-og-description=&quot;Docs Home &amp;rarr; MongoDB Shell To use the MongoDB Shell, you must have a MongoDB deployment to connect to.You can use the MongoDB Shell to connect to MongoDB version 4.2 or greater.You can install MongoDB Shell 2.0.0 on these operating systems:Operating Syste&quot; data-og-host=&quot;www.mongodb.com&quot; data-og-source-url=&quot;https://www.mongodb.com/docs/mongodb-shell/install/&quot; data-og-url=&quot;https://www.mongodb.com/docs/mongodb-shell/install/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bB9gNL/hyVunZEP1Z/MiN78GaOmoGIKI1VtdHFlk/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601,https://scrap.kakaocdn.net/dn/bmECWB/hyVupJVXsn/fReYkPut5PojY0bMtXbtNK/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601&quot;&gt;&lt;a href=&quot;https://www.mongodb.com/docs/mongodb-shell/install/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.mongodb.com/docs/mongodb-shell/install/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bB9gNL/hyVunZEP1Z/MiN78GaOmoGIKI1VtdHFlk/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601,https://scrap.kakaocdn.net/dn/bmECWB/hyVupJVXsn/fReYkPut5PojY0bMtXbtNK/img.png?width=1200&amp;amp;height=601&amp;amp;face=0_0_1200_601');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Install mongosh &amp;mdash; MongoDB Shell&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docs Home &amp;rarr; MongoDB Shell To use the MongoDB Shell, you must have a MongoDB deployment to connect to.You can use the MongoDB Shell to connect to MongoDB version 4.2 or greater.You can install MongoDB Shell 2.0.0 on these operating systems:Operating Syste&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.mongodb.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상기의 사이트에서 mongosh 설치 방법을 참고하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 방법은 mongodb 랑 거의 유사하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 mongosh 까지 설치 완료한다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파워쉘에서 mongodb 명령어를 입력해 몽고db 서버가 잘 작동하는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 작동한다면 새로 파워쉘 창을 켜서 mongosh 명령어를 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deLY65/btsFoJFn17t/tKhNu661kaoQRZIbfeQFrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deLY65/btsFoJFn17t/tKhNu661kaoQRZIbfeQFrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deLY65/btsFoJFn17t/tKhNu661kaoQRZIbfeQFrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeLY65%2FbtsFoJFn17t%2FtKhNu661kaoQRZIbfeQFrk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;871&quot; height=&quot;490&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mongosh 명령어를 통해 mongodb 서버와 잘 연결이 되었다면 위와 같은 화면이 뜬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 잘 설치해 놓은 mongodb 서버에,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node로 로드된 JS 파일을 통해서 데이터를 삽입하는 방법은 무엇일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 파워쉘 커맨드 창에서 mongodb 서버에 데이터를 삽입하는 방법도 있다. 하지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JS 개발 환경에서 JS 파일로 데이터를 삽입하고, JS 환경에서 바로 mongodb 서버에 접속해 데이터를 관리하면 훨씬 편할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러기 위한 도구가 바로 Mongoose라는 도구이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mongsoose는 mogodb에 넣고 싶은 자신의 데이터를 모델링해서 데이터 삽입을 도와주는 도구로, 데이터 스키마 생성, 데이터 조회, 삽입, 편집등의 기능도 지원해주는 도구이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mongoosejs.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://mongoosejs.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1709601728703&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Mongoose ODM v8.2.1&quot; data-og-description=&quot;Let's face it,&amp;nbsp;writing MongoDB validation, casting and business logic boilerplate is a drag. That's why we wrote Mongoose. const mongoose = require('mongoose'); mongoose.connect('mongodb://127.0.0.1:27017/test'); const Cat = mongoose.model('Cat', { name: &quot; data-og-host=&quot;mongoosejs.com&quot; data-og-source-url=&quot;https://mongoosejs.com/&quot; data-og-url=&quot;https://mongoosejs.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://mongoosejs.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mongoosejs.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Mongoose ODM v8.2.1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Let's face it,&amp;nbsp;writing MongoDB validation, casting and business logic boilerplate is a drag. That's why we wrote Mongoose. const mongoose = require('mongoose'); mongoose.connect('mongodb://127.0.0.1:27017/test'); const Cat = mongoose.model('Cat', { name:&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mongoosejs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몽구스를 이용하기 위해서는 몽구스를 설치부터 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널을 git-bash 환경으로 설정해 놓고 moogse를 설치하자&lt;/p&gt;
&lt;pre id=&quot;code_1709603779943&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install mongoose --save&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몽구스가 잘 설치되었다면 노드 모듈 디렉토리에서 확인이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;223&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqZLMc/btsFoLDiZbO/FSoVgD0JBsf0uSXlGzvQtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqZLMc/btsFoLDiZbO/FSoVgD0JBsf0uSXlGzvQtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqZLMc/btsFoLDiZbO/FSoVgD0JBsf0uSXlGzvQtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqZLMc%2FbtsFoLDiZbO%2FFSoVgD0JBsf0uSXlGzvQtK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;223&quot; height=&quot;526&quot; data-origin-width=&quot;223&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 본인이 데이터 스키마를 생성하고, 데이터를 삽입할 코드를 작성할 index.js파일을 만들어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.js 파일의 내용은 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1709603956932&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const mongoose = require(&quot;mongoose&quot;);
// moviceApp 데이터 베이스에 연결. 
//moviceApp 데이터 베이스가 없어도 괜찮다. 이 구문이 만들어 줄것.
mongoose
  .connect(&quot;mongodb://127.0.0.1:27017/movieApp&quot;)
  .then(() =&amp;gt; {
    console.log(&quot;CONNECTION OPEN&quot;);
  })
  .catch((err) =&amp;gt; {
    console.log(&quot;OH NO ERROR!&quot;);
    console.log(err);
  });

//movieSchema이라는 스키마 생성
const movieSchema = new mongoose.Schema({
  title: String,
  year: Number,
  score: Number,
  rating: String,
});

//Movice라는 class를 생성. 
//model메서드로 생성한 스키마를 클래스와 연결
//파라미터는 클래스 이름, 스키마이름 순으로 적는다.
const Movie = mongoose.model(&quot;Movie&quot;, movieSchema);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 코드를 작성해서 기본적인 몽구스 연결과 스키마 생성 및 스키마와 클래스 연결 설정 같이 마쳤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 위의 코드를 노드 환경에서 활성화 하려면 어떻게 해야 되는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우슨 노드 환경을 활성화해야 한다. 터미널에서 노드 명령어 입력.&lt;/p&gt;
&lt;pre id=&quot;code_1709604470754&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 활성화된 node 셸에서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709604569437&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.load index.js&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;명령어를 입력한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 참고: 최신 버전의 Node.js를 사용하는 경우 JS 파일에서 몽구스 모듈을 가져오고 강의 코드를 실행할 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;.load index.js&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령을 사용하면 버그가 발생할 가능성이 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;.load index.js명령을&lt;span&gt;&amp;nbsp;&lt;/span&gt;node&lt;span&gt;&amp;nbsp;&lt;/span&gt;셸에 입력하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;const mongoose = require('mongoose');코드 라인이 무한 루프로 출력되는 버그가 발생합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 방법&lt;/b&gt;:&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;node&lt;span&gt;&amp;nbsp;&lt;/span&gt;셸에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;.load index.js&lt;/b&gt;&lt;b&gt;를 사용하지 말고, &lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시스템 터미널에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1709604661400&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node -i -e &quot;$(&amp;lt; index.js)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;명령을 사용.&lt;/b&gt;(&lt;b&gt;node&lt;span&gt;&amp;nbsp;&lt;/span&gt;셸 외부에서&lt;/b&gt;,&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;먼저 디렉터리를 index.js 파일이 있는 폴더로 변경).&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이렇게 하면 하나의 명령으로 파일을 로드하여 node 셸을 시작할 수 있고 문제가 해결.&lt;/b&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;명령을 위에 표시된 대로 정확히 입력해야 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d2f31; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위의 명령어를 실행한 이후에는 노드 셸에서&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709604809964&quot; class=&quot;css&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;.load index.js&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 실행해도 오류 없이 잘 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 index.js 파일이 잘 로드 되었다면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m7omW/btsFsbBo3ts/yh8p4tSdr7fP7bFAAc1lAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m7omW/btsFsbBo3ts/yh8p4tSdr7fP7bFAAc1lAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m7omW/btsFsbBo3ts/yh8p4tSdr7fP7bFAAc1lAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm7omW%2FbtsFsbBo3ts%2Fyh8p4tSdr7fP7bFAAc1lAK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;346&quot; height=&quot;107&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 연결 성공시 출력되도록 설정해 놓은 CONNECTION OPEN이라는 문구가 출력될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에는 몽구스에서 지정한 문법에 따라 데이터를 삽입하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 insertMany()라는 몽구스의 메서드를 이용해서 다수의 데이터를 Moive라는 클래스에 삽입한 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드 역시 index.js 파일에 작성되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709605052256&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; Movie.insertMany([
 { title: &quot;Amelie&quot;, year: 2001, score: 8.3, rating: &quot;R&quot; },
 { title: &quot;Alien&quot;, year: 1979, score: 8.1, rating: &quot;R&quot; },
 { title: &quot;The Iron Giant&quot;, year: 1999, score: 7.5, rating: &quot;PG&quot; },
 { title: &quot;Stand By Me&quot;, year: 1986, score: 8.6, rating: &quot;R&quot; },
 { title: &quot;Moonrise Kingdom&quot;, year: 2012, score: 7.3, rating: &quot;PG-13&quot; },
]).then((data) =&amp;gt; {
   console.log(&quot;IT WORKED!&quot;);
   console.log(data);
 });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 잘 삽입 되었다면 IT WORKED 라는 구문이 출력된 다음,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삽입된 데이터가 출력되도록 설정한 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.js 파일의 전체코드는 아래와 같은 모습이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709605245209&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const mongoose = require(&quot;mongoose&quot;);
//test 데이터 베이스에 연결. 없어도 괜찮다. 이 구문이 만들어 줄것.
mongoose
  .connect(&quot;mongodb://127.0.0.1:27017/movieApp&quot;)
  .then(() =&amp;gt; {
    console.log(&quot;CONNECTION OPEN&quot;);
  })
  .catch((err) =&amp;gt; {
    console.log(&quot;OH NO ERROR!&quot;);
    console.log(err);
  });

//스키마 생성
const movieSchema = new mongoose.Schema({
  title: String,
  year: Number,
  score: Number,
  rating: String,
});

//Movice라는 class를 생성. 데이터 베이스, 스키마이름 순으로 적는다.
const Movie = mongoose.model(&quot;Movie&quot;, movieSchema);



Movie.insertMany([
 { title: &quot;Amelie&quot;, year: 2001, score: 8.3, rating: &quot;R&quot; },
 { title: &quot;Alien&quot;, year: 1979, score: 8.1, rating: &quot;R&quot; },
 { title: &quot;The Iron Giant&quot;, year: 1999, score: 7.5, rating: &quot;PG&quot; },
 { title: &quot;Stand By Me&quot;, year: 1986, score: 8.6, rating: &quot;R&quot; },
 { title: &quot;Moonrise Kingdom&quot;, year: 2012, score: 7.3, rating: &quot;PG-13&quot; },
 ]).then((data) =&amp;gt; {
  console.log(&quot;IT WORKED!&quot;);
   console.log(data);
 });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 작성 뒤, 노드셸에서&amp;nbsp; 아래의 명령문을 실행하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709605268736&quot; class=&quot;css&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.load index.js&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몽고db서버에 잘 연결되어 데이터가 성공적으로 삽입되었다면 터미널에 아래와 같은 결과가 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;nbsp;.load&amp;nbsp;index.js &lt;br /&gt;const&amp;nbsp;mongoose&amp;nbsp;=&amp;nbsp;require(&quot;mongoose&quot;); &lt;br /&gt;//test&amp;nbsp;데이터&amp;nbsp;베이스에&amp;nbsp;연결.&amp;nbsp;없어도&amp;nbsp;괜찮다.&amp;nbsp;이&amp;nbsp;구문이&amp;nbsp;만들어&amp;nbsp;줄것. &lt;br /&gt;mongoose &lt;br /&gt;&amp;nbsp;&amp;nbsp;.connect(&quot;mongodb://127.0.0.1:27017/movieApp&quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then(()&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;CONNECTION&amp;nbsp;OPEN&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch((err)&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;OH&amp;nbsp;NO&amp;nbsp;ERROR!&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(err); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//스키마&amp;nbsp;생성 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;movieSchema&amp;nbsp;=&amp;nbsp;new&amp;nbsp;mongoose.Schema({ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title:&amp;nbsp;String, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;year:&amp;nbsp;Number, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;score:&amp;nbsp;Number, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rating:&amp;nbsp;String, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Movice라는&amp;nbsp;class를&amp;nbsp;생성.&amp;nbsp;데이터&amp;nbsp;베이스,&amp;nbsp;스키마이름&amp;nbsp;순으로&amp;nbsp;적는다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;Movie&amp;nbsp;=&amp;nbsp;mongoose.model(&quot;Movie&quot;,&amp;nbsp;movieSchema); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;const&amp;nbsp;amadeus&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Movie({ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;title:&amp;nbsp;&quot;Amadeus&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;year:&amp;nbsp;1986, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;score:&amp;nbsp;9.2, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;rating:&amp;nbsp;&quot;R&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;}); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Movie.insertMany([ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;title:&amp;nbsp;&quot;Amelie&quot;,&amp;nbsp;year:&amp;nbsp;2001,&amp;nbsp;score:&amp;nbsp;8.3,&amp;nbsp;rating:&amp;nbsp;&quot;R&quot;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;title:&amp;nbsp;&quot;Alien&quot;,&amp;nbsp;year:&amp;nbsp;1979,&amp;nbsp;score:&amp;nbsp;8.1,&amp;nbsp;rating:&amp;nbsp;&quot;R&quot;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;title:&amp;nbsp;&quot;The&amp;nbsp;Iron&amp;nbsp;Giant&quot;,&amp;nbsp;year:&amp;nbsp;1999,&amp;nbsp;score:&amp;nbsp;7.5,&amp;nbsp;rating:&amp;nbsp;&quot;PG&quot;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;title:&amp;nbsp;&quot;Stand&amp;nbsp;By&amp;nbsp;Me&quot;,&amp;nbsp;year:&amp;nbsp;1986,&amp;nbsp;score:&amp;nbsp;8.6,&amp;nbsp;rating:&amp;nbsp;&quot;R&quot;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;title:&amp;nbsp;&quot;Moonrise&amp;nbsp;Kingdom&quot;,&amp;nbsp;year:&amp;nbsp;2012,&amp;nbsp;score:&amp;nbsp;7.3,&amp;nbsp;rating:&amp;nbsp;&quot;PG-13&quot;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;]).then((data)&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;IT&amp;nbsp;WORKED!&quot;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(data); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;}); &lt;br /&gt;&lt;br /&gt;Promise&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;pending&amp;gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;[Symbol(async_id_symbol)]:&amp;nbsp;152, &lt;br /&gt;&amp;nbsp;&amp;nbsp;[Symbol(trigger_async_id_symbol)]:&amp;nbsp;151 &lt;br /&gt;} &lt;br /&gt;&amp;gt;&amp;nbsp;CONNECTION&amp;nbsp;OPEN &lt;br /&gt;&amp;gt;&amp;nbsp;Movie.find({}).then(data&amp;nbsp;=&amp;gt;console.log(data)) &lt;br /&gt;Promise&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;pending&amp;gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;[Symbol(async_id_symbol)]:&amp;nbsp;835, &lt;br /&gt;&amp;nbsp;&amp;nbsp;[Symbol(trigger_async_id_symbol)]:&amp;nbsp;831 &lt;br /&gt;} &lt;br /&gt;&amp;gt;&amp;nbsp;[ &lt;br /&gt;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_id:&amp;nbsp;new&amp;nbsp;ObjectId('65e57d283c40e2d5368b0471'), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title:&amp;nbsp;'Amadeus', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;year:&amp;nbsp;1986, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;score:&amp;nbsp;9.5, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rating:&amp;nbsp;'R', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__v:&amp;nbsp;0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_id:&amp;nbsp;new&amp;nbsp;ObjectId('65e663502e7a641811485222'), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title:&amp;nbsp;'Amelie', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;year:&amp;nbsp;2001, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;score:&amp;nbsp;8.3, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rating:&amp;nbsp;'R', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__v:&amp;nbsp;0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_id:&amp;nbsp;new&amp;nbsp;ObjectId('65e663502e7a641811485223'), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title:&amp;nbsp;'Alien', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;year:&amp;nbsp;1979, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;score:&amp;nbsp;8.1, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rating:&amp;nbsp;'R', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__v:&amp;nbsp;0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_id:&amp;nbsp;new&amp;nbsp;ObjectId('65e663502e7a641811485224'), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title:&amp;nbsp;'The&amp;nbsp;Iron&amp;nbsp;Giant', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;year:&amp;nbsp;1999, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;score:&amp;nbsp;7.5, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rating:&amp;nbsp;'PG', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__v:&amp;nbsp;0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_id:&amp;nbsp;new&amp;nbsp;ObjectId('65e663502e7a641811485225'), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title:&amp;nbsp;'Stand&amp;nbsp;By&amp;nbsp;Me', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;year:&amp;nbsp;1986, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;score:&amp;nbsp;8.6, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rating:&amp;nbsp;'R', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__v:&amp;nbsp;0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_id:&amp;nbsp;new&amp;nbsp;ObjectId('65e663502e7a641811485226'), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title:&amp;nbsp;'Moonrise&amp;nbsp;Kingdom', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;year:&amp;nbsp;2012, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;score:&amp;nbsp;7.3, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rating:&amp;nbsp;'PG-13', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__v:&amp;nbsp;0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;] &lt;br /&gt;&amp;gt;&amp;nbsp;Movie.find({rating:'PG-13'}).then(data&amp;nbsp;=&amp;gt;console.log(data)) &lt;br /&gt;Promise&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;pending&amp;gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;[Symbol(async_id_symbol)]:&amp;nbsp;1195, &lt;br /&gt;&amp;nbsp;&amp;nbsp;[Symbol(trigger_async_id_symbol)]:&amp;nbsp;1191 &lt;br /&gt;} &lt;br /&gt;&amp;gt;&amp;nbsp;[ &lt;br /&gt;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_id:&amp;nbsp;new&amp;nbsp;ObjectId('65e663502e7a641811485226'), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title:&amp;nbsp;'Moonrise&amp;nbsp;Kingdom', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;year:&amp;nbsp;2012, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;score:&amp;nbsp;7.3, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rating:&amp;nbsp;'PG-13', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__v:&amp;nbsp;0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;] &lt;br /&gt;&amp;gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>MongoDB</category>
      <category>Mongoose</category>
      <category>mongosh</category>
      <category>node</category>
      <category>노드</category>
      <category>몽고DB</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/177</guid>
      <comments>https://developerson.tistory.com/177#entry177comment</comments>
      <pubDate>Tue, 5 Mar 2024 11:24:06 +0900</pubDate>
    </item>
    <item>
      <title>REST vs RESTFUL 는 무엇인가? 둘의 미묘한 차이점</title>
      <link>https://developerson.tistory.com/176</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;REST(Representational State Transfer)와 RESTful은 웹 서비스 아키텍처를 설계하는 데 사용되는 용어로, 서로 유사하지만 약간의 차이가 있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;REST(Representational State Transfer)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;-정의:&amp;nbsp; REST는 자원(URI), 행위(HTTP 메서드), 표현(Representations)으로 구성된 아키텍처적인 스타일&lt;br /&gt;- 특징:&lt;br /&gt;&amp;nbsp;&amp;nbsp;1. 자원은 URI로 표현되며, 각 자원은 고유한 식별자를 보유&lt;br /&gt;&amp;nbsp;&amp;nbsp;2. 행위는 HTTP 메서드(GET, POST, PUT, DELETE)를 이용하여 수행. &lt;br /&gt;&amp;nbsp;&amp;nbsp;3. 표현은 클라이언트가 자원의 상태를 나타내는 방식.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;RESTful:&lt;/b&gt;&lt;br /&gt;- 정의: RESTful은 REST 아키텍처를 따르는 웹 서비스다. 즉, REST 원칙을 준수하여 구현된 웹 서비스를 RESTful이라고 한다. &lt;br /&gt;- 특징:&lt;br /&gt;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;REST의&amp;nbsp;원칙을&amp;nbsp;따르며,&amp;nbsp;자원,&amp;nbsp;행위,&amp;nbsp;표현을&amp;nbsp;활용합니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;URI는&amp;nbsp;명사(자원)를&amp;nbsp;사용하고,&amp;nbsp;HTTP&amp;nbsp;메서드는&amp;nbsp;동사(행위)를&amp;nbsp;나타냅니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;클라이언트와&amp;nbsp;서버&amp;nbsp;간의&amp;nbsp;상태는&amp;nbsp;필요&amp;nbsp;없고,&amp;nbsp;요청이&amp;nbsp;완전히&amp;nbsp;독립적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;REST와 RESTful의 차이:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;REST는 아키텍처 스타일을 나타내는 개념이고, RESTful은 이를 실제로 구현한 웹 서비스를 의미.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RESTful은 REST 원칙을 따르지만, 엄격한 규칙을 따르지 않을 수도 있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;- REST:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;- 단순한 서비스나 작은 규모의 프로젝트에서 사용할 때 간편하게 적용. &lt;br /&gt;&amp;nbsp;&amp;nbsp;- 표준에 엄격하게 따를 필요가 없거나, 서비스의 요구사항이 RESTful을 엄격히 따르지 않아도 되는 경우에 사용. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;- RESTful:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;- 대규모의 복잡한 프로젝트나 기업 수준의 서비스에서 사용. &lt;br /&gt;&amp;nbsp;&amp;nbsp;- 표준화된 URI 및 HTTP 메서드 사용으로 인해 간편하게 개발 및 유지보수가 가능. &lt;br /&gt;&amp;nbsp;&amp;nbsp;- 자체적으로 규칙을 가지고 있어 개발자들 사이의 협업이 용이. &lt;br /&gt;&lt;br /&gt;종합적으로, 간단한 서비스에서는 REST를 적용하여 빠르게 개발할 수 있고, 대규모이거나 표준화가 필요한 프로젝트에서는 RESTful을 적용하여 일관성 있고 효율적인 웹 서비스를 구현.&lt;/p&gt;</description>
      <category>코딩 기록/유용한 IT 팁</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/176</guid>
      <comments>https://developerson.tistory.com/176#entry176comment</comments>
      <pubDate>Sun, 3 Mar 2024 16:19:09 +0900</pubDate>
    </item>
    <item>
      <title>오버라이드 VS 오버로드의 차이점 알아보기</title>
      <link>https://developerson.tistory.com/175</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오버라이드(Override)와 오버로드(Overload)는 객체지향 프로그래밍에서 다형성(Polymorphism)을 구현하는 방법 중 두 가지.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.오버라이드(Override)&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 오버라이드는 &lt;b&gt;상위 클래스(부모 클래스)에서 이미 정의된 메서드를 하위 클래스(자식 클래스)에서 동일한 시그니처(메서드 이름, 매개변수 유형 및 개수)로 다시 정의하는 것&lt;/b&gt;을 의미. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 오버라이드를 사용하면 하위 클래스는 상위 클래스의 메서드를 자신의 필요에 맞게 재정의 가능. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 오버라이드된 메서드는 상위 클래스의 메서드 대신 호출되며, 다형성을 통해 동일한 메서드 호출 시에도 실제 객체의 타입에 따라 다른 동작이 수행.&lt;/p&gt;
&lt;pre id=&quot;code_1709449884973&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Animal:
    def make_sound(self):
        return &quot;Some generic sound&quot;

class Dog(Animal):
    def make_sound(self):
        return &quot;Bark bark!&quot;

class Cat(Animal):
    def make_sound(self):
        return &quot;Meow meow!&quot;

# 사용 예시
dog = Dog()
cat = Cat()

print(dog.make_sound())  # &quot;Bark bark!&quot;
print(cat.make_sound())  # &quot;Meow meow!&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;2.오버로드(Overload)&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 오버로드는 &lt;b&gt;같은 클래스 내에서 메서드의 이름은 같지만 매개변수의 유형, 개수, 또는 순서가 다른 여러 버전을 정의&lt;/b&gt;하는 것. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 오버로드된 메서드는 메서드 이름이 같지만 시그니처가 다르므로 컴파일러가 인자의 유형을 기반으로 어떤 메서드를 호출할지 결정. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 오버로드된 메서드는 같은 이름을 사용하며 다양한 매개변수를 받아들일 수 있어, 코드의 가독성과 유연성을 높이는 데 사용. &lt;/p&gt;
&lt;pre id=&quot;code_1709449870444&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Calculator:
    def add(self, a, b):
        return a + b

    def add(self, a, b, c):
        return a + b + c

# 사용 예시
calculator = Calculator()
result1 = calculator.add(1, 2)      # 에러, 메서드 오버로드가 지원되지 않음
result2 = calculator.add(1, 2, 3)   # 정상 동작&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;오버라이드는 상속 관계에서 메서드를 재정의하고 다형성을 구현하는 데 사용,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오버로드는 하나의 클래스 내에서 동일한 이름의 메서드를 다양한 매개변수 조합으로 정의하여 유연성을 높이는 데 사용.&lt;/p&gt;</description>
      <category>코딩 기록/유용한 IT 팁</category>
      <category>오버라이드</category>
      <category>오버로드</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/175</guid>
      <comments>https://developerson.tistory.com/175#entry175comment</comments>
      <pubDate>Sun, 3 Mar 2024 16:12:25 +0900</pubDate>
    </item>
    <item>
      <title>클래스 vs 인터페이스 vs  추상 메서드 는 언제 어떻게 사용하는가?</title>
      <link>https://developerson.tistory.com/174</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;클래스와 인터페이스는 객체지향 프로그래밍에서 다른 역할을 수행하며, 사용하는 상황에 따라 선택된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스(Class)란?&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 클래스는 객체지향 프로그래밍에서 데이터와 메서드(함수)의 모음.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 객체의 설계도 혹은 틀로, 객체를 생성하기 위한 모든 특징과 행위를 정의.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 클래스는 구체적인 객체를 생성하기 위한 템플릿이며, 객체의 상태(속성)와 동작(메서드)을 정의.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709449183956&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Car:
    def __init__(self, make, model):
        self.make = make
        self.model = model

    def start_engine(self):
        print(&quot;Engine started&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추상 클래스란?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-추상 클래스는 일부 메서드의 구현을 하지 않은 추상 메서드를 포함할 수 있는 클래스.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-추상 메서드는 하위 클래스에서 반드시 구현.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-직접 객체를 생성할 수 없으며, 상속을 통해 하위 클래스에서 추상 메서드를 구현한 후에 해당 하위 클래스의 객체 생성 가&lt;/p&gt;
&lt;pre id=&quot;code_1709449313489&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius * self.radius&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;인터페이스(Interface)란?&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 인터페이스는 일종의 추상 클래스로, 모든 메서드가 추상 메서드인 특별한 형태의 클래스.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 인터페이스는 객체의 동작 방식을 정의하지만, 실제 동작 내용은 제공하지 않는다.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 여러 클래스가 동일한 동작 방식을 가져야 하는 경우 인터페이스를 사용하여 일관성을 유지한다.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- Java와 같은 언어에서는 인터페이스를 사용하여 다중 상속을 지원.&lt;/p&gt;
&lt;pre id=&quot;code_1709449218620&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from abc import ABC, abstractmethod

class Flyable(ABC):
    @abstractmethod
    def fly(self):
        pass

class Bird(Flyable):
    def fly(self):
        print(&quot;Bird is flying&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추상 메서드(Abstract Method)란?&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 추상 메서드는 메서드의 선언만 있고 구현이 없는 메서드.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 추상 메서드는 해당 메서드를 가지는 클래스가 반드시 구현해한다.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 추상 메서드는 일반적으로 추상 클래스나 인터페이스에서 정의.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 추상 메서드를 포함하는 클래스는 반드시 추상 클래스로 선언.&lt;br /&gt;&lt;br /&gt;클래스는 객체의 구체적인 모습을 정의.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터페이스는 객체의 동작 방식을 정의.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추상 메서드는 구현이 없는 메서드를 의미.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이들을 적절히 조합하여 객체지향 프로그래밍에서 유연하고 확장 가능한 구조를 설계한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;클래스(Class)의 특징&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.구현 가능한 메서드 포함&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 클래스는 데이터와 그 데이터를 처리하는 메서드(동작)를 함께 포함&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 클래스는 구체적인 객체의 속성과 행동을 정의하며, 객체를 생성하는 데 사용.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. 단일 상속&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 대부분의 언어에서 클래스는 단일 상속만을 지원. 즉, 한 클래스는 하나의 클래스만을 직접적으로 상속 받는다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.인스턴스 생성 가능&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 클래스는 객체를 생성하여 해당 객체의 인스턴스를 만들 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.일반 메서드와 속성을 가진다.&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 클래스는 일반 메서드와 속성을 가질 수 있어, 객체의 특정 동작 이외의 일반적인 기능도 포함 가능하다.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;인터페이스(Interface)의 특징&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.추상 메서드만 포함&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 인터페이스는 모든 메서드가 추상 메서드로 이루어져 있다. 즉, 메서드의 선언만 있고 구현은 없다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. 다중 상속&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;인터페이스는&amp;nbsp;다중&amp;nbsp;상속을&amp;nbsp;지원하므로,&amp;nbsp;여러&amp;nbsp;인터페이스를&amp;nbsp;동시에&amp;nbsp;구현할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.인스턴스 생성 불가&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 인터페이스는 객체를 직접적으로 생성할 수 없으며, 해당 인터페이스를 구현하는 클래스에서 구현해야 한다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.구현 강제:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 클래스가 인터페이스를 구현한다면, 해당 클래스는 인터페이스에서 정의한 모든 메서드를 반드시 구현해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;추상 클래스의(Abstract class) 특징&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&lt;/b&gt;&lt;b&gt;추상 메서드 포함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 하나 이상의 추상 메서드를 포함. 추상 메서드는 본체(구현)가 없고 선언 존재.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 하위 클래스에서는 추상 메서드를 반드시 구현.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 인스턴스 생성 불가:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 추상 클래스로 직접 객체(인스턴스)를 생성 불가. 주로 상속을 통해 하위 클래스에서 구현을 강제화하는 용도로 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 일반 메서드 포함:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 추상 클래스는 추상 메서드뿐만 아니라 일반 메서드도 포함.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4.다중 상속 가능:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 추상 클래스는 다른 클래스와 마찬가지로 다중 상속이 가능. 여러 추상 클래스를 상속하여 하나의 클래스에서 여러 기능을 동시에 활용.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;클래스와 인스턴스는 언제 사용하는가&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;*클래스 사용 시&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;구체적인&amp;nbsp;객체를&amp;nbsp;표현하고자&amp;nbsp;할&amp;nbsp;때. &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;단일&amp;nbsp;상속만&amp;nbsp;필요한&amp;nbsp;경우. &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;객체의&amp;nbsp;상태와&amp;nbsp;동작을&amp;nbsp;함께&amp;nbsp;다룰&amp;nbsp;필요가&amp;nbsp;있는&amp;nbsp;경우. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;*인터페이스 사용 시&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;다중&amp;nbsp;상속이&amp;nbsp;필요한&amp;nbsp;경우. &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;여러&amp;nbsp;클래스&amp;nbsp;간에&amp;nbsp;공통적인&amp;nbsp;동작을&amp;nbsp;정의하고&amp;nbsp;싶을&amp;nbsp;때. &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;클래스&amp;nbsp;간의&amp;nbsp;결합도를&amp;nbsp;낮추고&amp;nbsp;유연성을&amp;nbsp;높이고자&amp;nbsp;할&amp;nbsp;때. &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;특정&amp;nbsp;동작을&amp;nbsp;보장하고&amp;nbsp;강제하고자&amp;nbsp;할&amp;nbsp;때.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;*추상 클래스 사용 시&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-객체들 간의 공통된 특성과 동작이 필요할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-하위 클래스에서 특정 메서드의 구현을 강제화할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-코드의 일관성과 유지보수성을 높일 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-다중 상속을 활용할 때&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>코딩 기록/유용한 IT 팁</category>
      <category>인터페이스</category>
      <category>추상클래스</category>
      <category>클래스</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/174</guid>
      <comments>https://developerson.tistory.com/174#entry174comment</comments>
      <pubDate>Sun, 3 Mar 2024 16:08:48 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트, Express와 ejs를 이용해서 만드는 댓글 등록 및 수정 페이지</title>
      <link>https://developerson.tistory.com/173</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;페이지의 기본 구조&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 전체 댓글을 볼수 있는 목록 페이지&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FG1yS/btsFaMvLnJk/ML2THEuQWWf2NYJBjEOzQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FG1yS/btsFaMvLnJk/ML2THEuQWWf2NYJBjEOzQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FG1yS/btsFaMvLnJk/ML2THEuQWWf2NYJBjEOzQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFG1yS%2FbtsFaMvLnJk%2FML2THEuQWWf2NYJBjEOzQ1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;436&quot; height=&quot;349&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 전체 댓글목록에서 detail 클릭 클릭하면 넘어가는 특정 댓글 페이지 (댓글 수정 및 삭제 가능)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lgPcJ/btsFcmiKrjr/hOV0JVNr2otPZlmW7CdCEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lgPcJ/btsFcmiKrjr/hOV0JVNr2otPZlmW7CdCEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lgPcJ/btsFcmiKrjr/hOV0JVNr2otPZlmW7CdCEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlgPcJ%2FbtsFcmiKrjr%2FhOV0JVNr2otPZlmW7CdCEk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;880&quot; height=&quot;228&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 특정 댓글 수정페이지&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPNLyh/btsFercvekL/VHyqTKU2Lz1BpDcACa6q00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPNLyh/btsFercvekL/VHyqTKU2Lz1BpDcACa6q00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPNLyh/btsFercvekL/VHyqTKU2Lz1BpDcACa6q00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPNLyh%2FbtsFercvekL%2FVHyqTKU2Lz1BpDcACa6q00%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;646&quot; height=&quot;304&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4.새로운 댓글 작성 페이지&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/di7KFb/btsFfumhq8N/jawzf1hbw6bx0qkKNJXsF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/di7KFb/btsFfumhq8N/jawzf1hbw6bx0qkKNJXsF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/di7KFb/btsFfumhq8N/jawzf1hbw6bx0qkKNJXsF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdi7KFb%2FbtsFfumhq8N%2Fjawzf1hbw6bx0qkKNJXsF0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;373&quot; height=&quot;313&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 페이지는 서버를 구동하기 위해서 express 패키지를 사용하였으며 템플릿으로는 ejs를 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 유니크한 아이디를 만들기 위해서 uuid 패키지, 특정조건에서 Restful 명령어를 실행하기 위한 method-overide 패키지도 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package.json 파일&lt;/p&gt;
&lt;pre id=&quot;code_1708652393266&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;reststudy&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;description&quot;: &quot;&quot;,
  &quot;main&quot;: &quot;index.js&quot;,
  &quot;scripts&quot;: {
    &quot;test&quot;: &quot;echo \&quot;Error: no test specified\&quot; &amp;amp;&amp;amp; exit 1&quot;
  },
  &quot;keywords&quot;: [],
  &quot;author&quot;: &quot;&quot;,
  &quot;license&quot;: &quot;ISC&quot;,
  &quot;dependencies&quot;: {
    &quot;ejs&quot;: &quot;^3.1.9&quot;,
    &quot;express&quot;: &quot;^4.18.2&quot;,
    &quot;method-override&quot;: &quot;^3.0.0&quot;,
    &quot;uuid&quot;: &quot;^9.0.1&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 패키지 내용을 복사 한뒤&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708652447090&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령을 실행하면 동일한 노드 패키지 조건으로 설치 환경을 구성할 수 있다,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 페이지의 디렉토리 구조는 하기와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;184&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN4tbl/btsFcAuvZs5/OUdFnt9WDn1uiZJdnHcxDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN4tbl/btsFcAuvZs5/OUdFnt9WDn1uiZJdnHcxDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN4tbl/btsFcAuvZs5/OUdFnt9WDn1uiZJdnHcxDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN4tbl%2FbtsFcAuvZs5%2FOUdFnt9WDn1uiZJdnHcxDK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;184&quot; height=&quot;225&quot; data-origin-width=&quot;184&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지 구동에 필요한 패키지가 설치된 node_modules 디렉토리,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 경로마다 반환할 페이지가 저장된 views 디렉토리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 페이지 경로를 설정하는 index.js 파일이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 페이지가 어떠한 패키지의 기능을 사용하는지, 어떤 경로에서 어떤 페이지를 반환하는지, 어떤 기능에서 어떤 Restful 요청을 사용하는지 등의 전체적인 흐름을 파악하고 싶다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RestStudty 디렉토리 바로 하단에 있는 index.js 파일을 확인하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;184&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O3gmy/btsFbVspDDY/KGw56SOr5Gm17Hle8NIoxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O3gmy/btsFbVspDDY/KGw56SOr5Gm17Hle8NIoxk/img.png&quot; data-alt=&quot;파랗게 표시한 이 파일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O3gmy/btsFbVspDDY/KGw56SOr5Gm17Hle8NIoxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO3gmy%2FbtsFbVspDDY%2FKGw56SOr5Gm17Hle8NIoxk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;184&quot; height=&quot;225&quot; data-origin-width=&quot;184&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파랗게 표시한 이 파일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;RESTful 문법 정하기&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;GET/comments- 모든 코멘트 리스트업 &lt;br /&gt;POST/comments- 새로운 코멘트 등록&lt;br /&gt;GET/comments/:id - id 이용해서 하나의 코멘트만 가져오기 &lt;br /&gt;PATCH/comments/:id - 하나의 코멘트를 업데이트&lt;br /&gt;DELETE/comments?/:id - 하나의 코멘트를 삭제&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.js 파일의 코드&lt;/p&gt;
&lt;pre id=&quot;code_1708652764666&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//required는 특정 파일이나 패키지의 모듈을 불러와 현재 파일에서 사용할 수 있게 해주는 문법.
const path = require(&quot;path&quot;);
//uuid() 메소드를 실행하면 universally unique한 아이디를 만들 수 있다.
const { v4: uuid } = require(&quot;uuid&quot;);
//서버 구동을 위해 express 패키지 사용
const express = require(&quot;express&quot;);
const app = express();

//use는 어떤 방식의 요청이든 매번 실행되는 함수를 의미한다.
//Form 데이터를 POST 요청 BODY로 파싱하는 미들웨어
app.use(express.urlencoded({ extended: true }));
//들어오는 POST 요청(req)의 BODY를 JSON 형식으로 파싱하는 미들웨어
app.use(express.json());
//fake PUT/PATCH/DELETE 요청을 수행하기 위해 사용되는 패키지 methodOVerried
app.use(methodOverride(&quot;_method&quot;));
//VIEW 폴더의 경로와 EJS 템플릿 설정
app.set(&quot;views&quot;, path.join(__dirname, &quot;views&quot;));
app.set(&quot;view engine&quot;, &quot;ejs&quot;);

//화면에 보일 더미 데이터를 배열로 생성한다.
let comments = [
  {
    id: uuid(),
    username: &quot;Todd&quot;,
    comment: &quot;lol that is so funny!&quot;,
  },
  {
    id: uuid(),
    username: &quot;Skyler&quot;,
    comment: &quot;I like to go birdwatching with my dog&quot;,
  },
  {
    id: uuid(),
    username: &quot;Sk8erBoi&quot;,
    comment: &quot;Plz delete your account, Todd&quot;,
  },
  {
    id: uuid(),
    username: &quot;onlysayswoof&quot;,
    comment: &quot;woof woof woof&quot;,
  },
];

//comments 페이지로가면 코멘트 디렉토리의 index 파일을 렌더한다.
//index 페이지는 전체 코멘트의 목록을 보여주는 페이지다.
app.get(&quot;/comments&quot;, (req, res) =&amp;gt; {
  res.render(&quot;comments/index&quot;, { comments });
});

// comments/new 페이지로 이동해서 새로운 코멘트를 작성하는 폼을 렌더한다
app.get(&quot;/comments/new&quot;, (req, res) =&amp;gt; {
  res.render(&quot;comments/new&quot;);
});

//새로운 코멘트를 작성해서 작성된 데이터를 POST 리퀘스트로 전송한다.
//POST 리퀘스트가 성공했을시 전체 댓글 목록 페이지로 이동한다.
app.post(&quot;/comments&quot;, (req, res) =&amp;gt; {
  //Post Request로 전달된 내용을 destructure
  const { username, comment } = req.body;
  //destructure 한 data를 comments 배열에 추가
  comments.push({ username, comment, id: uuid() });
  //요청이 성공했을 시 /comments 페이지로 이동
  res.redirect(&quot;/comments&quot;);
});

// app.get(&quot;/comments/:id&quot;, (req, res) =&amp;gt; {
//   //id는 req의 param으로 넘겨주는 값, 즉 주소창의 파라미터가 id
//   const { id } = req.params;
//   //comments 배열에 있는 원소의 id 값이 req에서 요청한 id과 동일한 코멘트를 찾는다
//   const comment = comments.find((c) =&amp;gt; c.id === id);
//   res.render(&quot;comments/show&quot;, { comment });
// });

// comments/show로 이동해서 특정한 id의 댓글을 보여준다.
app.get(&quot;/comments/:id&quot;, (req, res) =&amp;gt; {
  //매개변수로 전달 받은 param을 id에 저장
  const { id } = req.params;
  //특정 id와 일치하는 id를 코멘트 배열에서 검색
  const comment = comments.find((c) =&amp;gt; c.id === id);
  //특정 id의 댓글만 보여주는 페이지를 렌더
  res.render(&quot;comments/show&quot;, { comment });
});

// comments/:id/edit 경로로 이동해 특정한 id의 댓글을 편집하는 폼으로 이동
app.get(&quot;/comments/:id/edit&quot;, (req, res) =&amp;gt; {
  const { id } = req.params;
  const comment = comments.find((c) =&amp;gt; c.id === id);
  res.render(&quot;comments/edit&quot;, { comment });
});

//patch와 put의 차이 : put은 전체 내용을 완전히 새로 교체하는 것이고 
//patch는 부분적으로 수정하는 것
//PATCH 명령을 통해 특정한 댓글을 수정한다
app.patch(&quot;/comments/:id&quot;, (req, res) =&amp;gt; {
  const { id } = req.params;
  //req로 전달되는 코멘트 내용을 새로운 코멘트로서 대입한다.
  const newCommentText = req.body.comment;
  const foundComment = comments.find((c) =&amp;gt; c.id === id);
  //id와 일치하는 코멘트를 새로운 코멘트로 수정한다.
  foundComment.comment = newCommentText;
  res.redirect(&quot;/comments&quot;);
});


//DELETE 명령어를 통해 특정한 댓글을 삭제한다.
app.delete(&quot;/comments/:id&quot;, (req, res) =&amp;gt; {
  const { id } = req.params;
  const foundComment = comments.find((c) =&amp;gt; c.id === id);
  //filter를 이용해서 배열에서 id값이 다른 element만 추출
  comments = comments.filter((c) =&amp;gt; c.id !== id);
  res.redirect(&quot;/comments&quot;);
});

app.get(&quot;/tacos&quot;, (req, res) =&amp;gt; {
  res.send(&quot;GET /tacos response&quot;);
});

app.post(&quot;/tacos&quot;, (req, res) =&amp;gt; {
  //body로 보내진 요청(req)를 meat과 qty라는 변수에 파싱하고
  const { meat, qty } = req.body;
  //아래의 형식으로 응답한다.
  res.send(`OK, here are your ${qty} ${meat} taco(s)`);
});

app.listen(3000, () =&amp;gt; {
  console.log(&quot;ON PORT 3000&quot;);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.js 파일을 통해서 전체적인 페이지의 흐름을 파악했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 특정 페이지의 구성은 어떻게 할 수 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상기 코드에 있었던 이 부분이 힌트다.&lt;/p&gt;
&lt;pre id=&quot;code_1708654085222&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'ejs')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에 보여지는 페이지 경로는 views 디렉토리의 경로를 참조하며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에 보여지는 템플릿은 ejs를 사용한다는 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;184&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGovst/btsFeqSe5fS/xTnyuyqKoAqNomLgs6C0p0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGovst/btsFeqSe5fS/xTnyuyqKoAqNomLgs6C0p0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGovst/btsFeqSe5fS/xTnyuyqKoAqNomLgs6C0p0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGovst%2FbtsFeqSe5fS%2FxTnyuyqKoAqNomLgs6C0p0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;184&quot; height=&quot;225&quot; data-origin-width=&quot;184&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 views 폴더 내부에 있는 html 파일들의 형식은 모두 ejs이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 전체 코멘트를 반환하는 index.ejs 페이지부터 확인해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.ejs&lt;/p&gt;
&lt;pre id=&quot;code_1708654291968&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Comments Index&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Comments&amp;lt;/h1&amp;gt;
    &amp;lt;ul&amp;gt;
      &amp;lt;% for (let c of comments){ %&amp;gt;
      &amp;lt;li&amp;gt;&amp;lt;%=c.comment%&amp;gt; - &amp;lt;b&amp;gt;&amp;lt;%=c.username%&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;a href=&quot;/comments/&amp;lt;%=c.id%&amp;gt;&quot;&amp;gt;details&amp;lt;/a&amp;gt;
      &amp;lt;% }%&amp;gt;
    &amp;lt;/ul&amp;gt;
    &amp;lt;a href=&quot;/comments/new&quot;&amp;gt;New Comment&amp;lt;/a&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ejs 템플릿 문법인 &amp;lt;% %&amp;gt;, &amp;lt;%= %&amp;gt;를 사용하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;% %&amp;gt;는 자바스크립트 코드를 감싸고 있으며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;%= %&amp;gt;는 GET 명령어로 받아온 comments 배열의 element 프로퍼티인 comment, username, id값을 반환하고 있다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;href&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;/comments/&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;%=&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;details&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;받아온 특정 id를 a태그의 경로로 입력해서 동적 페이지 이동도 가능하게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음으로는 특정 아이디의 댓글을 보여주는 show.ejs 페이지를 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;show.ejs&lt;/p&gt;
&lt;pre id=&quot;code_1708654540363&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Show&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;

  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Comment id: &amp;lt;%= comment.id %&amp;gt;&amp;lt;/h1&amp;gt;
    &amp;lt;h2&amp;gt;&amp;lt;%=comment.comment %&amp;gt; - &amp;lt;b&amp;gt;&amp;lt;%=comment.username %&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/h2&amp;gt;
    &amp;lt;a href=&quot;/comments&quot;&amp;gt;back to index&amp;lt;/a&amp;gt;
    &amp;lt;a href=&quot;/comments/&amp;lt;%=comment.id%&amp;gt;/edit&quot;&amp;gt;Edit Comment&amp;lt;/a&amp;gt;
    &amp;lt;form method=&quot;POST&quot; action=&quot;/comments/&amp;lt;%= comment.id %&amp;gt;/?_method=DELETE&quot;&amp;gt;
      &amp;lt;button&amp;gt;DELETE&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주목할 점은 form 태그로 DELETE 버튼을 감싸고 있으며, 해당 DELETE버튼을 클릭시 method 패키지를 이용해서 DELTE 명령어를 수행하게 하는 점이다. ?_method=DELETE 명령어를 통해서 버튼을 클릭시 특정 아이디의 댓글이 삭제된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 새로운 댓글을 작성하는 form을 보여주는 new.ejs 페이지를 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;new.ejs&lt;/p&gt;
&lt;pre id=&quot;code_1708654813108&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;New Comment&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Make a new comment&amp;lt;/h1&amp;gt;
    &amp;lt;form action=&quot;/comments&quot; method=&quot;post&quot;&amp;gt;
      &amp;lt;section&amp;gt;
        &amp;lt;label for=&quot;username&quot;&amp;gt;Enter username:&amp;lt;/label&amp;gt;
        &amp;lt;input
          type=&quot;text&quot;
          id=&quot;username&quot;
          placeholder=&quot;username&quot;
          name=&quot;username&quot;
        /&amp;gt;
      &amp;lt;/section&amp;gt;
      &amp;lt;section&amp;gt;
        &amp;lt;label for=&quot;comment&quot;&amp;gt;Comment Text&amp;lt;/label&amp;gt;
        &amp;lt;br /&amp;gt;
        &amp;lt;textarea name=&quot;comment&quot; id=&quot;comment&quot; cols=&quot;30&quot; rows=&quot;5&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
      &amp;lt;/section&amp;gt;
      &amp;lt;button&amp;gt;Submit&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
    &amp;lt;a href=&quot;/comments&quot;&amp;gt;Back to Index&amp;lt;/a&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;눈여겨 볼 점은 form 태그는 원래 get 명령 밖에 수행하지 못한다는 점이다. 하지만 method=&quot;post&quot;를 이용했다. 이는 method override 패키지를 통해 post 명령으로 form 데이터를 전송할 수 있게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 특정 댓글을 수정하는 edit.ejs 페이지를 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;edit.ejs&lt;/p&gt;
&lt;pre id=&quot;code_1708655026523&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Edit&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Edit&amp;lt;/h1&amp;gt;
    &amp;lt;form method=&quot;post&quot; action=&quot;/comments/&amp;lt;%=comment.id%&amp;gt;?_method=PATCH&quot;&amp;gt;
      &amp;lt;textarea name=&quot;comment&quot; id=&quot;&quot; cols=&quot;30&quot; rows=&quot;10&quot;&amp;gt;
        &amp;lt;%= comment.comment %&amp;gt;
      &amp;lt;/textarea&amp;gt;
      &amp;lt;button&amp;gt;Save&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 페이지 역시 new.ejs 페이지와 마찬가지로, method override 패키지를 이용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 GET 명령만 수행하는 form에게 POST 명령을 수행하도록 설정한게 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 method-override 패키지를 설치하기 위해선 아래의 명령문을 입력하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1708655162625&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i method-override&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제법 간단한 페이지로 보이지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 페이지도 세부적인 디렉토리 구성과 추가 패키지 설치가 필요함을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 페이지 이동에 필요한 RESTful 문법을 잘 설정해야지 페이지 이동시에 오류 없이 이동할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 페이지에서 다뤄진 기초적인 부분을 잘 이해하고 사용한다면 후에 고차적인 페이지를 구축할때도 큰 도움이 될 듯하다.&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>Express</category>
      <category>JavaScript</category>
      <category>node</category>
      <category>자바스크립트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/173</guid>
      <comments>https://developerson.tistory.com/173#entry173comment</comments>
      <pubDate>Fri, 23 Feb 2024 11:30:26 +0900</pubDate>
    </item>
    <item>
      <title>[JS/자바스크립트 ] Javascript JS closure의 사용예시로 closure 이해하기</title>
      <link>https://developerson.tistory.com/172</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트의 closure란 개념은 무엇일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mdn에서 clousre의 개념을 찾아보면 이렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #1b1b1b; text-align: start;&quot;&gt;A&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;closure&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is the combination of a function bundled together (enclosed) with references to its surrounding state (the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;lexical environment&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b; text-align: start;&quot;&gt;). In other words, a closure gives you access to an outer function's scope from an inner function. In JavaScript, closures are created every time a function is created, at function creation time.&lt;/span&gt; &lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt;클로저(Closure)란 함수와 그 함수가 선언될 당시의 렉시컬 환경(Lexical Environment)과의 조합으로, 외부 함수의 스코프에 대한 접근을 내부 함수에서 가능하게 하는 것을 의미합니다. 다시 말해서, 클로저는 내부 함수에서 외부 함수의 범위에 접근할 수 있도록 해주는 것입니다. 자바스크립트에서는 함수가 생성될 때마다 클로저가 생성됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라는 gpt의 설명을 들어도 한번에 이해가 되지 않는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누군가 closure를 이해하기 위해 좀더 쉬운 예시를 든적이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;closure는 어디든지 함수를 넣고 다니는 백팩이다. 이 백팩은 함수가 생성된 곳에서 보여지는 모든 변수가 담겨있다.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 closure란 기능을 통해서 함수의 변수에 접근할 수 있다는 말정도로 이해하면 될 듯하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 clousre란 기능을 좀더 쉽게 이해하기 위해서 closure가 나타나는 코드를 살펴보도록 하자.&lt;/p&gt;
&lt;pre id=&quot;code_1697178602457&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let f;

const g = function(){
  const a = 23;
  f = function(){
    console.log(a *2);
  }
}

const h = function(){
  const b = 777;
  f = function(){
    console.log(b *2);
  }
}


g();
f();
console.dir(f); 
h();
f(); 
console.dir(f);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 함수에서 g함수가 가장 첫번째로 호출 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;g함수는 이미 호출되었고 callstack에서 사라졌지만, 두번째로 호출된 f함수의 출력 결과를 보면, 46이란 결과가 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;f함수에는 g함수의 변수 a에 2를 곱하는 함수가 대입되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 f함수는 콜스택에서 사라진 g함수의 변수 a=23에 접근해서, 2를 곱하고 46이란 결과를 출력할 수 있었을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 위에서 언급한 closure 덕분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 콜스택에서 g함수가 사라졌어도, closure를 통해서 g함수의 변수에 접근이 가능했기 때문에 a=23에 접근할 수 있었던 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세번째로 출력되는 console.dir(f) 를 출력해보면,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y9XMW/btsyqw58UXk/QbpzVEdlDSZrHE3K3y46u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y9XMW/btsyqw58UXk/QbpzVEdlDSZrHE3K3y46u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y9XMW/btsyqw58UXk/QbpzVEdlDSZrHE3K3y46u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy9XMW%2Fbtsyqw58UXk%2FQbpzVEdlDSZrHE3K3y46u1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;340&quot; height=&quot;188&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;f함수가 closure를 이용해 g함수의 변수 a에 접근했음을 알수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음, 4번째로 h함수가 출력되었다. 이로 인해 f함수에는 h함수의 변수 b에 2를 곱하는 함수가 대입되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 5번째로 다시 f함수를 출력한다면 어떻게 될까? 이때도 당연히 closure가 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 h함수가 콜스택에서 사라졌지만, closure를 통해서 h함수의 변수 b=777에 접근이 가능했으며, 777에 2를 곱한 1544가 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 마지막에 console.dir(f)를 다시 출력해보면, 이전과 달리 closoure가 h함수에 적용된 것을 확인 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmPt2a/btsyssoSUpw/vGIRcLyNdnQBgkwRSKKmJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmPt2a/btsyssoSUpw/vGIRcLyNdnQBgkwRSKKmJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmPt2a/btsyssoSUpw/vGIRcLyNdnQBgkwRSKKmJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmPt2a%2FbtsyssoSUpw%2FvGIRcLyNdnQBgkwRSKKmJ0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;295&quot; height=&quot;204&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQHwV2/btsyeqzuCuH/VZNbEKn6DutvBqrDdohxU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQHwV2/btsyeqzuCuH/VZNbEKn6DutvBqrDdohxU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQHwV2/btsyeqzuCuH/VZNbEKn6DutvBqrDdohxU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQHwV2%2FbtsyeqzuCuH%2FVZNbEKn6DutvBqrDdohxU0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;340&quot; height=&quot;188&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 리턴값이 없는 함수를 할당해도 closure가 적용되며, 재할당 받은 함수에도 closure가 적용됨을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또다른 코드를 통해 closure의 개념을 이해해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1697178633177&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const boardPassengers = function(n, wait){
  const perGroup = n / 3 ;
  
  setTimeout(function(){
    console.log(`We are now boarding all ${n} passengers`);
    console.log(`There are 3 groups, each with ${perGroup} passenger`);
  }, wait*1000) 

  console.log(`Will start boarding in ${wait} seconds`);
};

const perGroup = 1000;
boardPassengers(180, 3)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드의 특이한 점은, boadrPssengers 함수 내에서 선언된 perGroup 변수를, 함수 밖에서 새로운 수로 대입한 다음,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;boardPassengers함수에 대입한 매개변수를 통해 다시 perGroup 변수에 수를 대입한다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 boardPassengers 내부에는 3초후에 실행되는 setTimeout 함수가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;boardPassengers&lt;span&gt; 가 호출되고 callstack에서 사라져도 setTimeout함수는 closure를 통해 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;boardPassengers의 변수에 접근할 수 있는 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 함수를 실행한 결과는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYMMtw/btsynZ1XA31/eKkLxMCkj03XsAe8o683CK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYMMtw/btsynZ1XA31/eKkLxMCkj03XsAe8o683CK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYMMtw/btsynZ1XA31/eKkLxMCkj03XsAe8o683CK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYMMtw%2FbtsynZ1XA31%2FeKkLxMCkj03XsAe8o683CK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;324&quot; height=&quot;89&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력결과에서는 180/3을 한 60이 출력됨을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;boardPassengers&amp;nbsp; 함수를 선언하기 전에 perGroup에&amp;nbsp; = 1000을 대입했다고 해도,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;boardPassengers&amp;nbsp;&lt;span&gt; 함수를 선언하면서 대입한 매개변수가 다시 perGroup 변수에 덮어씌워지는 점을 알 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;이를 통해서 n,wait과 매개변수에도 접근 할 수 있음을 알 수 있다. 왜냐면 매개변수 역시 함수의 지역 변수이므로, closure가 접근 가능한 변수이기 때문이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/172</guid>
      <comments>https://developerson.tistory.com/172#entry172comment</comments>
      <pubDate>Fri, 13 Oct 2023 16:44:37 +0900</pubDate>
    </item>
    <item>
      <title>[JS/자바스크립트 ] 함수의 디폴트 밸류, 디폴트 값</title>
      <link>https://developerson.tistory.com/171</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수를 사용할때는 보통 함수에 대입할 파라미터(매개변)를 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파라미터를 넣어야지 본인이 얻고 싶은 값이 나오기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 파라미터를 대입하지 않아도 기본적으로 출력되는 값을 설정할수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 함수의 default 값 설정을사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 createBooking 이란 함수를 보자,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1687157508201&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'use strict';

const bookings = [];

const createBooking = function ( flightNum, numPassengers = 1, price = 199 * numPassengers
) {
  const booking = {
   	flightNum,
    numPassengers,
    price,
  };
  
  console.log(booking);
  bookings.push(booking);
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 함수는 매개변수 flightNum(비행시간), numPassengers(승객 인원수), price(비행기 티켓 가격) 을 매개변수로 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수로 받은 세가지의 값은 booking 이란 구조체에 추가되고 해당 구조체는 다시 bookings라는 배열에 추가된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 주목할 점은 defualt 값이 설정된 numPassengers 와 price 라는 두가지 매개변수다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 파라미터는 함수가 호출되기도 전에 이미 numPassengers =1 , price= 199*numpassengers 와 같이 값이 대입되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉&amp;nbsp; createBooking 함수를 호출할때 해당 파라미터를 따로 대입하지 않아도 기본 값이 1, 199*(1)으로 설정되어 있다는 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 default 값이 설정되어 있는 함수를 호출시 어던 결과가 나오는지 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;코드&lt;/blockquote&gt;
&lt;pre id=&quot;code_1686756313317&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;
createBooking('LH123'); 
createBooking('LH123', 2, 800); 
createBooking('LH123', 5);&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;출력결과&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;{flightNum: 'LH123', numPassengers: 1, price: 199} &lt;br /&gt;{flightNum: 'LH123', numPassengers: 2, price: 800} &lt;br /&gt;{flightNum: 'LH123', numPassengers: 5, price: 995}&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;createBooking('LH123');&amp;nbsp; 는 flightNum의 매개변수 값만 주었기 때문에 나머지 매개변수는 기본값 1, 199가 출력되었다.&lt;br /&gt;createBooking('LH123', 2, 800); 는 모든 매개변수의 값을 주었기 때문에 대입한 그대로 계산되고 출력 되었다.&lt;br /&gt;createBooking('LH123', 5); 는 flightNum과 numPassengers 값만 주었고 나머지&amp;nbsp; price 값는 기본값으로 계산되어 출력됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 flightNum(비행 번호)와 티켓 가격 정보만 넘겨주고 승객수는 넘겨줄수 없을땐 어떻게 해야될까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;승객수를 입력하는 매개변수 자리에 undefined를 입력하면 호출한 함수가 오류없이 출력된다.&lt;/p&gt;
&lt;pre id=&quot;code_1687158042644&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;createBooking('LH123', undefined, 1000); // 승객수를 넘겨주기 싫을땐 undefined으로 적용.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 경우에는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;{flightNum: 'LH123', numPassengers: 1, price: 995} 와 같은 결과가 출력된다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>function</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>디폴트값</category>
      <category>자바스크립트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/171</guid>
      <comments>https://developerson.tistory.com/171#entry171comment</comments>
      <pubDate>Mon, 19 Jun 2023 16:09:48 +0900</pubDate>
    </item>
    <item>
      <title>[JS/자바스크립트] 문자열 메서드를 모두 이용하여 복잡한 문자열을 구조를 갖춘 형태로 변환하는 함수 만들기</title>
      <link>https://developerson.tistory.com/170</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;처음부터 정보를 형식에 맞춰서 받으면 정말 좋겠지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현실은 그렇지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통은 어지럽게 혼합된 정보를 본인이 필터링하고 다듬어서 형식을 갖추게 한다음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고객에게 전달하곤한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 항공편의 정보가 아래와 같이 전달되었다고 해보자&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686731773050&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const flights =
  '_Delayed_Departure;fao93766109;txl2133758440;11:25+_Arrival;bru0943384722;fao93766109;11:45+_Delayed_Arrival;hel7439299980;fao93766109;12:05+_Departure;fao93766109;lis2323639855;12:30';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지연 비행기와 도착시간등이 어지럽게 정보안에 섞여 있어서 한번에 알아보기 쉽지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 정보로 서비스를 하기 위해서는 아래와 같은 형식을 갖춰야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;255&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxDtIu/btsjWr6bXxI/eYTc47xVJqebvTybanxeKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxDtIu/btsjWr6bXxI/eYTc47xVJqebvTybanxeKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxDtIu/btsjWr6bXxI/eYTc47xVJqebvTybanxeKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxDtIu%2FbtsjWr6bXxI%2FeYTc47xVJqebvTybanxeKK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;255&quot; height=&quot;142&quot; data-origin-width=&quot;255&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 위의 어지러운 정보를 어떻게 위처럼 형식을 갖춰 정렬할 수 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트의 문자열 메서드를 쓰면 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 위의 정보에 문자열 메서드를 적용해 복잡한 정보를 깔끔하게 출력한 코드이다.&lt;/p&gt;
&lt;pre id=&quot;code_1686731951592&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 처음에 주어진 정보. 정렬이 필요함.
const flights =
  '_Delayed_Departure;fao93766109;txl2133758440;11:25+_Arrival;bru0943384722;fao93766109;11:45+_Delayed_Arrival;hel7439299980;fao93766109;12:05+_Departure;fao93766109;lis2323639855;12:30';

//0번째 인덱스부터 3개 글자까지 자른 뒤 대문자로 변환하게 하는 함수.
const getCode = str =&amp;gt; str.slice(0,3).toUpperCase()

//fligts 변수를 '+'를 기준으로 나눈다. 나눠져서 생긴 문자열의 수만큼 for문을 반복한다,
  for(const flight of flights.split('+')){
  
  //+를 기준으로 나눠진 문자열 element 을 다시 ';'를 기준으로 나눈다. 
  //첫번째로 나눠진 element는 지연정보, 도착 정보의 종류를 알려주는 type
  //두번째로 나눠진 element는 출발지인 from
  //세번째로 나눠진 element는 도착지인 to
  //네번째로 나눠진 element는 시간인 time 이 된다.
    const [type, from, to, time ] = flight.split(';');
   
   //type이 &quot;_Dayled&quot;로 시작한다면 지연정보이므로  를 추가한다. 아니면 그대로 둬야하므로 ''
    const output =  `${type.startsWith('_Delayed') ? 
    ' ' : ''} 
    //type에 붙은 &quot;_&quot;를 모두 공백으로 대체하기 위해 replaceAll메서드 사용. 
    ${type.replaceAll(
      '_',' ')} 
    //앞의 3글자를 대문자로 바꿔주는 함수를 from과 to에 적용.  
      from ${getCode(from)} to ${getCode(to)}  
   //time의 :는 h로 대체   
      (${time.replace(':','h')})`
   // 위의 모든 변형이 적용된 문자열의 간격을 균일화 하기위해 padStart메서드 적용.   
      .padStart(36)
    
    
    console.log(output);

  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 적용하면 아래와 같이 출력되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;255&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxDtIu/btsjWr6bXxI/eYTc47xVJqebvTybanxeKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxDtIu/btsjWr6bXxI/eYTc47xVJqebvTybanxeKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxDtIu/btsjWr6bXxI/eYTc47xVJqebvTybanxeKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxDtIu%2FbtsjWr6bXxI%2FeYTc47xVJqebvTybanxeKK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;255&quot; height=&quot;142&quot; data-origin-width=&quot;255&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>자바스크립트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/170</guid>
      <comments>https://developerson.tistory.com/170#entry170comment</comments>
      <pubDate>Thu, 15 Jun 2023 10:17:46 +0900</pubDate>
    </item>
    <item>
      <title>[JS/자바스크립트] 문자열 메서드를 이용해서 언더바 문자열을 카멜 표기법 문자로 바꾸는 함수 만들기  </title>
      <link>https://developerson.tistory.com/169</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언더바 표기법으로 작성된 변수의 이름을 카멜표기법으로 변환하는 프로그램을 만들어라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;textarea에 입력된 내용은 버튼이 클릭되면 변환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 테스트 데이터를 textarea에 붙여넣고 한번에 변환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;underscore_case&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;first_name&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Some_Variable&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;calculate_AGE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;delayed_departure&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼을 누를시 아래처럼 변환 되어야한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deCt8t/btsjXTnMODP/BHw5Oo2IP4xoea5jXteVD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deCt8t/btsjXTnMODP/BHw5Oo2IP4xoea5jXteVD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deCt8t/btsjXTnMODP/BHw5Oo2IP4xoea5jXteVD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeCt8t%2FbtsjXTnMODP%2FBHw5Oo2IP4xoea5jXteVD1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;382&quot; height=&quot;162&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;textarea에 입력된 내용, 클릭하는 버튼은 아래의 DOM 언어를 통해서 삽입된다.&lt;/p&gt;
&lt;pre id=&quot;code_1686731472277&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;document.body.append(document.createElement('textarea'));
document.body.append(document.createElement('button'));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;index.html&lt;/blockquote&gt;
&lt;pre id=&quot;code_1686731350348&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Make Functions&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
      body {
        height: 100vh;
        display: flex;
        align-items: center;
        background: linear-gradient(to top left, #28b487, #7dd56f);
      }
      h1 {
        font-family: sans-serif;
        font-size: 50px;
        line-height: 1.3;
        width: 100%;
        padding: 30px;
        text-align: center;
        color: white;
      }
      button {
        width: 50px;
        height: 20px;
        margin: 10px;
      }
      textarea {
        width: 300px;
        height: 100px;
      }
    &amp;lt;/style&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Make Functions&amp;lt;/h1&amp;gt;
    &amp;lt;script src=&quot;codingchallenge.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텍스트를 입력하고 버튼을 누르게 하는 기본 index.html 파일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/USBJl/btsjWsYj2Sb/GgjfZ3q9fDU6qmltjCggIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/USBJl/btsjWsYj2Sb/GgjfZ3q9fDU6qmltjCggIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/USBJl/btsjWsYj2Sb/GgjfZ3q9fDU6qmltjCggIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUSBJl%2FbtsjWsYj2Sb%2FGgjfZ3q9fDU6qmltjCggIk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1132&quot; height=&quot;606&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 위의 화면에 텍스트를 입력하고 버튼을 누를때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카멜 표기법으로 변환시키는 코드를 작성해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;codingchallenge.js&lt;/blockquote&gt;
&lt;pre id=&quot;code_1686731625953&quot; class=&quot;javascript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'use strict';

document.body.append(document.createElement('textarea'));
document.body.append(document.createElement('button'));

//버튼에 클릭할시 function이 실행되게 설정
document.querySelector('button').addEventListener('click', function () {

//textarea에 입력된 value 를 text라는 변수에 대입
  const text = document.querySelector('textarea').value;
  
//textarea에 입력된 value를 split 메서드를 이용해서 행별로 나누기  
//행별로 나뉘에진 문자열은 row라는 배열에 저장
  const rows = text.split('\n');

//rows라는 배열의 인덱스를 파악할 수 있도록 for문은 rows.entires()로 반복
//const[i,row] 에서 i는 인덱스 row는 배열에 있는 element
  for (const [i,row] of rows.entries()) {
  
  // element를 소문자로 변환 -&amp;gt; 공백 삭제- &amp;gt;&quot;_&quot;를 기준으로 문자열을 나눔 -&amp;gt; 
  //&quot;_&quot;기준으로 왼쪽 문자열 first, 오른쪽 문자열 second가 됨.
    const [first, second] = row.toLowerCase().trim().split('_');
    
  //first는 그대로 출력, second 문자열의 0번째 인덱스 문자는 대문자로 교체. 
  //first와 0번째 인덱스 문자가 대문자로 교체된 second를 결합하여 카멜표기법으로 변환 완료.
  //변환완료된 문자는 output이라는 문자열에 대입.
    const ouptut = `${first}${second.replace(
      second[0],
      second[0].toUpperCase()
    )}`;
    
    //output 변수에 padEnd 메서드를 이용해서 글자수를 20개로 맞추며 간격 유지.
    //✅에는 repeat메서드 이용해서 인덱스와 일치하는 개수 출력
    console.log(`${ouptut.padEnd(20)}${'✅'.repeat(i+1)}`);
  }
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 작성하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 textarea 에 문자열을 입력해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼을 누른다음,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clybFw/btsjRhpHZ4C/ScuvfJF4o753dRqQGMnmG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clybFw/btsjRhpHZ4C/ScuvfJF4o753dRqQGMnmG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clybFw/btsjRhpHZ4C/ScuvfJF4o753dRqQGMnmG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclybFw%2FbtsjRhpHZ4C%2FScuvfJF4o753dRqQGMnmG0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1112&quot; height=&quot;507&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 출력된다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 완성!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;315&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uM7Tw/btsjRmR5NVD/9Mxju1AufioJiSySg2y8kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uM7Tw/btsjRmR5NVD/9Mxju1AufioJiSySg2y8kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uM7Tw/btsjRmR5NVD/9Mxju1AufioJiSySg2y8kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuM7Tw%2FbtsjRmR5NVD%2F9Mxju1AufioJiSySg2y8kK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;315&quot; height=&quot;111&quot; data-origin-width=&quot;315&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>자바스크립트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/169</guid>
      <comments>https://developerson.tistory.com/169#entry169comment</comments>
      <pubDate>Thu, 15 Jun 2023 10:05:16 +0900</pubDate>
    </item>
    <item>
      <title>[JS/JavaScript]  문자열 나누기 합치기 정해진 글자수 만큼 다른 문자열로 채우기 반복하기 메소드 정리  split, join, repeat, padStart, padEnd</title>
      <link>https://developerson.tistory.com/168</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문자열을 활용할 수 있는 다양한 자바스크립트 메서드를 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;문자열을 기준문자 단위로 나눠주는 split 메서드&lt;/blockquote&gt;
&lt;pre id=&quot;code_1686486299594&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//split and join
console.log('a+very+nice+string'.split('+')); //['a', 'very', 'nice', 'string']
console.log('Nomad Haven Heaven'.split(' '));//(3)&amp;nbsp;['Nomad', 'Haven', 'Heaven']

const [firstName, lastName] = 'Nomad Havenheaven'.split(' ');

const newName =['Miss.',firstName, lastName.toUpperCase()].join(' ')
console.log(newName); //Miss. Nomad HAVENHEAVEN&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;출력화면&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;(4)&amp;nbsp;['a',&amp;nbsp;'very',&amp;nbsp;'nice',&amp;nbsp;'string']&lt;br /&gt;(3) ['Nomad', 'Haven', 'Heaven']&lt;br /&gt;Miss. Nomad HAVENHEAVEN&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;split는 지정한 문자를 기준으로 문자를 나누고 배열에 저장해주는 메서드이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;split('+')라는 메서드를 통해서 'a+very+nice+string'이라는 문자열을 나눈 뒤 출력하면&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;결과는 ['a','very','nice','string'] 이라는 배열이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 배열은 4가지 element로 구성되어있으며 +를 기준으로 나눠진 문자열이 저장된 것이 보인다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;split의 좋은점은 오로지 문자 많이 아니라 공백으로도 문자열을 나눌수 있다는 점이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;split(' ')은 공백을 기준으로 문자열을 나눈 다는 뜻이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;split(' ')이 적용된 'Nomad haven Heaven' 이라는 문자열을 출력해보자.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;element가 3가지인 ['Nomad','Haven','Heaven']라는 배열이 출력되었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이는 띄어쓰기를 기준으로 문자열이 배열에 저장된 것이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;const [firstName, lastName] 처럼 split을 통해서 문자열을 나눈뒤 각각 배열의 0번째 인덱스 1번째 인덱스에 적용하는 방법도 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 이름의 0번째 인덱스 문자를 대문자로 바꿔주는 CpitalizeName 함수이다. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;해당 함수는 &lt;/span&gt;split 메서드와 toUppercase 메서드를 이용해서&lt;span&gt; 설명한 기능을 실행한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686486327652&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const capitalizeName = function(name){
  const names = name.split(' ');
  const namesUpper = [];

  for( const n of names){
  //  namesUpper.push(n[0].toUpperCase() +  n.slice(1));
  namesUpper.push(n.replace(n[0],n[0].toUpperCase()));
  }
console.log(namesUpper.join(' '));
}

capitalizeName('jessica and smith davis')
capitalizeName('nomad haven')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CpitalizedName 이라는 함수에 대입되는 문자열을 우선 띄워쓰기를 기준으로 나눈 다음,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나눠진 문자를 names라는 배열에 대입한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;names의 배열에 있는 element 의 개수만큼 for 반복문을 실행하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for 반복문 동안 names의 0번째 인덱스 문자열의 0번째 문자는 대문자로 교체한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0번째 글자가 대문자로 교체된 0번째부터 ~ n번째 인덱스의 문자열들을 namesUpper이라는 배열에 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복문이 끝난 뒤&amp;nbsp; namseUpper 이라는 배열에 있는 문자들을 join 메서드로 합치는데, 합쳐진 문자열 사이에 ' '라는 공백문자를 둔다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 해당 함수를 사용한 코드를 출력한 것이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;br /&gt;Jessica And Smith Davis&lt;br /&gt;Nomad Haven&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;원하는 글자수 만큼 특수 문자를 채워주는 메서드 padStart, padEnd&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 10번째 번호중 마지막 세번짜 글자만 보이고 나머지 7개 글자는 * 처리를 하고 싶다면 어떻게 해야할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카드의 cvc 번호처럼 말이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 상황에서 쓸수 있는 메서드 역시 존재한다. padStart 메서드와 padEnd 메서드를 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686300838873&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;
//Padding
const message = 'Go to gate 23!'
console.log(message.padStart(20, '+').padEnd(30,'+')); 
console.log('Nomad'.padStart(20,'+').padEnd(30,'+'));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;++++++Go to gate 23!++++++++++&lt;br /&gt;+++++++++++++++Nomad++++++++++&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드와 출력문을 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'Go to gate 23!' 이라는 문자열에 padStart(20,'+') 를 적용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 의미는 총 20글자중 'Go to gate 23!'문자열의 문자 개수인&amp;nbsp; 14글자(공백포함)를 제외한 나머지 글자는 앞에 +라는 문자6개를 추가해서 20개를 맞추겠다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PadStart(맞추고 싶은 글자수,'글자수 맞추기 위해 채울 문자') 를 적용한다면, 글자수를 채울 문자가 앞에서 부터 채워진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;++++++Go to gate 23! 까지의 문자열이 완성된 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;이렇게 완성된 문자열 뒤에 .padEnd(30,'+') 이라는 메서드가 적용됐다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;해당 메서드는 30개의 글자수를 맞추는데 '&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;++++++Go to gate 23!&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;'의 글자수 20개를 제외한, 나머지 10개 문자는 뒤에 +를 채워서 맞추겠다는 말이다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;따라서 &lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;'&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;++++++Go to gate 23!' 뒤편에 +가 10개 붙은 것이 보인다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;아래의 &lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;+++++++++++++++Nomad++++++++++ 역시 위와 같은 방식을 통해 이해하면 이해가 될 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;해당 padStart기능을 이용하여 작성된 함수가 maskCreditCard라는 함수다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;해당 함수는입력된 번호의 마지막 네글자를 제외하고 나머지는 모두 *로 바꾸는 함수다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당함수는&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;lice메서드를 통해서 마지막 4글자를 잘라낸다음 last 변수에 대입힌다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;그다음 last 변수에 padStart 메서드를 적용하는데,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;메서드에서는 str.length를 이용해 알아낸 원래 문자열의 길이만큼, 앞에서 '*'로 채우겠다는 옵션이 적용되었다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686486443538&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const maskCreditCard  = function(number){
  const str =  number + ''; // 빈문자 더해주면 자료형이 문자열로 변환
  const last = str.slice(-4);
  return last.padStart(str.length, '*');
}

console.log(maskCreditCard(43213829103830)); 
console.log(maskCreditCard(123442342342342));
console.log(maskCreditCard('234534523534523'));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 함수를 적용한 코드를 출력하면 아래와 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;br /&gt;**********3830&lt;br /&gt;***********2342&lt;br /&gt;***********4523&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;문자열을 원하는 수만큼 반복하게 하는 메서드 repeat&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 메서드에는 문자열을 원하는 횟수만큼 반복하는 메서드 역시 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 비행기 방송은 같은 내용을 5번 정도 반복하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 방송 내용을 반복하는 함수를 repeat 함수로도 만들 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686491183418&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Repeat
const message2 = 'Bad weather... All Departures Delayed... ';
console.log(message2.repeat(5)); 

const planesInLine =function(n){
  console.log(`There are ${n} planes in line ${'✈️'.repeat(n)}`);
}

planesInLine(5);
planesInLine(3);
planesInLine(10);&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;출력화면&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Bad&amp;nbsp;weather...&amp;nbsp;All&amp;nbsp;Departures&amp;nbsp;Delayed...&amp;nbsp;Bad&amp;nbsp;weather...&amp;nbsp;All&amp;nbsp;Departures&amp;nbsp;Delayed...&amp;nbsp;Bad&amp;nbsp;weather...&amp;nbsp;All&amp;nbsp;Departures&amp;nbsp;Delayed...&amp;nbsp;Bad&amp;nbsp;weather...&amp;nbsp;All&amp;nbsp;Departures&amp;nbsp;Delayed...&amp;nbsp;Bad&amp;nbsp;weather...&amp;nbsp;All&amp;nbsp;Departures&amp;nbsp;Delayed...&amp;nbsp;&lt;br /&gt;There are 5 planes in line ✈️✈️✈️✈️✈️&lt;br /&gt;There are 3 planes in line ✈️✈️✈️&lt;br /&gt;There are 10 planes in line ✈️✈️✈️✈️✈️✈️✈️✈️✈️✈️&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;message2 문자열에 repeat(5)를 적용한뒤 출력하면 해당 문자열이 반복되어 출력되는 게 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 전제 문자열에만 반복을 적용하는 게 아니라, 문자의 일부에만 반복을 적용할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;${'✈️'.repeat(n)} 와 같이 특정 부분에만 메서드를 적용한 것을 봐도 함수가 잘 출력되는게 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>자바스크립트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/168</guid>
      <comments>https://developerson.tistory.com/168#entry168comment</comments>
      <pubDate>Sun, 11 Jun 2023 22:47:02 +0900</pubDate>
    </item>
    <item>
      <title>[JS/자바스크립트] 문자열을 소문자 변환, 대문자 변환, 자르기, 교체하기 하는 방법</title>
      <link>https://developerson.tistory.com/167</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 문자열을 편집하는 다양한 메서드를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 메서드는 무척 유용한 게 많아서 잘 알아두면 나중에 큰 도움이 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 문자열 string 을 편집하는 메서드는 무엇이있는지 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;문자열을 대소문자로 변환하는 기능&lt;/blockquote&gt;
&lt;pre id=&quot;code_1686312818552&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const airline = 'TAP Air Portugal';

console.log(airline.toLowerCase()); //tap air portugal
console.log(airline.toUpperCase()); //TAP AIR PORTUGAL
console.log('nomad'.toUpperCase());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.toLowerCase() 메서드를 이용하면 문자열을 한번에 소문자로 바꾸는 게 가능하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.toUpperCase() 메서드를 이용하면 문자열을 한번에 대문자로 바꾸는 게 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;출력화면&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;br /&gt;tap&amp;nbsp;air&amp;nbsp;portugal&lt;br /&gt;TAP AIR PORTUGAL&lt;br /&gt;NOMAD&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 위의 기능을 종합하여 첫번째 글자는 대문자, 그 이후 글자는 소문자로 맞추는 조정도 가능할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686313035648&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const passenger = 'nOmaD'; 
const passengerLower = passenger.toLowerCase();
const passengerCorrect =
  passengerLower[0].toUpperCase() + passengerLower.slice(1);

console.log(passengerCorrect); //Nomad 로 교정&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.문자열을 모두 소문자로 toLowerCase 메서드를 통해서 모두 소문자로 교체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 교체된 문자열의 0번째 인덱스 문자를 toUpperCase 메서드를 이용해서 대문자로 교체, 1번째 인덱스 이후의 문자열 slice 메서드로 자르기(1번째 인덱스 문자열 포함) 해서 두 문자열 +로 결합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;출력화면&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Nomad&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;문자열 비교하기&lt;/blockquote&gt;
&lt;pre id=&quot;code_1686313487413&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Comparing email
const email = 'hello@nomad.io';
const loginEmail = '  Hello@nomad.Io \n';
const normalizedEmail = loginEmail.toLowerCase().trim();

console.log(normalizedEmail); //hello@nomad.io
console.log(email === normalizedEmail); //true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 email의 문자열과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;loginEmail의 문자열은 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 loginEmail의 문자열을 toLowerCase 메서드로 소문자 변환 후, trim 메서드를 통해 공백을 삭제한 뒤 normalizaedEmail 변수에 넣는다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;normalizedEmail 변수는 결과적으로 email 변수의 문자열과 같게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 email === &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;normalizedEmail&lt;span&gt; 을 비교하면 true 가 출력된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;hello@nomad.io&lt;br /&gt;true&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문자열에 특정 단어가 있는지 확인하고 싶을댄 includes 메서드를 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;includes('특정단어')를 입력해서 출력하면, 해당 단어가 있을시 true 아닐시 false가 나온다.&lt;/p&gt;
&lt;pre id=&quot;code_1686314363624&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Booleans
const plane = 'Airbus A320neo';
console.log(plane.includes('A320')); //true
console.log(plane.includes('Boeing')); //false&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;출력화면&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;nbsp;true&lt;br /&gt;&amp;nbsp;false&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 특정 위치에 특정 문자열이 있는지 알고 싶다면 startsWith 메서드와 endsWith 메서드를 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문자열이 특정 문자열로 시작하는지 알고 싶을 때 쓰는 문자열은 startsWtih이고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문자열이 특정 문자열로 끝나는지 알고 싶을 때 쓰는 문자열은 endsWith이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686314590518&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const plane = 'Airbus A320neo';
console.log(plane.startsWith('Air')); //true
console.log(plane.startsWith('Airb')); //true
console.log(plane.startsWith('bus')); //false

if (plane.startsWith('Airbus') &amp;amp;&amp;amp; plane.endsWith('neo')) {
  console.log('Part of the New Airbus Family');
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;출력화면&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;true&lt;br /&gt;true&lt;br /&gt;false&lt;br /&gt;Part of the New Airbus Family&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;문자열 교체하기&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 문자열에서 일부만 변경하고 싶을때가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럴때는 replace 메서드를 쓰면 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;replace('바꾸고 싶은 문자열','교체할 문자열') 과 같은 순서로 코드를 작성하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686313736446&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//replacing
const priceGB = '288,97F';
const priceUS = priceGB.replace('F', '$').replace(',', '.');
console.log(priceUS);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 288,97F는 영국의 파운드 화폐 단위를 표현한 문자열이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문자를 미국의 달러 단위로 바꾸고자 한다면 288.97$가 될수있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 문자열에서 ','와'F' 만 바꾸면 될 일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 쓰는게 replace 메서드다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;출력화면&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;288.97$&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예시 문장처럼 띄워쓰기 없이 붙어있는 문자열만 되는게 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공백이 있는 긴 문장역시 교체가 가능하다는 점이 replace 메서드의 장점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686313892068&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const announcement =
  'All passengsers come to boarding door 23. Boadring door 23!';

console.log(announcement.replace('door', 'gate')); //오로지 첫번째 단어만 바꿔줌
console.log(announcement.replaceAll('door', 'gate')); //모든 단어가 바뀜
console.log(announcement.replaceAll(/door/g, 'gate')); //모든 단어가 바뀜. g는 global&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 replace 메서드를 쓰면 바꾸고자 하는 문자열의 첫번째 단어만 바뀐다. 그 뒤에 변환하고자 하는 단어가 나와도 이미 첫번째 단어가 바껴서 더이상 바뀌지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 console.log(announcement.replace('door', 'gate')); 를 출력하면&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;All passengsers come to boarding gate 23. Boadring door 23!&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 같이 첫번째 door만 gate로 변경되며, 두번때 door은 그대로 남아있는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 모든 단어를 교체하고 싶다면 replace대신 repalceAll을 쓰면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;console.log(announcement.replaceAll('door', 'gate')); 를 출력하면&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;All passengsers come to boarding gate 23. Boadring gate 23!&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 같이 모든 door이 gate라는 단어로 바뀐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 replace를 쓰는 대신에 모든 단어를 바꾸고 싶다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바꾸고 싶은 단어 앞뒤를 슬래쉬(/)로 감싸고 g를 붙여주면 된다. g는 global이라는 뜻으로 모든 단어를 광역적으로 바꾸겠다는 의미이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;console.log(announcement.replaceAll(/door/g, 'gate')); 를 출력하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;All&amp;nbsp;passengsers&amp;nbsp;come&amp;nbsp;to&amp;nbsp;boarding&amp;nbsp;gate&amp;nbsp;23.&amp;nbsp;Boadring&amp;nbsp;gate&amp;nbsp;23!&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;replace를 썼음에도 불구하고 모든 door가 gate로 바뀐걸 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 다룬 내용을 조합해서 간단한 함수를 만들수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bagge에 knife와 gun이 포함되면 탑승할수 없다는 메세지를 출력하는 함수를 만든다고 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 문자열을 toLowerCase 메서드를 이용해서 모두 소문자로 만든 뒤,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;includes 메서드로 찾고자 하는 문자열을 걸러내면&amp;nbsp; 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686298549570&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Practice Exercise
const checkBaggage = function (items) {
  const baggage = items.toLowerCase();
  if (baggage.includes('knife') || baggage.includes('gun')) {
    console.log('You are not allowed on board');
  } else {
    console.log('Welcome abroad');
  }
};

checkBaggage('I have a laptop, some Food and a pocket Knife');
checkBaggage('socks and camera');
checkBaggage('Got some snacks and a gun for proctection');&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;출력화면&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;You are not allowed on board&lt;br /&gt;Welcome abroad&lt;br /&gt;You are not allowed on board&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>자바스크립트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/167</guid>
      <comments>https://developerson.tistory.com/167#entry167comment</comments>
      <pubDate>Fri, 9 Jun 2023 21:50:47 +0900</pubDate>
    </item>
    <item>
      <title>[JS, JavaScript] Map 자료구조 개념 이해를 체크하기 위한  간단한 코딩문제 풀어보기</title>
      <link>https://developerson.tistory.com/166</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gameEnvets 라는 이름의 Map은 축구 경기동안 발생한 사건과 시간의 자료를 담은 자료구조이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번재 key 값은 경기 시작 이후 사건이 발생한 시간이며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번재 value 값은 해당 시간에 발생한 사건이다.&lt;/p&gt;
&lt;pre id=&quot;code_1685684029088&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const gameEvents = new Map([
  [17, '⚽ GOAL'],
  [36, '  Substitution'],
  [47, '⚽ GOAL'],
  [61, '  Substitution'],
  [64, '  Yellow card'],
  [69, '  Red card'],
  [70, '  Substitution'],
  [72, '  Substitution'],
  [76, '⚽ GOAL'],
  [80, '⚽ GOAL'],
  [92, '  Yellow card'],
]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 사항을 참고하여 아래의 문제를 JS 언어로 풀어보자.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Q1)&amp;nbsp; 중복이 없는 사건으로만 구성된 events라는 배열을 만들어라.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;A1)&lt;/blockquote&gt;
&lt;pre id=&quot;code_1685684198628&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const events = [...new Set(gameEvents.values())];
console.log(events);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;32&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lawMw/btsiswmrWya/YwJmn53hNkOKFb87frr3j0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lawMw/btsiswmrWya/YwJmn53hNkOKFb87frr3j0/img.png&quot; data-alt=&quot;출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lawMw/btsiswmrWya/YwJmn53hNkOKFb87frr3j0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlawMw%2FbtsiswmrWya%2FYwJmn53hNkOKFb87frr3j0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;490&quot; height=&quot;32&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;32&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Q2)&amp;nbsp; 경기가 끝난 후 64분 경의 옐로우 카드는 부적격 판정을 받았다. 해당 시간에 일어난 사건은 삭제하라.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;A2)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685684522158&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gameEvents.delete(64);
console.log(gameEvents);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AKbPg/btsir36dOhE/8PdRUlDXroFUKe6WxcrjJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AKbPg/btsir36dOhE/8PdRUlDXroFUKe6WxcrjJk/img.png&quot; data-alt=&quot;출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AKbPg/btsir36dOhE/8PdRUlDXroFUKe6WxcrjJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAKbPg%2Fbtsir36dOhE%2F8PdRUlDXroFUKe6WxcrjJk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;837&quot; height=&quot;237&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;237&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp;Q3) 경기 시간 동안 평균 몇분마다 사건이 일어났는지 계산하고 해당 결과를 출력하라.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;A3)&lt;br /&gt;&lt;br /&gt;
&lt;pre id=&quot;code_1685684832363&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//마지막 key 값 찾기(마지막 시간 찾기 위해서)
const time = [...gameEvents.keys()].pop();
console.log(time);

//이벤트 일어나는 시간의 평균 출력
console.log(
  `An event happened, on average, every ${time / gameEvents.size} minutes`
);​&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;343&quot; data-origin-height=&quot;46&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p3JSO/btsiqUVSC6e/ly1N8duGKhGb53fkptiQlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p3JSO/btsiqUVSC6e/ly1N8duGKhGb53fkptiQlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p3JSO/btsiqUVSC6e/ly1N8duGKhGb53fkptiQlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp3JSO%2FbtsiqUVSC6e%2Fly1N8duGKhGb53fkptiQlK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;343&quot; height=&quot;46&quot; data-origin-width=&quot;343&quot; data-origin-height=&quot;46&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Q4) 각 이벤트가 일어날 때마다&amp;nbsp; [FIRST HALF] 17: ⚽ GOAL 과 같은 형식의 문장을 출력하라. 참고로 45분 이후 발생한 사건은 후반전이므로 [FIRST HALF] 대신 [SENCOND HALF]로 출력되어야 한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;A4)&lt;br /&gt;
&lt;pre id=&quot;code_1685685048212&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (const [min, event] of gameEvents) {
  const half = min &amp;lt;= 45 ? 'First' : 'Second';
  console.log(`[${half} HALF] ${min}: ${event}`);
}​&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;262&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rQTwM/btsir1AHiKR/mxw0KGT2ftdMqeqEPjS0LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rQTwM/btsir1AHiKR/mxw0KGT2ftdMqeqEPjS0LK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rQTwM/btsir1AHiKR/mxw0KGT2ftdMqeqEPjS0LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrQTwM%2Fbtsir1AHiKR%2Fmxw0KGT2ftdMqeqEPjS0LK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;262&quot; height=&quot;203&quot; data-origin-width=&quot;262&quot; data-origin-height=&quot;203&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>MAP</category>
      <category>자바스크립트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/166</guid>
      <comments>https://developerson.tistory.com/166#entry166comment</comments>
      <pubDate>Fri, 2 Jun 2023 14:53:21 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript, JS ]Arrays vs Sets / Maps vs Objects 언제 어디서 써야할까? / data structure 사용 케이스 / 자료 구조체 사용 경우</title>
      <link>https://developerson.tistory.com/165</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;데이터의 출처는 세가지 종류가 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1.&amp;nbsp;프로그램&amp;nbsp;그&amp;nbsp;자체&amp;nbsp;:&amp;nbsp;데이터가&amp;nbsp;&amp;nbsp;소스&amp;nbsp;코드&amp;nbsp;자체에&amp;nbsp;적혀있는&amp;nbsp;경우&amp;nbsp;(status&amp;nbsp;messages)&lt;br /&gt;2.&amp;nbsp;UI를&amp;nbsp;통해서&amp;nbsp;:&amp;nbsp;유저의&amp;nbsp;input이나&amp;nbsp;DOM으로&amp;nbsp;쓰여진&amp;nbsp;데이터(tasks&amp;nbsp;in&amp;nbsp;todo&amp;nbsp;app)&lt;br /&gt;3.&amp;nbsp;외부의&amp;nbsp;출처를&amp;nbsp;통해&amp;nbsp;:&amp;nbsp;Web&amp;nbsp;API&amp;nbsp;통해서&amp;nbsp;불러오는&amp;nbsp;데이터들&amp;nbsp;(recipe&amp;nbsp;obejct)&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 데이터들은 collection of data 데이터의 집합이며 Data structure&amp;nbsp; 자료 구조체를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;만약 데이터가 단순한 리스트에 대한 값이라면   Arrays or Set 이 적절하다.&lt;br /&gt;만약 데이터가 key,value 값이 필요하다면  Object or Map 이 적절하다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;key는 vlaue를 설명하는 역할을 한다. 따라서 value에 추가적 설명이 필요하다면 Object or Map을 써야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;web API는 JSON 형태로 전달되는 Data로서 JSON은 key,value가 필수적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 JSON을 받아서 활용할때 역시 Object, Map을 쓰는게 적절하다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 Array와 Set는 각각 어떤 경우에 써야할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;Array&amp;nbsp;VS&amp;nbsp;SET&amp;nbsp;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;두 자료 구조는 value를 설명할 필요가 없는 list에 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Arrays 배열&amp;nbsp;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1685582400786&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tasks = ['Code','Eat','Code']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 케이스 :&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;순서가 있는 value가 필요할때 사용.&lt;/li&gt;
&lt;li&gt;데이터를 수정할 필요가 있을때 사용.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Set&lt;/blockquote&gt;
&lt;pre id=&quot;code_1685582472607&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tasks = new Set(['Code','Eat','Code'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;사용 케이스:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고유한 값만이 필요할때 사용.&lt;/li&gt;
&lt;li&gt;고성능의 퍼포먼스가 필요할때 사용.(Set를 통해&amp;nbsp; item을 검색하거나 삭제하는건 Array를 이용하는 것보다 10배가 더 빠름)&lt;/li&gt;
&lt;li&gt;Array의 중복값을 삭제할때&amp;nbsp;사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;Object&amp;nbsp;VS&amp;nbsp;MAP&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Object&amp;nbsp;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1685582613158&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;task = {
  task: 'Code',
  date : 'today',
  repeat: true
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;사용 케이스:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;key/value를 저장하는 좀더 고전적인 자료구조, 오래된 만큼 많이 쓰인다.&lt;/li&gt;
&lt;li&gt;작성하기 쉽고&amp;nbsp;.과&amp;nbsp;[]통해서&amp;nbsp;접근하기&amp;nbsp;쉽다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;힘수를 포함해야 할때 사용한다. 함수를 메서드처럼 사용가능.&lt;/li&gt;
&lt;li&gt;JSON을&amp;nbsp;작업해야할&amp;nbsp;때&amp;nbsp;사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Maps&lt;/blockquote&gt;
&lt;pre id=&quot;code_1685582680717&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;task =new Map([
  ['task', 'Code'],
  ['date', 'today'],
  [false, 'Start coding']

]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;사용 케이스 :&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오브젝트보다 더 나은 성능&lt;/li&gt;
&lt;li&gt;key값으로 어떤 데이터 타입도 사용가능.&lt;/li&gt;
&lt;li&gt;iterate하기&amp;nbsp;쉽다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;자료구조체의 크기를 파악하기 쉽다. (size메서드 사용)&lt;/li&gt;
&lt;li&gt;간편하게 key값을 vluae값과 묶고 싶을때 사용&lt;/li&gt;
&lt;li&gt;key 값이 문자열이 아닐때 사용.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>array</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>object</category>
      <category>배열</category>
      <category>자료구조</category>
      <category>자바스크립트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/165</guid>
      <comments>https://developerson.tistory.com/165#entry165comment</comments>
      <pubDate>Thu, 1 Jun 2023 10:28:12 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript / Map 과 스프레드 연산자 사용해서 간단한 Quiz앱 만들기 / Map을 Object 와 Array 배열로 변환하는 방법</title>
      <link>https://developerson.tistory.com/164</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전의 글을 통해서 Map이라는 자료 구조를 배워봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 Map을 어떻게 활용할수 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드와 같이 question이라는 이름을 가지는 Map 형태의 자료 구조가 있다고 하자.&lt;/p&gt;
&lt;pre id=&quot;code_1685521510369&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const question = new Map([
  ['question', 'What is the best programming language in the world?'],
  [1, 'C'],
  [2, 'Java'],
  [3, 'JavaScript'],
  ['correct', 3],
  [true, 'Correct  '],
  [false, 'Try again'],
]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 만들고 싶은 앱은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. prompt창에서 &quot;What is the best progamming language in the world?' 라는 질문이 뜨고 -&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 해당 질문에 3이라는 번호(JavaScript라는 value의 key값)를 입력하면 -&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Correct 라는 대답이 뜨게 하는 앱이다. -&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 3외의 답을 입력하면 Try again 이라는 대답이 뜨게 처리하고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 코드를 작성해야 할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 기능의 퀴즈앱을 만드는데는 if문 조차 필요 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1685521502408&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;
const answer = Number(prompt('Your answer'));
console.log(question.get(question.get('correct') === answer));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. promprt 창을 띄워 입력값을 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 입력 값을 숫자로 전환해 변수 answer에 대입한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 대입된 answer이란 변수가 key인 correct의&amp;nbsp; value 값 3과 일치한다면 true가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. true라는 key 값의 value인 Correct 라는 답이 출력되게 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2RzX5/btsh590VASL/kEHESpzCAIg143aRXeNbbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2RzX5/btsh590VASL/kEHESpzCAIg143aRXeNbbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2RzX5/btsh590VASL/kEHESpzCAIg143aRXeNbbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2RzX5%2Fbtsh590VASL%2FkEHESpzCAIg143aRXeNbbK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;452&quot; height=&quot;146&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 코드를 작성했다면,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프롬프트 창에 3이라는 숫자를 입력해보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;105&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DKWHc/btsibeUbM8p/KI3SQLkqkirk4BCe5QfKVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DKWHc/btsibeUbM8p/KI3SQLkqkirk4BCe5QfKVK/img.png&quot; data-alt=&quot;이 같은 출력문이 나올 것이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DKWHc/btsibeUbM8p/KI3SQLkqkirk4BCe5QfKVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDKWHc%2FbtsibeUbM8p%2FKI3SQLkqkirk4BCe5QfKVK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;105&quot; height=&quot;50&quot; data-origin-width=&quot;105&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이 같은 출력문이 나올 것이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Map이라는 자료구조의 기능에 대해 이해하면 위와 같이 여러 방면으로 활용 가능하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Map 자료구조는 iterable해서 반복문으로도 활용 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1685580234732&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (const [key, value] of question) {
  if (typeof key === 'number') console.log(`Answer ${key}: ${value}`);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R9AXY/btsiaFduHoH/IILYtvkulYPUowlkTouup0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R9AXY/btsiaFduHoH/IILYtvkulYPUowlkTouup0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R9AXY/btsiaFduHoH/IILYtvkulYPUowlkTouup0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR9AXY%2FbtsiaFduHoH%2FIILYtvkulYPUowlkTouup0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;385&quot; height=&quot;81&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;81&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위의 코드를 출력하면 key와 value가 하나씩 짝을 맞춰 출력되는게 보인다. 즉 Map은 iterable한 자료구조라는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object가 interable한 것 처럼 유사한 형태의&amp;nbsp; Map도 Interable 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 Map 자료구조를 출력한 출력문이다.&lt;/p&gt;
&lt;div style=&quot;background-color: #272822; color: #f8f8f2;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #f8f8f2;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #f8f8f2;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #a6e22e;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #f8f8f2;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #f8f8f2;&quot;&gt;question&lt;/span&gt;&lt;span style=&quot;color: #f8f8f2;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo5Wcw/btsicLRqUiC/063TCIfKTXaUtB2QQQKQ81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo5Wcw/btsicLRqUiC/063TCIfKTXaUtB2QQQKQ81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo5Wcw/btsicLRqUiC/063TCIfKTXaUtB2QQQKQ81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo5Wcw%2FbtsicLRqUiC%2F063TCIfKTXaUtB2QQQKQ81%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;182&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 Object 자료구조를 entries 메서드를 통해 출력한 출력문이다.&lt;/p&gt;
&lt;pre id=&quot;code_1685581144649&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const weekdays = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'];


const openingHours = {
  [weekdays[3]]: {
    open: 12,
    close: 22,
  },
  [weekdays[4]]: {
    open: 11,
    close: 23,
  },
  [weekdays[5]]: {
    open: 0, // Open 24 hours
    close: 24,
  },
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #272822; color: #f8f8f2;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #f8f8f2;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #f8f8f2;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #a6e22e;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #f8f8f2;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #66d9ef;&quot;&gt;Object&lt;/span&gt;&lt;span style=&quot;color: #f8f8f2;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #a6e22e;&quot;&gt;entries&lt;/span&gt;&lt;span style=&quot;color: #f8f8f2;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #f8f8f2;&quot;&gt;openingHours&lt;/span&gt;&lt;span style=&quot;color: #f8f8f2;&quot;&gt;));&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCPBBX/btsibe0YcZF/CiMnSY3HNhoanlRQhFj06K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCPBBX/btsibe0YcZF/CiMnSY3HNhoanlRQhFj06K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCPBBX/btsibe0YcZF/CiMnSY3HNhoanlRQhFj06K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCPBBX%2Fbtsibe0YcZF%2FCiMnSY3HNhoanlRQhFj06K%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;346&quot; height=&quot;115&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;115&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 자료구조의 출력문을 보면 공통점이 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;element 안에 배열이 있으며 배열이 key값과&amp;nbsp; value 값을 가진다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 유사성 때문에 Object 는 Map으로 전환 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object를 Map으로 전환하는 방법 또한 간단하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;new Map에 기존에 존재하는 Object를 넣고 새로운 변수를 선언만 해두면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1685522502778&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Convert object to map
console.log(Object.entries(openingHours));
const hoursMap = new Map(Object.entries(openingHours));
console.log(hoursMap);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 방법으로 선언된 hoursMap이라는 Map은&amp;nbsp; 아래와 같이 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ohjRQ/btsibeUcvhI/BSQ21vLJSprCCPWjsKksik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ohjRQ/btsibeUcvhI/BSQ21vLJSprCCPWjsKksik/img.png&quot; data-alt=&quot;Map으로 변환된 Object&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ohjRQ/btsibeUcvhI/BSQ21vLJSprCCPWjsKksik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FohjRQ%2FbtsibeUcvhI%2FBSQ21vLJSprCCPWjsKksik%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;397&quot; height=&quot;122&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Map으로 변환된 Object&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 map을 array 배열로 변환하는 방법도 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 맵의 element 를 스프레드 연산자를 이용하여 배열에 대입하고 key, value 메서드를 쓰면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1685521742962&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log([...question.keys()]);
console.log([...question.values()]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 코드를 출력하면 key 값만 담긴 배열, value 값만 담긴 배열이 잘 출력되는 게 보인다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8QtUN/btsiaipjVNZ/CjQKKxoGTNbKdAKDUTk6Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8QtUN/btsiaipjVNZ/CjQKKxoGTNbKdAKDUTk6Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8QtUN/btsiaipjVNZ/CjQKKxoGTNbKdAKDUTk6Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8QtUN%2FbtsiaipjVNZ%2FCjQKKxoGTNbKdAKDUTk6Ak%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;881&quot; height=&quot;48&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>자바스크립트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/164</guid>
      <comments>https://developerson.tistory.com/164#entry164comment</comments>
      <pubDate>Thu, 1 Jun 2023 10:12:30 +0900</pubDate>
    </item>
    <item>
      <title>Map 을 이용해서 다양한 형태의 key값을 가지는 구조체 만들기 / Array, Set의 보완 / Map 구조체의 메서드 알아보기</title>
      <link>https://developerson.tistory.com/163</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에는 다양한 형태의 구조체가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;array는 element별로 인덱스가 있고 인덱스 별로 요소를 구분, 외부에서 요소를 호출도 가능하다. 단점은 요소별로 중복된 값이 있을때 중복 값을 제거하거나 중복된 인수의 값을 구하기가 번거롭다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Set는 중복된 element를 여러번 추가해도 고유한 element 하나만 요소로 가지는 특징이 있다. 따라서 배열내의 중복값을 제거하거나 고유한 요소의 수를 파악할때 좋은 구조체이다. 단점은 Set에는 인덱스가 없다. 따라서 외부에서 Set내의 element를 key값을 통해서 호출하지 못한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;array와 Set의 아쉬운 점을 보완하는 구조체가 바로 Map이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 Map의 사용 사례를 알아보자.&lt;/p&gt;
&lt;pre id=&quot;code_1685491743294&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const rest = new Map();
rest.set('name', 'Classico Italiano');
rest.set(1, 'Firenze', 'Italy');

console.log(rest.set(2, 'Lisbon', 'Portugal'));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rest라는 이름의 Map 구조체를 new Map(); 을 통해 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 구조체에 key,value값을 추가하고 싶으면 .set(key,value) 메소드를 쓰면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 key/value 값으로 name/Classico Italinao&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 key/value 값으로 1/ Firenze, Italy&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세번재 key/value 값은 console 창 출력을 통해서 2/Lisbon,Portugal 이 추가되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 실제 콘솔창에서는 어떻게 출력될까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;22&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coak78/btsh32zyrUx/NOe1OHJcSygMkxb1bKKVIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coak78/btsh32zyrUx/NOe1OHJcSygMkxb1bKKVIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coak78/btsh32zyrUx/NOe1OHJcSygMkxb1bKKVIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcoak78%2Fbtsh32zyrUx%2FNOe1OHJcSygMkxb1bKKVIk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;587&quot; height=&quot;22&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;22&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 key/value 값으로 name/Classico Italinao 는 그대로 추가 되었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;두번째 key/value 값으로 1/ Firenze만 출력되었다, Italy는 없다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;세번재 key/value 값은 console 창 출력을 통해서 2/Lisbon 만 출력되었다. Portugal은 없다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;.set(key,value) 형식으로 Map에 값을 추가할 때,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;key,value 값 다음에 다른 값을 추가해도key,value 값만 추가 됨을 알수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한 name이라는 key값처럼 string이 key 값이 될수도 있지만, 1,2 처럼 숫자가 key 값이 될수도 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그렇다면 계속 .set() 메서드를 이용해서 Map에 값을 추가해보도록 하자&lt;/p&gt;
&lt;pre id=&quot;code_1685492327451&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rest
  .set('categories', ['Italian', 'Pizzeria', 'Vegetarian', 'Organic'])
  .set('open', 11)
  .set('close', 23)
  .set(true, 'We are open')
  .set(false, 'We are closed');

console.log(rest.get('name'));
console.log(rest.get('true'));
console.log(rest.get(true));
console.log(rest.get('1'));
console.log(rest.get(1));&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;차례로 name이라는 key값을 get 메서드를 통해 value 호출,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;'true'라는 문자열 key값을 get 메서드를 통해 value 호출,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;true라는 boolean key값을 get 메서드를 통해 value 호출,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;'1'이라는 문자열 key값을 get 메서드를 통해 value 호출,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1이라는 숫자 key값을 get 메서드를 통해 value 호출.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;결과를 살펴보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;148&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvDGgO/btsh4PUfYqT/oBNpgPWqt0nEzV4hsDgaWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvDGgO/btsh4PUfYqT/oBNpgPWqt0nEzV4hsDgaWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvDGgO/btsh4PUfYqT/oBNpgPWqt0nEzV4hsDgaWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvDGgO%2Fbtsh4PUfYqT%2FoBNpgPWqt0nEzV4hsDgaWK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;218&quot; height=&quot;152&quot; data-origin-width=&quot;148&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;차례로 name이라는 key값을 get 메서드를 통해 value 호출  Classico Italiano라는 value 값 호출&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;'true'라는 문자열&lt;span&gt;&amp;nbsp;&lt;/span&gt;key값을 get 메서드를 통해 value 호출  true라는 문자열 key값이 존재하지 않는다 처리해 undefined.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;true라는 boolean&lt;span&gt;&amp;nbsp;&lt;/span&gt;key값을 get 메서드를 통해 value 호출 true라는 boolean의 value값인 'We are Open&quot; 호출&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;'1'이라는 문자열&lt;span&gt;&amp;nbsp;&lt;/span&gt;key값을 get 메서드를 통해 value 호출  1이라는 문자열 key값이 존재하지 않는다 처리해 undefined.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1이라는 숫자&lt;span&gt;&amp;nbsp;&lt;/span&gt;key값을 get 메서드를 통해 value 호출 1이란 숫자 key값의 value 값인 Firenze 호출&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이를 통해서 Map 구조체는 key값이 string인지, 숫자인지, boolean인지 모두 구분 가능하다는 사실을 알게 되었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그렇다면 이렇게 key 값이 구분 가능한 Map을 어떻게 활용할 수 있을까?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685492973090&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const time = 21;
console.log(rest.get(time &amp;gt; rest.get('open') &amp;amp;&amp;amp; time &amp;lt; rest.get('close')));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;21이라는 값을 가지는 time 값이 'open'의 value 값 보다 크고 close 보다 작을 경우를 가정헀을때 해당 사실은 참이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 출력문 안에 있는 조건은 true가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 rest에서 true라는 키값이 가지는 value는 'We are Open'이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 true의 value 값인 we are open이 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;117&quot; data-origin-height=&quot;21&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/whVhd/btsh2GjG6a8/fkNCXJZJhtTYkwZeYdF6p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/whVhd/btsh2GjG6a8/fkNCXJZJhtTYkwZeYdF6p1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/whVhd/btsh2GjG6a8/fkNCXJZJhtTYkwZeYdF6p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwhVhd%2Fbtsh2GjG6a8%2FfkNCXJZJhtTYkwZeYdF6p1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;117&quot; height=&quot;21&quot; data-origin-width=&quot;117&quot; data-origin-height=&quot;21&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떠한 값에 대한 조건이 true, false 일때 이에 대한 값을 출력할수 있도록 Map에서 만들수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 Map 구조체는 해당 구조체 안에 특정한 값이 있는지 역시 확인 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 구조체 안의 element를 삭제하는 것 역시 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 구조체 안에 몇개의 element가 있는지 확인하는 것도 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 has / delete / size 메서드를 통해서 확인, 삭제, 갯수 확인을 한 코드이다.&lt;/p&gt;
&lt;pre id=&quot;code_1685493542792&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Map 구조체 안에 특정한 요소가 있는지 확인하는 메서드 has
console.log(rest.has('categories')); //true

//Map 구조체 안에 특정한 요소를 삭제하는 메서드 delete
rest.delete(2);
console.log(rest.has(2)); //false

//Map 구조체 안에 있는 요소의 개수를 확인하는 메서드 size
console.log(rest.size); //7&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;88&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cW29SV/btsh2nkoCnv/2kXVaQFGda9ToF2c6IT7aK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cW29SV/btsh2nkoCnv/2kXVaQFGda9ToF2c6IT7aK/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cW29SV/btsh2nkoCnv/2kXVaQFGda9ToF2c6IT7aK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcW29SV%2Fbtsh2nkoCnv%2F2kXVaQFGda9ToF2c6IT7aK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;88&quot; height=&quot;57&quot; data-origin-width=&quot;88&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 말했듯 Map 구조체는 string, boolean, number 을 구분해서 key 값을 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 Map 구조체의 key값으로 array배열도 처리가 가능할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[1,2] 라는 배열을 key값으로 추가하고 'Test'라는 Value를 추가했다.&lt;/p&gt;
&lt;pre id=&quot;code_1685493714602&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rest.set([1, 2], 'Test');
console.log(rest); //key: (2) [1, 2] value: &quot;Test&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf9MNh/btsh4OuhjZJ/aKDOfWUWMCNqjgy1xP5Gf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf9MNh/btsh4OuhjZJ/aKDOfWUWMCNqjgy1xP5Gf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf9MNh/btsh4OuhjZJ/aKDOfWUWMCNqjgy1xP5Gf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf9MNh%2Fbtsh4OuhjZJ%2FaKDOfWUWMCNqjgy1xP5Gf1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;831&quot; height=&quot;200&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Map 구조체 전체를 출력헀을 시에는 7번 인덱스에 key 값으로 배열 [1,2]가 잘 들어간 것이 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 해당 값을 출력하면&lt;/p&gt;
&lt;pre id=&quot;code_1685493993864&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(rest.get([1, 2]));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;97&quot; data-origin-height=&quot;13&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HfH04/btshYdJtt8O/GDdlkTkAB9WQZVuE9V43pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HfH04/btshYdJtt8O/GDdlkTkAB9WQZVuE9V43pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HfH04/btshYdJtt8O/GDdlkTkAB9WQZVuE9V43pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHfH04%2FbtshYdJtt8O%2FGDdlkTkAB9WQZVuE9V43pk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;97&quot; height=&quot;13&quot; data-origin-width=&quot;97&quot; data-origin-height=&quot;13&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;undefine이 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 이렇게 되나 chatGPT 한테 물어보니까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;rest.get([1, 2])에서 [1, 2]는 배열로 키로 사용되고 있습니다. &lt;br /&gt;그러나 Map의 get() 메서드는 키를 정확히 일치하는 값으로 찾기 위해 동등성 비교(===)를 수행합니다. &lt;br /&gt;&lt;br /&gt;배열은 참조 타입이므로 동등성 비교를 할 때는 같은 참조를 가리켜야 일치합니다. &lt;br /&gt;console.log(rest.get([1, 2])); 부분에서 [1, 2]는 배열 객체를 생성하여 사용한 것입니다. &lt;br /&gt;이 때, 코드가 실행될 때마다 [1, 2]라는 배열 객체가 매번 새롭게 생성됩니다.&lt;br /&gt;&lt;br /&gt;따라서, rest.get([1, 2])는 매번 새로운 배열 객체로 인식되어, &lt;br /&gt;기존에 rest Map에 저장된 [1, 2]와 일치하는 키를 찾지 못하고 undefined를 반환하게 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴땐 그럼 어떻게 배열을 Map의 key값으로 사용할수 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;const 를 이용해서 먼저 배열을 선언해주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1685493719307&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//배열을 key로 사용하기 위해선 const를 사용해서 배열을 선언
const arr = [1, 2];
rest.set(arr, 'Test');
console.log(rest.get(arr)); //Test&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 arr를 통해서 먼저 선언된 배열을&amp;nbsp; key값으로 추가하면 get 메서드로 key값을 찾아도 Test라는 Value가 잘 호출된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Map의 독특한 기능은 DOM도 key 값으로 쓸수 있다는 점이다.&lt;/p&gt;
&lt;pre id=&quot;code_1685494424072&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rest.set(document.querySelector('h1'), 'Heading'); //콘솔창에서 key 클릭하면 hi부분 하이라이트됨
console.log(rest);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드처럼&amp;nbsp; h1을 지정한 DOM 을 key 값으로 넣은 다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 구조체를 클릭한다 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;1034&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnbtoU/btsh3CgMnOQ/UnOMremK3cfgbLmrrefCW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnbtoU/btsh3CgMnOQ/UnOMremK3cfgbLmrrefCW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnbtoU/btsh3CgMnOQ/UnOMremK3cfgbLmrrefCW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnbtoU%2Fbtsh3CgMnOQ%2FUnOMremK3cfgbLmrrefCW0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1274&quot; height=&quot;1034&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;1034&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력된 key값인 h1을 클릭하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘솔창의 웹페이지에서 h1 부분에 해당하는 문자열이 하이라이트 처리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>MAP</category>
      <category>object</category>
      <category>구조체</category>
      <category>자료구조</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/163</guid>
      <comments>https://developerson.tistory.com/163#entry163comment</comments>
      <pubDate>Wed, 31 May 2023 09:59:46 +0900</pubDate>
    </item>
    <item>
      <title>Set 이용해서 Array 의 중복 삭제하기, Set 이용해서 중복 없는 배열 만들기</title>
      <link>https://developerson.tistory.com/162</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;array를 만들다보면&amp;nbsp; array&amp;nbsp; 내부의 element들이 중복되는 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 array 내에서 중복되는 값을 제외한 겹치지 않는 element들만 알고 싶거나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복되지 않는 고유한 element의 개수를 알고 싶다면, 이 중복 element 를 어떻게 처리해야 하나 멈칫 할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때는 Set를 이용하면 쉽게 배열의 중복값을 제거할 수 있으며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;고유한 element 의 갯수를 알수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 Set이 어떤 것인지부터 알아보자.&lt;/p&gt;
&lt;pre id=&quot;code_1685005318396&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const ordersSet = new Set([
  'Pasta',
  'Pizza',
  'Pizza',
  'Risotto',
  'Pasta',
  'Pizza',
]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 ordersSet라는 Set가 있다고 하자. 이 세트에는 Pizza와 Pasta라는 중복되는&amp;nbsp; 요소가 존재한다.&lt;/p&gt;
&lt;pre id=&quot;code_1685005456380&quot; class=&quot;1c&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(ordersSet);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 Set를 출력하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLfJFS/btshj4fkMp0/LLGmdrN0qIbYDlV5YKPvNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLfJFS/btshj4fkMp0/LLGmdrN0qIbYDlV5YKPvNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLfJFS/btshj4fkMp0/LLGmdrN0qIbYDlV5YKPvNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLfJFS%2Fbtshj4fkMp0%2FLLGmdrN0qIbYDlV5YKPvNK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;322&quot; height=&quot;122&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복값을 삭제한 고유한 요소들만 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 문자열로 구성된 Set를 출력한다면,&lt;/p&gt;
&lt;pre id=&quot;code_1685005461616&quot; class=&quot;gams&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(new Set('Nomad'));​&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;293&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnMQuz/btshp1Pxjox/Tf7TFIylxhSjT1enCNf65k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnMQuz/btshp1Pxjox/Tf7TFIylxhSjT1enCNf65k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnMQuz/btshp1Pxjox/Tf7TFIylxhSjT1enCNf65k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnMQuz%2Fbtshp1Pxjox%2FTf7TFIylxhSjT1enCNf65k%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;293&quot; height=&quot;162&quot; data-origin-width=&quot;293&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 하나하나를 요소로 삼아 Set가 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set 에는&amp;nbsp; Array의 length와 비슷한 메소드가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 size이다.&lt;/p&gt;
&lt;pre id=&quot;code_1685005552077&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(ordersSet.size);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 Set에 size라는 메소드를 적용하면 중복되지 않는 고유한 값의 개수 3이 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복값 까지 모두 element로 처리해서 중복되는 원소까지 제외하지 않고 출력하는 length와는 미묘한 차이가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 특정 element가 해당 Set에 있는지 확인하기 위한 메소드로 has 가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685074509621&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(ordersSet.has('Pizza')); //array의 include와 비슷
console.log(ordersSet.has('Bread'));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pizza같이 세트에 존재하는 요소를 넣으면&amp;nbsp; true가 출력되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bread 같이 존재하지 않는 요소를 넣으면 false가 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 include와 비슷한 기능이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 add/delete 메소드를 통해서 세트에 요소를 추가 삭제도 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;add와 delete 를 사용한 예시를 보자.&lt;/p&gt;
&lt;pre id=&quot;code_1685074592029&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ordersSet.add('Garlic Bread');
ordersSet.add('Garlic Bread');
ordersSet.delete('Risotto')
//ordersSet.clear();// 모든 element 삭제하는 메소드

console.log(ordersSet); //Garlic Bread  두개가 추가됐지만 갈릭브레드 하나만 추가됨. 리조토 삭제됨.
console.log(ordersSet[0]); // udefined 출력된 이유 : Set에는 인덱스가 없다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;217&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m3G4v/btshrSrrmT7/0RagwQUK1dOV9K2Fq0IkJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m3G4v/btshrSrrmT7/0RagwQUK1dOV9K2Fq0IkJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m3G4v/btshrSrrmT7/0RagwQUK1dOV9K2Fq0IkJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm3G4v%2FbtshrSrrmT7%2F0RagwQUK1dOV9K2Fq0IkJ1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;217&quot; height=&quot;140&quot; data-origin-width=&quot;217&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 add를 통해&amp;nbsp; Galic Bread를 두번 추가했지만 결국 출력되는 갈릭브레드는 딱 1개 밖에 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 값의 요소를 계속 추가해봤자 늘어나지 않는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 delete메소드를 이용해 삭제한 Risotto는 삭제되어 보이지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 요소를 한번에 삭제하고 싶다면 clear 메소드를 써도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set에 add 를 통해서 같은 값의 요소를 추가해도 하나의 고유한 값만 추가되는 이유는 무엇일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set는 가지고 있는 모든 값을 유니크한 value로 인식하기 떄문이다. 따라서 Set에는 중복된 value를 구분하기 위한 index역시 없다. Set의 모든 요소는 고유한 value이므로 인덱스가 필요 없기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;orderSet[0]이라는 인덱스를 출력해봤자 undefined만 출력되는 이유다. 그 이유로 Set는 요소가 있는지 확인하는 메소드 has, 추가 삭제하는 메소드 add delete 밖에 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 외부에서 set의 value도 가져오지 못한다. set에는 인덱스가 없기 때문이다. 외부에서 value를 가져오고 싶을떄는 인덱스를 이용하는 array를 사용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Set의 요소는&amp;nbsp; iterable하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for문 안에서 Set를 돌리면 각각의 요소가 잘 출력되긴한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685075339072&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(const order of ordersSet) console.log(order);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;141&quot; data-origin-height=&quot;63&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvyA6U/btshxUPjfWO/rkxn6B0EzndWQP7jdX94a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvyA6U/btshxUPjfWO/rkxn6B0EzndWQP7jdX94a0/img.png&quot; data-alt=&quot;출력결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvyA6U/btshxUPjfWO/rkxn6B0EzndWQP7jdX94a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvyA6U%2FbtshxUPjfWO%2Frkxn6B0EzndWQP7jdX94a0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;141&quot; height=&quot;63&quot; data-origin-width=&quot;141&quot; data-origin-height=&quot;63&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set의 한계로 인해 실제 사용 범위가 줄어들지도 모른다 생각하겠지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set는 Array와 함께 사용할때 훌륭한 시너지를 낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set를 활용해&amp;nbsp; Array의 중복제거를 할수도 있으며, Array에서 중복된 값을 제외한 고유한 요소의 개수도 알수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1685075500067&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const staff = ['Waiter','Chef','Waiter','Manager','Chef','Waiter'];
const staffUnique = [...new Set(staff)]; //set 을 이용해서 중복이 삭제된 새로운 array생성.
console.log(staffUnique);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스태프의 역할을 표기한 staff라는 배열에서 중복되는 역할이 삭제된 값만 알고 싶다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열을 생성하는 괄호안에 스프레드 연산자인 ...를 쓴다음, 기존 staff 배열의 값을 담은 새로운 Set를 생성하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp2ozQ/btshqwW1qdc/U8Z7Jrkp3frC0Dvj7t4zt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp2ozQ/btshqwW1qdc/U8Z7Jrkp3frC0Dvj7t4zt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp2ozQ/btshqwW1qdc/U8Z7Jrkp3frC0Dvj7t4zt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp2ozQ%2FbtshqwW1qdc%2FU8Z7Jrkp3frC0Dvj7t4zt1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;247&quot; height=&quot;105&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력하면 중복된 값이 제외된 고유한 값 3개만 배열로 생성된 걸 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열에서 중복된 값을 제외한 고유한 요소의 갯수를 알수도 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1685075684512&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//배열에서 중복된 값을 제외한 고유한 엘레멘트의 개수만 알고싶을때
console.log(new Set(['Waiter','Chef','Waiter','Manager','Chef','Waiter']).size);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set의 size 메소드만 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력시 중복되지 않는 요소의 갯수인 3이 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굳이 배열 뿐만아니라, 문자열의 중복되지 않는 글자 개수를 알고 싶을때도 Set를 쓰면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1685004976274&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;
//문자 열에서 중복되지 않은 고유한 문자의 개수 알고싶을때.
console.log(new Set('nomadhavensheaven').size);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nomadhavensheaven 이라는 문자열에서 중복된 알파벳이 제거된 고유한 문자열의 갯수 9가 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>array</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>set</category>
      <category>value</category>
      <category>자바스크립트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/162</guid>
      <comments>https://developerson.tistory.com/162#entry162comment</comments>
      <pubDate>Fri, 26 May 2023 13:37:04 +0900</pubDate>
    </item>
    <item>
      <title>Object 안에 또 Object 가 있는 복잡한 Object의 값 모두 불러오기 / keys, values, entries 이용하기</title>
      <link>https://developerson.tistory.com/161</link>
      <description>&lt;pre id=&quot;code_1684749132169&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const weekdays = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'];

const openingHours = {
  [weekdays[3]]: {
    open: 12,
    close: 22,
  },
  [weekdays[4]]: {
    open: 11,
    close: 23,
  },
  [weekdays[5]]: {
    open: 0, // Open 24 hours
    close: 24,
  },
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 obejct가 있다고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;openingHours라는 object는 value가 또 obejct 로 구성된 복잡한 object다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 오브젝트에서 원하는 key,value 값만 쏙쏙 뽑아서 쓰고 싶으면 어떻게 할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 property name, key, value를 이용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 object에서 property name만 가져오는 방법을 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684749348348&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//property Names
const properties = Object.keys(openingHours);
console.log(properties);

let openStr = `We are opne on ${properties.length}
days: `;

console.log(`We are open on ${properties.length} days`);

for (const day of properties) {
  openStr += `${day},`;
}
console.log(openStr);​&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object.keys() 괄호부분에 본인이 property name(key) 값만 가져오고 싶은 오브젝트 이름을 넣으면 끝이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;property의 개수를 알고싶으면 properties.length 를 쓰면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복문을 써서 propertyn name&amp;nbsp; &amp;nbsp;하나하나 출력하는 것 역시 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 출력하면 아래와 같은 값이 확인 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bli2j4/btsg0nL3P18/WXSqeZ3pgqYxdYLTkmypsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bli2j4/btsg0nL3P18/WXSqeZ3pgqYxdYLTkmypsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bli2j4/btsg0nL3P18/WXSqeZ3pgqYxdYLTkmypsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbli2j4%2Fbtsg0nL3P18%2FWXSqeZ3pgqYxdYLTkmypsk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;247&quot; height=&quot;160&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Property value만 출력한는 것 역시 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object.values()의 괄호한에 Object 이름만 쓰면 끝.&lt;/p&gt;
&lt;pre id=&quot;code_1684749605464&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Property Values

const values = Object.values(openingHours);
console.log(values);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;출력하면 다음과 같은 결과가 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi2TFG/btsg26vEN5a/gHMNBXe1n92cwkl4pOxEH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi2TFG/btsg26vEN5a/gHMNBXe1n92cwkl4pOxEH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi2TFG/btsg26vEN5a/gHMNBXe1n92cwkl4pOxEH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi2TFG%2Fbtsg26vEN5a%2FgHMNBXe1n92cwkl4pOxEH1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;341&quot; height=&quot;105&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;key 따로&amp;nbsp; value 따로 말고 전체 값을 자유롭게 가져와 쓰고 싶다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시 가능하다. entries 메소드를 쓰면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684749700890&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Entrie Objext
const entries = Object.entries(openingHours);

//[key,value]]
//value가  object 라서 destructure 해준다.
for (const [key, {open,close}] of entries) {
  console.log(`On ${key} we open at ${open} and close at ${close}`);

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;entries 메소드를 쓰면 key값 value값 모두 불러올 수 있으며, object 처럼 구성된 value값 역시 위의 코드처럼 호출 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OGZi8/btsg0u5pnp4/6KKOsT1BTuqVTUVkjX1NJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OGZi8/btsg0u5pnp4/6KKOsT1BTuqVTUVkjX1NJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OGZi8/btsg0u5pnp4/6KKOsT1BTuqVTUVkjX1NJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOGZi8%2Fbtsg0u5pnp4%2F6KKOsT1BTuqVTUVkjX1NJK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;370&quot; height=&quot;66&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드의 반복문을 출력하면 key값 value 값, value 값 안의&amp;nbsp; value값 까지 모두 출력된게 보인다.&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>JavaScript</category>
      <category>JS</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/161</guid>
      <comments>https://developerson.tistory.com/161#entry161comment</comments>
      <pubDate>Mon, 22 May 2023 19:04:19 +0900</pubDate>
    </item>
    <item>
      <title>podman 명령어로  linux에 contianer 설치하기</title>
      <link>https://developerson.tistory.com/160</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.설치&lt;/h3&gt;
&lt;pre id=&quot;code_1684482486813&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dnf install podman -y
adduser user3
echo 1111 | passwd --stdin user3
ssh user3@localhost&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-dnf 명령어로 podmad 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-컨테이너 사용할 유저 user3 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-user3의 비밀번호 1111으로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-user3의 계정으로 접속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684482341095&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#user3으로 로그인한 상태
podman pull quay.io/centos7/httpd-24-centos7:latest
podman run -d -p8080:8080 --name container-web quay.io/centos7/httpd-24-centos7:latest
podman ps
curl localhost:8080&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-podman pull 명령어로 컨테이너 이미지 불러오기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*컨테이너 이미지는 컨테이너화된 애플리케이션을 실행하기 위한 실행 환경과 애플리케이션 코드 및 종속성을 포함하는 패키지. 이미지는 애플리케이션을 실행하는 데 필요한 모든 파일 시스템, 라이브러리, 실행 파일, 환경 변수 등을 하나의 단위로 묶어놓은 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-podman run&amp;nbsp; 명령어 이용해서 컨테이너 실행.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-d 옵션으로 컨테이너 백그라운드에서 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-p 옵션으로 호스트의 8080 포트와 컨테이너 8080포트 연결. 이를 통해 호스트 8080 포트로 들어오는 요청이 컨테이너 8080포트로 전달.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--name 으로 실행중인 컨테이너에 &quot;container-web&quot; 이름 지정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #111827; text-align: left;&quot;&gt;quay.io/centos7/httpd-24-centos7:latest 실행할 컨테이너 이미지 이름&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-podman ps로 상태 확인하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgUbYS/btsgBQg3CXx/VdBM3Ncio70AgZpCOgSOyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgUbYS/btsgBQg3CXx/VdBM3Ncio70AgZpCOgSOyk/img.png&quot; data-alt=&quot;이렇게 컨테이너 이름이 보여아지 잘 구성된것&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgUbYS/btsgBQg3CXx/VdBM3Ncio70AgZpCOgSOyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgUbYS%2FbtsgBQg3CXx%2FVdBM3Ncio70AgZpCOgSOyk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1162&quot; height=&quot;87&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이렇게 컨테이너 이름이 보여아지 잘 구성된것&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-8080 포트와 잘 연결되는지 확인하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1105&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9ViAY/btsgDJHIyBV/HxcGFKNlPDFmaZEVjkBcA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9ViAY/btsgDJHIyBV/HxcGFKNlPDFmaZEVjkBcA0/img.png&quot; data-alt=&quot;이런식으로 인덱스 파일 같은게 출력되어야지 잘 연결되는 것&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9ViAY/btsgDJHIyBV/HxcGFKNlPDFmaZEVjkBcA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9ViAY%2FbtsgDJHIyBV%2FHxcGFKNlPDFmaZEVjkBcA0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1105&quot; height=&quot;850&quot; data-origin-width=&quot;1105&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이런식으로 인덱스 파일 같은게 출력되어야지 잘 연결되는 것&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 컨테이너를 사용자 최적화&lt;/h4&gt;
&lt;pre id=&quot;code_1684482403044&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#user3으로 로그인한 상태
podman generate systemd --new --files --name container-web
mkdir -p ~/.config/systemd/user
cp container-web.service ~/.config/systemd/user
systemctl daemon-reload --user
systemctl enable --now container-web --user&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-podman generate systemd ~ 명령어로&amp;nbsp; Podman 컨테이너를 시스템 서비스로 실행하기 위한 systemd 유닛 파일을 생성.&lt;/p&gt;
&lt;p style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Podman은 컨테이너를 실행하는 동안 시스템 서비스로 관리할 수 있도록 systemd 유닛 파일을 생성하는 기능을 제공. 이를 통해 컨테이너가 시스템 부팅 시 자동으로 시작되거나, 장애가 발생했을 때 재시작되는 등의 이점을 얻는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 명령어를 실행하면 container-web이라는 이름의 새로운 유닛파일이 생성되고 해당 파일은 /etc/systemd/system&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디렉토리에 저장.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;systemd를 사용해서 컨테이너 시작, 중지, 재시작 가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-mkdir 명령어로 ~/.config/systemd/user의 디렉토리 생성. 생성되니 디렉토리는 특정한 사용자에서(user3) systemd 서비스 파일 관리하기 위해 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-cp~ 명령어로 container-web.service 파일을 위에서 생성한 디렉토리 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;~/.config/systemd/user 에 복사. 이 역시 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;container-web.service 파일을 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;특정한 사용자(user3)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;systemd 서비스로 등록하기 위한 작업.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-systemctl deamon-reload~ 명령어로 현재 사용자(user3)의 systemd&amp;nbsp; 인스턴스에 대한 구성파일 변경사항을 다시 로드. 이 명령어 실행시 변경된 유닛파일 내용 적용된다. systemd가 수정된 구성을 인식하고 해당 유닛 사용할 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-systemctl enable~&amp;nbsp; 명령어로 contaienr-web 서비스를 사용자 레벨에서 활성화 하고, 즉시 시작해도록 하는 명렁어. 이를 통해 container-web 서비스가 사용자 세션에서 자동으로 시작되도록 설정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#root계정으로 다시 로그인 한뒤, 아래의 명령문 실행&lt;/p&gt;
&lt;pre id=&quot;code_1684485083941&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;loginctl enable-linger user3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;loginctl enable-linger containeruser 명령어는 특정 사용자인 user3이 로그아웃 상태일 때에도 시스템에 로그인된 상태를 유지하도록 설정하는 명령어.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;linger 옵션은 사용자의 로그인 세션을 유지하는 기능을 활성화.&lt;/p&gt;
&lt;p style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로 로그아웃한 사용자는 시스템이 재부팅되거나 로그아웃된 상태에서 실행 중인 서비스 또는 프로세스가 종료됨. 그러나 linger를 사용하면 사용자가 로그아웃한 후에도 해당 사용자의 서비스 또는 프로세스가 계속 실행될수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위의 명령어를 통해 user3이라는 사용자 계정에 대해, linger를 활성화하겠다는 의미.&lt;/p&gt;
&lt;p style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이를 통해 해당 사용자가 로그아웃된 상태에서도 설정된 서비스나 프로세스가 계속 실행될 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. container 서비스 잘 작동하는지 확인하기&lt;/h4&gt;
&lt;pre id=&quot;code_1684485275095&quot; class=&quot;crmsh&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;systemctl status container-web --user
curl localhost:8080&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;systemctl staus 명령어로 contianer-web 서비스의 상태 확인.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/os0KY/btsgDMq6CUA/w8trG1AiZAbUREim6Ix8uK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/os0KY/btsgDMq6CUA/w8trG1AiZAbUREim6Ix8uK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/os0KY/btsgDMq6CUA/w8trG1AiZAbUREim6Ix8uK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fos0KY%2FbtsgDMq6CUA%2Fw8trG1AiZAbUREim6Ix8uK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1152&quot; height=&quot;286&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Active 상태를 확인하니 잘 작동되는게 확인 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;curl 명령문으로 포트 8080에 잘 연결되는 것도 확인하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 구성 완료!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;006&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/006.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/006.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 방법으로 구성하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684486478186&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#user3 로그인 한 상태에서 구성

#wget 명령어는 주어진 URL에서 파일을 다운로드하는 명령어
dnf install wget

wget https://raw.githubusercontent.com/tangt64/training_memos/main/opensource/linux-101/materials/Containerfile


#현재 디렉토리(.)에 위치한 Dockerfile을 사용하여 컨테이너 이미지를 빌드. 
#-t 옵션은 이미지에 태그를 지정하는 옵션으로, web-container라는 이름으로 이미지를 태그.
#빌드된 이미지는 로컬 컨테이너 이미지 저장소에 저장, web-container라는 태그로 해당 이미지를 참조.
podman build . -t web-container

#현재 시스템에 저장된 컨테이너 이미지 목록을 보여주는 명령어
podman images

mkdir htdocs/

echo &quot;hello systemd service container&quot; &amp;gt; htdocs/index.html

#&quot;new-web-container&quot;라는 이름으로 &quot;localhost/web-container&quot; 이미지를 기반으로 컨테이너를 생성,실행. 
#컨테이너 내부의 &quot;/var/www/html/&quot; 디렉토리는 호스트의 &quot;/home/user3/htdocs/&quot; 디렉토리와 연결. 
#웹 서비스를 호스트에서 컨테이너로 전달. 
#호스트의 8081 포트는 컨테이너의 80 포트와 연결되어 웹 서비스에 접근.
podman run -d --name new-web-container -v /home/user3/htdocs/:/var/www/html/:Z -p 8081:80 localhost/web-container

curl http://localhost:8081&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;curl 명령어 실행시&amp;nbsp; hello systemd service container 가 잘 출력되어야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lpQSW/btsgEayArkh/82JbWcMRKFKgWPQB90R2Uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lpQSW/btsgEayArkh/82JbWcMRKFKgWPQB90R2Uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lpQSW/btsgEayArkh/82JbWcMRKFKgWPQB90R2Uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlpQSW%2FbtsgEayArkh%2F82JbWcMRKFKgWPQB90R2Uk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;448&quot; height=&quot;45&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 다운 받은 파일 링크&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://raw.githubusercontent.com/tangt64/training_memos/main/opensource/linux-101/materials/Containerfile&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://raw.githubusercontent.com/tangt64/training_memos/main/opensource/linux-101/materials/Containerfile&lt;/a&gt;&lt;/p&gt;</description>
      <category>Container</category>
      <category>Linux</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/160</guid>
      <comments>https://developerson.tistory.com/160#entry160comment</comments>
      <pubDate>Fri, 19 May 2023 17:38:07 +0900</pubDate>
    </item>
    <item>
      <title>파일 형태의 스왑 swap 생성하는 방법 / dd 명령어 사용해서 파일 형태 스왑swap 만들기</title>
      <link>https://developerson.tistory.com/159</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. dd 명령어를 사용해서 크기가 1G 이고 개수가 1개인 swap.data 만들기&lt;/h3&gt;
&lt;pre id=&quot;code_1684473057533&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#명령문
dd if=/dev/zero of=/swap.data bs=1G count=1&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1684473398968&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#출력내용
1
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4.36341 s, 246 MB/s&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*왜 옵션으로 if=/dev/zero 를 설정해야 하는 가에 대한 chatGPT의 답변&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;dd 명령어는 입력 소스(if 옵션)에서 데이터를 읽어서 출력 대상(of 옵션)에 씁니다. &lt;br /&gt;&lt;br /&gt;데이터를 읽는 입력 소스로 /dev/zero를 사용하는 이유는 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;/dev/zero는 리눅스 시스템에서 제공하는 가상 장치 파일입니다. &lt;br /&gt;이 파일에서는 무한히 많은 0(널 바이트)를 읽을 수 있습니다. &lt;br /&gt;dd 명령어의 if 옵션에 /dev/zero를 설정하면, /dev/zero에서 0을 계속 읽어서 출력 대상인 swap.data에 씁니다.&lt;br /&gt;&lt;br /&gt;if=/dev/zero를 설정하는 이유는 실제로 스왑 파일을 생성할 때, &lt;br /&gt;초기화되지 않은 공간을 0으로 채워줘야 하기 때문입니다. &lt;br /&gt;스왑 파일은 보안을 위해 기존 데이터가 완전히 지워져야 하므로, &lt;br /&gt;/dev/zero에서 0을 읽어서 스왑 파일에 쓰는 것이 일반적인 방법입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. 생성된 swap.data 파일이 data 파일인지 확인하기&lt;/h3&gt;
&lt;pre id=&quot;code_1684473451559&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;file swap.data&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v1fCl/btsgu6Sv1Z9/RF9tAQbx9KHYYfvm8nvij0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v1fCl/btsgu6Sv1Z9/RF9tAQbx9KHYYfvm8nvij0/img.png&quot; data-alt=&quot;출력결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v1fCl/btsgu6Sv1Z9/RF9tAQbx9KHYYfvm8nvij0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv1fCl%2Fbtsgu6Sv1Z9%2FRF9tAQbx9KHYYfvm8nvij0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;387&quot; height=&quot;47&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;47&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. 생성된 swap.data 파일을 swap 으로 만들기(swap.data&amp;nbsp; 파일은 /tmp 경로에 생성됨)&lt;/h3&gt;
&lt;pre id=&quot;code_1684473643274&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkswap /tmp/swap.data&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TkndM/btsgBe2X10O/ONQY3ysWfRba2G9byT1fGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TkndM/btsgBe2X10O/ONQY3ysWfRba2G9byT1fGK/img.png&quot; data-alt=&quot;출력결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TkndM/btsgBe2X10O/ONQY3ysWfRba2G9byT1fGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTkndM%2FbtsgBe2X10O%2FONQY3ysWfRba2G9byT1fGK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;120&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. swap의 권한 지정하고 확인하기&lt;/h3&gt;
&lt;pre id=&quot;code_1684473833888&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#권한 지정
chmod 0600 swap.data

#권한확인
ls -lh swap.data&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;46&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RLO3B/btsgBn6zy1E/toNRRNJc8fYE5LqiSYAZrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RLO3B/btsgBn6zy1E/toNRRNJc8fYE5LqiSYAZrK/img.png&quot; data-alt=&quot;권한이 잘 변경되었다면 이렇게 -rw------- 뜬다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RLO3B/btsgBn6zy1E/toNRRNJc8fYE5LqiSYAZrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRLO3B%2FbtsgBn6zy1E%2FtoNRRNJc8fYE5LqiSYAZrK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;533&quot; height=&quot;46&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;46&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;권한이 잘 변경되었다면 이렇게 -rw------- 뜬다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;5. 생성된 swap을 swapon 명령어로 활성화 하기&lt;/h3&gt;
&lt;pre id=&quot;code_1684473918070&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;swapon swap.data&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;6. 잘 활성화 됐는지 swapon 명령어로 확인 하기&lt;/h3&gt;
&lt;pre id=&quot;code_1684474028122&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;swapon -s&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I8lXZ/btsgB2AGq6e/i4GxEulevCrQTOtmZ92Yqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I8lXZ/btsgB2AGq6e/i4GxEulevCrQTOtmZ92Yqk/img.png&quot; data-alt=&quot;잘 활성화 됐으면 생성한 swap.data가 목록에 보인다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I8lXZ/btsgB2AGq6e/i4GxEulevCrQTOtmZ92Yqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI8lXZ%2FbtsgB2AGq6e%2Fi4GxEulevCrQTOtmZ92Yqk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;567&quot; height=&quot;147&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;147&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;잘 활성화 됐으면 생성한 swap.data가 목록에 보인다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;6. 활성화된 swap 을 swapoff 명령어로 중지하고, 중지 됐는지 확인&amp;nbsp;&lt;/h3&gt;
&lt;pre id=&quot;code_1684474214902&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#swap 중지 명령
swapoff /tmp/swap.data

#중지 여부 확인
swapon -s&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AZ8K9/btsgB3sOrFB/nX6GNxqI8sreIWy3ZsjsZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AZ8K9/btsgB3sOrFB/nX6GNxqI8sreIWy3ZsjsZK/img.png&quot; data-alt=&quot;잘 중지 되었다면 swap.data가 보이지 않는다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AZ8K9/btsgB3sOrFB/nX6GNxqI8sreIWy3ZsjsZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAZ8K9%2FbtsgB3sOrFB%2FnX6GNxqI8sreIWy3ZsjsZK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;577&quot; height=&quot;106&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;잘 중지 되었다면 swap.data가 보이지 않는다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코딩 기록/linux</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/159</guid>
      <comments>https://developerson.tistory.com/159#entry159comment</comments>
      <pubDate>Fri, 19 May 2023 14:31:04 +0900</pubDate>
    </item>
    <item>
      <title>검색된 파일의 전체를 한번에 다 압축 하는 리눅스 명령문 쓰기 / find와 exec 이용 / + 이용해서 한번에 압축</title>
      <link>https://developerson.tistory.com/158</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 공부를 하면서 혼자 아래의 문제를 풀고 있었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 user2의 파일을 찾아서 /tmp/user2-banned/에 저장한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저장된 파일은 xz으로 압축하여 user2-banned이름으로 /root/에 저장한다.&lt;/li&gt;
&lt;li&gt;반드시 확장자는 올바르게 표기가 되어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 user2의 파일을 찾아야 하니&lt;/p&gt;
&lt;pre id=&quot;code_1684459751922&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;find / -user user2 -type f -print&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 입력했고 아래와 같은 파일들이 검색됐다.&lt;/p&gt;
&lt;pre id=&quot;code_1684459770430&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/home/user2/.bash_logout
/home/user2/.bash_profile
/home/user2/.bashrc
find: &amp;lsquo;/proc/7227/task/7227/fdinfo/6&amp;rsquo;: No such file or directory
find: &amp;lsquo;/proc/7227/fdinfo/5&amp;rsquo;: No such file or directory
/root/.bash_logout
/root/.bash_profile
/root/.bashrc
/var/spool/mail/user2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색된 파일들을 모두 압축하고 새로운 이름에 저장하려고&amp;nbsp; 아래의 코드를 입력했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684459841278&quot; class=&quot;crmsh&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; find / -user user2 -type f -exec tar cf /tmp/user2-banned/user2-banned.xz {} \;​&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;/tmp/user2-banned/ 경로에 user2-banned.xz라는 파일이 생기긴 했는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;압축 파일의 내부 파일을 볼수있는&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684459885966&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tar -tf user2-banned.xz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 실행해서 해당파일을 보니 검색된 파일중&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/var/spool/mail/user2 만 저장되어 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 파일을 압축하고 싶은데 어떻게 해야되냐 GPT한테 물어보니 아래와 같은 명령어를 실행하라 했다. {} 뒤애 + 가 새롭게 붙었다.&lt;/p&gt;
&lt;pre id=&quot;code_1684459975217&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;find / -user user2 -type f -exec tar rf /tmp/user2-banned/user2-banned.xz {} +&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt;변경된 부분은 &lt;/span&gt;-exec&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt; 뒤에 &lt;/span&gt;tar&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt; 명령어를 실행하는 부분입니다. &lt;/span&gt;rf&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt; 옵션을 사용하여 압축 파일에 파일을 추가하고, &lt;/span&gt;{}&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt;는 &lt;/span&gt;find&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt; 명령어가 찾은 파일을 나타냅니다. &lt;/span&gt;+&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt;는 여러 개의 파일을 한 번에 처리하도록 지정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;+를 붙여야지 여러 파일을 한번에 압축할 수 있나보다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;위와 같이 명령문을 작성하고 다시 압축된 파일을 확인해보니&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o60aF/btsgqCRAUBS/SK02b9UeW9tK9VhJ7OsewK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o60aF/btsgqCRAUBS/SK02b9UeW9tK9VhJ7OsewK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o60aF/btsgqCRAUBS/SK02b9UeW9tK9VhJ7OsewK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo60aF%2FbtsgqCRAUBS%2FSK02b9UeW9tK9VhJ7OsewK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;566&quot; height=&quot;182&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 파일들이 생성된 압축 파일 내에 잘 복사된게 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;응용 연습문제 풀기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 user1이 가지고 있는 모든 파일을 생성한다.&lt;/li&gt;
&lt;li&gt;1메가보다 작은 크기인 파일만 복사한다.&lt;/li&gt;
&lt;li&gt;복사된 파일은 bzip2로 복사하여 /root/에 user1-files라는 이름으로 저장한다.&lt;/li&gt;
&lt;li&gt;반드시 확장자는 올바르게 표기가 되어 있어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성된 명령문&lt;/p&gt;
&lt;pre id=&quot;code_1684461256012&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; find / -user user1 -size -1M -type f -exec tar rf /root/user1-fiels.bzip2 {} +&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 기록/linux</category>
      <category>Linux</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/158</guid>
      <comments>https://developerson.tistory.com/158#entry158comment</comments>
      <pubDate>Fri, 19 May 2023 10:36:29 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript / Optional Chaining을 이용해서 코드 훨씬 간결하게 작성하기 +  nullish coalescing operator 이용해서 optional chaining 기능 극대화  / '.?' 만 찍으면 끝</title>
      <link>https://developerson.tistory.com/157</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 코드가 있다고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 코드에서 object restaurant는 자신의 object 외부에있는 또다른 object인 openingHour를 불러와서 key와 value를 구성하고 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1684418768743&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'use strict';

const weekdays = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'];

const openingHours = {
  [weekdays[3]]: {
    open: 12,
    close: 22,
  },
  [weekdays[4]]: {
    open: 11,
    close: 23,
  },
  [weekdays[5]]: {
    open: 0, // Open 24 hours
    close: 24,
  },
};


const restaurant = {
  name: 'Classico Italiano',
  location: 'Via Angelo Tavanti 23, Firenze, Italy',
  categories: ['Italian', 'Pizzeria', 'Vegetarian', 'Organic'],
  starterMenu: ['Focaccia', 'Bruschetta', 'Garlic Bread', 'Caprese Salad'],
  mainMenu: ['Pizza', 'Pasta', 'Risotto'],

  //ES6 enhanced object literals
  openingHours,

  order(starterIndex, mainIndex) {
    return [this.starterMenu[starterIndex], this.mainMenu[mainIndex]];
  },

  orderDeliver({ starterIndex = 1, mainIndex = 0, time = '20:00', address }) {
    console.log(
      `Order Received! ${this.starterMenu[starterIndex]} and ${this.mainMenu[mainIndex]} will be deliverd to ${address} at ${time}`
    );
  },

  orderPasta(ing1, ing2, ing3) {
    console.log(
      `Here is your delicious pasta with ${ing1}, ${ing2} and ${ing3}`
    );
  },

  orderPizza(mainIngredient, ...otherIngredients) {
    console.log(mainIngredient);
    console.log(otherIngredients);
  },
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 외부에서 해당 레스토랑의 월요일(mon) open 시간을 요청한다고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 외부의 요청시간에 답하기 위해서 restaurant 의 openingHour key 값에 있는 월요일(mon) 시간의 value 을 보내야 겠지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;restaurant object가 사용하는 외부의 openingHour object 내부에는 월요일(mon)의 key 값과 value 값이 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 막무가내로 아래처럼 출력하면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684419198044&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(restaurant.openingHours.mon.open);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIkSCg/btsgsSs2zHE/uqXHUK0GBElbYcAEieJiu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIkSCg/btsgsSs2zHE/uqXHUK0GBElbYcAEieJiu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIkSCg/btsgsSs2zHE/uqXHUK0GBElbYcAEieJiu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIkSCg%2FbtsgsSs2zHE%2FuqXHUK0GBElbYcAEieJiu0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;646&quot; height=&quot;71&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;71&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 오류가 난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 오류를 피하는게 가장 급한일이라 생각하고, 바쁜대로 undefined 값이라도 보내야 된다고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if문을 사용해서 아래와 같이 작성할수도 있겠지만,&lt;/p&gt;
&lt;pre id=&quot;code_1684419431814&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//restaurant의 open 시간이 있고 open 시간 중 월요일(mon)이 있으면 해당 시간을 출력
if (restaurant.openingHours &amp;amp;&amp;amp; restaurant.openingHours.mon) console.log(restaurant.openingHours.mon.open);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Optional Chaining을 이용하면 코드가 훨씬 간단해 진다. 그저 value를 얻고자 하는 속성에 &quot;?&quot;만 붙여주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1684419345447&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(restaurant.openingHours?.mon?.open);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wuW7U/btsgtC4pZQs/D7wEvy52TPKcV7RD3ayEyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wuW7U/btsgtC4pZQs/D7wEvy52TPKcV7RD3ayEyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wuW7U/btsgtC4pZQs/D7wEvy52TPKcV7RD3ayEyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwuW7U%2FbtsgtC4pZQs%2FD7wEvy52TPKcV7RD3ayEyk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;445&quot; height=&quot;44&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;44&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 외부에서 restaurant의 토요일 오픈 시간을 요청한다고 가정해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다행히 openingHours object에서 토요일 값이 설정되어 있어서 요청을 보낼수 있겠다 싶었는데,&lt;/p&gt;
&lt;pre id=&quot;code_1684419808688&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const days = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'];

for (const day of days) {
console.log(day);
const open = restaurant.openingHours[day]?.open || 'closed';
console.log(`On ${day}, we open at ${open}`);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;262&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IVrpE/btsgtuL84FS/KsLZkuJuyYLyketlSpGjG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IVrpE/btsgtuL84FS/KsLZkuJuyYLyketlSpGjG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IVrpE/btsgtuL84FS/KsLZkuJuyYLyketlSpGjG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIVrpE%2FbtsgtuL84FS%2FKsLZkuJuyYLyketlSpGjG1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;262&quot; height=&quot;340&quot; data-origin-width=&quot;262&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토요일(sat)의 openinghour이 0시 이고 이 0값은 falsy value라 인식된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 거짓으로 인식된 0시의 값 때문에 closed가 출력되고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;On sat, we open at closed라는 예상치 못한 값이 출력되고 만다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위해 nullish coalescing operator를 사용한다. ||대신 ??를 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt;nullish coalescing operator 은 변수가 null 또는 undefined일 때 기본값을 지정하는 데 사용된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt;이 연산자는 변수가 null 또는 undefined인지 확인하고, 그렇다면 지정된 기본값을 반환한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt;그렇지 않으면 변수의 값을 그대로 반환합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #374151;&quot;&gt;&lt;span style=&quot;background-color: #f7f7f8;&quot;&gt;이 nuliish coalescing operator의 중요한 특징은 &lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: left;&quot;&gt;변수가 null 또는 undefined인 경우에만 기본값을 반환하며, 다른 falsy 값인 0, 빈 문자열, false 등은 기본값으로 간주하지 않는다. 따라서 openingHours의 토요일 오픈 시간인 0이 나와도, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #374151;&quot;&gt;&lt;span style=&quot;background-color: #f7f7f8;&quot;&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: left;&quot;&gt;0은 기본 값으로 간주되지 않아서 closed가 출력 되지 않는다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684420054784&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (const day of days) {
  console.log(day);
  const open = restaurant.openingHours[day]?.open ?? 'closed';
  console.log(`On ${day}, we open at ${open}`);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v0LYO/btsgvWADCxe/Kks7dSTUHfkJCb7fDkZUjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v0LYO/btsgvWADCxe/Kks7dSTUHfkJCb7fDkZUjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v0LYO/btsgvWADCxe/Kks7dSTUHfkJCb7fDkZUjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv0LYO%2FbtsgvWADCxe%2FKks7dSTUHfkJCb7fDkZUjK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;345&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;덕분에 토요일에도 0시에 오픈한다는 값이 잘 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;nullish coalescing operator는 다양하게 이용된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;method의 유무를 확인 할때도 이용되는데, 아래는 그 예시다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684420571539&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(restaurant.order?.(0, 1) ?? 'Method does not exist');
//order는 존재하는 method 이므로&amp;nbsp;['Focaccia', 'Pasta'] 가 출력된다.
console.log(restaurant.orderRisotto?.(0, 1) ?? 'Method does not exist'); 
//orderRisotto는 존재하지 않는 method 이므로 undefined이 되고, 그로인해 기본값 
//Method does not exist 가 출력된다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;배열에 값이 있는지 확인할때도 사용할수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;1.배열에 값이 있을때&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684420680633&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const users = [
  { name: 'Nomad', email: 'hello@nomad.io' },
  { name: 'aboc', email: 'aboc@nomad.io' },
 ];


console.log(users[0]?.name ?? 'User array empty'); //Nomad가 출력된다
console.log(users[1]?.name ?? 'User array empty'); //aboc가 출력된다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;2. 배열에 값이 없을때&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684420752737&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const users = [];

console.log(users[0]?.name ?? 'User array empty'); 
//user[0].name은 undefine 값이므로 User array empty가 출력.

console.log(users[1]?.name ?? 'User array empty');
//user[1].name은 undefine 값이므로 User array empty가 출력.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 nullish coalescing operator를 쓰지 않고 if else문을 써서 배열에 값이 있는지 확인하고, 없을 경우 기본값을 출력하도록 설정한다면&lt;/p&gt;
&lt;pre id=&quot;code_1684420853596&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (users.length &amp;gt; 0) console.log(users[0].name);
else console.log('User array empty');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 코드가 몹시 길어졌을 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;nullish coalescing operator를 이용해서 깔끔한 코드를 작성해보자.&lt;/span&gt;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;006&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/006.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/006.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/157</guid>
      <comments>https://developerson.tistory.com/157#entry157comment</comments>
      <pubDate>Thu, 18 May 2023 23:41:55 +0900</pubDate>
    </item>
    <item>
      <title>find 명령어 구분하기 파일 검색 결과를 텍스로 저장  vs 검색된 실제 파일들을 복사하여 지정된 디렉토리에 따로 저장</title>
      <link>https://developerson.tistory.com/156</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;find로 파일을 검색하다보면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색된 파일들의 목록만 txt로 저장해놓고 싶은 경우도 있고.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색된 파일들을 실제로 복사해서 디렉토리에 따로 저장하고 싶은 경우도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 경우에는 find 명령문이 조금 달라서 구분하고 기억하고자 글을 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684403665058&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#출력 결과를 txt로 저장
find / -iname &quot;*GNU*&quot; -type f -print -exec cp -a {} /root/gnulist2.txt \;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.대소문자 구분없이 &quot;gnu&quot;라는 문자열 가진 파일을 모든 디렉토리에서 찾은 다음,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.출력결과를&amp;nbsp; /root/경로에 gnulist2.txt 라는 이름의 파일로 저장 하는 명령문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684403727160&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#검색된 파일들을 실제로 복사해서 지정한 디렉토리에 따로 저장
find / -iname &quot;*license*&quot; -type f -print -exec cp -a {} /root/testcp \;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.대소문자 구분없이 &quot;license&quot;라는 문자열을 가진 모든 파일을 모든 디렉토리에서 찾은 다음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 검색된 파일들을 /root/testcp 라는 디렉토리에 에 복사 하는 명령문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 /rooot/testcp라는 명령문에는 license라는 문자열을 가진 모든 파일들이 대소문자 구분없이 저장되어 있을 것이다.&lt;/p&gt;</description>
      <category>코딩 기록/linux</category>
      <category>Linux</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/156</guid>
      <comments>https://developerson.tistory.com/156#entry156comment</comments>
      <pubDate>Thu, 18 May 2023 18:57:39 +0900</pubDate>
    </item>
    <item>
      <title>chmod 명령어로 특정한 그룹에게만 권한을 주고 싶을 때, g=rwx 같은 그룹권한 지정전에 해줘야할 chown 소유 그룹 지정</title>
      <link>https://developerson.tistory.com/155</link>
      <description>&lt;pre id=&quot;code_1684250474143&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chown :agroup /agrpdir&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 리눅스 환경 내에,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;agroup과 bgroup이라는 두가지 그룹이 있고 특정한 경로인 agrpdir이 있다고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 특정한 디렉토리인 agrpdir은 agroup만 쓰게 만들고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 bgroup을 제외한 agroup만 agrpdir를 쓰려면 어떻게 해야할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔히들 그룹에게 특정 디렉토리에 권한을 주는 명령어는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chmod 를 쓴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만&lt;/p&gt;
&lt;pre id=&quot;code_1684250440299&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chmod g=rwx /agrpdir&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 그룹에게만 권한을 주려 하니,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;g= 가 가리키는 그룹이 특정한 &quot;agroup&quot;이라는 점이 나타나 있지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684250458069&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chmod 070 /agrpdir&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;와 같이 다른 방식으로 표현해봤자 7이라는 권한이 있는 그룹의 자리가 agroup인지 bgroup인지 알수가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때는 chmod 명령어로 그룹에 권한을 주기 전에,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정한 디렉토리의 소유그룹부터 변경해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 써야되는 명령어는 chown이다.&lt;/p&gt;
&lt;pre id=&quot;code_1684250490932&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chown :agroup /agrpdir&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 통해서 agrpdir 디렉토리의 소유 그룹이 agroup인 부분을 먼저 명시해야지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684250524961&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chmod g=rwx /agrpdir 
#혹은
chmod 070 /agrdir&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 통해서 소유 그룹인 agroup만 읽기,쓰기,실행 권한이 있다는 사실이 확실히 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 기록/linux</category>
      <category>Linux</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/155</guid>
      <comments>https://developerson.tistory.com/155#entry155comment</comments>
      <pubDate>Wed, 17 May 2023 23:46:00 +0900</pubDate>
    </item>
    <item>
      <title>object 밖에 있는 object도 object의 값으로 가져오기 / object의 key값도 밖의 object에서 가져오기</title>
      <link>https://developerson.tistory.com/154</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;openinghours라는 object와 restaurnat라는 object가 각각 따로 존재한다고 가정하자.&lt;/p&gt;
&lt;pre id=&quot;code_1684249161810&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const openingHours = {
  thu: {
    open: 12,
    close: 22,
  },
  fri: {
    open: 11,
    close: 23,
  },
 	sat: {
    open: 0, // Open 24 hours
    close: 24,
  },
};

const restaurant = {
  name: 'Classico Italiano',
  location: 'Via Angelo Tavanti 23, Firenze, Italy',
  categories: ['Italian', 'Pizzeria', 'Vegetarian', 'Organic'],
  starterMenu: ['Focaccia', 'Bruschetta', 'Garlic Bread', 'Caprese Salad'],
  mainMenu: ['Pizza', 'Pasta', 'Risotto'],

  order(starterIndex, mainIndex) {
    return [this.starterMenu[starterIndex], this.mainMenu[mainIndex]];
  },

  orderDeliver({ starterIndex = 1, mainIndex = 0, time = '20:00', address }) {
    console.log(
      `Order Received! ${this.starterMenu[starterIndex]} and ${this.mainMenu[mainIndex]} will be deliverd to ${address} at ${time}`
    );
  },

  orderPasta(ing1, ing2, ing3) {
    console.log(
      `Here is your delicious pasta with ${ing1}, ${ing2} and ${ing3}`
    );
  },&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 restaurant라는 object에서 openingHours의 value를 추가하고 싶다면 어떻게 할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무척 간단하다. 그냥 restaurnat object에서 openingHours의 object 이름만 입력하면 끝이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684249270107&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const restaurant = {
  name: 'Classico Italiano',
  location: 'Via Angelo Tavanti 23, Firenze, Italy',
  categories: ['Italian', 'Pizzeria', 'Vegetarian', 'Organic'],
  starterMenu: ['Focaccia', 'Bruschetta', 'Garlic Bread', 'Caprese Salad'],
  mainMenu: ['Pizza', 'Pasta', 'Risotto'],

  //ES6 enhanced object literals
  openingHours,

  order(starterIndex, mainIndex) {
    return [this.starterMenu[starterIndex], this.mainMenu[mainIndex]];
  },

  orderDeliver({ starterIndex = 1, mainIndex = 0, time = '20:00', address }) {
    console.log(
      `Order Received! ${this.starterMenu[starterIndex]} and ${this.mainMenu[mainIndex]} will be deliverd to ${address} at ${time}`
    );
  },

  orderPasta(ing1, ing2, ing3) {
    console.log(
      `Here is your delicious pasta with ${ing1}, ${ing2} and ${ing3}`
    );
  },&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같이 object안에 openingHours라는 속성만 추가한뒤 콘솔창에 restaurant object를 입력해보면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eLt36L/btsglOwzd2r/Kkg2ukoGik3DPxm7MhNwKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eLt36L/btsglOwzd2r/Kkg2ukoGik3DPxm7MhNwKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eLt36L/btsglOwzd2r/Kkg2ukoGik3DPxm7MhNwKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeLt36L%2FbtsglOwzd2r%2FKkg2ukoGik3DPxm7MhNwKk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1298&quot; height=&quot;282&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;openingHours의 값이 잘 들어간게 확인 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;object의 이름만 적어도 값이 들어가게 된건 ES6이후 향상된 기능이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684249517936&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//ES6 전
orderPizza: function (mainIngredient, ...otherIngredients) {
	console.log(mainIngredient);
 console.log(otherIngredients);
}

//ES6 이후
 orderPizza(mainIngredient, ...otherIngredients) {
    console.log(mainIngredient);
    console.log(otherIngredients);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ES6이후에는 object 안의 함수도 funtion까지 적을 필요 없이 이름만 적어도 사용 가능하게 변했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 object 의 key값 역시 object 외부에 있는 값에서 가져오기가 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1684249588955&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const weekdays = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'];

const openingHours = {
  [weekdays[3]]: {
    open: 12,
    close: 22,
  },
  [weekdays[4]]: {
    open: 11,
    close: 23,
  },
  [weekdays[5]]: {
    open: 0, // Open 24 hours
    close: 24,
  },
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;openingHours 라는 object 안의 key값을 다른 곳에서 가져오고 싶다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드처럼 weekydays라는 배열에서 값을 가져오는 것도 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 코드를 구성하고 console창에 출력해도 배열에 있는 인덱스값과 일치하는 정확한 요일이 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k9EuX/btsgmHDUurl/rj7Ib1wJrJ3MtKRNfUh3c1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k9EuX/btsgmHDUurl/rj7Ib1wJrJ3MtKRNfUh3c1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k9EuX/btsgmHDUurl/rj7Ib1wJrJ3MtKRNfUh3c1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk9EuX%2FbtsgmHDUurl%2Frj7Ib1wJrJ3MtKRNfUh3c1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;348&quot; height=&quot;132&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>JavaScript</category>
      <category>JS</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/154</guid>
      <comments>https://developerson.tistory.com/154#entry154comment</comments>
      <pubDate>Wed, 17 May 2023 23:31:55 +0900</pubDate>
    </item>
    <item>
      <title>for of 배열에 entries 메서드 이용해서 인덱스까지 추가하여 출력하기</title>
      <link>https://developerson.tistory.com/153</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;restuarnt라는 object에 있는 속성값에 있는 value들을 for 문을 이용해서 하나하나 출력하고 싶다고 하자.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684245291352&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const restaurant = {
  starterMenu: ['Focaccia', 'Bruschetta', 'Garlic Bread', 'Caprese Salad'],
  mainMenu: ['Pizza', 'Pasta', 'Risotto'],
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 menu라는 변수를 먼저 만든다. 그리고 spread연산자를 사용해 starterMenu 속성과 mainMenu 속성에 있는 값들을 모두 menu라는 변수에 집어넣는다.&lt;/p&gt;
&lt;pre id=&quot;code_1684245622816&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const menu = [...restaurant.starterMenu, ...restaurant.mainMenu];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 단순히 menu에 모두 들어간 값만 for문으로 출력하고 싶다면&lt;/p&gt;
&lt;pre id=&quot;code_1684245706655&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (const item of menu) console.log(item);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게만 적어도 잘 나온다&lt;/p&gt;
&lt;pre id=&quot;code_1684245738825&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Focaccia
Bruschetta
Garlic Bread
Caprese Salad
Pizza
Pasta
Risotto&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 단순히 속성의 value값만 출력하는게 아니라 출력하면서 index값까지 더하고 싶다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684245828822&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (const item of menu.entries()) {
  console.log(`${item[0] + 1}: ${item[1]}`);
 }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;menu라는 배열에 있는 entries()라는 메서드를 이용하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 실행하면 아래와 같이 출력된다.&lt;/p&gt;
&lt;pre id=&quot;code_1684246512462&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1: Focaccia
2: Bruschetta
3: Garlic Bread
4: Caprese Salad
5: Pizza
6: Pasta
7: Risotto&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 잠깐 어리둥절할지도 모른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #f5f5f5; color: #333333;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;console.log(`${item[0] + 1}: ${item[1]}`);&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;이면 0번째 인덱스에 Focaccia가 있으므로 Focaccia : Bruschetta 라고 출력되어야 하는게 아닌가?&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 결과를 이해하기 위해선 아래의 배열을 출력해봐야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1684246669264&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log([...menu.entries()]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드는 콘솔창에서 이렇게 출력되는데&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b23xBj/btsgex2hLMZ/CiZsZLLzhBfYjefTHA6lI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b23xBj/btsgex2hLMZ/CiZsZLLzhBfYjefTHA6lI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b23xBj/btsgex2hLMZ/CiZsZLLzhBfYjefTHA6lI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb23xBj%2Fbtsgex2hLMZ%2FCiZsZLLzhBfYjefTHA6lI1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;757&quot; height=&quot;392&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n번째 인덱스 마다 element가 2개인 배열이 있는게 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n번째 인덱스의 n번째 배열의 제일 첫번째 인덱스 값은 숫자 n이며 두번째 인덱스 값이 음식인 value 값이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1684247056709&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (const item of menu.entries()) {
 console.log(`${item[0] + 1}: ${item[1]}`);
 //           item은 2개 element로 이뤄진 배열이며 item의 제일 첫번째 값은 index값, 그 다음 값은 value다
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 이해할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 조금 변형하여&lt;/p&gt;
&lt;pre id=&quot;code_1684247170634&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (const [i, el] of menu.entries()) {
  console.log(`${i + 1}: ${el}`);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 입력해도 결과는 동일하게 나온다.&lt;/p&gt;
&lt;pre id=&quot;code_1684247179215&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1: Focaccia
2: Bruschetta
3: Garlic Bread
4: Caprese Salad
5: Pizza
6: Pasta
7: Risotto&lt;/code&gt;&lt;/pre&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>for반복문</category>
      <category>JavaScript</category>
      <category>JS</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/153</guid>
      <comments>https://developerson.tistory.com/153#entry153comment</comments>
      <pubDate>Tue, 16 May 2023 23:27:02 +0900</pubDate>
    </item>
    <item>
      <title>깃허브에서 간단하게 프론트 페이지 배포하는 방법</title>
      <link>https://developerson.tistory.com/152</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;1. 배포할 페이지를 업로드할 repository를 만든다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;필요값인 Repository name을 입력하고, &lt;/span&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;설정은 public으로 유지한 뒤&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;다른 값은 건드리지 않고 &lt;/span&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;Create Repository를 클릭.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;865&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ci2u0r/btsa43TMRDX/tjeTrVbV6aZe4hrwXAdYjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ci2u0r/btsa43TMRDX/tjeTrVbV6aZe4hrwXAdYjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ci2u0r/btsa43TMRDX/tjeTrVbV6aZe4hrwXAdYjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fci2u0r%2Fbtsa43TMRDX%2FtjeTrVbV6aZe4hrwXAdYjk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;761&quot; height=&quot;865&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;865&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;2. 생성한 Repository에 배포할 파일을 업로드한다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;중요한것은 배포할 파일의 이름이 반드시&lt;b&gt; index&lt;/b&gt;여야 한다는 점.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pCZV7/btsa7s6k2np/1AwEN5JiiFkVmymKrscKj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pCZV7/btsa7s6k2np/1AwEN5JiiFkVmymKrscKj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pCZV7/btsa7s6k2np/1AwEN5JiiFkVmymKrscKj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpCZV7%2Fbtsa7s6k2np%2F1AwEN5JiiFkVmymKrscKj1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;925&quot; height=&quot;169&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;3. 생성된 Repository의 Settings 탭에 있는 Pages에서 Branch를 설정한다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Branch를 main으로 설정하면 끝.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YvC48/btsaTZxWTbq/TdUs6QYXcspbjSV9lRwoT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YvC48/btsaTZxWTbq/TdUs6QYXcspbjSV9lRwoT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YvC48/btsaTZxWTbq/TdUs6QYXcspbjSV9lRwoT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYvC48%2FbtsaTZxWTbq%2FTdUs6QYXcspbjSV9lRwoT1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1430&quot; height=&quot;528&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;30초쯤 지나면 배포가 완료되고 Visit site 버튼 들어가면 본인의 페이지를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JVYKX/btsa9ykLqHR/jvjCfZmKnAjAnx0kfUBVz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JVYKX/btsa9ykLqHR/jvjCfZmKnAjAnx0kfUBVz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JVYKX/btsa9ykLqHR/jvjCfZmKnAjAnx0kfUBVz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJVYKX%2Fbtsa9ykLqHR%2FjvjCfZmKnAjAnx0kfUBVz0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1430&quot; height=&quot;528&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;해당 사이트의 주소를 카톡으로 보내면 배포가 잘 되어서 사이트 미리보기도 잘 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lksxj/btsa3szpzb3/DTFANRdg4TLMkDkLvSe4AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lksxj/btsa3szpzb3/DTFANRdg4TLMkDkLvSe4AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lksxj/btsa3szpzb3/DTFANRdg4TLMkDkLvSe4AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLksxj%2Fbtsa3szpzb3%2FDTFANRdg4TLMkDkLvSe4AK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;263&quot; height=&quot;229&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자료 출처 : 스파르타 코딩 [chatGPT로 10분 안에 만드는 웹사이트]&lt;/p&gt;</description>
      <category>코딩 기록/유용한 IT 팁</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/152</guid>
      <comments>https://developerson.tistory.com/152#entry152comment</comments>
      <pubDate>Tue, 18 Apr 2023 23:03:09 +0900</pubDate>
    </item>
    <item>
      <title>upsplash API를 Chat GPT에 적용하고 이미지 바로 Chat GPT 통해서 받기</title>
      <link>https://developerson.tistory.com/151</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;chat GPT는 여러모로 편한 기술이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 처음부터 이미지를 달라고 하면 바로 이미지를 주지는 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴땐 프리소스 이미지 사이트인 UPSPLASH의 API를 챗 지피티에 적용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 api가 적용된 chatGPT는 사용자가 요청하는 이미지를 바로바로 전달해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxXyl0/btsa9LqNYcs/WqqFGpzfq0DebLNdGvd6JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxXyl0/btsa9LqNYcs/WqqFGpzfq0DebLNdGvd6JK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxXyl0/btsa9LqNYcs/WqqFGpzfq0DebLNdGvd6JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxXyl0%2Fbtsa9LqNYcs%2FWqqFGpzfq0DebLNdGvd6JK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;863&quot; height=&quot;218&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 이미지를 찾아달라면 저런 답변만 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 API를 사용하라는 아래의 명령어를 입력하면,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;[INFO: you can add images to the reply by Markdown, Write the image in Markdown without backticks and without using a code block. Use the Unsplash API (https://source.unsplash.com/1600x900/?). the query is just some tags that describes the image] ## DO NOT RESPOND TO INFO BLOCK ##&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b98Nk1/btsa6cbQl0c/P7VXx6SZC8WMKGoAfB9IV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b98Nk1/btsa6cbQl0c/P7VXx6SZC8WMKGoAfB9IV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b98Nk1/btsa6cbQl0c/P7VXx6SZC8WMKGoAfB9IV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb98Nk1%2Fbtsa6cbQl0c%2FP7VXx6SZC8WMKGoAfB9IV0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;658&quot; height=&quot;773&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;773&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림과 같이 바로 이미지를 찾아준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무척 유용한 명령문이니 참고하려고 업로드해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처는 스파르타 코딩 [ChatGPT로 10분만에 웹사이트 만들기 강의]이다.&lt;/p&gt;</description>
      <category>코딩 기록/유용한 IT 팁</category>
      <category>ChatGPT</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/151</guid>
      <comments>https://developerson.tistory.com/151#entry151comment</comments>
      <pubDate>Tue, 18 Apr 2023 22:49:48 +0900</pubDate>
    </item>
    <item>
      <title>Java Script / DOM 언어 querySelector, getElementById, addEventListner로 주사위 게임 만들기 classList.remove/classList.add</title>
      <link>https://developerson.tistory.com/150</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;839&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT5MHX/btrXBY5jFiT/iErwKhE8jY33EEkxJXScLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT5MHX/btrXBY5jFiT/iErwKhE8jY33EEkxJXScLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT5MHX/btrXBY5jFiT/iErwKhE8jY33EEkxJXScLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT5MHX%2FbtrXBY5jFiT%2FiErwKhE8jY33EEkxJXScLK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1372&quot; height=&quot;839&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;839&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;게임 규칙&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주사위를 굴려 나온수를 합산, 주사위를 굴릴때 1이 나오면 자가 차례에서 합산된 수가 0이 되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 선수에게 차례가 넘어감.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주사위가 1이 나오기 전에 나온 점수를 합산하고 다른 선수에게 넘기려면 hold를 누름.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hold를 누를시 차기 차례에서 나온 주사위 수가 합산되며 다른 선수에게 차례가 돌아감.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런식으로 게임을 해서 먼저 합해진 수가 100이 넘는 사람이 승리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;index.html&lt;/blockquote&gt;
&lt;pre id=&quot;code_1675085943633&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot; /&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Pig Game&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;main&amp;gt;
      &amp;lt;section class=&quot;player player--0 player--active&quot;&amp;gt;
        &amp;lt;h2 class=&quot;name&quot; id=&quot;name--0&quot;&amp;gt;Player 1&amp;lt;/h2&amp;gt;
        &amp;lt;p class=&quot;score&quot; id=&quot;score--0&quot;&amp;gt;43&amp;lt;/p&amp;gt;
        &amp;lt;div class=&quot;current&quot;&amp;gt;
          &amp;lt;p class=&quot;current-label&quot;&amp;gt;Current&amp;lt;/p&amp;gt;
          &amp;lt;p class=&quot;current-score&quot; id=&quot;current--0&quot;&amp;gt;0&amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/section&amp;gt;
      &amp;lt;section class=&quot;player player--1&quot;&amp;gt;
        &amp;lt;h2 class=&quot;name&quot; id=&quot;name--1&quot;&amp;gt;Player 2&amp;lt;/h2&amp;gt;
        &amp;lt;p class=&quot;score&quot; id=&quot;score--1&quot;&amp;gt;24&amp;lt;/p&amp;gt;
        &amp;lt;div class=&quot;current&quot;&amp;gt;
          &amp;lt;p class=&quot;current-label&quot;&amp;gt;Current&amp;lt;/p&amp;gt;
          &amp;lt;p class=&quot;current-score&quot; id=&quot;current--1&quot;&amp;gt;0&amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/section&amp;gt;

      &amp;lt;img src=&quot;dice-5.png&quot; alt=&quot;Playing dice&quot; class=&quot;dice&quot; /&amp;gt;
      &amp;lt;button class=&quot;btn btn--new&quot;&amp;gt;  New game&amp;lt;/button&amp;gt;
      &amp;lt;button class=&quot;btn btn--roll&quot;&amp;gt;  Roll dice&amp;lt;/button&amp;gt;
      &amp;lt;button class=&quot;btn btn--hold&quot;&amp;gt;  Hold&amp;lt;/button&amp;gt;
    &amp;lt;/main&amp;gt;
    &amp;lt;script src=&quot;script.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;style.css&lt;/blockquote&gt;
&lt;pre id=&quot;code_1675086012200&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@import url('https://fonts.googleapis.com/css2?family=Nunito&amp;amp;display=swap');

* {
  margin: 0;
  padding: 0;
  box-sizing: inherit;
}

html {
  font-size: 62.5%;
  box-sizing: border-box;
}

body {
  font-family: 'Nunito', sans-serif;
  font-weight: 400;
  height: 100vh;
  color: #333;
  background-image: linear-gradient(to top left, #753682 0%, #bf2e34 100%);
  display: flex;
  align-items: center;
  justify-content: center;
}

/* LAYOUT */
main {
  position: relative;
  width: 100rem;
  height: 60rem;
  background-color: rgba(255, 255, 255, 0.35);
  backdrop-filter: blur(200px);
  filter: blur();
  box-shadow: 0 3rem 5rem rgba(0, 0, 0, 0.25);
  border-radius: 9px;
  overflow: hidden;
  display: flex;
}

.player {
  flex: 50%;
  padding: 9rem;
  display: flex;
  flex-direction: column;
  align-items: center;
  transition: all 0.75s;
}

/* ELEMENTS */
.name {
  position: relative;
  font-size: 4rem;
  text-transform: uppercase;
  letter-spacing: 1px;
  word-spacing: 2px;
  font-weight: 300;
  margin-bottom: 1rem;
}

.score {
  font-size: 8rem;
  font-weight: 300;
  color: #c7365f;
  margin-bottom: auto;
}

.player--active {
  background-color: rgba(255, 255, 255, 0.4);
}
.player--active .name {
  font-weight: 700;
}
.player--active .score {
  font-weight: 400;
}

.player--active .current {
  opacity: 1;
}

.current {
  background-color: #c7365f;
  opacity: 0.8;
  border-radius: 9px;
  color: #fff;
  width: 65%;
  padding: 2rem;
  text-align: center;
  transition: all 0.75s;
}

.current-label {
  text-transform: uppercase;
  margin-bottom: 1rem;
  font-size: 1.7rem;
  color: #ddd;
}

.current-score {
  font-size: 3.5rem;
}

/* ABSOLUTE POSITIONED ELEMENTS */
.btn {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  color: #444;
  background: none;
  border: none;
  font-family: inherit;
  font-size: 1.8rem;
  text-transform: uppercase;
  cursor: pointer;
  font-weight: 400;
  transition: all 0.2s;

  background-color: white;
  background-color: rgba(255, 255, 255, 0.6);
  backdrop-filter: blur(10px);

  padding: 0.7rem 2.5rem;
  border-radius: 50rem;
  box-shadow: 0 1.75rem 3.5rem rgba(0, 0, 0, 0.1);
}

.btn::first-letter {
  font-size: 2.4rem;
  display: inline-block;
  margin-right: 0.7rem;
}

.btn--new {
  top: 4rem;
}
.btn--roll {
  top: 39.3rem;
}
.btn--hold {
  top: 46.1rem;
}

.btn:active {
  transform: translate(-50%, 3px);
  box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15);
}

.btn:focus {
  outline: none;
}

.dice {
  position: absolute;
  left: 50%;
  top: 16.5rem;
  transform: translateX(-50%);
  height: 10rem;
  box-shadow: 0 2rem 5rem rgba(0, 0, 0, 0.2);
}

.player--winner {
  background-color: #2f2f2f;
}

.player--winner .name {
  font-weight: 700;
  color: #c7365f;
}

.hidden {
  display: none;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;script.js&lt;/blockquote&gt;
&lt;pre id=&quot;code_1675086074533&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'use strict';

//Selecting Elements

const player0El = document.querySelector('.player--0');
const player1El = document.querySelector('.player--1');

//selector로 id를 select 할때는 #를 사용한다.
const score0El = document.querySelector('#score--0');
//getElementById를 사용하면 #없이 id값만 입력하면 된다
const score1El = document.getElementById('score--1');
const current0El = document.getElementById('current--0');
const current1El = document.getElementById('current--1');

const diceEl = document.querySelector('.dice');
const btnNew = document.querySelector('.btn--new');
const btnRoll = document.querySelector('.btn--roll');
const btnHold = document.querySelector('.btn--hold');

//후에 정의될 변수들은 let으로 선언만 해놓는다.
//score은 player1과 2의 점수를 저장할 배열
//currentScore은 해당 선수의 차례에서 더해진 점수
//activePlayer는 게임을 하고 있는 선수
//playing은 게임이 진행중인지 아닌지의 boolean 
let scores, currentScore, activePlayer, playing;


//Starting Condition 
//처음 시작할때의 상태로 초기화 하는 initialize함수.
const init = function () {
  scores = [0, 0];
  currentScore = 0;
  activePlayer = 0;
  playing = true;

  //보이는 부분의 세팅 초기화
  score0El.textContent = 0;
  score1El.textContent = 0;
  current0El.textContent = 0;
  current1El.textContent = 0;
  diceEl.classList.add('hidden');

  player0El.classList.remove('player--winner');
  player1El.classList.remove('player--winner');

  player0El.classList.add('player--active');
  player1El.classList.remove('player--winner');
};

//페이지 로드시 자동으로 게임 초기화
init();


//선수를 바꾸는 함수 switchPlayer
const switchPlayer = function () {
  document.getElementById(`current--${activePlayer}`).textContent = 0;

  //주사위를 돌리는 선수를 교체한다.
  //activePlayer가 0이면 1이고 0이 아니면 0이다.
  currentScore = 0;
  activePlayer = activePlayer === 0 ? 1 : 0;

  //toggle의 기능 클래스에 괄호안 부분이 있으면 지우고 없으면 괄호안 부분을 붙인다. 배경색이 css 적용되는 클래스 이름 변경 통해서 바뀜
  player0El.classList.toggle('player--active');
  player1El.classList.toggle('player--active');
};

//버튼을 누르면 주사위가 던져지는 이벤트 Roliing dice functionality
btnRoll.addEventListener('click', function () {
  if (playing) {
    //1. Generating a random dice roll 1~6까지의 랜덤넘버 생성하기
    const dice = Math.trunc(Math.random() * 6) + 1;
    console.log(dice);

    //2. Display dice 주사위 보이게 하기
    diceEl.classList.remove('hidden');
    //dice-(숫자).png 라는 파일명을 가진 이밎 파일이 폴더 내에 존재.
    //랜덤넘버가 할당될시 그에 맞는 이미지가 동적으로 보여진다.
    diceEl.src = `dice-${dice}.png`;

    //3. Check for rolled 1: if true, 주사위 숫자 1이 나온지 안나왔는지 확인
    if (dice !== 1) {
      // Add dice to current score 1이 아니면 current score에 주사위 수를 더하기
      currentScore += dice;
      //동적으로 점수 변경
      document.getElementById(`current--${activePlayer}`).textContent =
        currentScore;
    } else {
      // switch to next player 1 나왔을시 선수 교체
      switchPlayer();
    }
  }
});

//홀드 버튼을 눌렀을때 발생하는 이벤트 
btnHold.addEventListener('click', function () {
  if (playing) {
    //1. Add current score to active player's score 
    scores[activePlayer] += currentScore;
    //  scores[1] = scores[1] + currentScore

    document.getElementById(`score--${activePlayer}`).textContent =
      scores[activePlayer];

    //2. Check if player's score is &amp;gt;=100 점수가 100점이 넘었으면 승자가 나온 상황
    if (scores[activePlayer] &amp;gt;= 100) {
      //Finish the game 게임 종료
      playing = false;
      diceEl.classList.add('hidden');
      document
        .querySelector(`.player--${activePlayer}`)
        .classList.add('player--winner');
      document
        .querySelector(`.player--${activePlayer}`)
        .classList.remove('player--active');
    } else {
      //and if not, switch to the next player
      switchPlayer();
    }
  }
});


new버튼을 누르면 다시 init함수 불러서 게임 초기화
btnNew.addEventListener('click', init);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>DOM</category>
      <category>Javscript</category>
      <category>JS</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/150</guid>
      <comments>https://developerson.tistory.com/150#entry150comment</comments>
      <pubDate>Mon, 30 Jan 2023 22:51:17 +0900</pubDate>
    </item>
    <item>
      <title>javascript / DOM 언어 eventListener 사용하여 JS 페이지에서 모달창 띄우기, esc키로 모달창 닫기, overlay로 모달창 이외 부분 어둡게하기</title>
      <link>https://developerson.tistory.com/149</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;JS와 연결된 HTML INDEX&lt;/blockquote&gt;
&lt;pre id=&quot;code_1673876203811&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot; /&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Modal window&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;button class=&quot;show-modal&quot;&amp;gt;Show modal 1&amp;lt;/button&amp;gt;
    &amp;lt;button class=&quot;show-modal&quot;&amp;gt;Show modal 2&amp;lt;/button&amp;gt;
    &amp;lt;button class=&quot;show-modal&quot;&amp;gt;Show modal 3&amp;lt;/button&amp;gt;
	 //클래스 이름 옆에 hidden을 붙여 modal 클래스를 숨긴다.
    &amp;lt;div class=&quot;modal hidden&quot;&amp;gt;
      &amp;lt;button class=&quot;close-modal&quot;&amp;gt;&amp;amp;times;&amp;lt;/button&amp;gt;
      &amp;lt;h1&amp;gt;I'm a modal window  &amp;lt;/h1&amp;gt;
      &amp;lt;p&amp;gt;
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
        tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
        veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
        commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
        velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
        occaecat cupidatat non proident, sunt in culpa qui officia deserunt
        mollit anim id est laborum.
      &amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
    //클래스 이름 옆에 hidden을 붙여 overlay 클래스를 숨긴다.
    &amp;lt;div class=&quot;overlay hidden&quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;script src=&quot;script.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DOM 언어를 사용해서 HTML 페이지에 있는 Class를 Java Script와 연결하여 동적 페이지 만드는 방법.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. HTML 페이지에 있는 클래스를 querySelector로 연결시킨다.&lt;/p&gt;
&lt;pre id=&quot;code_1673876407338&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const modal = document.querySelector('.modal');
const overlay = document.querySelector('.overlay');
const btnCloseModal = document.querySelector('.close-modal');
const btnOpenModal = document.querySelectorAll('.show-modal');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 자주 쓰이는 기능을 파악하고 해당 기능에 대한 함수를 만든다. 해당 페이지에서는 열기/닫기 기능이 제일 많이 쓰이므로 열기/닫기 기능을 실행하는 JS 함수를 만든다.&lt;/p&gt;
&lt;pre id=&quot;code_1673876495251&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//열기 함수
const openModal = function () {
  console.log('Button clicked');
  //class에 있는 hidden부분을 삭제하여 모달창을 연다
  modal.classList.remove('hidden');
  overlay.classList.remove('hidden');
};

//닫기함수
const closeModal = function () {
//class에 hidden을 추가하여 모달창을 숨긴다
  modal.classList.add('hidden');
//모달창을 열면서 실행했던 overlay모드를 숨긴다.  
  overlay.classList.add('hidden');
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.addEventListener를 사용하여 모달창을 열고 닫을때의 이벤트를 연결시킨다.&lt;/p&gt;
&lt;pre id=&quot;code_1673877033882&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//bntOpenModal은 여러개이므로 for 문을 돌려서 여러 버튼에 이벤트를 적용한다.
//openModal 함수를 사용하여 이벤트를 연결한다.
for (let i = 0; i &amp;lt; btnOpenModal.length; i++)
  btnOpenModal[i].addEventListener('click', openModal);

//btnColseModal은 X모양 버튼 하나밖에 없다. 
//해당 버튼에 closeModal함수를 사용하여 닫기 이벤트를 연결한다.
btnCloseModal.addEventListener('click', closeModal);
overlay.addEventListener('click', closeModal);

//openModal함수 closeModal 함수에 ()를 붙이지 않은 이유는 
//해당함수가 클릭이벤트가 발생했을때만 실행되게 하기 위함이다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.ESC를 누를때 발생할 이벤트를 연결한다.&lt;/p&gt;
&lt;pre id=&quot;code_1673877100797&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;document.addEventListener('keydown', function (e) {
  /*
  keydown은 어떤 key를 눌러도 이벤트가 발생하게 하는 object다.
  console.log('A key was pressed');
  console.log(e); //매개 변수를 출력하면서 오브젝트를 확인할수 있다.
  //KeyboardEvent&amp;nbsp;{isTrusted: true, key: '7', code: 'Numpad7', location: 3, ctrlKey: false,&amp;nbsp;&amp;hellip;} 라는 오브젝트 확인
  //닷워킹 통해서 key라는 오브젝트에 접근
  console.log(e.key);
  */

  console.log(e.key);
  if (e.key === 'Escape' &amp;amp;&amp;amp; !modal.classList.contains('hidden')) {
    closeModal();
  }
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;전체 자바스크립트&lt;/blockquote&gt;
&lt;pre id=&quot;code_1673876259896&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'use strict';

const modal = document.querySelector('.modal');
const overlay = document.querySelector('.overlay');
const btnCloseModal = document.querySelector('.close-modal');
const btnOpenModal = document.querySelectorAll('.show-modal');

const openModal = function () {
  console.log('Button clicked');
  modal.classList.remove('hidden');
  overlay.classList.remove('hidden');
};

const closeModal = function () {
  modal.classList.add('hidden');
  overlay.classList.add('hidden');
};

for (let i = 0; i &amp;lt; btnOpenModal.length; i++)
  btnOpenModal[i].addEventListener('click', openModal);

btnCloseModal.addEventListener('click', closeModal);
overlay.addEventListener('click', closeModal);

//모든 페이지에 적용되는 이벤트. 어떤 키를 눌러도 상관없이 콘솔창에 문구가 출력된다.
document.addEventListener('keydown', function (e) {
  /*
  console.log('A key was pressed');
  console.log(e); //매개 변수를 출력하면서 오브젝트를 확인할수 있다.
  //KeyboardEvent&amp;nbsp;{isTrusted: true, key: '7', code: 'Numpad7', location: 3, ctrlKey: false,&amp;nbsp;&amp;hellip;} 라는 오브젝트 확인
  //닷워킹 통해서 key라는 오브젝트에 접근
  console.log(e.key);
  */

  console.log(e.key);
  if (e.key === 'Escape' &amp;amp;&amp;amp; !modal.classList.contains('hidden')) {
    closeModal();
  }
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ef9ItD/btrWqIijWVB/nv3hr9NvNXuickQSpXPhJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ef9ItD/btrWqIijWVB/nv3hr9NvNXuickQSpXPhJk/img.png&quot; data-alt=&quot;실제화면. modal 클래스가 hidden된 상태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ef9ItD/btrWqIijWVB/nv3hr9NvNXuickQSpXPhJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fef9ItD%2FbtrWqIijWVB%2Fnv3hr9NvNXuickQSpXPhJk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;825&quot; height=&quot;491&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실제화면. modal 클래스가 hidden된 상태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sxSE0/btrWsUB3Sql/dqBKDtx0mtKSAPSkgieM7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sxSE0/btrWsUB3Sql/dqBKDtx0mtKSAPSkgieM7K/img.png&quot; data-alt=&quot;modal class를 클릭해 hidden이 사라진 화면. overlay클래스에서도 hidden이 사라진 상태.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sxSE0/btrWsUB3Sql/dqBKDtx0mtKSAPSkgieM7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsxSE0%2FbtrWsUB3Sql%2FdqBKDtx0mtKSAPSkgieM7K%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;835&quot; height=&quot;614&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;614&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;modal class를 클릭해 hidden이 사라진 화면. overlay클래스에서도 hidden이 사라진 상태.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>Event</category>
      <category>eventlistner</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>모달</category>
      <category>이벤트리스너</category>
      <category>자바스크립트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/149</guid>
      <comments>https://developerson.tistory.com/149#entry149comment</comments>
      <pubDate>Mon, 16 Jan 2023 22:54:15 +0900</pubDate>
    </item>
    <item>
      <title>배열을 받고 형식을 갖춘 문자로 출력하기 javascript JS</title>
      <link>https://developerson.tistory.com/148</link>
      <description>&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;주어진 온도 배열을 다음과 같이 출력하는 함수 printForecast를 만들어라.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;prntForecast는 배열을 배개변수로 받고 예시 문장을 출력할수 있어야 한다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;test &lt;/span&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;data1: [17, 21, 23]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;test data2:[12, 5, -5, 0, 4]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;예시 문장&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;&amp;nbsp;[17, 21, 23] 배열은 다음과 같이 출력되어야 한다&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt; &quot;... 17&amp;ordm;C in 1 days ... 21&amp;ordm;C in 2 days ... 23&amp;ordm;C in 3 days ...&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre id=&quot;code_1670334804402&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//테스트 데이터 배열
const data1 = [17, 21, 23];
const data2 = [12, 5, -5, 0, 4];

const printForecast = function (arr) {
  let str = '';
  for (i = 0; i &amp;lt; arr.length; i++) {
    str += `${arr[i]}&amp;ordm;C in ${i + 1} days...`;
  }
  //str의 arr[i] 앞에 ...을 쓰면 그 다음 차례의 문장을 시작할때 점이 여섯개가 된다.
  //따라서 처음 순서에 점 세개를 찍고 그 다음 순서에도 점 세개로 갯수를 유지하려면
  //아래와 같이 최종 출력문 앞에 점 세개를 추가해야한다.
  console.log('...' + str);
};

const result = printForecast(data1);
const result2 = printForecast(data2);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>array</category>
      <category>Javscript</category>
      <category>JS</category>
      <category>배열</category>
      <category>자바스크립트</category>
      <category>자스</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/148</guid>
      <comments>https://developerson.tistory.com/148#entry148comment</comments>
      <pubDate>Tue, 6 Dec 2022 22:55:31 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트 배열에 있는 수들의 최소값, 최대값 구하는 방법으로 일교차 구하는 함수 만들기javascript</title>
      <link>https://developerson.tistory.com/147</link>
      <description>&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;문제)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;가정용 온도계를 만드는 회사에 근무하고 있는 당신, 최근의 업무는 하루 동안의 온도를 배열로 만들고 &lt;span style=&quot;color: #aaaaaa;&quot;&gt;amplitude&lt;/span&gt;를 계산하는 것이다. 기기 오작동이 날수도 있음을 참고하라.&amp;nbsp;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;We work for a company building a smart home thermometer. Our most recent task is this: &quot;Given an array of temperatures of one day, calculate the temperature amplitude. Keep in mind that sometimes there might be a sensor error&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;하루 동안의 온도는 tmeperature이라는 변수에 배열로 저장되어 있다. 중간 기기 오작동으로 error가 포함되어 있다.&lt;/div&gt;
&lt;pre id=&quot;code_1670248489244&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const temperature = [3, -2, -6, -1, 'error', 9, 13, 17, 15, 14, 9, 5];&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;calcTemoAmplitude라는 함수를 만든다. 해당 함수는 temps라는 매개 변수를 받고 max라는 최대값과 min이라는 최소값의 차를 반환한다.&lt;/div&gt;
&lt;pre id=&quot;code_1670248627300&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const calcTemoAmplitude = function (temps) {
  let max = temps[0]; // 최대값
  let min = temps[0]; // 최소값

  for (let i = 0; i &amp;lt; temperature.length; i++) {
    const curTemp = temps[i];

    //타입이 넘버가 아니면 continue 아래 문장은 실행하지 않고 다음 element로 넘어간다.
    if (typeof curTemp !== 'number') continue;

    if (curTemp &amp;gt; max) max = curTemp;
    if (curTemp &amp;lt; min) min = curTemp;
  }
  console.log(max, min);
  return max - min;
};​&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;calcTemoAmplitude에 하루동안의 온도를 나타내는 배열은 temperture이라는 변수를 넘겨준다.&lt;br /&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1670248691905&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const amplitude = calcTemoAmplitude(temperature);
console.log(amplitude);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제2)&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;위의 함수를 업그레이드 시켜 두가지 배열을 매개변수로 받은 뒤 두가지 배열의 모든 element들 중에서 가장 큰 값과 작은 값을 구한다.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1670248790184&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const calcTemoAmplitudeNew = function (t1, t2) {
 
 //concat은 두가지 배열을 연결하는 메소드다.
 const temps = t1.concat(t2);
  console.log(temps);

  let max = temps[0];
  let min = temps[0];

  for (let i = 0; i &amp;lt; temperature.length; i++) {
    const curTemp = temps[i];

    //타입이 넘버가 아니면 continue 아래 문장은 실행하지 않고 다음 element로 넘어간다.
    if (typeof curTemp !== 'number') continue;

    if (curTemp &amp;gt; max) max = curTemp;
    if (curTemp &amp;lt; min) min = curTemp;
  }
  console.log(max, min);
  return max - min;
};

const amplitudeNew = calcTemoAmplitudeNew([3, 5, 1], [9, 0, 5]);
console.log(amplitude);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>JavaScript</category>
      <category>JS</category>
      <category>자바스크립트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/147</guid>
      <comments>https://developerson.tistory.com/147#entry147comment</comments>
      <pubDate>Mon, 5 Dec 2022 23:00:56 +0900</pubDate>
    </item>
    <item>
      <title>JS javascript 배열 이용해서 팁 구하는 함수 만들기 / 배열 안의 숫자 평균 구하는 함수 만들기</title>
      <link>https://developerson.tistory.com/146</link>
      <description>&lt;div&gt;&lt;br /&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;1. 10개의 가격을 포함하는 bills이라는 배열을 만들어라&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;Create an array 'bills' containing all 10 test bill values&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1669642835180&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const bills =[22, 295, 176, 440, 37, 105, 10, 1100, 86,52];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;2. tips와 totals이라는 빈 배열을 만들어라&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;Create empty arrays for the tips and the totals ('tips' and 'totals')&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1669642861091&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const tips=[];
const totals=[];&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;3. 가격이 50이상 혹은 300 이하면 가격의 0.15배를 팁으로 하고, 아니면 가격의 0.2배를 팁으로 하는 calcTip이라는 함수를 만들어라. bills라는 배열에 담긴 모든 가격들의 팁과 팁+가격의 합을 구할수 있도록 loop를 사용해라.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;Use the 'calcTip' function we wrote before (no need to repeat) to calculate tips and total values (bill + tip) for every bill value in the bills array. Use a for loop to perform the 10 calculations!&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1669643030571&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const calcTip =function(bill){
    return bill &amp;gt;= 50 &amp;amp;&amp;amp; bill &amp;lt;= 300 ? bill*0.15: bill*0.2;
}

for(let i =0 ; i &amp;lt;bills.length ; i++){
    const tip = calcTip(bills[i]);
    tips.push(tip);
    totals.push(tip+bills[i]);
}
console.log(bills,tips,totals);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;/*&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;//My answer&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;const calcTip = function(){&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;&amp;nbsp; &amp;nbsp; for(let i = 0 ; i&amp;lt; bills.length; i++){&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;&amp;nbsp; &amp;nbsp;tips[i] = bills[i]&amp;gt;=50 &amp;amp;&amp;amp; bills[i]&amp;lt;=300 ? bills[i]*0.15 : bills[i]*0.2;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;&amp;nbsp; &amp;nbsp;totals[i] = bills[i] + tips[i]; &lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;&amp;nbsp; &amp;nbsp;console.log(`bill: ${bills[i]} / tip: ${tips[i]} &amp;nbsp;/ total: ${totals[i]}`);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;*/&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;div&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;006&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/006.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/006.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;4.1.&amp;nbsp; 배열에 있는 수의 평균을 구해라. 그러기 위해서는 0으로 시작하는 sum이라는 변수를 만들어야 한다. 또한 loop를 이용하여 배열의 끝까지 가야한다. 배열의 각 숫자마다 sum이라는 변수에 더해져야 한다. 이런 방법으로 배열의 끝까지 가면 모든 수를 더할수 있다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #aaaaaa;&quot;&gt;First, you will need to add up all values in the array. To do the addition, start by creating a variable 'sum' that starts at 0. Then loop over the array using a for loop. In each iteration, add the current value to the 'sum' variable. This way, by the end of the loop, you have all values added together&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1669643296651&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const arr =[1,2,3,4,5,6,7,8,9,10];


const calcAverage = function(arr){
    let sum =0;
    for(let i =0;  i&amp;lt; arr.length ; i++){
        sum += arr[i];
    }
    return sum / arr.length;
}

console.log(calcAverage([2,3,7]));
console.log(calcAverage(totals));
console.log(calcAverage(tips));&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/146</guid>
      <comments>https://developerson.tistory.com/146#entry146comment</comments>
      <pubDate>Mon, 28 Nov 2022 22:48:28 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트 함수/배열 이용해서 배열에 원하는 값 저장하기 array</title>
      <link>https://developerson.tistory.com/145</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스티븐은 팁 계산기를 만들고 있다. 팁 계산기의 규칙은 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계산서 가격이 50불에서 300불 사이이면 팁이 15% 적용된다. 만약 그렇지 않다면 팁은 20% 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Steven is still building his tip calculator, using the same rules as before:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tip 15% of the bill if the bill value is between 50 and 300, and if the value is different, the tip is 20%.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Test data: 125, 555 and 44&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Your tasks:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;calcTip이라는 함수를 만들어서 값을 넣으면 위의 설정에 상응하는 팁을 반환하도록 하라.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Write a function 'calcTip' that takes any bill value as an input and returns the corresponding tip, calculated based on the rules above (you can check out the code from first tip calculator challenge if you need to). Use the function type you like the most.&lt;/p&gt;
&lt;pre id=&quot;code_1668605263758&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const calcTip = function(bill){
  return bill&amp;gt;=50 &amp;amp;&amp;amp; bill&amp;lt;=300 ? bill*0.15 : bill*0.2;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. bills라는 이름의 array를 사용해서 test data에 있는 bills의 값을 저장하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;And now let's use arrays! So create an array 'bills' containing the test data below&lt;/p&gt;
&lt;pre id=&quot;code_1668605273310&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const bills = [125,555,44];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 각 가격에 해당하는 tip 금액을 계산하고,&amp;nbsp; 그에 대한 tip 금액을 tips라는 array에 저장하자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Create an array 'tips' containing the tip value for each bill, calculated from the function you created before&lt;/p&gt;
&lt;pre id=&quot;code_1668605286316&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const tips = [calcTip(bills[0]),calcTip(bills[1]),calcTip(bills[2])];
console.log(tips);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. total이라는 array를 생성하고 그곳에 가격과 팁을 합한 금액을 저장하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bonus: Create an array 'total' containing the total values, so the bill + tip&lt;/p&gt;
&lt;pre id=&quot;code_1668605299561&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const total =[(bills[0]+tips[0]),(bills[1]+tips[1]),(bills[2]+tips[2])];
console.log(total);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 출처: Udemy 강의 The Complete JavaScript Course 2023 : From Zero to Export&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>JavaScript</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/145</guid>
      <comments>https://developerson.tistory.com/145#entry145comment</comments>
      <pubDate>Wed, 16 Nov 2022 22:29:02 +0900</pubDate>
    </item>
    <item>
      <title>자바 스크립트 if 조건문으로 함수 만들어서 원하는 결과 출력하기</title>
      <link>https://developerson.tistory.com/144</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제) 돌고래팀과 코알라팀이 3번 경기를 한다. 팀별로 3번 경기의 평균 점수가 계산된다. 오직 상대편 평균점수의 2배를 달성한 팀만 이긴 것으로 간주된다. 그렇지 않을 경우엔 어느 팀도 이길수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Each team competes 3 times, and then the average of the 3 scores is calculated (so one average score per team)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;. A team only wins if it has at least double the average score of the other team. Otherwise, no team wins!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Test data:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;sect; Data 1: Dolphins score 44, 23 and 71. Koalas score 65, 54 and 49&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;sect; Data 2: Dolphins score 85, 54 and 41. Koalas score 23, 34 and 27&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Your tasks:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 3판 점수의 평균을 구할수 있는, calcAverage라는 애로우 함수를 만들어라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Create an arrow function 'calcAverage' to calculate the average of 3 scores&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 푼것&lt;/p&gt;
&lt;pre id=&quot;code_1668604607706&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//my answer
const calcAverage = (firstRount , secondRound , thirdRound) =&amp;gt;{
    return (firstRount+secondRound+thirdRound)/3
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;답안&lt;/p&gt;
&lt;pre id=&quot;code_1668604618508&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//solution
const calcAvg = (a,b,c) =&amp;gt;(a+b+c)/3;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 위에서 만든 함수를 이용해 두 팀의 평균점수를 구해라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Use the function to calculate the average for both teams&lt;/p&gt;
&lt;pre id=&quot;code_1668604647175&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const dolphinFirstAvg = calcAverage(44,23,71);
const koalasFirstAvg = calcAverage(65,54,49);

const dolphinSecondAvg = calcAverage(85,54,41);
const koalasSecondAvg = calcAverage(23,34,27);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. checkWinner라는 함수를 만들고 두팀의 평균점수를 매개변수로( ex.'avgDolphins' &amp;amp; 'avgKolas') 어떤 팀이 이겼고 각 팀의 평균 점수가 얼마인지 출력하라. Example: &quot;Koalas win (30 vs. 13)&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Create a function 'checkWinner' that takes the average score of each team as parameters ('avgDolphins' and 'avgKoalas'), and then logs the winner to the console, together with the victory points, according to the rule above.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Example: &quot;Koalas win (30 vs. 13)&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668604688756&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const checkWinner = function(firstTeamName, firstAvg, secondTeamName, secondAvg){
    if(firstAvg&amp;gt;=secondAvg*2){
        console.log(`${firstTeamName} win (${firstAvg}vs${secondAvg})`)
    } else if(secondAvg&amp;gt;firstAvg &amp;amp;&amp;amp; secondAvg&amp;gt;=firstAvg*2){
        console.log(`${secondTeamName} win (${secondAvg}vs${firstAvg})`);
    }else {
        console.log('draw!');
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Use the 'checkWinner' function to determine the winner for both Data 1 and Data 2&lt;/p&gt;
&lt;pre id=&quot;code_1668604716299&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;checkWinner('Dolphin',dolphinFirstAvg,'Koalas',koalasFirstAvg);

checkWinner('Dolphin',dolphinSecondAvg,'Koalas',koalasSecondAvg);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 출처: Udemy 강의 The Complete JavaScript Course 2023 : From Zero to Export&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>JavaScript</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/144</guid>
      <comments>https://developerson.tistory.com/144#entry144comment</comments>
      <pubDate>Wed, 16 Nov 2022 22:19:32 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript 기초 - 변수와 데이터 타입 : let / const / number / string/ boolean / null / undefine / symbol</title>
      <link>https://developerson.tistory.com/143</link>
      <description>&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;시작하기 전 설정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;1. index.html 파일 생성&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 폴더에 자바스크립트 코드파일(variable.js) 외에도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저의 콘솔창을 통해 결과를 출력하게 해주는 index.html 파일도 생성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;204&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXeJEc/btrJrQHI4NZ/w5fKWE51q76QPfRMIGtp1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXeJEc/btrJrQHI4NZ/w5fKWE51q76QPfRMIGtp1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXeJEc/btrJrQHI4NZ/w5fKWE51q76QPfRMIGtp1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXeJEc%2FbtrJrQHI4NZ%2Fw5fKWE51q76QPfRMIGtp1k%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;204&quot; height=&quot;106&quot; data-origin-width=&quot;204&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;index.html&lt;/blockquote&gt;
&lt;pre id=&quot;code_1660225504770&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
    &amp;lt;script src=&quot;variable.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;2. Use srtict 입력하기&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바닐라 자바스크립트 개발시 제일 먼저 'use strict'를 선언해주는 게 좋다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2vlrS/btrJvRyoUCX/ni9tcHUbCfX5WTXpgsbBHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2vlrS/btrJvRyoUCX/ni9tcHUbCfX5WTXpgsbBHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2vlrS/btrJvRyoUCX/ni9tcHUbCfX5WTXpgsbBHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2vlrS%2FbtrJvRyoUCX%2Fni9tcHUbCfX5WTXpgsbBHK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;559&quot; height=&quot;124&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;자바 스크립트의 변수&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;Variable&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. let&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ES6에 추가된 변수로, ES6는 글로벌하게 개발자들이 이용하는 자바스크립트 문법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에는 var라는 변수를 썼지만, var에는 치명적인 단점이 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로&amp;nbsp; &amp;nbsp;var는 hoisting의 성격을 가지고 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hoisting :&lt;span style=&quot;color: #6a9955; letter-spacing: 0px;&quot;&gt;move declaration from bottom to top 어디에 선언했냐에 상관 없이 항상 선언을 끌어올려주는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;만약 아래 순서와 같이 코드가 작성되어 있다 해도&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1660226043176&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'use strict';

console.log(age); // undefined로 출력
{
age=4;
var age;
}
console.log(age); //4로 출력&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;var age라는 선언이 제일 위로 끌어 올려지기 때문에, &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;age에 대한 값이 할당되지 않았으므로 제일 처음 콘솔문에는 undefined으로 나온다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;따라서 이러한 단점을 가진 var을 대체하기 위해 나온 변수가 let이다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;ES6부터 자바스크립트에 변수를 선언할수 있는 키워드는 딱 하나 let이다.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1660226319869&quot; class=&quot;sqf&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let globalName = 'global name';

{
let name = 'nomad';
console.log(name);
name='haven';
console.log(name);
console.log(globalName)
}

console.log(name); // 블록안에 있는 변수는 외부에서 출력하지 못한다.
console.log(globalName); // 블록 안에서 변수 쓰지 않고 바로 정의하는 변수를 
//global scope이라고 부른다. 블록 안에서도, 밖에서도 출력 가능하다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTTccu/btrJt37G6GN/CnrRtYVUmvebCzTdavft71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTTccu/btrJt37G6GN/CnrRtYVUmvebCzTdavft71/img.png&quot; data-alt=&quot;위 코드의 출력화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTTccu/btrJt37G6GN/CnrRtYVUmvebCzTdavft71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTTccu%2FbtrJt37G6GN%2FCnrRtYVUmvebCzTdavft71%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;386&quot; height=&quot;191&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;191&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 코드의 출력화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;globalName과 같은 글로벌한 &lt;span style=&quot;color: #6a9955; letter-spacing: 0px;&quot;&gt;변수들은 어플리케이션이 실행되는 순간부터 끝날때까지 메모리에 탑재되기 때문에 최소한으로 쓸 필요가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;let은 메모리에 값을 읽고 쓰는게 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UzjFV/btrJC4SqAIn/Ki8mi6fvbtg6CaQkNue6AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UzjFV/btrJC4SqAIn/Ki8mi6fvbtg6CaQkNue6AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UzjFV/btrJC4SqAIn/Ki8mi6fvbtg6CaQkNue6AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUzjFV%2FbtrJC4SqAIn%2FKi8mi6fvbtg6CaQkNue6AK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;456&quot; height=&quot;186&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;let 변수에 ellie라고 할당한 다음 hello라고 변경하는게 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1085&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cciE6X/btrJEMcHKTc/A289eeRHmXHufuYpqLGDX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cciE6X/btrJEMcHKTc/A289eeRHmXHufuYpqLGDX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cciE6X/btrJEMcHKTc/A289eeRHmXHufuYpqLGDX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcciE6X%2FbtrJEMcHKTc%2FA289eeRHmXHufuYpqLGDX0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;464&quot; height=&quot;198&quot; data-origin-width=&quot;1085&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. Const&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;선언한 뒤에 변경할수 없는 immutable한 변수. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 16px; letter-spacing: 0px;&quot;&gt;웬만하면 값을 할당한 다음 변경되지 않는 데이터 값에 사용해야하는 변수이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 16px; letter-spacing: 0px;&quot;&gt;읽기만 가능하다. 그래서 변수를 할당한 뒤에는 다른 값으로 변경하는 게 불가능 하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgcU0d/btrJGVtpFD5/zsUEJ97BdbsbdJC2Ak9g6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgcU0d/btrJGVtpFD5/zsUEJ97BdbsbdJC2Ak9g6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgcU0d/btrJGVtpFD5/zsUEJ97BdbsbdJC2Ak9g6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgcU0d%2FbtrJGVtpFD5%2FzsUEJ97BdbsbdJC2Ak9g6k%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;197&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 16px; letter-spacing: 0px;&quot;&gt;변수의 값이 바뀌어야될 좋은 이유가 없다면 웬만해선 Const를 사용하는 편이 좋다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;u&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Const 변수를 쓰는 이유&lt;/span&gt;&lt;/u&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-security&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-thread safety &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-reduce human mistakes&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1660226632212&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const daysInWeek = 7;
const maxNumber = 5;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;변수의 종류들&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;Variables Types&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;primitive, single item&lt;/b&gt;: number, string, boolean, null, undefine, symbol 더이상 작은 단위로 나눠질수 없는 한가지의 단위&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;object&lt;/b&gt; : 싱글 아이템들을 하나로 묶어 여러 단위로 관리할수 있게 해주는 것. box container&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;function, first-class function&lt;/b&gt; : 다른 데이터 타입처럼 함수를 변수에 할당, 함수에 파라미터로도 전달, 함수의 리턴 타입으로도 함수 전달&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1660226793373&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const count = 17; //Integer
const size = 17.1; //Decimal number
console.log(`value: ${count}, type: ${typeof count}`);
console.log(`value: ${size}, type: ${typeof size}`);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3Zx43/btrJt4yJ9hr/XyUErEL7HSOciT4zxGJz6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3Zx43/btrJt4yJ9hr/XyUErEL7HSOciT4zxGJz6K/img.png&quot; data-alt=&quot;위 코드의 출력결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3Zx43/btrJt4yJ9hr/XyUErEL7HSOciT4zxGJz6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3Zx43%2FbtrJt4yJ9hr%2FXyUErEL7HSOciT4zxGJz6K%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;353&quot; height=&quot;74&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 코드의 출력결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Imuuntable data type:&lt;/b&gt; primitive types, frozen objects (i.e. object.freeze())&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Mutable data type:&lt;/b&gt; all object by default are mutable in JS&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UzjFV/btrJC4SqAIn/Ki8mi6fvbtg6CaQkNue6AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UzjFV/btrJC4SqAIn/Ki8mi6fvbtg6CaQkNue6AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UzjFV/btrJC4SqAIn/Ki8mi6fvbtg6CaQkNue6AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUzjFV%2FbtrJC4SqAIn%2FKi8mi6fvbtg6CaQkNue6AK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;456&quot; height=&quot;186&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;primitive type 같은 경우는 변수가 바로 메모리에 저장된다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;variable은 value가 메모리에 저장된다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lT5sX/btrJB2AN5Eb/2GLEulbWfsQPXKK92Es4F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lT5sX/btrJB2AN5Eb/2GLEulbWfsQPXKK92Es4F1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lT5sX/btrJB2AN5Eb/2GLEulbWfsQPXKK92Es4F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlT5sX%2FbtrJB2AN5Eb%2F2GLEulbWfsQPXKK92Es4F1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;470&quot; height=&quot;171&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;반대로 object는 너무 커서 메모리에 한번에 올라갈수 없다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;const ellie라고 선언한다음 object를 할당하게 되면 ellie가 가르키는 곳엔 ref가 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;ref는 실제로 object가 담겨있는 메모리를 가르킨다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;ellie가 가르키고 있는 포인터만 잠겨서 ellie가 다른 object로 변경이 불가능 하지만,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;ellie의 나이와 이름은 변경이 가능하다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;object는 obejct를 가리키는 ref가 메모리에 저장된닫.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; number에 속하지만 특수한 값을 가지는 경우 : infinity, -infiniry, Nan(Not a Number)&lt;/p&gt;
&lt;pre id=&quot;code_1660226915699&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const infinity = 1/0; //수를 0으로 나누면 무한대가 된다
const negativeInfinity = -1/0; //음수를 0으로 나누면 음의 무한대가 된다.
const nAn = 'not a number'/2;

console.log(infinity);
console.log(negativeInfinity);
console.log(nAn);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&lt;span style=&quot;color: #6a9955; letter-spacing: 0px;&quot;&gt;연산시 유효한 값을 받지 못하게 되면 숫자가 아닌 Infinity, -Infinity가 뜨는 경우가 있으니 주의&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;165&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsUryD/btrJsOCWD37/IEBgV6OVwqOOk53AYquKbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsUryD/btrJsOCWD37/IEBgV6OVwqOOk53AYquKbK/img.png&quot; data-alt=&quot;위 코드의 출력결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsUryD/btrJsOCWD37/IEBgV6OVwqOOk53AYquKbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsUryD%2FbtrJsOCWD37%2FIEBgV6OVwqOOk53AYquKbK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;165&quot; height=&quot;104&quot; data-origin-width=&quot;165&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 코드의 출력결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; bigInt : 새로 추가된 변수로 많이 쓰지는 않지만, 큰 숫자를 표현할때 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1660227095832&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const bigInt= 15648465456484655132184121238412123n;
console.log(`value: ${bigInt}, type: ${typeof bigInt}`);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k15gV/btrJvjIHhtr/QakVbJ6btee9FNF3knN5G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k15gV/btrJvjIHhtr/QakVbJ6btee9FNF3knN5G1/img.png&quot; data-alt=&quot;위 코드의 출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k15gV/btrJvjIHhtr/QakVbJ6btee9FNF3knN5G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk15gV%2FbtrJvjIHhtr%2FQakVbJ6btee9FNF3knN5G1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;717&quot; height=&quot;35&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 코드의 출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; string 문자열&lt;/p&gt;
&lt;pre id=&quot;code_1660227158678&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const char = 'c';
const brendan = 'brendan';
const greeting ='hello' + brendan;
const helloBob = `hi ${brendan}!`; // template literals (string)

console.log(`value: ${greeting}, type: ${typeof greeting}`);
console.log(`value: ${helloBob}, type: ${typeof helloBob}`);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpy3va/btrJrQucTPw/4K5k0HDxf3bOqoEpmhlCek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpy3va/btrJrQucTPw/4K5k0HDxf3bOqoEpmhlCek/img.png&quot; data-alt=&quot;위 코드의 출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpy3va/btrJrQucTPw/4K5k0HDxf3bOqoEpmhlCek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpy3va%2FbtrJrQucTPw%2F4K5k0HDxf3bOqoEpmhlCek%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;427&quot; height=&quot;72&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 코드의 출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  boolean&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; letter-spacing: 0px;&quot;&gt;&lt;b&gt;false&lt;/b&gt;: 0, null, undefined, Nan, ''(비어진 string)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;true&lt;/b&gt;: any other value&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1660227286120&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const canRead = true;
const test = 3&amp;lt;1; // fasle
console.log(`value: ${canRead}, type: ${typeof canRead}`);
console.log(`value: ${test}, type: ${typeof test}`);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbI2Sq/btrJvjIHqdF/Km3DUaSBRIN0K2QLrNtzXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbI2Sq/btrJvjIHqdF/Km3DUaSBRIN0K2QLrNtzXK/img.png&quot; data-alt=&quot;위 코드의 출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbI2Sq/btrJvjIHqdF/Km3DUaSBRIN0K2QLrNtzXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbI2Sq%2FbtrJvjIHqdF%2FKm3DUaSBRIN0K2QLrNtzXK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;378&quot; height=&quot;68&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 코드의 출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  null 텅 비어 있는 값&lt;/p&gt;
&lt;pre id=&quot;code_1660227337880&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let nothing = null;
console.log(`value: ${nothing}, type: ${typeof nothing}`);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMuZFh/btrJuRy8Q4r/faVuWS0QALEiiOnVpLwRPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMuZFh/btrJuRy8Q4r/faVuWS0QALEiiOnVpLwRPK/img.png&quot; data-alt=&quot;위 코드의 출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMuZFh/btrJuRy8Q4r/faVuWS0QALEiiOnVpLwRPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMuZFh%2FbtrJuRy8Q4r%2FfaVuWS0QALEiiOnVpLwRPK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;340&quot; height=&quot;38&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 코드의 출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;undefined 텅 비어있는 것과 값이 들어가 있는 것마저 정해지지 않은 값&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1660227398776&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let x;
console.log(`value: ${x}, type: ${typeof x}`);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg1HPn/btrJwqf73lA/SB2ig9wqNv3xKq1lQ99Vyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg1HPn/btrJwqf73lA/SB2ig9wqNv3xKq1lQ99Vyk/img.png&quot; data-alt=&quot;위 코드의 출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg1HPn/btrJwqf73lA/SB2ig9wqNv3xKq1lQ99Vyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg1HPn%2FbtrJwqf73lA%2FSB2ig9wqNv3xKq1lQ99Vyk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;443&quot; height=&quot;38&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 코드의 출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span style=&quot;color: #000000;&quot;&gt;s&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;ymbol&amp;nbsp; : map이나 자료구조에서 고유한 식별자가 필요할때, 동시에 다발적으로 일어날수 있는 코드에서 우선순위를 주고싶을 때 사용 &lt;span style=&quot;color: #000000;&quot;&gt;create unique identifiers for objects &amp;nbsp;map&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1660227515112&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const symbol1 = Symbol('id');
const symbol2 = Symbol('id');
console.log(symbol1===symbol2); //콘솔에 출력하면 false 나온다.

const gSymbol1 = Symbol.for('id');
const gSymbol2 = Symbol.for('id');
console.log(gSymbol1===gSymbol2); // true
console.log(`value: ${symbol1.description}, type: ${typeof symbol1}`);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blOlnW/btrJrQnqNug/mbfq7S4UqVZbnhi0HpMGX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blOlnW/btrJrQnqNug/mbfq7S4UqVZbnhi0HpMGX0/img.png&quot; data-alt=&quot;위 코드의 출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blOlnW/btrJrQnqNug/mbfq7S4UqVZbnhi0HpMGX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblOlnW%2FbtrJrQnqNug%2Fmbfq7S4UqVZbnhi0HpMGX0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;311&quot; height=&quot;108&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 코드의 출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*symbol은&amp;nbsp;바로&amp;nbsp;출력하면&amp;nbsp;error가&amp;nbsp;나므로&amp;nbsp;.description을&amp;nbsp;통해&amp;nbsp;출력해야&amp;nbsp;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; object 구조체. 실제의 사물, 데이터 구조등을 표현할때 쓰인다.&lt;/p&gt;
&lt;pre id=&quot;code_1660227623046&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const haven = { name: 'haven', age: 20};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 기록/JavaScript</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>자바스크립트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/143</guid>
      <comments>https://developerson.tistory.com/143#entry143comment</comments>
      <pubDate>Thu, 11 Aug 2022 23:21:11 +0900</pubDate>
    </item>
    <item>
      <title>Jnit test시 java.lang.llegalStateException 오류 났을 때 해결 방법</title>
      <link>https://developerson.tistory.com/142</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HB6po/btrDGJGOz1C/E0p5b1TzrISea8MkGUJ6K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HB6po/btrDGJGOz1C/E0p5b1TzrISea8MkGUJ6K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HB6po/btrDGJGOz1C/E0p5b1TzrISea8MkGUJ6K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHB6po%2FbtrDGJGOz1C%2FE0p5b1TzrISea8MkGUJ6K1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;890&quot; height=&quot;698&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;698&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 실행하니&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1433&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rpKRn/btrDMziq0xp/Wdhr3mjBKRrEOVvyjONKNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rpKRn/btrDMziq0xp/Wdhr3mjBKRrEOVvyjONKNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rpKRn/btrDMziq0xp/Wdhr3mjBKRrEOVvyjONKNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrpKRn%2FbtrDMziq0xp%2FWdhr3mjBKRrEOVvyjONKNk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1433&quot; height=&quot;495&quot; data-origin-width=&quot;1433&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 오류가 났다.&amp;nbsp;java.lang.llegalStateException&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색해보니 pom.xml 파일에서 spring-framework / spring-core / spring-test의 버전이 다르면 이런 에러가 난다고.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;dust&quot;&gt;&lt;code&gt;    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;spring-test&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;${org.springframework-version}&amp;lt;/version&amp;gt;
   &amp;lt;/dependency&amp;gt;
&amp;lt;/dependencies&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;version 부분에 아래와 같은 코드를 입력하고 maven을 reload하니까 오류가 사라졌다&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;${org.springframework-version}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처: &lt;a href=&quot;https://m.blog.naver.com/ysulshin/220934106478&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://m.blog.naver.com/ysulshin/220934106478&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654088089838&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;junit test 안될때 에러로그/해결방법&quot; data-og-description=&quot;에러로그 java.lang.IllegalStateException: Could not load TestContextBootstrapper [null]. Spe...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://m.blog.naver.com/ysulshin/220934106478&quot; data-og-url=&quot;https://blog.naver.com/ysulshin/220934106478&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LA6uk/hyOBBK1lV4/chotn7ANKbPPq1IzMMo85k/img.png?width=270&amp;amp;height=270&amp;amp;face=0_0_270_270&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/ysulshin/220934106478&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://m.blog.naver.com/ysulshin/220934106478&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LA6uk/hyOBBK1lV4/chotn7ANKbPPq1IzMMo85k/img.png?width=270&amp;amp;height=270&amp;amp;face=0_0_270_270');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;junit test 안될때 에러로그/해결방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;에러로그 java.lang.IllegalStateException: Could not load TestContextBootstrapper [null]. Spe...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 기록/Spring</category>
      <category>error</category>
      <category>Java</category>
      <category>spring</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/142</guid>
      <comments>https://developerson.tistory.com/142#entry142comment</comments>
      <pubDate>Wed, 1 Jun 2022 21:55:01 +0900</pubDate>
    </item>
    <item>
      <title>react / 리액트로 화면에 카메라 구현하고 촬영한 사진 저장하기</title>
      <link>https://developerson.tistory.com/141</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;참고 사이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.expo.dev/versions/latest/sdk/camera/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.expo.dev/versions/latest/sdk/camera/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1647784284737&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Camera - Expo Documentation&quot; data-og-description=&quot;Expo is an open-source platform for making universal native apps for Android, iOS, and the web with JavaScript and React.&quot; data-og-host=&quot;docs.expo.dev&quot; data-og-source-url=&quot;https://docs.expo.dev/versions/latest/sdk/camera/&quot; data-og-url=&quot;https://docs.expo.dev/versions/latest/sdk/camera/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hMedt/hyNLOiI9AL/VyW8xCDfyMiAq7tQTRmyNk/img.png?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627,https://scrap.kakaocdn.net/dn/cqhzkw/hyNLR7Bg5U/hZeumhOf6QTPkzmC22G9Yk/img.png?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627,https://scrap.kakaocdn.net/dn/et7a2D/hyNKb0WrQh/fNHMg3yE2eBFEAkQ8xNnwK/img.png?width=620&amp;amp;height=620&amp;amp;face=0_0_620_620&quot;&gt;&lt;a href=&quot;https://docs.expo.dev/versions/latest/sdk/camera/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.expo.dev/versions/latest/sdk/camera/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hMedt/hyNLOiI9AL/VyW8xCDfyMiAq7tQTRmyNk/img.png?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627,https://scrap.kakaocdn.net/dn/cqhzkw/hyNLR7Bg5U/hZeumhOf6QTPkzmC22G9Yk/img.png?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627,https://scrap.kakaocdn.net/dn/et7a2D/hyNKb0WrQh/fNHMg3yE2eBFEAkQ8xNnwK/img.png?width=620&amp;amp;height=620&amp;amp;face=0_0_620_620');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Camera - Expo Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Expo is an open-source platform for making universal native apps for Android, iOS, and the web with JavaScript and React.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.expo.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;022&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/022.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/022.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;시작&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;프로젝트 생성문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1647783783111&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native init CameraSample --template react-native-template-typescript&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;설정을 위한 설치문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1647783834294&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install -g yarn


npm yarn --version


npm i react-native-camera


npm i watcher


npm i @react-native-community/cameraroll


npm install --save fbjs&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package.json &amp;gt; dependencis 부분에서 watcher 버전 1.1 으로 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eo9y4g/btrwlKUyNUj/PSk8WvRMLFvnmW2HjOfOBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eo9y4g/btrwlKUyNUj/PSk8WvRMLFvnmW2HjOfOBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eo9y4g/btrwlKUyNUj/PSk8WvRMLFvnmW2HjOfOBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feo9y4g%2FbtrwlKUyNUj%2FPSk8WvRMLFvnmW2HjOfOBk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;163&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;163&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그외 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;카메라샘플1.PNG&quot; data-origin-width=&quot;210&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHSrWq/btrwA7mprBE/SrnBAU4AN2un5deLC5wrMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHSrWq/btrwA7mprBE/SrnBAU4AN2un5deLC5wrMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHSrWq/btrwA7mprBE/SrnBAU4AN2un5deLC5wrMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHSrWq%2FbtrwA7mprBE%2FSrnBAU4AN2un5deLC5wrMk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;210&quot; height=&quot;208&quot; data-filename=&quot;카메라샘플1.PNG&quot; data-origin-width=&quot;210&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;app&amp;gt;src 안에 있는 build.gradle &amp;gt; defaultConfig부분&lt;/span&gt;에 아래 구문 삽입&lt;/p&gt;
&lt;pre id=&quot;code_1647783903917&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;missingDimensionStrategy 'react-native-camera', 'general'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;build.gradle&amp;gt; defaultConfig 전체 코드&lt;/p&gt;
&lt;pre id=&quot;code_1647783952259&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apply plugin: &quot;com.android.application&quot;

import com.android.build.OutputFile

/**
 * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
 * and bundleReleaseJsAndAssets).
 * These basically call `react-native bundle` with the correct arguments during the Android build
 * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
 * bundle directly from the development server. Below you can see all the possible configurations
 * and their defaults. If you decide to add a configuration block, make sure to add it before the
 * `apply from: &quot;../../node_modules/react-native/react.gradle&quot;` line.
 *
 * project.ext.react = [
 *   // the name of the generated asset file containing your JS bundle
 *   bundleAssetName: &quot;index.android.bundle&quot;,
 *
 *   // the entry file for bundle generation. If none specified and
 *   // &quot;index.android.js&quot; exists, it will be used. Otherwise &quot;index.js&quot; is
 *   // default. Can be overridden with ENTRY_FILE environment variable.
 *   entryFile: &quot;index.android.js&quot;,
 *
 *   // https://reactnative.dev/docs/performance#enable-the-ram-format
 *   bundleCommand: &quot;ram-bundle&quot;,
 *
 *   // whether to bundle JS and assets in debug mode
 *   bundleInDebug: false,
 *
 *   // whether to bundle JS and assets in release mode
 *   bundleInRelease: true,
 *
 *   // whether to bundle JS and assets in another build variant (if configured).
 *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
 *   // The configuration property can be in the following formats
 *   //         'bundleIn${productFlavor}${buildType}'
 *   //         'bundleIn${buildType}'
 *   // bundleInFreeDebug: true,
 *   // bundleInPaidRelease: true,
 *   // bundleInBeta: true,
 *
 *   // whether to disable dev mode in custom build variants (by default only disabled in release)
 *   // for example: to disable dev mode in the staging build type (if configured)
 *   devDisabledInStaging: true,
 *   // The configuration property can be in the following formats
 *   //         'devDisabledIn${productFlavor}${buildType}'
 *   //         'devDisabledIn${buildType}'
 *
 *   // the root of your project, i.e. where &quot;package.json&quot; lives
 *   root: &quot;../../&quot;,
 *
 *   // where to put the JS bundle asset in debug mode
 *   jsBundleDirDebug: &quot;$buildDir/intermediates/assets/debug&quot;,
 *
 *   // where to put the JS bundle asset in release mode
 *   jsBundleDirRelease: &quot;$buildDir/intermediates/assets/release&quot;,
 *
 *   // where to put drawable resources / React Native assets, e.g. the ones you use via
 *   // require('./image.png')), in debug mode
 *   resourcesDirDebug: &quot;$buildDir/intermediates/res/merged/debug&quot;,
 *
 *   // where to put drawable resources / React Native assets, e.g. the ones you use via
 *   // require('./image.png')), in release mode
 *   resourcesDirRelease: &quot;$buildDir/intermediates/res/merged/release&quot;,
 *
 *   // by default the gradle tasks are skipped if none of the JS files or assets change; this means
 *   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
 *   // date; if you have any other folders that you want to ignore for performance reasons (gradle
 *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
 *   // for example, you might want to remove it from here.
 *   inputExcludes: [&quot;android/**&quot;, &quot;ios/**&quot;],
 *
 *   // override which node gets called and with what additional arguments
 *   nodeExecutableAndArgs: [&quot;node&quot;],
 *
 *   // supply additional arguments to the packager
 *   extraPackagerArgs: []
 * ]
 */

project.ext.react = [
    enableHermes: false,  // clean and rebuild if changing
]

apply from: &quot;../../node_modules/react-native/react.gradle&quot;

/**
 * Set this to true to create two separate APKs instead of one:
 *   - An APK that only works on ARM devices
 *   - An APK that only works on x86 devices
 * The advantage is the size of the APK is reduced by about 4MB.
 * Upload all the APKs to the Play Store and people will download
 * the correct one based on the CPU architecture of their device.
 */
def enableSeparateBuildPerCPUArchitecture = false

/**
 * Run Proguard to shrink the Java bytecode in release builds.
 */
def enableProguardInReleaseBuilds = false

/**
 * The preferred build flavor of JavaScriptCore.
 *
 * For example, to use the international variant, you can use:
 * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
 *
 * The international variant includes ICU i18n library and necessary data
 * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
 * give correct results when using with locales other than en-US.  Note that
 * this variant is about 6MiB larger per architecture than default.
 */
def jscFlavor = 'org.webkit:android-jsc:+'

/**
 * Whether to enable the Hermes VM.
 *
 * This should be set on project.ext.react and that value will be read here. If it is not set
 * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
 * and the benefits of using Hermes will therefore be sharply reduced.
 */
def enableHermes = project.ext.react.get(&quot;enableHermes&quot;, false);

/**
 * Architectures to build native code for in debug.
 */
def nativeArchitectures = project.getProperties().get(&quot;reactNativeDebugArchitectures&quot;)

android {
    ndkVersion rootProject.ext.ndkVersion

    compileSdkVersion rootProject.ext.compileSdkVersion

    defaultConfig {
        applicationId &quot;com.camerasample&quot;
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName &quot;1.0&quot;
        missingDimensionStrategy 'react-native-camera', 'general'

    }
    splits {
        abi {
            reset()
            enable enableSeparateBuildPerCPUArchitecture
            universalApk false  // If true, also generate a universal APK
            include &quot;armeabi-v7a&quot;, &quot;x86&quot;, &quot;arm64-v8a&quot;, &quot;x86_64&quot;
        }
    }
    signingConfigs {
        debug {
            storeFile file('debug.keystore')
            storePassword 'android'
            keyAlias 'androiddebugkey'
            keyPassword 'android'
        }
    }
    buildTypes {
        debug {
            signingConfig signingConfigs.debug
            if (nativeArchitectures) {
                ndk {
                    abiFilters nativeArchitectures.split(',')
                }
            }
        }
        release {
            // Caution! In production, you need to generate your own keystore file.
            // see https://reactnative.dev/docs/signed-apk-android.
            signingConfig signingConfigs.debug
            minifyEnabled enableProguardInReleaseBuilds
            proguardFiles getDefaultProguardFile(&quot;proguard-android.txt&quot;), &quot;proguard-rules.pro&quot;
        }
    }

    // applicationVariants are e.g. debug, release
    applicationVariants.all { variant -&amp;gt;
        variant.outputs.each { output -&amp;gt;
            // For each separate APK per architecture, set a unique version code as described here:
            // https://developer.android.com/studio/build/configure-apk-splits.html
            // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc.
            def versionCodes = [&quot;armeabi-v7a&quot;: 1, &quot;x86&quot;: 2, &quot;arm64-v8a&quot;: 3, &quot;x86_64&quot;: 4]
            def abi = output.getFilter(OutputFile.ABI)
            if (abi != null) {  // null for the universal-debug, universal-release variants
                output.versionCodeOverride =
                        defaultConfig.versionCode * 1000 + versionCodes.get(abi)
            }

        }
    }
}

dependencies {
    implementation fileTree(dir: &quot;libs&quot;, include: [&quot;*.jar&quot;])
    //noinspection GradleDynamicVersion
    implementation &quot;com.facebook.react:react-native:+&quot;  // From node_modules

    implementation &quot;androidx.swiperefreshlayout:swiperefreshlayout:1.0.0&quot;

    debugImplementation(&quot;com.facebook.flipper:flipper:${FLIPPER_VERSION}&quot;) {
        exclude group:'com.facebook.fbjni'
    }

    debugImplementation(&quot;com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}&quot;) {
        exclude group:'com.facebook.flipper'
        exclude group:'com.squareup.okhttp3', module:'okhttp'
    }

    debugImplementation(&quot;com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}&quot;) {
        exclude group:'com.facebook.flipper'
    }

    if (enableHermes) {
        def hermesPath = &quot;../../node_modules/hermes-engine/android/&quot;;
        debugImplementation files(hermesPath + &quot;hermes-debug.aar&quot;)
        releaseImplementation files(hermesPath + &quot;hermes-release.aar&quot;)
    } else {
        implementation jscFlavor
    }
}

// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
    from configurations.implementation
    into 'libs'
}

apply from: file(&quot;../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle&quot;); applyNativeModulesAppBuildGradle(project)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;카메라샘플2.PNG&quot; data-origin-width=&quot;185&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vpdb0/btrwpZRgkeK/rJLC9KEoMVwPkAWvutKXy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vpdb0/btrwpZRgkeK/rJLC9KEoMVwPkAWvutKXy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vpdb0/btrwpZRgkeK/rJLC9KEoMVwPkAWvutKXy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvpdb0%2FbtrwpZRgkeK%2FrJLC9KEoMVwPkAWvutKXy1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;185&quot; height=&quot;242&quot; data-filename=&quot;카메라샘플2.PNG&quot; data-origin-width=&quot;185&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;app&amp;gt;src&amp;gt;main&amp;gt; AndroidManifest.xml 부분을 아래와 같이 수정&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647784253964&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
  package=&quot;com.camerasample&quot;&amp;gt;

&amp;lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&amp;gt;
&amp;lt;uses-permission android:name=&quot;android.permission.CAMERA&quot; /&amp;gt;
&amp;lt;uses-permission android:name=&quot;android.permission.READ_EXTERNAL_STORAGE&quot; /&amp;gt;
&amp;lt;uses-permission android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot; /&amp;gt;
&amp;lt;uses-permission android:name=&quot;android.permission.RECORD_AUDIO&quot;/&amp;gt;





    &amp;lt;application
      android:name=&quot;.MainApplication&quot;
      android:label=&quot;@string/app_name&quot;
      android:icon=&quot;@mipmap/ic_launcher&quot;
      android:roundIcon=&quot;@mipmap/ic_launcher_round&quot;
      android:allowBackup=&quot;false&quot;
      android:theme=&quot;@style/AppTheme&quot;
      android:requestLegacyExternalStorage=&quot;true&quot;&amp;gt;
      

      &amp;lt;activity
        android:name=&quot;.MainActivity&quot;
        android:label=&quot;@string/app_name&quot;
        android:configChanges=&quot;keyboard|keyboardHidden|orientation|screenSize|uiMode&quot;
        android:launchMode=&quot;singleTask&quot;
        android:windowSoftInputMode=&quot;adjustResize&quot;&amp;gt;
        &amp;lt;intent-filter&amp;gt;
            &amp;lt;action android:name=&quot;android.intent.action.MAIN&quot; /&amp;gt;
            &amp;lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&amp;gt;
        &amp;lt;/intent-filter&amp;gt;
      &amp;lt;/activity&amp;gt;
    &amp;lt;/application&amp;gt;
&amp;lt;/manifest&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;App.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1647784459091&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import CameraRoll from &quot;@react-native-community/cameraroll&quot;;
import React, { useState } from &quot;react&quot;;
import { Image, PermissionsAndroid, StyleSheet, Text, TouchableOpacity, View } from &quot;react-native&quot;;
import { RNCamera } from &quot;react-native-camera&quot;;

export default function App(){
  const cameraRef=React.useRef(null)
  const[picture,setPicture] = useState(&quot;이미지경로&quot;)


  //권한처리

  const takePhoto = async()=&amp;gt;{

    await PermissionsAndroid.requestMultiple([
      PermissionsAndroid.PERMISSIONS.CAMERA,
      PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
      PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE
    ]).then((result)=&amp;gt;{
      if (result['android.permission.CAMERA']
          &amp;amp;&amp;amp; result['android.permission.WRITE_EXTERNAL_STORAGE']
          &amp;amp;&amp;amp; result['android.permission.READ_EXTERNAL_STORAGE'] === 'granted') {
          console.log(&quot;모든 권한 획득&quot;);
        } else {
          console.log(&quot;권한거절&quot;);
        }
    })

    if(cameraRef){
      const data= await cameraRef.current.takePictureAsync({
        quality:1,
        exif:true
      })
      console.log('data',data.uri)


      //사진저장
      if(data){
       const result = CameraRoll.save(data.uri).then(out=&amp;gt;{
         console.log(out)
         setPicture(data.uri)
      }).catch(err=&amp;gt;{
        console.log(`${err.message}`)
      })
      console.log('result',result)
    }

  }
}

  return(
    &amp;lt;View style={styles.container}&amp;gt;
     &amp;lt;RNCamera
     ref={cameraRef}
     style={{width:400, height:500}}
     type={RNCamera.Constants.Type.back}
     captureAudio={false}/&amp;gt;

     &amp;lt;TouchableOpacity onPress={takePhoto}&amp;gt;
      &amp;lt;View style={styles.button}&amp;gt;
      &amp;lt;Text&amp;gt;사진&amp;lt;/Text&amp;gt;
      &amp;lt;/View&amp;gt;
     &amp;lt;/TouchableOpacity&amp;gt;

     &amp;lt;Image 
      style={styles.tinyLogo}
      source={{
        uri:`${picture}`
      }}/&amp;gt;
    &amp;lt;/View&amp;gt;
  )
}

const styles = StyleSheet.create({
  container:{
    flex:1,
    justifyContent:&quot;center&quot;,
    alignItems:&quot;center&quot;
  },
    button:{
      width:100,
      height:100,
      borderRadius:50,
      borderWidth:5,
      borderColor:&quot;blue&quot;,
      borderStyle:&quot;solid&quot;,
      backgroundColor:&quot;pink&quot;,
      marginTop:30,
      justifyContent:&quot;center&quot;,
      alignItems:&quot;center&quot;
    },
    tinyLogo:{
      width:100,
      height:100,
      marginTop:30
    }


})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행화면&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220320_223556625.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rncl8/btrwzcIg7qQ/1PvA7DqIynMVVATCOsPf5k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rncl8/btrwzcIg7qQ/1PvA7DqIynMVVATCOsPf5k/img.jpg&quot; data-alt=&quot;구동 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rncl8/btrwzcIg7qQ/1PvA7DqIynMVVATCOsPf5k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frncl8%2FbtrwzcIg7qQ%2F1PvA7DqIynMVVATCOsPf5k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220320_223556625.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;구동 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220320_223556625_01.jpg&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6jPMi/btrwpZX2Hw9/RtvjuOTMessypZyH2lCvY0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6jPMi/btrwpZX2Hw9/RtvjuOTMessypZyH2lCvY0/img.jpg&quot; data-alt=&quot;촬영해서 저장된 사진&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6jPMi/btrwpZX2Hw9/RtvjuOTMessypZyH2lCvY0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6jPMi%2FbtrwpZX2Hw9%2FRtvjuOTMessypZyH2lCvY0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;460&quot; height=&quot;613&quot; data-filename=&quot;KakaoTalk_20220320_223556625_01.jpg&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;촬영해서 저장된 사진&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 기록/react</category>
      <category>React</category>
      <category>리액트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/141</guid>
      <comments>https://developerson.tistory.com/141#entry141comment</comments>
      <pubDate>Sun, 20 Mar 2022 22:55:20 +0900</pubDate>
    </item>
    <item>
      <title>react /  Axios 이용해서 스프링부트로 만든 웹페이지 안드로이드 화면과 연결시키기 (회원가입/게시판/글작성)</title>
      <link>https://developerson.tistory.com/140</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developerson.tistory.com/117&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developerson.tistory.com/117&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1647179928455&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;스프링 부트로 SpringBoot 회원가입, 페이징, 글작성-수정-삭제-답변, 댓글 작성 되는 게시판 페이지&quot; data-og-description=&quot;기본적 세팅은 아래글 https://developerson.tistory.com/114 페이징은 아래글을 참고해서 만든 게시판이다. https://developerson.tistory.com/116 별도의 설명 없이 우선 코드만 백업할 예정. 이제 이걸 이해하..&quot; data-og-host=&quot;developerson.tistory.com&quot; data-og-source-url=&quot;https://developerson.tistory.com/117&quot; data-og-url=&quot;https://developerson.tistory.com/117&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Gq1cD/hyNGHd4lRb/QaYEx2KVqkNpGK6PP0reW1/img.png?width=323&amp;amp;height=726&amp;amp;face=0_0_323_726,https://scrap.kakaocdn.net/dn/bEcdDf/hyNGHry9Fq/kbXGhZJ6fCC2EFx1BnS02k/img.png?width=323&amp;amp;height=726&amp;amp;face=0_0_323_726,https://scrap.kakaocdn.net/dn/byc5W6/hyNH0QBRGq/cxTTMQFUZPkR2eyWwavyc0/img.png?width=323&amp;amp;height=726&amp;amp;face=0_0_323_726&quot;&gt;&lt;a href=&quot;https://developerson.tistory.com/117&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developerson.tistory.com/117&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Gq1cD/hyNGHd4lRb/QaYEx2KVqkNpGK6PP0reW1/img.png?width=323&amp;amp;height=726&amp;amp;face=0_0_323_726,https://scrap.kakaocdn.net/dn/bEcdDf/hyNGHry9Fq/kbXGhZJ6fCC2EFx1BnS02k/img.png?width=323&amp;amp;height=726&amp;amp;face=0_0_323_726,https://scrap.kakaocdn.net/dn/byc5W6/hyNH0QBRGq/cxTTMQFUZPkR2eyWwavyc0/img.png?width=323&amp;amp;height=726&amp;amp;face=0_0_323_726');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;스프링 부트로 SpringBoot 회원가입, 페이징, 글작성-수정-삭제-답변, 댓글 작성 되는 게시판 페이지&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;기본적 세팅은 아래글 https://developerson.tistory.com/114 페이징은 아래글을 참고해서 만든 게시판이다. https://developerson.tistory.com/116 별도의 설명 없이 우선 코드만 백업할 예정. 이제 이걸 이해하..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developerson.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;react와 연결시킬 스프링 프로젝트는 해당 링크에 있는 프로젝트다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;react와 스프링 부트를 잘 연결시키기 위해서는 sts를 통해서 해당 프로젝트의 서버를 미리 켜준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 스프링 부트 프로젝트의 BbsDto 부분에 @JsonProperty(&quot;userid&quot;)라는 어노테이션을 추가해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;react에서 이름이 그냥 id된 데이터를 잘 못받아서 그런다는데.. 잘 모르겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;044&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/044.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/044.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqpzR0/btrvQf0T9q0/I53KeZW0ZX9M3gsptYsTD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqpzR0/btrvQf0T9q0/I53KeZW0ZX9M3gsptYsTD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqpzR0/btrvQf0T9q0/I53KeZW0ZX9M3gsptYsTD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqpzR0%2FbtrvQf0T9q0%2FI53KeZW0ZX9M3gsptYsTD1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;449&quot; height=&quot;482&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 리액트 프로젝트도 생성해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;생성문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1647180525287&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native init Samples --template react-native-template-typescript&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 기능을 써야하므로 미리 입력해줄 설치문도 많다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;설치문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1647180645739&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install @react-navigation/native
npm install @react-navigation/native-stack
npm install react-native-safe-area-context
npm install react-native-gesture-handler
npm install react-native-screens
npm install watcher
npm i axios
npm i @react-native-async-storage/async-storage
npm i react-native-paper&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;watcher 때문에 설치가 불안정할수 있는데 그럴때는 package.json에서 dependencies에 있는 watcher 버전을 1.1.0 으로 바꿔준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K8DjQ/btrvMHxl74P/KNrR3dUx46spFMccKARfu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K8DjQ/btrvMHxl74P/KNrR3dUx46spFMccKARfu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K8DjQ/btrvMHxl74P/KNrR3dUx46spFMccKARfu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK8DjQ%2FbtrvMHxl74P%2FKNrR3dUx46spFMccKARfu0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;296&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 이제 본격적으로 react 프로젝트를 만들어보자&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;022&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/022.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/022.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;파일 구성 및 폴더 구성&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;202&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzk9Ke/btrvOgFZqET/vQK7CzXj92APs43GB7xNCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzk9Ke/btrvOgFZqET/vQK7CzXj92APs43GB7xNCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzk9Ke/btrvOgFZqET/vQK7CzXj92APs43GB7xNCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzk9Ke%2FbtrvOgFZqET%2FvQK7CzXj92APs43GB7xNCK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;202&quot; height=&quot;780&quot; data-origin-width=&quot;202&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이용할 이미지는 assets 폴더를 생성해서 저장한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/Cpceh/btrvPJ7XabH/Yn91sIJiyLmckpo9NCbSy0/dog.png?attach=1&amp;amp;knm=img.png&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;dog.png&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.02MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/dDROXQ/btrvMc3Tnyk/WmXWTPN0v72MtLfCqGN4e1/logo2.png?attach=1&amp;amp;knm=img.png&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;logo2.png&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/zbIZF/btrvRAKtJVL/EPtLDU2d1G1E2Ho6thvAT0/welcome.jpg?attach=1&amp;amp;knm=img.jpg&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;welcome.jpg&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;screens 폴더를 생성하고 그 안에 bbs/member 폴더를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원가입/로그인 화면을 위해 member 폴더 안에 Account.tsx / Login.tsx 파일을 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시판 목록/ 글쓰기 / 글읽기 기능을 위해 bbs 폴더 안에 Bbs.tsx/Bbsdetail.tsx/Bbslist.tsx/Bbswrite.tsx 파일을 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 파일별 코드는 아래와 같다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;bbs 폴더 안에 있는 파일들&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Bbs.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1647181503388&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useState } from &quot;react&quot;;
import { Button, StyleSheet, Text, View } from &quot;react-native&quot;;
import Bbsdetail from &quot;./Bbsdetail&quot;;
import Bbslist from &quot;./Bbslist&quot;;
import Bbswrite from &quot;./Bbswrite&quot;;

function Bbs(){
    const[bbslist,setBbslist]=useState(&quot;bbslist&quot;)
    const[bbs,setBbs]=useState({})


    let child:any

    if(bbslist==&quot;bbslist&quot;){
      //  child = (&amp;lt;Text&amp;gt;Bbslist view&amp;lt;/Text&amp;gt;)
      child=(&amp;lt;Bbslist setBbslist={setBbslist} setBbs={setBbs}/&amp;gt; )
        
    }else if(bbslist==&quot;bbswrite&quot;){
      //  child = (&amp;lt;Text&amp;gt;BbsWrite view&amp;lt;/Text&amp;gt;)
        child =(&amp;lt;Bbswrite setBbslist={setBbslist}/&amp;gt;)

    }else if(bbslist==&quot;bbsdetail&quot;){
      //  child = (&amp;lt;Text&amp;gt;BbsDetail view {JSON.stringify(bbs)} &amp;lt;/Text&amp;gt;)
      child=(&amp;lt;Bbsdetail bbs={bbs}/&amp;gt;)
    }


    return(
        &amp;lt;View&amp;gt;
            &amp;lt;View style={styles.menu}&amp;gt;
            &amp;lt;View style={styles.button}&amp;gt;
                &amp;lt;Button title=&quot;글목록&quot; onPress={bbslist=&amp;gt;setBbslist(&quot;bbslist&quot;)}/&amp;gt;
                &amp;lt;/View&amp;gt;
                &amp;lt;View style={styles.button}&amp;gt;
                &amp;lt;Button title=&quot;글추가&quot; onPress={bbslist=&amp;gt;setBbslist(&quot;bbswrite&quot;)}/&amp;gt;    
                &amp;lt;/View&amp;gt;
            &amp;lt;/View&amp;gt;

            &amp;lt;View&amp;gt;{child}&amp;lt;/View&amp;gt;    


        &amp;lt;/View&amp;gt;
    )
}

const styles = StyleSheet.create({
    menu:{
        flexDirection:&quot;row&quot;,
        flexWrap:&quot;wrap&quot;,
    },
    button:{
        flex:1,
        height:50,
        margin:1,

    },
    childView:{
        height:760,

    }
})

export default Bbs;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Bbsdetail.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1647181564355&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import { StyleSheet,  ScrollView, Text } from &quot;react-native&quot;;
import { Avatar, Card, Headline, Paragraph } from &quot;react-native-paper&quot;;

import { SafeAreaView } from &quot;react-native-safe-area-context&quot;;

function Bbsdetail(props:any){


    return(
        &amp;lt;SafeAreaView&amp;gt;
            &amp;lt;ScrollView contentContainerStyle={styles.contentContainer}&amp;gt;
        
            &amp;lt;Headline&amp;gt;글 내용&amp;lt;/Headline&amp;gt;
            &amp;lt;Card style={styles.card}&amp;gt;

            &amp;lt;Card.Title
            title={props.bbs.title}
            subtitle={&quot;작성자 :&quot; + props.bbs.userid}
            left={props=&amp;gt;&amp;lt;Avatar.Text {...props} label=&quot;AAA&quot;/&amp;gt;}/&amp;gt;

            &amp;lt;Card.Content&amp;gt;
                &amp;lt;Paragraph style={styles.content}&amp;gt;
                    {props.bbs.content}
                &amp;lt;/Paragraph&amp;gt;
                &amp;lt;Text style={{textAlign:&quot;right&quot;}}&amp;gt;
                    조회수:{props.bbs.readcount}
                &amp;lt;/Text&amp;gt;

                &amp;lt;Text style={{textAlign:&quot;right&quot;}}&amp;gt;
                    작성일:{props.bbs.wdate}
                &amp;lt;/Text&amp;gt;

            &amp;lt;/Card.Content&amp;gt;

            &amp;lt;/Card&amp;gt;
        
            &amp;lt;/ScrollView&amp;gt;
        &amp;lt;/SafeAreaView&amp;gt;
    )
}


const styles = StyleSheet.create({

    contentContainer:{
        padding:16

    },
    card:{
        marginTop:20
    },
    content:{
        fontSize:20
    }

})

export default Bbsdetail&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Bbslist.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1647181529412&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import axios from &quot;axios&quot;;
import React, { useEffect, useState } from &quot;react&quot;;
import { StyleSheet, View, TouchableOpacity, Image, Text, FlatList } from &quot;react-native&quot;;

//연습용 데이터
// const data=[
//     {
//         &quot;userid&quot;:&quot;aaa&quot;,
//         &quot;title&quot;:&quot;첫번째 제목&quot;,
//         &quot;readcount&quot;: 3
//     },
//     {
//         &quot;userid&quot;:&quot;bbb&quot;,
//         &quot;title&quot;:&quot;두번째 제목&quot;,
//         &quot;readcount&quot;: 2
//     },
//     {
//         &quot;userid&quot;:&quot;ccc&quot;,
//         &quot;title&quot;:&quot;세번째 제목&quot;,
//         &quot;readcount&quot;: 1
//     }

// ]


function Item({id,title,readcount,seq, props}:any){

    function itemClick(seq:number){
        console.log('itemClick')
        console.log(seq)

        axios.get(&quot;http://192.168.35.3:3000/bbsdetail&quot;, { params:{seq:seq}})
            .then(function(resp){
                console.log(resp.data)

                //짐싸기
                props.setBbs(resp.data)
            })
            .catch(function(err){
                console.log(err)
            })



        //bbsdetail로 이동

        props.setBbslist(&quot;bbsdetail&quot;)

    }

    return(
        &amp;lt;View style={styles.item}&amp;gt;
            &amp;lt;TouchableOpacity onPress={()=&amp;gt;itemClick(seq)}&amp;gt;
                &amp;lt;View style={styles.idRow}&amp;gt;
                    &amp;lt;Image style={styles.image} source={require(&quot;../../assets/dog.png&quot;)}/&amp;gt;
                    &amp;lt;Text style={styles.title}&amp;gt;{title}&amp;lt;/Text&amp;gt;
                &amp;lt;/View&amp;gt;
                &amp;lt;View style={styles.idRow}&amp;gt;
                    &amp;lt;Text style={styles.id}&amp;gt;{id}&amp;lt;/Text&amp;gt;
                    &amp;lt;Text style={styles.readcount}&amp;gt;{readcount}&amp;lt;/Text&amp;gt;
                    &amp;lt;/View&amp;gt;
            &amp;lt;/TouchableOpacity&amp;gt;

        &amp;lt;/View&amp;gt;
    )
}





function Bbslist(props:any){
    const[data,setData]=useState([])

    function renderItem({item}:any){

        function strLength(str:String){
    
            if(str.length &amp;gt; 20){
                return str.substring(0,17)+&quot;...&quot;
            }else{
                return str
            }
        }
    
        return(
            &amp;lt;Item id={&quot;작성자:&quot;+item.userid} title={strLength(item.title)} 
            readcount={&quot;조회수:&quot; +item.readcount} seq={item.seq} props={props}/&amp;gt;
    
        )

    }

    let mounted= true

    useEffect(()=&amp;gt;{

        axios.get(&quot;http://192.168.35.3:3000/getBbsList&quot;,{} )
            .then(function(resp){
             console.log(resp.data)   

             setData(resp.data)

            }).catch(function(err){
             console.log(err)
            })
    },[])

return(
    &amp;lt;View style={styles.scrView}&amp;gt;
        &amp;lt;FlatList data={data} renderItem={renderItem} /&amp;gt;
    &amp;lt;/View&amp;gt;
)
}

const styles = StyleSheet.create({

    item:{
        backgroundColor:'#d7d9f4',
        padding:10,
        marginVertical:2,
        marginHorizontal:8,
        borderColor:&quot;#ff0000&quot;,
        borderRadius:15,
        borderStyle:'solid',
        borderWidth:2
    },
    image:{
        width:50,
        height:50,
        marginTop:15
    },
    title: {
        fontFamily: &quot;roboto-regular&quot;,
        paddingLeft: 20,
        color: &quot;#400040&quot;,
        height: 60,
        width: 500,
        fontSize: 24,
    },
    id: {
        fontFamily: &quot;roboto-regular&quot;,
        //backgroundColor: &quot;#ffff00&quot;,
        color: &quot;#121212&quot;,
        height: 30,
        width: 166,
        fontSize: 20,
        marginLeft: 80,
        marginTop: 8
    },
    readcount: {
        fontFamily: &quot;roboto-regular&quot;,
        //backgroundColor: &quot;#00ff00&quot;,
        color: &quot;#121212&quot;,
        height: 30,
        width: 211,
        fontSize: 20,
        marginLeft: 51,
        marginTop: 8,
        textAlign: &quot;center&quot;,
    },

    idRow:{
        height:40,
        flexDirection:&quot;row&quot;,
        marginLeft:5,
    },
    scrView:{
        height:760
    }

})

export default Bbslist;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Bbswrtie.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1647181588668&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import AsyncStorage from &quot;@react-native-async-storage/async-storage&quot;;
import axios from &quot;axios&quot;;
import React, { useState } from &quot;react&quot;;
import { Alert, StyleSheet, Text, View } from &quot;react-native&quot;;
import { Button,  TextInput } from &quot;react-native-paper&quot;;


function Bbswrite(props:any){
    const [id,setId] = useState('')
    const [title,setTitle]= useState('')
    const [content, setContent] =useState('')
    
    const loginData = async () =&amp;gt;{
        try{
            let user = await AsyncStorage.getItem('login')
            if(user !=null){
            setId((JSON.parse(user)).id )
            }
        }catch(err){}
    }
    loginData()
   

    function bbsWriteBtn(){
        console.log(id)
        console.log(title)
        console.log(content)

        if(title.trim()==&quot;&quot;){
        }

        axios.get(&quot;http://192.168.35.3:3000/bbswrite&quot;,
        {
            params:{
                id:id,
                title:title,
                content:content
            }
        }).then(function(resp){
            console.log(resp.data)

            if(resp.data==&quot;YES&quot;){
                props.setBbslist(&quot;bbslist&quot;)
            }

        }).catch(function(){
            Alert.alert(&quot;추가되지 않았습니다.&quot;)
        })

    }



    return(
        &amp;lt;View&amp;gt;
            &amp;lt;Text style={styles.text}&amp;gt;글추가&amp;lt;/Text&amp;gt;
            &amp;lt;View style={{alignItems:'center'}}&amp;gt;


                &amp;lt;TextInput
                style={styles.texInput}
                mode=&quot;outlined&quot;
                label=&quot;작성자&quot;
                value={id}
                editable={false}/&amp;gt;

                &amp;lt;TextInput
                    style={styles.textArea}
                    mode=&quot;outlined&quot;
                    label=&quot;제목&quot;
                    value={title}
                    onChangeText={title=&amp;gt;setTitle(title)}/&amp;gt;

                &amp;lt;TextInput
                style={styles.textArea}
                placeholder=&quot;내용&quot;
                multiline={true}
                numberOfLines={20}
                value={content}
                onChangeText={content=&amp;gt;setContent(content)}/&amp;gt;
                
                &amp;lt;Button 
                  mode=&quot;outlined&quot;
                  style={styles.button}
                  onPress={bbsWriteBtn}&amp;gt;작성완료&amp;lt;/Button&amp;gt;


            &amp;lt;/View&amp;gt;

        &amp;lt;/View&amp;gt;
    )

}

const styles = StyleSheet.create({
    text:{
        marginTop:10,
        fontSize:30,
        textAlign:&quot;center&quot;
    },
    texInput:{
        marginTop:20,
        fontSize:16,
        width:500,
        height:40,
        backgroundColor:&quot;#e3e3e3&quot;
    },
    textArea:{
        fontSize:16,
        borderWidth:1,
        marginTop:20,
        backgroundColor:&quot;#e3e3e3&quot;,
        textAlignVertical:&quot;top&quot;,
        width:500

    },
    button:{
        marginTop:20,
        marginVertical:8
    }
})


export default Bbswrite&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;member 폴더 안에 있는 파일들&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Account.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1647181762121&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import axios from &quot;axios&quot;;
import React, { useState } from &quot;react&quot;;
import { Image, StyleSheet, View,TouchableHighlight, Text, TextInput, Alert} from &quot;react-native&quot;;



export default function Account( {navigation}:any){
    const[id,setId]= useState('')
    const[msg,setMsg]=useState(&quot;msg&quot;)

    const[pwd,setPwd]=useState(&quot;&quot;)
    const[name,setName]=useState(&quot;&quot;)
    const[email,setEmail]=useState(&quot;&quot;)

    function idCheck(){
        console.log('idCheck')
        console.log(`${id}`)

        if(id.trim()===&quot;&quot;){
            Alert.alert(&quot;아이디&quot;,&quot;아이디를 입력해 주십시오.&quot;)
            setId(&quot;&quot;)
        }else{

        axios.post(&quot;http://192.168.35.3:3000/getId&quot;,null,{params:{id:id}})
        .then(function(resp){
            console.log(resp.data)
            
            if(resp.data==&quot;OK&quot;){
                setMsg(&quot;사용 가능합니다.&quot;)
            }else{
                setMsg(&quot;사용중입니다.&quot;)
                setId(&quot;&quot;)
            }
        })
        .catch(function(err){
            console.log(err)
        })
    }
    }


    
    function regi(){
        if(id.trim()===&quot;&quot;){
            Alert.alert(&quot;아이디&quot;,&quot;아이디를 입력해주십시오.&quot;)
        }
        else if(pwd.trim()===&quot;&quot;){
            Alert.alert(&quot;패스워드&quot;,&quot;패스워드를 입력해주십시오.&quot;)
        }
        else{
            axios.post(&quot;http://192.168.35.3:3000/addmember&quot;,null,
            {
                params:{
                    id:id,
                    pwd: pwd,
                    name:name,
                    email:email
                    }
                 }
            ).then(function(resp){
                console.log(resp.data)

                if(resp.data==&quot;YES&quot;){
                   
                    Alert.alert('regi',
                                '회원가입 되었습니다.',
                                [{
                                   text:'확인',
                                   onPress:()=&amp;gt;navigation.navigate('login')     
                                }])
                }
                else{
                    Alert.alert(&quot;regi&quot;,&quot;가입되지 않았습니다.&quot;)
                }

            }).catch(function(err){
                console.log(err)
            })
        }
    }


    return(
        &amp;lt;View style={styles.container}&amp;gt;
            &amp;lt;Image style={styles.logo} source={require(&quot;../../assets/welcome.jpg&quot;)}/&amp;gt;

            &amp;lt;View style={styles.inputView}&amp;gt;                
                &amp;lt;TextInput
                    style={styles.textInput}
                    placeholder=&quot;아이디&quot;
                    value={id}
                    underlineColorAndroid=&quot;transparent&quot;
                    onChangeText={(id)=&amp;gt;setId(id)}/&amp;gt;
            &amp;lt;/View&amp;gt;


            &amp;lt;View style={styles.idTextContainer}&amp;gt;
                &amp;lt;Text style={styles.idText}&amp;gt;{msg}&amp;lt;/Text&amp;gt;
           
                &amp;lt;TouchableHighlight style={[styles.buttonContainer, styles.sendButton]} 
                                    onPress={()=&amp;gt;idCheck()}&amp;gt;
                    &amp;lt;Text style={styles.buttonText}&amp;gt;id확인&amp;lt;/Text&amp;gt;
                &amp;lt;/TouchableHighlight&amp;gt;
            &amp;lt;/View&amp;gt;


            &amp;lt;View style={styles.inputView}&amp;gt;                
                &amp;lt;TextInput
                    style={styles.textInput}
                    placeholder=&quot;패스워드&quot;
                    underlineColorAndroid=&quot;transparent&quot;
                    onChangeText={(pwd)=&amp;gt;setPwd(pwd)}/&amp;gt;
            &amp;lt;/View&amp;gt;

            
            &amp;lt;View style={styles.inputView}&amp;gt;                
                &amp;lt;TextInput
                    style={styles.textInput}
                    placeholder=&quot;이름&quot;
                    underlineColorAndroid=&quot;transparent&quot;
                    onChangeText={(name)=&amp;gt;setName(name)}/&amp;gt;
            &amp;lt;/View&amp;gt;

             
            &amp;lt;View style={styles.inputView}&amp;gt;                
                &amp;lt;TextInput
                    style={styles.textInput}
                    placeholder=&quot;이메일&quot;
                    underlineColorAndroid=&quot;transparent&quot;
                    onChangeText={(email)=&amp;gt;setName(email)}/&amp;gt;
            &amp;lt;/View&amp;gt;

            &amp;lt;TouchableHighlight style={[styles.buttonContainer, styles.sendButton]} onPress={()=&amp;gt;regi()} &amp;gt;
                &amp;lt;Text style={styles.buttonText}&amp;gt;회원가입&amp;lt;/Text&amp;gt;
            &amp;lt;/TouchableHighlight&amp;gt;



        &amp;lt;/View&amp;gt;

        
    )
}

const styles = StyleSheet.create({
    container:{
        flex:1,
        justifyContent:&quot;center&quot;,
        alignItems:&quot;center&quot;,
        backgroundColor:&quot;#fff&quot;
    },
    logo: {
        justifyContent:&quot;center&quot;,
        marginBottom:60
    },
    inputView:{
        borderBottomColor:&quot;#f5fcff&quot;,
        backgroundColor:&quot;#dcdcdc&quot;,
        borderRadius:30,
        borderBottomWidth:1,
        width:300,
        height:45,
        marginBottom:20,
        flexDirection:'row',
        alignItems:&quot;center&quot;
    },
    textInput:{
        height:45,
        marginLeft:16,
        borderBottomColor:&quot;#fff&quot;,
        flex:1
    },
    buttonContainer:{
        height:45,
        flexDirection:'row',
        justifyContent:&quot;center&quot;,
        alignItems:&quot;center&quot;,
        marginBottom:20,
        width:100,
        borderRadius:30

    },

    sendButton:{
        backgroundColor:&quot;#ff4500&quot;
    },
    idTextContainer:{
        height:45,
        flexDirection:&quot;row&quot;,
        justifyContent:&quot;center&quot;,
        alignItems:&quot;center&quot;,
        width:100,
        borderRadius:30
    },
    idText:{
        marginLeft:20,
        marginBottom:20,
        width:180
    },
    buttonText:{
        color:'white'
    }

})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Login.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1647181786435&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import AsyncStorage from &quot;@react-native-async-storage/async-storage&quot;;
import axios from &quot;axios&quot;;
import React, { useState } from &quot;react&quot;;
import { 
    Image, 
    StyleSheet, 
    View, 
    TextInput, 
    Text, 
    TouchableOpacity,    
    Button,
    Alert
} from &quot;react-native&quot;;

export default function Login( { navigation }:any ) {

    const [id, setId] = useState(&quot;&quot;)
    const [password, setPassword] = useState(&quot;&quot;)
    
    function login(){
        if(id.trim() == &quot;&quot;){
            Alert.alert(&quot;id&quot;, &quot;아이디를 입력해 주십시오&quot;)
        }
        else if(password.trim() == &quot;&quot;){
            Alert.alert(&quot;password&quot;, &quot;password를 입력해 주십시오&quot;)
        }
        else{
            axios.post(&quot;http://192.168.35.3:3000/login&quot;, null, 
                {
                    params: {
                        id: id,
                        pwd: password
                    }
                }).then(function(resp){
                    if(resp.data != null &amp;amp;&amp;amp; resp.data != &quot;&quot;){
                        console.log(&quot;로그인 되었습니다&quot;)
                        console.log(resp.data)

                        AsyncStorage.setItem('login',JSON.stringify(resp.data))

                        //loginData()
                        navigation.navigate('bbs')
                        
                    }
                    else{
                        Alert.alert(&quot;login&quot;, &quot;아이디나 패스워드를 확인하세요&quot;)
                    }

                }).catch(function(err){
                    Alert.alert(&quot;err&quot;, err)
                })
        }
    }

    const loginData = async () =&amp;gt;{
        try{
        let user = await AsyncStorage.getItem('login')
                        console.log(&quot;login 정보:&quot;+user)
        }catch(err){}
    }

    return (
        &amp;lt;View style={styles.container}&amp;gt;            
            &amp;lt;Image style={styles.image} source={ require(&quot;../../assets/logo2.png&quot;) } /&amp;gt;

            &amp;lt;View style={styles.inputView}&amp;gt;
                &amp;lt;TextInput
                    style={styles.textInput}
                    placeholder=&quot;id를 입력해 주세요&quot;
                    placeholderTextColor=&quot;#003f5c&quot;
                    onChangeText={(id)=&amp;gt;setId(id)} /&amp;gt;
            &amp;lt;/View&amp;gt;

            &amp;lt;View style={styles.inputView}&amp;gt;
                &amp;lt;TextInput
                    style={styles.textInput}
                    placeholder=&quot;password를 입력해 주세요&quot;
                    placeholderTextColor=&quot;#003f5c&quot;
                    secureTextEntry={true}
                    onChangeText={(password)=&amp;gt;setPassword(password)} /&amp;gt;
            &amp;lt;/View&amp;gt;

            &amp;lt;TouchableOpacity onPress={()=&amp;gt; navigation.navigate(&quot;account&quot;)}&amp;gt;
                &amp;lt;Text style={styles.forgot_button}&amp;gt;회원가입&amp;lt;/Text&amp;gt;      
            &amp;lt;/TouchableOpacity&amp;gt;

            &amp;lt;TouchableOpacity style={styles.loginBtn} onPress={()=&amp;gt;login()}&amp;gt;
                &amp;lt;Text&amp;gt;로그인&amp;lt;/Text&amp;gt;
            &amp;lt;/TouchableOpacity&amp;gt;     

        &amp;lt;/View&amp;gt;
    )
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: &quot;#fff&quot;,
        alignItems: &quot;center&quot;,
        justifyContent: &quot;center&quot;
    },
    image: {
        marginBottom: 40
    },
    inputView: {
        backgroundColor: &quot;#ffc0cb&quot;,
        borderRadius: 30,
        width: &quot;70%&quot;,
        height: 45,
        marginBottom: 20,
        alignItems: &quot;center&quot;
    },
    textInput:{
        height: 50,
        flex: 1,
        padding: 10,
        marginLeft: 20
    },
    forgot_button: {
        height: 30,
        marginBottom: 30
    },
    loginBtn: {
        width: &quot;50%&quot;,
        borderRadius: 25,
        height: 50,
        alignItems: &quot;center&quot;,
        justifyContent: &quot;center&quot;,
        marginTop: 40,
        backgroundColor: &quot;#ff1493&quot;
    }
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행화면&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220313_231711748.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O2jXH/btrvMdPgxMQ/nT6Try2HqWPtOLXTptSK31/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O2jXH/btrvMdPgxMQ/nT6Try2HqWPtOLXTptSK31/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O2jXH/btrvMdPgxMQ/nT6Try2HqWPtOLXTptSK31/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO2jXH%2FbtrvMdPgxMQ%2FnT6Try2HqWPtOLXTptSK31%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220313_231711748.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220313_231711748_01.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUsXKF/btrvSfzjzNv/rKbFDbJ4X84wKkX5M7Jdu0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUsXKF/btrvSfzjzNv/rKbFDbJ4X84wKkX5M7Jdu0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUsXKF/btrvSfzjzNv/rKbFDbJ4X84wKkX5M7Jdu0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUsXKF%2FbtrvSfzjzNv%2FrKbFDbJ4X84wKkX5M7Jdu0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220313_231711748_01.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220313_231711748_02.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wuidw/btrvKrtZgZm/oSgZ3BgFmOMGiGRzvCd4OK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wuidw/btrvKrtZgZm/oSgZ3BgFmOMGiGRzvCd4OK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wuidw/btrvKrtZgZm/oSgZ3BgFmOMGiGRzvCd4OK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwuidw%2FbtrvKrtZgZm%2FoSgZ3BgFmOMGiGRzvCd4OK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220313_231711748_02.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220313_231711748_03.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doC5yZ/btrvNIbBVs4/sGHGaaWBQGh7OAD8lqe0V0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doC5yZ/btrvNIbBVs4/sGHGaaWBQGh7OAD8lqe0V0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doC5yZ/btrvNIbBVs4/sGHGaaWBQGh7OAD8lqe0V0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoC5yZ%2FbtrvNIbBVs4%2FsGHGaaWBQGh7OAD8lqe0V0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220313_231711748_03.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220313_231715030.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/evpysr/btrvS7OzPsl/erdVUszLyF7GtRf84IYKBK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/evpysr/btrvS7OzPsl/erdVUszLyF7GtRf84IYKBK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/evpysr/btrvS7OzPsl/erdVUszLyF7GtRf84IYKBK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fevpysr%2FbtrvS7OzPsl%2FerdVUszLyF7GtRf84IYKBK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220313_231715030.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 기록/react</category>
      <category>axios</category>
      <category>React</category>
      <category>리액트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/140</guid>
      <comments>https://developerson.tistory.com/140#entry140comment</comments>
      <pubDate>Sun, 13 Mar 2022 23:30:50 +0900</pubDate>
    </item>
    <item>
      <title>react / builderX 로 레이아웃 간편하게 만들고 화면에 적용하기</title>
      <link>https://developerson.tistory.com/139</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;builderX를 이용하면 별다른 코드를 작성하지 않고 쉽게 화면의 레이아웃을 만들수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://builderx.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://builderx.io/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1647178941267&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;BuilderX&quot; data-og-description=&quot;BuilderX is a browser based screen design tool that codes React Native &amp;amp; React for you&quot; data-og-host=&quot;builderx.io&quot; data-og-source-url=&quot;https://builderx.io/&quot; data-og-url=&quot;https://builderx.io&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://builderx.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://builderx.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;BuilderX&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;BuilderX is a browser based screen design tool that codes React Native &amp;amp; React for you&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;builderx.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;구글 아이디만 있으면 편하게 사용 가능하다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;new project를 클릭하면 새로운 레이아웃을 만들수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkUMk3/btrvUCtZWff/ftmKoCMoBqbbBiU0y7Sqk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkUMk3/btrvUCtZWff/ftmKoCMoBqbbBiU0y7Sqk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkUMk3/btrvUCtZWff/ftmKoCMoBqbbBiU0y7Sqk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkUMk3%2FbtrvUCtZWff%2FftmKoCMoBqbbBiU0y7Sqk0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;854&quot; height=&quot;406&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;940&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSDIWd/btrvMHxj7LV/mpdNjfbXMfKYp27Vm1tZYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSDIWd/btrvMHxj7LV/mpdNjfbXMfKYp27Vm1tZYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSDIWd/btrvMHxj7LV/mpdNjfbXMfKYp27Vm1tZYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSDIWd%2FbtrvMHxj7LV%2FmpdNjfbXMfKYp27Vm1tZYk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1916&quot; height=&quot;940&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;940&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Device로 OS를 설정하고 화면의 크기를 설정하는 기초 설정을 먼저해준다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그다음 본인이 원하는 소스를 추가해 화면을 구성하면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;코드를 보기 위해서는 우측 상단의 CODE를 클릭하면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;CODE를 클릭하면 Download Component 버튼이 보이는데 이를 클릭.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/babi80/btrvS6WnRMq/taacQqL7Pih9RtnEY3O9W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/babi80/btrvS6WnRMq/taacQqL7Pih9RtnEY3O9W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/babi80/btrvS6WnRMq/taacQqL7Pih9RtnEY3O9W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbabi80%2FbtrvS6WnRMq%2FtaacQqL7Pih9RtnEY3O9W0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;585&quot; height=&quot;473&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다운 받은 component 폴더는 압축을 풀어준다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;우선 다운받은 component를 적용할 react 프로젝트를 만들어줘야한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;생성문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1647179297106&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native init sampleBD --template react-native-template-typescript&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트를 생성한 다음 폴더를 만들어준다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;155&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sFaUw/btrvJxamUcH/dCiUePw3MYOrt93dnMqmY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sFaUw/btrvJxamUcH/dCiUePw3MYOrt93dnMqmY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sFaUw/btrvJxamUcH/dCiUePw3MYOrt93dnMqmY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsFaUw%2FbtrvJxamUcH%2FdCiUePw3MYOrt93dnMqmY1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;155&quot; height=&quot;204&quot; data-origin-width=&quot;155&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;src폴더를 생성한다. &amp;gt; src 폴더안에 assets/ components는 다른데서 복붙할 것이므로 따로 생성하지 않는다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다시 다운받은 component 폴더를 확인해보자.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;폴더 안에 있는 src 폴더의 파일들을 이용해야한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;253&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA0acA/btrvRzEOcte/uh1qioBHPYSxkVdEKy3Ze0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA0acA/btrvRzEOcte/uh1qioBHPYSxkVdEKy3Ze0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA0acA/btrvRzEOcte/uh1qioBHPYSxkVdEKy3Ze0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA0acA%2FbtrvRzEOcte%2Fuh1qioBHPYSxkVdEKy3Ze0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;253&quot; height=&quot;141&quot; data-origin-width=&quot;253&quot; data-origin-height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tk194/btrvSAiBGiX/zcbCo2xCsnqDXceKE51rkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tk194/btrvSAiBGiX/zcbCo2xCsnqDXceKE51rkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tk194/btrvSAiBGiX/zcbCo2xCsnqDXceKE51rkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftk194%2FbtrvSAiBGiX%2FzcbCo2xCsnqDXceKE51rkk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;473&quot; height=&quot;156&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;src 폴더 안에 있는 assets 폴더와 component 폴더를 복사한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 react프로젝트 안에 생성했던 src 폴더에 복사 붙여넣기한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;155&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sFaUw/btrvJxamUcH/dCiUePw3MYOrt93dnMqmY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sFaUw/btrvJxamUcH/dCiUePw3MYOrt93dnMqmY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sFaUw/btrvJxamUcH/dCiUePw3MYOrt93dnMqmY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsFaUw%2FbtrvJxamUcH%2FdCiUePw3MYOrt93dnMqmY1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;155&quot; height=&quot;204&quot; data-origin-width=&quot;155&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아직 builderX를 통해 다운받은 component 폴더에서 사용할 파일이 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;srceens 폴더 안에 있는 untilted.js 파일의 코드를 모두 복사한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;298&quot; data-origin-height=&quot;101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5Rd8b/btrvPK6RjNN/datOWPHzVUKfKefdeHDkP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5Rd8b/btrvPK6RjNN/datOWPHzVUKfKefdeHDkP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5Rd8b/btrvPK6RjNN/datOWPHzVUKfKefdeHDkP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5Rd8b%2FbtrvPK6RjNN%2FdatOWPHzVUKfKefdeHDkP1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;298&quot; height=&quot;101&quot; data-origin-width=&quot;298&quot; data-origin-height=&quot;101&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;복사한 코드를 리액트 프로젝트의 App.tsx에 붙여넣기한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;165&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uU5wN/btrvMJaP0I7/hGJRAdEdxcK9cm1yKuAkWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uU5wN/btrvMJaP0I7/hGJRAdEdxcK9cm1yKuAkWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uU5wN/btrvMJaP0I7/hGJRAdEdxcK9cm1yKuAkWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuU5wN%2FbtrvMJaP0I7%2FhGJRAdEdxcK9cm1yKuAkWk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;165&quot; height=&quot;384&quot; data-origin-width=&quot;165&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 복붙을 하면 에러가 난다. 그럴때는 import문의 from에 있는 폴더 위치를 수정해주고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;function 이름을 App으로 수정해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제일 하단에 있는 export 문도 default App; 으로 바꿔주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1647179731990&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from &quot;react&quot;;
import { StyleSheet, View, Text, TextInput, Slider } from &quot;react-native&quot;;
import CupertinoButtonPurple1 from &quot;./src/components/CupertinoButtonPurple1&quot;;
import CupertinoSegmentWithTwoTabs from &quot;./src/components/CupertinoSegmentWithTwoTabs&quot;;
import MaterialCardWithImageAndTitle from &quot;./src/components/MaterialCardWithImageAndTitle&quot;;

function App(props:any) {
  return (
    &amp;lt;View style={styles.container}&amp;gt;
      &amp;lt;Text style={styles.text제목작성}&amp;gt;Text 제목 작성&amp;lt;/Text&amp;gt;
      &amp;lt;TextInput
        placeholder=&quot;입력하십시오.&quot;
        style={styles.입력하십시오}
      &amp;gt;&amp;lt;/TextInput&amp;gt;
      &amp;lt;Slider value={50} style={styles.slider}&amp;gt;&amp;lt;/Slider&amp;gt;
      &amp;lt;View style={styles.rect}&amp;gt;&amp;lt;/View&amp;gt;
      &amp;lt;CupertinoButtonPurple1
        style={styles.cupertinoButtonPurple1}
      &amp;gt;&amp;lt;/CupertinoButtonPurple1&amp;gt;
      &amp;lt;CupertinoSegmentWithTwoTabs
        style={styles.cupertinoSegmentWithTwoTabs}
      &amp;gt;&amp;lt;/CupertinoSegmentWithTwoTabs&amp;gt;
      &amp;lt;MaterialCardWithImageAndTitle
        style={styles.materialCardWithImageAndTitle}
      &amp;gt;&amp;lt;/MaterialCardWithImageAndTitle&amp;gt;
    &amp;lt;/View&amp;gt;
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1
  },
  text제목작성: {
    fontFamily: &quot;roboto-regular&quot;,
    color: &quot;#121212&quot;,
    height: 51,
    width: 394,
    textAlign: &quot;center&quot;,
    fontSize: 20,
    marginTop: 23,
    marginLeft: 103
  },
  입력하십시오: {
    fontFamily: &quot;courier-regular&quot;,
    color: &quot;rgba(0,0,0,1)&quot;,
    height: 54,
    width: 505,
    textAlign: &quot;center&quot;,
    borderWidth: 1,
    borderColor: &quot;#000000&quot;,
    shadowColor: &quot;rgba(0,0,0,1)&quot;,
    shadowOffset: {
      width: 3,
      height: 3
    },
    elevation: 5,
    shadowOpacity: 0.81,
    shadowRadius: 0,
    borderRadius: 33,
    backgroundColor: &quot;rgba(255,255,255,1)&quot;,
    marginTop: 50,
    marginLeft: 48
  },
  slider: {
    height: 31,
    width: 385,
    marginTop: 22,
    marginLeft: 107
  },
  rect: {
    width: 493,
    height: 261,
    backgroundColor: &quot;#E6E6E6&quot;,
    marginTop: 50,
    marginLeft: 54
  },
  cupertinoButtonPurple1: {
    height: 44,
    width: 100,
    marginTop: 14,
    marginLeft: 250
  },
  cupertinoSegmentWithTwoTabs: {
    height: 56,
    width: 375,
    marginTop: 8,
    marginLeft: 107
  },
  materialCardWithImageAndTitle: {
    height: 166,
    width: 359,
    marginTop: 28,
    marginLeft: 121
  }
});

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 적용한뒤 실행하면 아래와 같은 화면이 잘 적용되었음을 확인할수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220313_224049109.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A5wu8/btrvVMbZ5UC/cLu5qfyKde81eTzmdiNzQ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A5wu8/btrvVMbZ5UC/cLu5qfyKde81eTzmdiNzQ1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A5wu8/btrvVMbZ5UC/cLu5qfyKde81eTzmdiNzQ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA5wu8%2FbtrvVMbZ5UC%2FcLu5qfyKde81eTzmdiNzQ1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220313_224049109.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코딩 기록/react</category>
      <category>builderx</category>
      <category>React</category>
      <category>TypeScript</category>
      <category>리액트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/139</guid>
      <comments>https://developerson.tistory.com/139#entry139comment</comments>
      <pubDate>Sun, 13 Mar 2022 22:57:43 +0900</pubDate>
    </item>
    <item>
      <title>react / Navigator로 화면간 이동 가능하게 만들기</title>
      <link>https://developerson.tistory.com/138</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;생성문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646754181813&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native init sample26 --template react-native-template-typescript&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;설치문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646754196231&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;
npm install react-native-gesture-handler

npm install @react-navigation/native


npm install @react-navigation/native-stack


npm install react-native-safe-area-context


npm install react-native-screens


npm install watcher&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;파일구조&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;197&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q7gK4/btrvvD8lcKa/sSuKjpD4ktty3F3RYjT3z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q7gK4/btrvvD8lcKa/sSuKjpD4ktty3F3RYjT3z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q7gK4/btrvvD8lcKa/sSuKjpD4ktty3F3RYjT3z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq7gK4%2FbtrvvD8lcKa%2FsSuKjpD4ktty3F3RYjT3z1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;197&quot; height=&quot;242&quot; data-origin-width=&quot;197&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src 폴더 생성 &amp;gt; 그안에 screens 생성 &amp;gt; DetailScreen, HomeScreen 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;HomeScreen.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646754244625&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useNavigation } from &quot;@react-navigation/native&quot;;
import React from &quot;react&quot;;
import { Button, StyleSheet, Text, View } from &quot;react-native&quot;;

export default function HomeScreen(){

    const navigation = useNavigation()

  return(
  &amp;lt;View style={styles.container}&amp;gt;
      &amp;lt;Text&amp;gt;Home Screen&amp;lt;/Text&amp;gt;
      &amp;lt;Button title='Detail로 이동' onPress={()=&amp;gt; navigation.navigate(&quot;Detail&quot;)}/&amp;gt;
  &amp;lt;/View&amp;gt;
  )
}

const styles = StyleSheet.create({
    container:{
        flex:1,
        alignItems:'center',
        justifyContent:'center'
    }

})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;DetailScreem.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646754256410&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import { Button, StyleSheet, Text, View } from &quot;react-native&quot;;

export default function DetailScreen(){


    return(
        &amp;lt;View style={styles.container}&amp;gt;
            &amp;lt;Text&amp;gt;Detail Screen&amp;lt;/Text&amp;gt;
        &amp;lt;/View&amp;gt;
        )

}

const styles = StyleSheet.create({
    container:{
        flex:1,
        alignItems:'center',
        justifyContent:'center'
    }
})&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;App.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646754292226&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { NavigationContainer } from &quot;@react-navigation/native&quot;;
import { createNativeStackNavigator } from &quot;@react-navigation/native-stack&quot;;
import React from &quot;react&quot;;
import { View } from &quot;react-native&quot;;
import DetailScreen from &quot;./src/screens/DetailScreen&quot;
import HomeScreen from &quot;./src/screens/HomeScreen&quot;


const Stack = createNativeStackNavigator()

export default function App(){


  return(
  &amp;lt;NavigationContainer&amp;gt;
    &amp;lt;Stack.Navigator initialRouteName=&quot;Home&quot;&amp;gt;

    &amp;lt;Stack.Screen name=&quot;Home&quot; component={HomeScreen}/&amp;gt;
    
    &amp;lt;Stack.Screen name=&quot;Detail&quot; component={DetailScreen}/&amp;gt;

    &amp;lt;/Stack.Navigator&amp;gt;
  &amp;lt;/NavigationContainer&amp;gt;

  )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행화면&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220308_232748961_10.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjNeLf/btrvrf8Y0Li/lCKOlmy2F5IkrzEpMwGq61/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjNeLf/btrvrf8Y0Li/lCKOlmy2F5IkrzEpMwGq61/img.jpg&quot; data-alt=&quot;&amp;amp;nbsp;Home화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjNeLf/btrvrf8Y0Li/lCKOlmy2F5IkrzEpMwGq61/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjNeLf%2Fbtrvrf8Y0Li%2FlCKOlmy2F5IkrzEpMwGq61%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220308_232748961_10.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;nbsp;Home화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220308_232748961_12.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3icAe/btrvuOoXpKu/KwD0kumWl2TW35qMktfaUK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3icAe/btrvuOoXpKu/KwD0kumWl2TW35qMktfaUK/img.jpg&quot; data-alt=&quot;Detail 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3icAe/btrvuOoXpKu/KwD0kumWl2TW35qMktfaUK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3icAe%2FbtrvuOoXpKu%2FKwD0kumWl2TW35qMktfaUK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220308_232748961_12.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Detail 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코딩 기록/react</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/138</guid>
      <comments>https://developerson.tistory.com/138#entry138comment</comments>
      <pubDate>Wed, 9 Mar 2022 00:45:50 +0900</pubDate>
    </item>
    <item>
      <title>react 메인 화면 구성하고 Navigator로  화면 이동하게 만들기</title>
      <link>https://developerson.tistory.com/137</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;생성문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646753305150&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native init sample25 --template react-native-template-typescript&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;설치문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646753336091&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install react-native-gesture-handler

npm install @react-navigation/native


npm install @react-navigation/bottom-tabs


npm install react-native-safe-area-context

npm install react-native-screens


npm install react-native-vector-icons

npm install watcher

npm i --save-dev @types/react-native-vector-icons&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;생성파일&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;샘플25파일.PNG&quot; data-origin-width=&quot;264&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DG5Wf/btrvylFRQcL/hNzDqPSqzMVZiPZXBR4P9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DG5Wf/btrvylFRQcL/hNzDqPSqzMVZiPZXBR4P9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DG5Wf/btrvylFRQcL/hNzDqPSqzMVZiPZXBR4P9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDG5Wf%2FbtrvylFRQcL%2FhNzDqPSqzMVZiPZXBR4P9k%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;264&quot; height=&quot;576&quot; data-filename=&quot;샘플25파일.PNG&quot; data-origin-width=&quot;264&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src 폴더 생성 &amp;gt; 그 안에 screens폴더 생성 &amp;gt; 그안에 BaseScreen, HomeScreen, SettingScreen tsx 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;build.gradle 설정&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;샘플25그래들.PNG&quot; data-origin-width=&quot;187&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lyHqQ/btrvtBcnkYA/hcVcnARVPTC2AwT9RMEaK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lyHqQ/btrvtBcnkYA/hcVcnARVPTC2AwT9RMEaK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lyHqQ/btrvtBcnkYA/hcVcnARVPTC2AwT9RMEaK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlyHqQ%2FbtrvtBcnkYA%2FhcVcnARVPTC2AwT9RMEaK0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;187&quot; height=&quot;200&quot; data-filename=&quot;샘플25그래들.PNG&quot; data-origin-width=&quot;187&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;android&amp;gt;app&amp;gt;build.gradle 에 코드 추가&lt;/p&gt;
&lt;pre id=&quot;code_1646753652168&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apply plugin: &quot;com.android.application&quot;

import com.android.build.OutputFile

/**
 * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
 * and bundleReleaseJsAndAssets).
 * These basically call `react-native bundle` with the correct arguments during the Android build
 * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
 * bundle directly from the development server. Below you can see all the possible configurations
 * and their defaults. If you decide to add a configuration block, make sure to add it before the
 * `apply from: &quot;../../node_modules/react-native/react.gradle&quot;` line.
 *
 * project.ext.react = [
 *   // the name of the generated asset file containing your JS bundle
 *   bundleAssetName: &quot;index.android.bundle&quot;,
 *
 *   // the entry file for bundle generation. If none specified and
 *   // &quot;index.android.js&quot; exists, it will be used. Otherwise &quot;index.js&quot; is
 *   // default. Can be overridden with ENTRY_FILE environment variable.
 *   entryFile: &quot;index.android.js&quot;,
 *
 *   // https://reactnative.dev/docs/performance#enable-the-ram-format
 *   bundleCommand: &quot;ram-bundle&quot;,
 *
 *   // whether to bundle JS and assets in debug mode
 *   bundleInDebug: false,
 *
 *   // whether to bundle JS and assets in release mode
 *   bundleInRelease: true,
 *
 *   // whether to bundle JS and assets in another build variant (if configured).
 *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
 *   // The configuration property can be in the following formats
 *   //         'bundleIn${productFlavor}${buildType}'
 *   //         'bundleIn${buildType}'
 *   // bundleInFreeDebug: true,
 *   // bundleInPaidRelease: true,
 *   // bundleInBeta: true,
 *
 *   // whether to disable dev mode in custom build variants (by default only disabled in release)
 *   // for example: to disable dev mode in the staging build type (if configured)
 *   devDisabledInStaging: true,
 *   // The configuration property can be in the following formats
 *   //         'devDisabledIn${productFlavor}${buildType}'
 *   //         'devDisabledIn${buildType}'
 *
 *   // the root of your project, i.e. where &quot;package.json&quot; lives
 *   root: &quot;../../&quot;,
 *
 *   // where to put the JS bundle asset in debug mode
 *   jsBundleDirDebug: &quot;$buildDir/intermediates/assets/debug&quot;,
 *
 *   // where to put the JS bundle asset in release mode
 *   jsBundleDirRelease: &quot;$buildDir/intermediates/assets/release&quot;,
 *
 *   // where to put drawable resources / React Native assets, e.g. the ones you use via
 *   // require('./image.png')), in debug mode
 *   resourcesDirDebug: &quot;$buildDir/intermediates/res/merged/debug&quot;,
 *
 *   // where to put drawable resources / React Native assets, e.g. the ones you use via
 *   // require('./image.png')), in release mode
 *   resourcesDirRelease: &quot;$buildDir/intermediates/res/merged/release&quot;,
 *
 *   // by default the gradle tasks are skipped if none of the JS files or assets change; this means
 *   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
 *   // date; if you have any other folders that you want to ignore for performance reasons (gradle
 *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
 *   // for example, you might want to remove it from here.
 *   inputExcludes: [&quot;android/**&quot;, &quot;ios/**&quot;],
 *
 *   // override which node gets called and with what additional arguments
 *   nodeExecutableAndArgs: [&quot;node&quot;],
 *
 *   // supply additional arguments to the packager
 *   extraPackagerArgs: []
 * ]
 */

project.ext.react = [
    enableHermes: false,  // clean and rebuild if changing
]

apply from: &quot;../../node_modules/react-native/react.gradle&quot;

/**
 * Set this to true to create two separate APKs instead of one:
 *   - An APK that only works on ARM devices
 *   - An APK that only works on x86 devices
 * The advantage is the size of the APK is reduced by about 4MB.
 * Upload all the APKs to the Play Store and people will download
 * the correct one based on the CPU architecture of their device.
 */
def enableSeparateBuildPerCPUArchitecture = false

/**
 * Run Proguard to shrink the Java bytecode in release builds.
 */
def enableProguardInReleaseBuilds = false

/**
 * The preferred build flavor of JavaScriptCore.
 *
 * For example, to use the international variant, you can use:
 * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
 *
 * The international variant includes ICU i18n library and necessary data
 * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
 * give correct results when using with locales other than en-US.  Note that
 * this variant is about 6MiB larger per architecture than default.
 */
def jscFlavor = 'org.webkit:android-jsc:+'

/**
 * Whether to enable the Hermes VM.
 *
 * This should be set on project.ext.react and that value will be read here. If it is not set
 * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
 * and the benefits of using Hermes will therefore be sharply reduced.
 */
def enableHermes = project.ext.react.get(&quot;enableHermes&quot;, false);

/**
 * Architectures to build native code for in debug.
 */
def nativeArchitectures = project.getProperties().get(&quot;reactNativeDebugArchitectures&quot;)

android {
    ndkVersion rootProject.ext.ndkVersion

    compileSdkVersion rootProject.ext.compileSdkVersion

    defaultConfig {
        applicationId &quot;com.sample25&quot;
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName &quot;1.0&quot;
    }
    splits {
        abi {
            reset()
            enable enableSeparateBuildPerCPUArchitecture
            universalApk false  // If true, also generate a universal APK
            include &quot;armeabi-v7a&quot;, &quot;x86&quot;, &quot;arm64-v8a&quot;, &quot;x86_64&quot;
        }
    }
    signingConfigs {
        debug {
            storeFile file('debug.keystore')
            storePassword 'android'
            keyAlias 'androiddebugkey'
            keyPassword 'android'
        }
    }
    buildTypes {
        debug {
            signingConfig signingConfigs.debug
            if (nativeArchitectures) {
                ndk {
                    abiFilters nativeArchitectures.split(',')
                }
            }
        }
        release {
            // Caution! In production, you need to generate your own keystore file.
            // see https://reactnative.dev/docs/signed-apk-android.
            signingConfig signingConfigs.debug
            minifyEnabled enableProguardInReleaseBuilds
            proguardFiles getDefaultProguardFile(&quot;proguard-android.txt&quot;), &quot;proguard-rules.pro&quot;
        }
    }

    // applicationVariants are e.g. debug, release
    applicationVariants.all { variant -&amp;gt;
        variant.outputs.each { output -&amp;gt;
            // For each separate APK per architecture, set a unique version code as described here:
            // https://developer.android.com/studio/build/configure-apk-splits.html
            // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc.
            def versionCodes = [&quot;armeabi-v7a&quot;: 1, &quot;x86&quot;: 2, &quot;arm64-v8a&quot;: 3, &quot;x86_64&quot;: 4]
            def abi = output.getFilter(OutputFile.ABI)
            if (abi != null) {  // null for the universal-debug, universal-release variants
                output.versionCodeOverride =
                        defaultConfig.versionCode * 1000 + versionCodes.get(abi)
            }

        }
    }
}

dependencies {
    implementation fileTree(dir: &quot;libs&quot;, include: [&quot;*.jar&quot;])
    //noinspection GradleDynamicVersion
    implementation &quot;com.facebook.react:react-native:+&quot;  // From node_modules

    implementation &quot;androidx.swiperefreshlayout:swiperefreshlayout:1.0.0&quot;

    debugImplementation(&quot;com.facebook.flipper:flipper:${FLIPPER_VERSION}&quot;) {
        exclude group:'com.facebook.fbjni'
    }

    debugImplementation(&quot;com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}&quot;) {
        exclude group:'com.facebook.flipper'
        exclude group:'com.squareup.okhttp3', module:'okhttp'
    }

    debugImplementation(&quot;com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}&quot;) {
        exclude group:'com.facebook.flipper'
    }

    if (enableHermes) {
        def hermesPath = &quot;../../node_modules/hermes-engine/android/&quot;;
        debugImplementation files(hermesPath + &quot;hermes-debug.aar&quot;)
        releaseImplementation files(hermesPath + &quot;hermes-release.aar&quot;)
    } else {
        implementation jscFlavor
    }
}

// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
    from configurations.implementation
    into 'libs'
}

project.ext.vectoricons = [
  iconFontNames: [ 'Ionicons.ttf', 'FontAwesome.ttf' ]
]


apply from: file(&quot;../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle&quot;); applyNativeModulesAppBuildGradle(project)


apply from: &quot;../../node_modules/react-native-vector-icons/fonts.gradle&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 두개 코드만 추가된 것.&lt;/p&gt;
&lt;pre id=&quot;code_1646753687673&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;project.ext.vectoricons = [
  iconFontNames: [ 'Ionicons.ttf', 'FontAwesome.ttf' ]
]

-apply from: &quot;../../node_modules/react-native-vector-icons/fonts.gradle&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;HomeScreen.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646753845238&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import { StyleSheet, Text, View } from &quot;react-native&quot;;

export default function HomeScreen(){


    return(
        &amp;lt;View style={styles.container}&amp;gt;
            &amp;lt;Text&amp;gt;Home Screen&amp;lt;/Text&amp;gt;
        &amp;lt;/View&amp;gt;
    )
}


const styles = StyleSheet.create({
    container:{
        backgroundColor:'#ffffff'
    }
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;BaseScreen.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646753891616&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import { StyleSheet, Text, View } from &quot;react-native&quot;;

export default function BaseScreen(){


    return(
        &amp;lt;View style={styles.container}&amp;gt;
            &amp;lt;Text&amp;gt;Base Screen&amp;lt;/Text&amp;gt;
        &amp;lt;/View&amp;gt;
    )
}

const styles = StyleSheet.create({
    container:{
        backgroundColor:'#00ff00'
    }
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;SettingScreen.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646753916140&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import { StyleSheet, Text, View } from &quot;react-native&quot;;

export default function SettingScreen(){

    return(
        &amp;lt;View style={styles.container}&amp;gt;
            &amp;lt;Text&amp;gt;Setting Screen&amp;lt;/Text&amp;gt;
        &amp;lt;/View&amp;gt;
    )
}


const styles = StyleSheet.create({
    container:{
        backgroundColor:'grey'
    }
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행화면&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220309_002755671.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sk7fw/btrvtdbIxSk/0WGywG5g5PxhGedlskrf2K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sk7fw/btrvtdbIxSk/0WGywG5g5PxhGedlskrf2K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sk7fw/btrvtdbIxSk/0WGywG5g5PxhGedlskrf2K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSk7fw%2FbtrvtdbIxSk%2F0WGywG5g5PxhGedlskrf2K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;627&quot; height=&quot;1004&quot; data-filename=&quot;KakaoTalk_20220309_002755671.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220309_002755671_01.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xjehw/btrvuQf1fyu/NYQYDxbmtz2H7AjP0bfFI0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xjehw/btrvuQf1fyu/NYQYDxbmtz2H7AjP0bfFI0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xjehw/btrvuQf1fyu/NYQYDxbmtz2H7AjP0bfFI0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxjehw%2FbtrvuQf1fyu%2FNYQYDxbmtz2H7AjP0bfFI0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;976&quot; data-filename=&quot;KakaoTalk_20220309_002755671_01.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220309_002755671_02.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qwaNN/btrvxk8iCgm/kYwQjQ0LaLl8BEElITMP71/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qwaNN/btrvxk8iCgm/kYwQjQ0LaLl8BEElITMP71/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qwaNN/btrvxk8iCgm/kYwQjQ0LaLl8BEElITMP71/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqwaNN%2Fbtrvxk8iCgm%2FkYwQjQ0LaLl8BEElITMP71%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;642&quot; height=&quot;1027&quot; data-filename=&quot;KakaoTalk_20220309_002755671_02.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 기록/react</category>
      <category>navigator</category>
      <category>React</category>
      <category>TypeScript</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/137</guid>
      <comments>https://developerson.tistory.com/137#entry137comment</comments>
      <pubDate>Wed, 9 Mar 2022 00:39:35 +0900</pubDate>
    </item>
    <item>
      <title>react  / TextProvider, useContext 통해서 다른 파일에 있는 값 화면에 구현하기</title>
      <link>https://developerson.tistory.com/136</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;생성문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646752997155&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native init sample24 --template react-native-template-typescript&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;생성파일&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;샘플24파일.PNG&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfK9EI/btrvt2AuOAK/nwNWgdsTziWIf7a9t6NSu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfK9EI/btrvt2AuOAK/nwNWgdsTziWIf7a9t6NSu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfK9EI/btrvt2AuOAK/nwNWgdsTziWIf7a9t6NSu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfK9EI%2Fbtrvt2AuOAK%2FnwNWgdsTziWIf7a9t6NSu0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;234&quot; height=&quot;263&quot; data-filename=&quot;샘플24파일.PNG&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src 폴더 생성 &amp;gt; 그 안에 component 폴더 생성 &amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;component폴더안에 CountProvider, First, Second, Third, TextProvider 타입 스크립트 파일 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;TextProvider.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646752398698&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { createContext } from &quot;react&quot;;
import { Text } from &quot;react-native&quot;;

export const TextContext = createContext({})

interface Props{
    children: JSX.Element

}

export default function TextProvider({ children }:Props){

    const text = &quot;이것은 전달한 값입니다.&quot;

    //매개변수 children에 text값을 전달
    return(
        &amp;lt;TextContext.Provider value={text}&amp;gt;
            {children}
        &amp;lt;/TextContext.Provider&amp;gt;
    )



}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;CountProvider.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646752419332&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { createContext, useState } from &quot;react&quot;;
import { Text } from &quot;react-native&quot;;

export const CountContext = createContext({})

interface Props{
    children: JSX.Element

}

export const CountProvider = ({ children }:Props)=&amp;gt;{

    const [count, setcount] = useState(0)

    return(
        &amp;lt;CountContext.Provider value={[count, setcount]}&amp;gt;
            {children}
        &amp;lt;/CountContext.Provider&amp;gt;
    )



}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Third.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646752334625&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useContext } from &quot;react&quot;;
import { Text, View, Button } from &quot;react-native&quot;;
import { CountContext } from &quot;./CountProvider&quot;;
import { TextContext } from &quot;./TextProvider&quot;;



export default function Third(){

    const [count,setCount]:any = useContext(CountContext)

    const btnClick = () =&amp;gt;{
        setCount( (pcount:any) =&amp;gt; pcount+1 )
    }

    return(
        &amp;lt;View&amp;gt;
            &amp;lt;Text&amp;gt;Third Component: 현재 카운트 : {count}&amp;lt;/Text&amp;gt;
            &amp;lt;Button title=&quot;+1증가&quot; onPress={btnClick}/&amp;gt;
        &amp;lt;/View&amp;gt;        
    )

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Second.tsx&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1646752779008&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useContext } from &quot;react&quot;;
import { Text, View } from &quot;react-native&quot;;
import Third from &quot;./Third&quot;;


export default function Second(){
 

    return (
        
        &amp;lt;View&amp;gt;
            &amp;lt;Text&amp;gt;Second Component&amp;lt;/Text&amp;gt;
            &amp;lt;Third/&amp;gt;
        &amp;lt;/View&amp;gt;
    )

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;First.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646752522928&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useContext } from &quot;react&quot;;
import { Text, TextComponent, View } from &quot;react-native&quot;;
import Second from &quot;./Second&quot;;
import TextProvider, { TextContext } from &quot;./TextProvider&quot;;

export default function First(){

    return (
           &amp;lt;View&amp;gt;
               &amp;lt;Text&amp;gt;First Component&amp;lt;/Text&amp;gt;
                 &amp;lt;Second/&amp;gt;
             &amp;lt;/View&amp;gt;
         )


}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;App.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646752506895&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { createContext, useContext } from &quot;react&quot;;
import { Text, View } from &quot;react-native&quot;;
import { CountProvider } from &quot;./src/component/CountProvider&quot;;
import First from &quot;./src/component/First&quot;;
import TextProvider from &quot;./src/component/TextProvider&quot;;

/*
useContext, creatContext
:값 넘기기
*/



export default function App(){


  return(
    &amp;lt;View&amp;gt;
    &amp;lt;CountProvider&amp;gt;
        &amp;lt;First/&amp;gt;
    &amp;lt;/CountProvider&amp;gt;
    &amp;lt;/View&amp;gt;
  )


}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Second.tsx가 Third.tsx를 전달받고 First.tsx가 Second.tsx를 전달받음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 App.tsx에서 First만 전달받아도 Third,Second의 값을 모두 받을수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행화면&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼 누르면 숫자가 증가한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220309_001904047.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HlinO/btrvvEe67vh/1LJykYgO9MulKgN4lahjkK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HlinO/btrvvEe67vh/1LJykYgO9MulKgN4lahjkK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HlinO/btrvvEe67vh/1LJykYgO9MulKgN4lahjkK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHlinO%2FbtrvvEe67vh%2F1LJykYgO9MulKgN4lahjkK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220309_001904047.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이콘 정보 사이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://ionic.io/ionicons&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ionic.io/ionicons&lt;/a&gt; &lt;/p&gt;
&lt;figure id=&quot;og_1646754092149&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Ionicons: The premium icon pack for Ionic Framework&quot; data-og-description=&quot;Ionicons is an open-sourced and MIT licensed icon pack.&quot; data-og-host=&quot;ionic.io&quot; data-og-source-url=&quot;https://ionic.io/ionicons&quot; data-og-url=&quot;https://ionic.io/ionicons&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bzzUWm/hyNEs8aCiE/vxt9jrEdscHNvWz9bWg7XK/img.png?width=1200&amp;amp;height=640&amp;amp;face=0_0_1200_640&quot;&gt;&lt;a href=&quot;https://ionic.io/ionicons&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ionic.io/ionicons&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bzzUWm/hyNEs8aCiE/vxt9jrEdscHNvWz9bWg7XK/img.png?width=1200&amp;amp;height=640&amp;amp;face=0_0_1200_640');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ionicons: The premium icon pack for Ionic Framework&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ionicons is an open-sourced and MIT licensed icon pack.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ionic.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 기록/react</category>
      <category>contprovider</category>
      <category>React</category>
      <category>textprovider</category>
      <category>TypeScript</category>
      <category>리액트</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/136</guid>
      <comments>https://developerson.tistory.com/136#entry136comment</comments>
      <pubDate>Wed, 9 Mar 2022 00:22:38 +0900</pubDate>
    </item>
    <item>
      <title>react UseMemo 사용하여 특정 함수만 호출되는 예제 보기 / typescript / useCallback함수 이용하여 버튼 클릭시 숫자 증가시키기</title>
      <link>https://developerson.tistory.com/135</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행구문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646751101817&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native init sample22 --template react-native-template-typescript&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;App.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646751122689&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useMemo, useState } from &quot;react&quot;;
import { Button, Text, View } from &quot;react-native&quot;;

/*
useMemo: 연산된 값을 렌더링시에 재사용할때 사용된다
useMeMo(func,검사할 배열 )
*/

function square(params:any){
  const testData = [Array(10).keys]
  testData.forEach(()=&amp;gt;{
  console.log(`계산중.. 루프처리 ${testData.length}회 실행중..`)

})
return params * params
}

export default function App(){

  const[countStateA,setcountStateA] = useState( 0 )
  const[countStateB,setcountStateB] = useState( 0 )


  function countResultA(){
    setcountStateA((prevCount)=&amp;gt;prevCount+1)
    console.log(&quot;A+1 버튼이 클릭되었습니다.&quot;)
  
  }

  function countResultB(){
    setcountStateB((prevCount)=&amp;gt;prevCount+1)
    console.log(&quot;B+1 버튼이 클릭되었습니다.&quot;)
  
  }
 //첫번째 값 useState(0) 이므로 params*params=0
 // const squarArea = square(countStateB) / A+1 버튼 눌렀어도 squre 함수 실행
 
  //useMemo 사용했을때는 계산 B+1 눌렀을때만 squree 함수가 실행
 const squarArea = useMemo(()=&amp;gt;square(countStateB),[countStateB])


  return(
    &amp;lt;View&amp;gt;
      &amp;lt;Text&amp;gt;계산 결과 A&amp;lt;/Text&amp;gt;
      &amp;lt;Button title=&quot;계산: A+1&quot; onPress={countResultA}/&amp;gt;

      &amp;lt;Text&amp;gt;계산 결과 B&amp;lt;/Text&amp;gt;
      &amp;lt;Button title=&quot;계산: B+1&quot; onPress={countResultB}/&amp;gt;

      &amp;lt;Text&amp;gt;정사각형 면적&amp;lt;/Text&amp;gt;
      &amp;lt;Text&amp;gt;계산 결과 X 계산 결과 ={squarArea}&amp;lt;/Text&amp;gt;

    &amp;lt;/View&amp;gt;
  )

}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행화면&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220308_232748961_03.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ypb4A/btrvrBb7Nj1/x2I9O51zm1UbBdVx3FkTH1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ypb4A/btrvrBb7Nj1/x2I9O51zm1UbBdVx3FkTH1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ypb4A/btrvrBb7Nj1/x2I9O51zm1UbBdVx3FkTH1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fypb4A%2FbtrvrBb7Nj1%2Fx2I9O51zm1UbBdVx3FkTH1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220308_232748961_03.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;us&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;eMemo 대신 const squarArea = square(countStateB) 코드를 실행하고 A+1 버튼 눌렀을때 터미널&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;샘플22터미널.PNG&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6Wt1O/btrvlAegbPg/Vd7soEvAxBFMgss27tkppK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6Wt1O/btrvlAegbPg/Vd7soEvAxBFMgss27tkppK/img.png&quot; data-alt=&quot;A+1버튼 누를때 squre함수도 같이 실행되는 중&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6Wt1O/btrvlAegbPg/Vd7soEvAxBFMgss27tkppK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6Wt1O%2FbtrvlAegbPg%2FVd7soEvAxBFMgss27tkppK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;303&quot; height=&quot;207&quot; data-filename=&quot;샘플22터미널.PNG&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;A+1버튼 누를때 squre함수도 같이 실행되는 중&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;squarArea&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;useMemo&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(()&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;square&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;countStateB&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;),[&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;countStateB&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;])&amp;nbsp; &lt;span style=&quot;color: #000000;&quot;&gt;사용한 터미널&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;395&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcsPF2/btrvt2HgZ0T/Xqh2rX7pbZAGiVNfiZRWCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcsPF2/btrvt2HgZ0T/Xqh2rX7pbZAGiVNfiZRWCK/img.png&quot; data-alt=&quot;A+1버튼 누를때 squre함수가 실행되지 않는다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcsPF2/btrvt2HgZ0T/Xqh2rX7pbZAGiVNfiZRWCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcsPF2%2Fbtrvt2HgZ0T%2FXqh2rX7pbZAGiVNfiZRWCK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;395&quot; height=&quot;202&quot; data-origin-width=&quot;395&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;A+1버튼 누를때 squre함수가 실행되지 않는다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행구문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646751873064&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native init sample23 --template react-native-template-typescript&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;App.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646751724584&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useCallback, useState } from &quot;react&quot;;
import { Button, Text, View } from &quot;react-native&quot;;

/*
useCallback: 함수 재사용
*/

const MyButton = React.memo(({buttonValue,counterState}:any)=&amp;gt;{
  console.log(`${buttonValue}를 클릭했습니다.`)
  return &amp;lt;Button title={buttonValue} onPress={counterState}/&amp;gt;
})

export default function App(){

  const[countStateA,setCountStateA] = useState(0)
  const[countStateB,setCountStateB] = useState(0)

const countIncrementA = useCallback(()=&amp;gt;setCountStateA(countStateA+1),[countStateA])

const countIncrementB = useCallback(()=&amp;gt;setCountStateB(countStateB+1),[countStateB])

  return(

&amp;lt;View&amp;gt;
  &amp;lt;Text&amp;gt;A button{countStateA}&amp;lt;/Text&amp;gt;
  &amp;lt;MyButton counterState={countIncrementA} buttonValue='A button'/&amp;gt;

  &amp;lt;Text&amp;gt;B button{countStateB}&amp;lt;/Text&amp;gt;
  &amp;lt;MyButton counterState={countIncrementB} buttonValue='B button'/&amp;gt;
&amp;lt;/View&amp;gt;

  )

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 실행하면 버튼을 누릴때마다 button이란 텍스트 옆의 숫자가 증가한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220308_232748961_04.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Per73/btrvyl6Vxvo/K5qkTEEu6BfOvDp90Yhndk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Per73/btrvyl6Vxvo/K5qkTEEu6BfOvDp90Yhndk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Per73/btrvyl6Vxvo/K5qkTEEu6BfOvDp90Yhndk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPer73%2Fbtrvyl6Vxvo%2FK5qkTEEu6BfOvDp90Yhndk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220308_232748961_04.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코딩 기록/react</category>
      <category>React</category>
      <category>TypeScript</category>
      <category>useCallback</category>
      <category>useMemo</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/135</guid>
      <comments>https://developerson.tistory.com/135#entry135comment</comments>
      <pubDate>Tue, 8 Mar 2022 23:59:37 +0900</pubDate>
    </item>
    <item>
      <title>react 현재시간 화면에 나타나고 초마다 갱신되게하기 / typescript 시계 만들기</title>
      <link>https://developerson.tistory.com/134</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646750565450&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native init sample21 --template react-native-template-typescript&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;App.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646750545486&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useEffect, useState } from &quot;react&quot;;
import { StyleSheet, Text, View } from &quot;react-native&quot;;

export default function App(){
  return(
    &amp;lt;View style={styles.cotainer}&amp;gt;
      &amp;lt;Clock/&amp;gt;
    &amp;lt;/View&amp;gt;
  )
}

const Clock =() =&amp;gt;{
  const [date, setDate] = useState(()=&amp;gt; new Date())

  useEffect(()=&amp;gt;{
    const timeId = setInterval(()=&amp;gt;tick(),1000)
    console.log('setInteval')

    return() =&amp;gt;{
      clearInterval(timeId)
      console.log('clearInterval')

    }
  })


  const tick =() =&amp;gt;{
    setDate(new Date())
  }

  return(
    &amp;lt;View style={styles.cotainer}&amp;gt;
      &amp;lt;Text style={styles.timeText}&amp;gt;현재시간&amp;lt;/Text&amp;gt;
      &amp;lt;Text style={styles.timeText}&amp;gt;{date.toLocaleTimeString()}&amp;lt;/Text&amp;gt;
    &amp;lt;/View&amp;gt;
  )
}

const styles = StyleSheet.create({

cotainer:{
  flex:1,
  backgroundColor:'#ffffff',
  alignItems:'center',
  justifyContent:'center'
},
timeText:{
  fontSize:30,
  fontWeight:&quot;bold&quot;
}
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행화면&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220308_234142611.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dw2L8J/btrvvuiXlll/Vx82e4gM0ftHYuk9uwVsNK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dw2L8J/btrvvuiXlll/Vx82e4gM0ftHYuk9uwVsNK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dw2L8J/btrvvuiXlll/Vx82e4gM0ftHYuk9uwVsNK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdw2L8J%2FbtrvvuiXlll%2FVx82e4gM0ftHYuk9uwVsNK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220308_234142611.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;초마다 시간이 갱신되며 콘솔창에 표시된다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;샘플21터미널.PNG&quot; data-origin-width=&quot;157&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyKRGJ/btrvyhpTF9T/3NnKMZIVKIAfOOAWUwhTik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyKRGJ/btrvyhpTF9T/3NnKMZIVKIAfOOAWUwhTik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyKRGJ/btrvyhpTF9T/3NnKMZIVKIAfOOAWUwhTik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyKRGJ%2FbtrvyhpTF9T%2F3NnKMZIVKIAfOOAWUwhTik%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;157&quot; height=&quot;190&quot; data-filename=&quot;샘플21터미널.PNG&quot; data-origin-width=&quot;157&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코딩 기록/react</category>
      <category>React</category>
      <category>TypeScript</category>
      <category>시간</category>
      <category>시계</category>
      <category>시계만들기</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/134</guid>
      <comments>https://developerson.tistory.com/134#entry134comment</comments>
      <pubDate>Tue, 8 Mar 2022 23:49:40 +0900</pubDate>
    </item>
    <item>
      <title>react / useEffect 써서 버튼 누를때 특정 텍스트 화면에 보이게 하기 / typescript</title>
      <link>https://developerson.tistory.com/133</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646750078047&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native init sample20 --template react-native-template-typescript​&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;App.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646750095468&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useEffect, useState } from &quot;react&quot;;
import { Button, Text, View } from &quot;react-native&quot;;


/* 
useEffect: 컴퍼넌트가 rendering 될때마다 특정 작업을 실행할 수 있도록 하는 hook
            compoentDidMount + componentDidUpdate + componentWillUnmount
*/
function Welcome(props:any) {

  console.log('start')

  useEffect(()=&amp;gt;{   //==$(document).ready()
    props.setText('My World')
    console.log('useEffect')
  })

  console.log('end')

  function func(){
    props.setText('world')
  }

  return(
    &amp;lt;View&amp;gt;
    &amp;lt;Text&amp;gt;Welcome&amp;lt;/Text&amp;gt;
    &amp;lt;Button title=&quot;button&quot; onPress={func}&amp;gt;&amp;lt;/Button&amp;gt;
    &amp;lt;/View&amp;gt;
  )
}

export default function App(){

      //get   set
const [text,setText] =useState('abc')

  
return(
  &amp;lt;View&amp;gt;
    &amp;lt;Text&amp;gt;hello {text}&amp;lt;/Text&amp;gt;
    &amp;lt;Welcome setText={setText}/&amp;gt;
  &amp;lt;/View&amp;gt;
)

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼 누르면 Hello My World 라는 텍스트가 보인가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220308_232748961_02.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cD625H/btrvyibgKqP/qSSog4lEwwKEi6ArCGSzTk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cD625H/btrvyibgKqP/qSSog4lEwwKEi6ArCGSzTk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cD625H/btrvyibgKqP/qSSog4lEwwKEi6ArCGSzTk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcD625H%2FbtrvyibgKqP%2FqSSog4lEwwKEi6ArCGSzTk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220308_232748961_02.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Welcome 함수 안에 있는 uesEffect로 인해 text는 My World로 세팅되고 콘솔에 useEffect가 출력되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;샘플20터미널.PNG&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baTeWc/btrvyk7ZVzg/qT1hsmMxKaeUoYrCFNE881/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baTeWc/btrvyk7ZVzg/qT1hsmMxKaeUoYrCFNE881/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baTeWc/btrvyk7ZVzg/qT1hsmMxKaeUoYrCFNE881/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaTeWc%2Fbtrvyk7ZVzg%2FqT1hsmMxKaeUoYrCFNE881%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;329&quot; height=&quot;91&quot; data-filename=&quot;샘플20터미널.PNG&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코딩 기록/react</category>
      <category>React</category>
      <category>TypeScript</category>
      <category>useEffect</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/133</guid>
      <comments>https://developerson.tistory.com/133#entry133comment</comments>
      <pubDate>Tue, 8 Mar 2022 23:38:07 +0900</pubDate>
    </item>
    <item>
      <title>react  / flex 이용하여 원하는 비율로 화면에 아이템 구현하기 / typescript</title>
      <link>https://developerson.tistory.com/132</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;프로젝트 생성문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646645723693&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native init sample19 --template react-native-template-typescript&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src 폴더 생성 &amp;gt; components 폴더 생성 &amp;gt; Flexbox.tsx &amp;amp; Marginadding.tsx &amp;amp; WidthHeight.tsx 파일 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sample19폴더.PNG&quot; data-origin-width=&quot;191&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BdYkT/btrvl8VywQD/diEgxnmHjCbeRreakWWaYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BdYkT/btrvl8VywQD/diEgxnmHjCbeRreakWWaYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BdYkT/btrvl8VywQD/diEgxnmHjCbeRreakWWaYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBdYkT%2Fbtrvl8VywQD%2FdiEgxnmHjCbeRreakWWaYK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;191&quot; height=&quot;217&quot; data-filename=&quot;sample19폴더.PNG&quot; data-origin-width=&quot;191&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;WidthHeight.tsx&amp;nbsp;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646645848066&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import { StyleSheet, Text, View } from &quot;react-native&quot;;

export const WidthHeight= () =&amp;gt;(
    
        &amp;lt;View style={style.container}&amp;gt;
        &amp;lt;Text&amp;gt;200X100&amp;lt;/Text&amp;gt;
      &amp;lt;/View&amp;gt;
    )
    

    const style = StyleSheet.create({
        container:{
          width:200,
          height:100,
          borderWidth:StyleSheet.hairlineWidth,
          borderColor:'#bbb'
        }
      })&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Marginadding.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646645864998&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import { StyleSheet, Text, View } from &quot;react-native&quot;;

export const MarginPadding = () =&amp;gt;(

    &amp;lt;View style={style.cotainer}&amp;gt;
        &amp;lt;Text&amp;gt;제목입니다.&amp;lt;/Text&amp;gt;
    &amp;lt;/View&amp;gt;

)
    const style =StyleSheet.create({
        cotainer:{
            marginHorizontal:'10%',
            padding:16,
            borderWidth:StyleSheet.hairlineWidth,
            borderColor:'#ccc',
            backgroundColor:'#ffff00'
        }
    })&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Flexbox.tsx&amp;nbsp;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646645893502&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import { StyleSheet, Text, View } from &quot;react-native&quot;;

export default function Flexbox(){
    return(
        &amp;lt;View style={style.container}&amp;gt;
            &amp;lt;Text style={style.item}&amp;gt;아이템1&amp;lt;/Text&amp;gt;
            &amp;lt;Text style={style.item}&amp;gt;아이템2&amp;lt;/Text&amp;gt;
            &amp;lt;Text style={style.item}&amp;gt;아이템3&amp;lt;/Text&amp;gt;
            &amp;lt;Text style={style.item}&amp;gt;아이템4&amp;lt;/Text&amp;gt;
            &amp;lt;Text style={style.item}&amp;gt;아이템5&amp;lt;/Text&amp;gt;
            &amp;lt;Text style={style.item}&amp;gt;아이템6&amp;lt;/Text&amp;gt;
        &amp;lt;/View&amp;gt;
    )
}

const style = StyleSheet.create({
container:{
    flexDirection:'row', //가로정렬
    flexWrap:'wrap' //줄바꿈
},
item:{
    width:200,
    height:100,
    borderWidth: StyleSheet.hairlineWidth,
    borderColor:'#bbb'
}

})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;App.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646645930063&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import { StyleSheet, View } from &quot;react-native&quot;;
import Flexbox from &quot;./src/components/Flexbox&quot;;
import { MarginPadding } from &quot;./src/components/Marginadding&quot;;
import { WidthHeight } from &quot;./src/components/WidthHeight&quot;;



export default function App(){

  return(
    &amp;lt;View style={style.container}&amp;gt;
      &amp;lt;WidthHeight/&amp;gt;
      &amp;lt;MarginPadding/&amp;gt;
      &amp;lt;Flexbox/&amp;gt;

      &amp;lt;View style={style.box}/&amp;gt;

      
    &amp;lt;/View&amp;gt;
 
  )
}

const style = StyleSheet.create({
  container:{
    flex:1
  },
  box:{
    width:150,
    height:100,
    backgroundColor:'red',
    position:'absolute', // 오른쪽 하단
    right:16,
    bottom:16
  }

})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행화면&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220307_183323986.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zbCXy/btrvqkgbbYw/kaMq3rcdXN1QYziuWraOkK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zbCXy/btrvqkgbbYw/kaMq3rcdXN1QYziuWraOkK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zbCXy/btrvqkgbbYw/kaMq3rcdXN1QYziuWraOkK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzbCXy%2FbtrvqkgbbYw%2FkaMq3rcdXN1QYziuWraOkK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220307_183323986.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코딩 기록/react</category>
      <category>Flex</category>
      <category>flexbox</category>
      <category>React</category>
      <category>TypeScript</category>
      <category>플렉스</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/132</guid>
      <comments>https://developerson.tistory.com/132#entry132comment</comments>
      <pubDate>Mon, 7 Mar 2022 18:40:11 +0900</pubDate>
    </item>
    <item>
      <title>react / flex 속성 이용하여 화면 비율 조정하기 (typescript)</title>
      <link>https://developerson.tistory.com/131</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;프로젝트 생성문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646644976677&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native init sample18 --template react-native-template-typescript&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;App.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646645006143&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import { StyleSheet, Text, View } from &quot;react-native&quot;;


//flex : 크기 비율로 설정하는 것
export default function App(){

  return (
    &amp;lt;View style={style.container}&amp;gt;
      &amp;lt;View style={style.caseOne}/&amp;gt;
      &amp;lt;View style={style.caseTwo}&amp;gt;
        &amp;lt;Text&amp;gt;두번째 화면&amp;lt;/Text&amp;gt;
        &amp;lt;/View&amp;gt;
      &amp;lt;View style={style.caseThree}/&amp;gt;
      &amp;lt;/View&amp;gt;
  )

}

const style = StyleSheet.create({
  container:{
    flex:1,
    width:300
  },
  caseOne:{
    flex:1,
    backgroundColor:'yellow'
  },
  caseTwo:{
    flex:1,
    backgroundColor:'blue'
  },
  caseThree:{
    flex:8,
    backgroundColor:'green',
   height:200
  }
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행화면&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220307_182628454.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IL5fG/btrvhnLMcMI/PV0Ka4mAZfdvCkNi9cSJK1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IL5fG/btrvhnLMcMI/PV0Ka4mAZfdvCkNi9cSJK1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IL5fG/btrvhnLMcMI/PV0Ka4mAZfdvCkNi9cSJK1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIL5fG%2FbtrvhnLMcMI%2FPV0Ka4mAZfdvCkNi9cSJK1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220307_182628454.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코딩 기록/react</category>
      <category>Flex</category>
      <category>React</category>
      <category>stylesheet</category>
      <category>TypeScript</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/131</guid>
      <comments>https://developerson.tistory.com/131#entry131comment</comments>
      <pubDate>Mon, 7 Mar 2022 18:27:54 +0900</pubDate>
    </item>
    <item>
      <title>react / 색상코드와 방향 조절로 화면에 색상카드 만들기 / SafeAreaView / transform : rotateX, rotateZ</title>
      <link>https://developerson.tistory.com/130</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;프로젝트 생성문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646644822626&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native init sample17 --template react-native-template-typescript&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;App.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646644735705&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import { Image, SafeAreaView, StyleSheet, Text, View } from &quot;react-native&quot;;

const colorList = [
  { color: '#00974A', val: '00974A' },
  { color: '#2e6067', val: '2e6067' },
  { color: '#a92127', val: 'a92127' },
  { color: '#030364', val: '030364' },
  { color: '#0d6729', val: '0d6729' },
  { color: '#ff290b', val: 'ff290b' },
];



export default function App(){


  return(
  
    &amp;lt;SafeAreaView&amp;gt;
      &amp;lt;View style={{padding:16}}&amp;gt;
        { colorList.map( it =&amp;gt; ( 
          &amp;lt;View key={it.color} style={[style.card, {backgroundColor:it.color}]} &amp;gt;
            &amp;lt;Text&amp;gt;{it.val}&amp;lt;/Text&amp;gt;
            &amp;lt;/View&amp;gt;
        ) ) }
      &amp;lt;/View&amp;gt;
    &amp;lt;/SafeAreaView&amp;gt;

  )
}



const style = StyleSheet.create({

container: {
  flex: 1
},
card:{

  marginVertical:8,
  height: 96,
  borderColor:'lightgray',
  borderWidth:5,
  borderRadius:8,
  transform:[ //move, roatation,scale = 변환
    {rotateX:'45deg'},
    {rotateZ:'0.785398rad'}
  ]
}

})&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행화면&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220307_163019714_15.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMrveC/btrvatMPPls/ikJEBU6zAsDVhgMfuslEf0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMrveC/btrvatMPPls/ikJEBU6zAsDVhgMfuslEf0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMrveC/btrvatMPPls/ikJEBU6zAsDVhgMfuslEf0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMrveC%2FbtrvatMPPls%2FikJEBU6zAsDVhgMfuslEf0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220307_163019714_15.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 기록/react</category>
      <category>React</category>
      <category>rotate</category>
      <category>stylesheet</category>
      <category>transfrom</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/130</guid>
      <comments>https://developerson.tistory.com/130#entry130comment</comments>
      <pubDate>Mon, 7 Mar 2022 18:20:43 +0900</pubDate>
    </item>
    <item>
      <title>react 이미지 화면에 구현하기 (파일 불러와서 구현하기 / 이미지 주소로 구현하기) / 글자 자간, 글자 배경색 지정하기 / 텍스트 영역에 테두리 만들기  / imageview / text StyleSheet 모음</title>
      <link>https://developerson.tistory.com/129</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;프로젝트 생성문&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646643001052&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native init sample17 --template react-native-template-typescript&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현할 이미지는 scr&amp;gt;assets폴더에 저장해둔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ship.jpg 파일을 저장해두었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/soCxZ/btrvhNYScDS/0pDS0dp7J0pnjHpjDIMbak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/soCxZ/btrvhNYScDS/0pDS0dp7J0pnjHpjDIMbak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/soCxZ/btrvhNYScDS/0pDS0dp7J0pnjHpjDIMbak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsoCxZ%2FbtrvhNYScDS%2F0pDS0dp7J0pnjHpjDIMbak%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;345&quot; height=&quot;221&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;App.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646643181865&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import { Image, SafeAreaView, StyleSheet, Text, View } from &quot;react-native&quot;;



export default function App(){


  return(
 

   &amp;lt;View&amp;gt;
       &amp;lt;Image
    source={{uri:'https://reactnative.dev/docs/assets/favicon.png'}}
      style={{width:100, height:100, resizeMode:'contain', opacity:0.5}}
 /&amp;gt;  

  &amp;lt;Image
    source={require('./src/assets/ship.jpg')}
     style={{width:300, height:300}} /&amp;gt;

 &amp;lt;/View&amp;gt;

  )
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행화면&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220307_163019714_06.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs1EVA/btrvnVuCmaW/bOIIms7TftWAy5E50DRxI0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs1EVA/btrvnVuCmaW/bOIIms7TftWAy5E50DRxI0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs1EVA/btrvnVuCmaW/bOIIms7TftWAy5E50DRxI0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs1EVA%2FbtrvnVuCmaW%2FbOIIms7TftWAy5E50DRxI0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220307_163019714_06.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;글자 배경색, 글자 위치 지정하기&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;App.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646643962879&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import { Image, SafeAreaView, StyleSheet, Text, View } from &quot;react-native&quot;;


export default function App(){


 return(
&amp;lt;View&amp;gt;
&amp;lt;Text style={{backgroundColor:&quot;#ffff00&quot;, textAlign:&quot;center&quot;}}&amp;gt;Hello&amp;lt;/Text&amp;gt;
&amp;lt;Text style={{textAlign:&quot;right&quot;}}&amp;gt;World&amp;lt;/Text&amp;gt;
&amp;lt;/View&amp;gt;

  )
}


const style = StyleSheet.create({
hello:{
backgroundColor:&quot;#ff0000&quot;
}

})&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220307_163019714_01.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HPjIq/btrvgl9p6em/HIHZQMB8qBkntI1hCsP0CK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HPjIq/btrvgl9p6em/HIHZQMB8qBkntI1hCsP0CK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HPjIq/btrvgl9p6em/HIHZQMB8qBkntI1hCsP0CK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHPjIq%2Fbtrvgl9p6em%2FHIHZQMB8qBkntI1hCsP0CK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220307_163019714_01.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;글자 자간 지정하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;App.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646644231244&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import { Image, SafeAreaView, StyleSheet, Text, View } from &quot;react-native&quot;;


export default function App(){


 return(
  
&amp;lt;View&amp;gt;
&amp;lt;Text style={{letterSpacing:2, fontSize:18}}&amp;gt;
오는 9일 진행되는 20대 대선 본투표에서 코로나19 확진자와 격리자들은 일반 유권자와 같은 방법으로 직접 투표함에 용지를 넣는 방식으로 투표를 하게 된다.
&amp;lt;/Text&amp;gt;
&amp;lt;/View&amp;gt;

   

  )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행화면&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220307_163019714_02.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSJX1p/btrvat0hty5/9erCDPydyhLfUJal3IMm01/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSJX1p/btrvat0hty5/9erCDPydyhLfUJal3IMm01/img.jpg&quot; data-alt=&quot;자간지정 전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSJX1p/btrvat0hty5/9erCDPydyhLfUJal3IMm01/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSJX1p%2Fbtrvat0hty5%2F9erCDPydyhLfUJal3IMm01%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;521&quot; height=&quot;834&quot; data-filename=&quot;KakaoTalk_20220307_163019714_02.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자간지정 전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220307_163019714_04.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxSGN1/btrvocJDH5b/uLkQ9CNkALujSVDQaX1sEk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxSGN1/btrvocJDH5b/uLkQ9CNkALujSVDQaX1sEk/img.jpg&quot; data-alt=&quot;자간 지정 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxSGN1/btrvocJDH5b/uLkQ9CNkALujSVDQaX1sEk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxSGN1%2FbtrvocJDH5b%2FuLkQ9CNkALujSVDQaX1sEk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;581&quot; height=&quot;930&quot; data-filename=&quot;KakaoTalk_20220307_163019714_04.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자간 지정 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;텍스트&amp;nbsp;영역에&amp;nbsp;테두리&amp;nbsp;만들기&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;App.tsx&lt;/blockquote&gt;
&lt;pre id=&quot;code_1646644415667&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import { Image, SafeAreaView, StyleSheet, Text, View } from &quot;react-native&quot;;


export default function App(){


  return(
 

&amp;lt;View style={style.world}&amp;gt;
&amp;lt;Text&amp;gt;Hello&amp;lt;/Text&amp;gt;
&amp;lt;Text&amp;gt;World&amp;lt;/Text&amp;gt;
&amp;lt;/View&amp;gt;


  )
}


const style = StyleSheet.create({

world:{
borderWidth:1,
bordercolor:'gray',
borderBottomLeftRadius:10,
borderTopRightRadius:10
}

})&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실행화면&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20220307_163019714_09.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xf5GM/btrvbeBSBm2/ImJKGLySDvG6spe8XYv3qk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xf5GM/btrvbeBSBm2/ImJKGLySDvG6spe8XYv3qk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xf5GM/btrvbeBSBm2/ImJKGLySDvG6spe8XYv3qk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXf5GM%2FbtrvbeBSBm2%2FImJKGLySDvG6spe8XYv3qk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;1280&quot; data-filename=&quot;KakaoTalk_20220307_163019714_09.jpg&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코딩 기록/react</category>
      <category>React</category>
      <category>stylesheet</category>
      <category>text</category>
      <category>텍스트양식</category>
      <author>NomadHaven</author>
      <guid isPermaLink="true">https://developerson.tistory.com/129</guid>
      <comments>https://developerson.tistory.com/129#entry129comment</comments>
      <pubDate>Mon, 7 Mar 2022 18:15:27 +0900</pubDate>
    </item>
  </channel>
</rss>