<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>지니의 기록</title>
    <link>https://cocobi.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 6 Jul 2026 13:40:26 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>cocobi</managingEditor>
    <image>
      <title>지니의 기록</title>
      <url>https://tistory1.daumcdn.net/tistory/4605467/attach/17fc44bb40f54c79bb0990d8b54856ad</url>
      <link>https://cocobi.tistory.com</link>
    </image>
    <item>
      <title>[React Native] Error: Duplicate resources 오류 해결 방법</title>
      <link>https://cocobi.tistory.com/269</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciDF2F/btrYY7OoIM7/zO6sG2Jwli0VJXJBhT57y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciDF2F/btrYY7OoIM7/zO6sG2Jwli0VJXJBhT57y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciDF2F/btrYY7OoIM7/zO6sG2Jwli0VJXJBhT57y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciDF2F%2FbtrYY7OoIM7%2FzO6sG2Jwli0VJXJBhT57y0%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;377&quot; height=&quot;130&quot; data-origin-width=&quot;580&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;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  &lt;span style=&quot;background-color: #ffffff;&quot;&gt;Error: Duplicate resources 오류 해결하기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;gradle build 또는 로컬 기동시 아래와 같은 에러가 발생했을 때 해결하는 방법이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676274564257&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; Task :app:mergeReleaseResources FAILED
[drawable-hdpi-v4/node_modules_reactnavigation_stack_src_views_assets_backicon] 
C:\Users\jinny\Documents\git\melhor\app-user\android\app\src\main\res\drawable-hdpi\node_modules_reactnavigation_stack_src_views_assets_backicon.png 
[drawable-hdpi-v4/node_modules_reactnavigation_stack_src_views_assets_backicon] 
C:\Users\jinny\Documents\git\melhor\app-user\android\app\build\generated\res\react\release\drawable-hdpi\node_modules_reactnavigation_stack_src_views_assets_backicon.png: 
Error: Duplicate resources 
[drawable-mdpi-v4/node_modules_reactnavigation_stack_src_views_assets_backicon] 
C:\Users\jinny\Documents\git\melhor\app-user\android\app\src\main\res\drawable-mdpi\node_modules_reactnavigation_stack_src_views_assets_backicon.png 
[drawable-mdpi-v4/node_modules_reactnavigation_stack_src_views_assets_backicon] 
C:\Users\jinny\Documents\git\melhor\app-user\android\app\build\generated\res\react\release\drawable-mdpi\node_modules_reactnavigation_stack_src_views_assets_backicon.png: 
Error: Duplicate resources 
[drawable-mdpi-v4/node_modules_reactnavigation_stack_src_views_assets_backiconmask] 
C:\Users\jinny\Documents\git\melhor\app-user\android\app\src\main\res\drawable-mdpi\node_modules_reactnavigation_stack_src_views_assets_backiconmask.png 
[drawable-mdpi-v4/node_modules_reactnavigation_stack_src_views_assets_backiconmask] 
C:\Users\jinny\Documents\git\melhor\app-user\android\app\build\generated\res\react\release\drawable-mdpi\node_modules_reactnavigation_stack_src_views_assets_backiconmask.png: 
Error: Duplicate resources [drawable-mdpi-v4/src_assets_address_emptyaddress] 
C:\Users\jinny\Documents\git\melhor\app-user\android\app\src\main\res\drawable-mdpi\src_assets_address_emptyaddress.png 
.....&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj; &lt;span&gt; &lt;/span&gt;&lt;/b&gt;&amp;nbsp;원인 및 해결방법&lt;/span&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;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ 원인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 오류는 프로젝트 빌드시 [ &lt;span style=&quot;color: #000000;&quot;&gt;android / app / src / main / res / ]&amp;nbsp; 디렉토리 내 중복된 파일이 존재하기 때문에 발생한다.&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;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ 해결방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;res 폴더에 존재하는 drawable 또는 raw 폴더에 존재하는 중복된 파일을 삭제하면 해결된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 &lt;span&gt;drawable&lt;span&gt; 폴더를 통채로 삭제하면 오류가 해결된다고 하나 나의 경우에는 rn_edit_text_material.xml 을 제외한 모든 파일을 삭제 후 재빌드 하였더니 해결되었다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&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;&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;&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;a href=&quot;https://stackoverflow.com/questions/61593821/generate-an-apk-failed-on-react-native&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;stackoverflow :: generate-an-apk-failed-on-react-native&lt;/a&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;&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;</description>
      <category>Mobile/React Native</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/269</guid>
      <comments>https://cocobi.tistory.com/269#entry269comment</comments>
      <pubDate>Mon, 13 Feb 2023 16:57:26 +0900</pubDate>
    </item>
    <item>
      <title>[React Native]  APK 파일 추출하는 방법 정리</title>
      <link>https://cocobi.tistory.com/263</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/27yUl/btrYlu2KxrX/qfRpN6i4HpxgCWDeY5O7K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/27yUl/btrYlu2KxrX/qfRpN6i4HpxgCWDeY5O7K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/27yUl/btrYlu2KxrX/qfRpN6i4HpxgCWDeY5O7K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F27yUl%2FbtrYlu2KxrX%2FqfRpN6i4HpxgCWDeY5O7K1%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;377&quot; height=&quot;130&quot; data-origin-width=&quot;580&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;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  React native APK 파일 추출하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안드로이드 apk 파일을 추출하는 방법에 대해 정리한 포스팅이다.&amp;nbsp;&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0️⃣ 공통사항&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;APK를 추출하기 전에 앞서 추출을 위해서는 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;android/app/src/main/assets 디렉토리가 존재해야 하므로 해당 디렉토리가 존재하지 않는경우&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt; assets 폴더를 생성한다.&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ 명령어로 추출하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;커맨드에 아래 명령어를 입력할 경우 assets 디렉토리에 번들 파일이 생성된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676002833028&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/&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;236&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mZz1l/btrYRgbGN0s/mQWRD8PHbfm9CzRc9XeSJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mZz1l/btrYRgbGN0s/mQWRD8PHbfm9CzRc9XeSJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mZz1l/btrYRgbGN0s/mQWRD8PHbfm9CzRc9XeSJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmZz1l%2FbtrYRgbGN0s%2FmQWRD8PHbfm9CzRc9XeSJk%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;271&quot; height=&quot;305&quot; data-origin-width=&quot;236&quot; data-origin-height=&quot;266&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;color: #000000;&quot;&gt;그 후 npx react-native run-android 명령어 (또는 &lt;span style=&quot;background-color: #f8f8f8;&quot;&gt;./gradlew assembleDebug&lt;/span&gt;&lt;span style=&quot;background-color: #f8f8f8;&quot;&gt;)&lt;/span&gt;를 입력하여 로컬 서버를 기동하게되면 app/build/output/app/debug 경로에 apk 파일이 생성된다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ 안드로이드 스튜디오로 추출하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1번과 마찬가지로 우선 번들파일을 생성해야 하므로 커맨드에 아래 명령어를 입력한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676003257821&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/&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 &amp;gt; Build Bundle / APK &amp;gt; Build APK 를 차례대로 눌러주면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;app/build/output/app/debug 경로에 &lt;/span&gt;APK파일이 생성된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FnuF1/btrYJZCzLKP/TKZbXL9H7IH2OPSfl9ofR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FnuF1/btrYJZCzLKP/TKZbXL9H7IH2OPSfl9ofR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FnuF1/btrYJZCzLKP/TKZbXL9H7IH2OPSfl9ofR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFnuF1%2FbtrYJZCzLKP%2FTKZbXL9H7IH2OPSfl9ofR1%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;593&quot; height=&quot;340&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;382&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;&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;</description>
      <category>Mobile/React Native</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/263</guid>
      <comments>https://cocobi.tistory.com/263#entry263comment</comments>
      <pubDate>Mon, 6 Feb 2023 21:51:26 +0900</pubDate>
    </item>
    <item>
      <title>[Android Studio] Gradle 빌드 오류 해결하기 (Android Gradle plugin requires java 11 to run. you are currently using java 1.8)</title>
      <link>https://cocobi.tistory.com/261</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi5jM0/btrX302MXOi/eSp3tK454oOrwPgnTdFqK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi5jM0/btrX302MXOi/eSp3tK454oOrwPgnTdFqK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi5jM0/btrX302MXOi/eSp3tK454oOrwPgnTdFqK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi5jM0%2FbtrX302MXOi%2FeSp3tK454oOrwPgnTdFqK0%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;404&quot; height=&quot;256&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;256&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  안드로이드 스튜디오 오류 해결 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Gradle 빌드 중 아래와 같은 오류가 발생하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 오류의 원인은 요구하는 JDK 버전보다 현재 사용하는 JDK의 버전이 더 낮기 때문에 발생한 것이다.&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;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Android&amp;nbsp;Gradle&amp;nbsp;plugin&amp;nbsp;requires&amp;nbsp;java&amp;nbsp;11&amp;nbsp;to&amp;nbsp;run.&amp;nbsp;you&amp;nbsp;are&amp;nbsp;currently&amp;nbsp;using&amp;nbsp;java&amp;nbsp;1.8&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675515082224&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Build file '/Users/jinny/AndroidStudioProjects/MyApplication/app/build.gradle' line: 2

An exception occurred applying plugin request [id: 'com.android.application']
&amp;gt; Failed to apply plugin 'com.android.internal.application'.
   &amp;gt; Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8.
     You can try some of the following options:
       - changing the IDE settings.
       - changing the JAVA_HOME environment variable.
       - changing `org.gradle.java.home` in `gradle.properties`.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;  오류 해결&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내 경우에는 다른 프로젝트에서 JDK1.8을 사용하여 환경 변수상 JDK가 1.8로 등록되어 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 안드로이드 개발을 위해서 JDK를 11로 변경 하였더니 오류가 해결되었다.&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;&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: #000000;&quot;&gt;1️⃣ 시작버튼 옆 검색창에 '환경 변수' 입력&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;348&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qfYoq/btrX40ONlIv/deEmUgZ6M4SDgPDLNOqYBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qfYoq/btrX40ONlIv/deEmUgZ6M4SDgPDLNOqYBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qfYoq/btrX40ONlIv/deEmUgZ6M4SDgPDLNOqYBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqfYoq%2FbtrX40ONlIv%2FdeEmUgZ6M4SDgPDLNOqYBk%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;285&quot; height=&quot;440&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;537&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;span style=&quot;color: #000000;&quot;&gt;2️⃣ 시스템 속성창이 켜지며, 환경 변수(N) 클릭&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;475&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1WTbE/btrX6iuWpmk/0kX46ynfcMBLOGA471WZj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1WTbE/btrX6iuWpmk/0kX46ynfcMBLOGA471WZj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1WTbE/btrX6iuWpmk/0kX46ynfcMBLOGA471WZj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1WTbE%2FbtrX6iuWpmk%2F0kX46ynfcMBLOGA471WZj1%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;424&quot; height=&quot;475&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;532&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;span style=&quot;color: #000000;&quot;&gt;3️⃣ 시스템 변수의 JAVA_HOME 경로를 JDK 11 경로로 변경 후 확인 버튼 클릭&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;616&quot; data-origin-height=&quot;581&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DksPz/btrX4YDuGbV/x7qJBmLK5T4DCVog9XShT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DksPz/btrX4YDuGbV/x7qJBmLK5T4DCVog9XShT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DksPz/btrX4YDuGbV/x7qJBmLK5T4DCVog9XShT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDksPz%2FbtrX4YDuGbV%2Fx7qJBmLK5T4DCVog9XShT1%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;604&quot; height=&quot;570&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;581&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;span style=&quot;color: #000000;&quot;&gt;만약 JDK 11이 설치되어 있지 않은 경우 &lt;a href=&quot;https://www.oracle.com/kr/java/technologies/javase/jdk11-archive-downloads.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;오라클 사이트&lt;/a&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;&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;</description>
      <category>Dev Tools</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/261</guid>
      <comments>https://cocobi.tistory.com/261#entry261comment</comments>
      <pubDate>Sat, 4 Feb 2023 22:12:55 +0900</pubDate>
    </item>
    <item>
      <title>[Clean Code] 클린 코드 10장 ~ 11장 리뷰</title>
      <link>https://cocobi.tistory.com/260</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mplqe/btrX2njxrU7/pjpKNHRjJkKgIbs7QQHCk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mplqe/btrX2njxrU7/pjpKNHRjJkKgIbs7QQHCk0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mplqe/btrX2njxrU7/pjpKNHRjJkKgIbs7QQHCk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmplqe%2FbtrX2njxrU7%2FpjpKNHRjJkKgIbs7QQHCk0%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;279&quot; height=&quot;331&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1518&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 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  10장 :: 클래스&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&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;어렵다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[&amp;nbsp;클래스&amp;nbsp;체계&amp;nbsp;]&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클래스의&amp;nbsp;추상화&amp;nbsp;단계는&amp;nbsp;아래와&amp;nbsp;같이&amp;nbsp;순차적으로&amp;nbsp;내려간다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;변수&amp;nbsp;목록(공개&amp;nbsp;변수&amp;nbsp;&amp;gt;&amp;nbsp;비공개&amp;nbsp;변수&amp;nbsp;&amp;gt;&amp;nbsp;비공개&amp;nbsp;인스턴스&amp;nbsp;변수)&amp;nbsp;&amp;gt;&amp;nbsp;공개&amp;nbsp;함수&amp;nbsp;&amp;gt;&amp;nbsp;비공개&amp;nbsp;함수 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;캡슐화 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;수단이다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[&amp;nbsp;클래스는&amp;nbsp;작아야&amp;nbsp;한다&amp;nbsp;]&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;한다'. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;잰다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;관문이다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;단일&amp;nbsp;책임&amp;nbsp;원칙 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단일&amp;nbsp;책임&amp;nbsp;원칙(SRP,&amp;nbsp;Single&amp;nbsp;Responsibility&amp;nbsp;Principle)은&amp;nbsp;클래스나&amp;nbsp;모듈을&amp;nbsp;변경할&amp;nbsp;이유가&amp;nbsp;하나뿐이어야&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;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;많은 개발자는 자잘한 단일 책임 클래스가 많아지면 큰 그림을 이해하기 어려워진다고 우려한다. 큰 그림을 이해하려면 여러 클래스를 수없이 넘나들어야 한다고 걱정한다. 하지만 작은 클래스가 많은 시스템이든 큰 클래스가 몇 개뿐인 시스템이든 돌아가는 부품은 그 수가 비슷하다. 그러므로 고민할 질문은 &quot;작은 서랍을 많이 두고 명확한 컴포넌트를 나눠까? 큰 서랍 몇 개에 모두 넣어둘까?&quot; 이다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;충분하다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;수행한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;응집도 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;나눈다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&amp;nbsp;응집도를&amp;nbsp;유지하면&amp;nbsp;작은&amp;nbsp;클래스&amp;nbsp;여러 개가&amp;nbsp;나온다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[&amp;nbsp;변경하기&amp;nbsp;쉬운&amp;nbsp;클래스&amp;nbsp;]&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;깨끗한&amp;nbsp;시스템은&amp;nbsp;클래스를&amp;nbsp;체계적으로&amp;nbsp;정리해&amp;nbsp;변경에&amp;nbsp;수반하는&amp;nbsp;위험을&amp;nbsp;낮춘다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;쉬워진다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&amp;nbsp;이상적인&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;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;변경으로부터&amp;nbsp;격리 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=======================================&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;코드를&amp;nbsp;깔끔하게&amp;nbsp;짜는것만으로&amp;nbsp;깨끗한&amp;nbsp;코드를&amp;nbsp;얻는 것은&amp;nbsp;아니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;해야겠다. &lt;/span&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;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  11장 :: 시스템&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;높은&amp;nbsp;추상화&amp;nbsp;수준(=시스템)&amp;nbsp;수준에서도&amp;nbsp;깨끗함을&amp;nbsp;유지하는&amp;nbsp;방법 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&quot;복잡성은&amp;nbsp;죽음이다.&amp;nbsp;개발자에게서&amp;nbsp;생기를&amp;nbsp;앗아가며,&amp;nbsp;제품을&amp;nbsp;계획하고&amp;nbsp;제작하고&amp;nbsp;테스트하기&amp;nbsp;어렵게&amp;nbsp;만든다.&quot;&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;레이&amp;nbsp;오지(Ray&amp;nbsp;Ozzie),&amp;nbsp;Microsoft&amp;nbsp;CTO &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;도시를&amp;nbsp;세운다면?&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도시가&amp;nbsp;돌아가는&amp;nbsp;또&amp;nbsp;다른&amp;nbsp;이유는&amp;nbsp;적절한&amp;nbsp;추상화와&amp;nbsp;모듈화&amp;nbsp;덕분이다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[&amp;nbsp;시스템&amp;nbsp;제작과&amp;nbsp;시스템&amp;nbsp;사용을&amp;nbsp;분리하라&amp;nbsp;]&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;소프트웨어&amp;nbsp;시스템은&amp;nbsp;준비&amp;nbsp;과정과&amp;nbsp;런타임&amp;nbsp;로직을&amp;nbsp;분리해야&amp;nbsp;한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;Main&amp;nbsp;분리 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;생성과&amp;nbsp;관련된&amp;nbsp;코드는&amp;nbsp;모두&amp;nbsp;main이나&amp;nbsp;main이&amp;nbsp;호출하는&amp;nbsp;모듈로&amp;nbsp;옮기고,&amp;nbsp;나머지&amp;nbsp;시스템은&amp;nbsp;모든&amp;nbsp;객체가&amp;nbsp;생성되어&amp;nbsp;있고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 모든 의존성이 연결되어 있다고 가정한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;팩토리 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;때로는&amp;nbsp;객체가&amp;nbsp;생성되는&amp;nbsp;시점을&amp;nbsp;애플리케이션이&amp;nbsp;결정할&amp;nbsp;필요가&amp;nbsp;있다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;의존성&amp;nbsp;주입 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 사용과 제작을 분리하는 강력한 메커니즘 중 하나가 의존성 주입(DI)이다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 의존성 주입은 제어 역전 기법을 의존성 관리에 적용한 메커니즘이다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 진정한 의존성 주입에서 클래스는 의존성을 해결하려 시도하지 않고 수동적이어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 대신에 의존성을 주입하는 방법으로 설정자 메서드나 생성자 인수를 제공한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[&amp;nbsp;확장&amp;nbsp;]&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;이것이&amp;nbsp;반복적이고&amp;nbsp;점진적인&amp;nbsp;애자일&amp;nbsp;방식의&amp;nbsp;핵심이다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&amp;nbsp;소프트웨어&amp;nbsp;시스템은&amp;nbsp;'수명이&amp;nbsp;짧다'는&amp;nbsp;본질로&amp;nbsp;인해&amp;nbsp;아키텍처의&amp;nbsp;점진적인&amp;nbsp;발전이&amp;nbsp;가능하다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;횡단(Cross-cutting)&amp;nbsp;관심사 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;영속성과&amp;nbsp;같은&amp;nbsp;관심사는&amp;nbsp;애플리케이션의&amp;nbsp;자연스러운&amp;nbsp;객체&amp;nbsp;경계를&amp;nbsp;넘나드는&amp;nbsp;경향이&amp;nbsp;있다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;원론적으로는 모듈화되고 캡슐화된 방식으로 영속성 방식을 구상할 수 있다. 하지만 현실적으로는 영속성 방식을 구현 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 한 코드가 온갖 객체로 흩어지고, 여기서 횡단 관심사라는 용어가 나온다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;EJB&amp;nbsp;아키텍처가&amp;nbsp;영속성,&amp;nbsp;보안,&amp;nbsp;트랜잭션을&amp;nbsp;처리하는&amp;nbsp;방식은&amp;nbsp;관점&amp;nbsp;지향&amp;nbsp;프로그래밍(AOP,&amp;nbsp;AOP는&amp;nbsp;횡단&amp;nbsp;관심사에&amp;nbsp;대처해&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 모듈성을 확보하는 방법론이다.)을 예견했다.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;-&amp;nbsp;자바에서&amp;nbsp;사용하는&amp;nbsp;관점(또는&amp;nbsp;관점과&amp;nbsp;유사한)&amp;nbsp;메커니즘&amp;nbsp;세&amp;nbsp;가지 &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;자바&amp;nbsp;프록시(p.203) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;경우이다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;순수&amp;nbsp;자바&amp;nbsp;AOP프레임워크(p.205) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;순수&amp;nbsp;자바&amp;nbsp;관점을&amp;nbsp;구현하는&amp;nbsp;스프링&amp;nbsp;AOP,&amp;nbsp;JBoss&amp;nbsp;AOP등과&amp;nbsp;같은&amp;nbsp;프레임워크는&amp;nbsp;내부&amp;nbsp;프록시를&amp;nbsp;사용한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;AspectJ&amp;nbsp;관점(p.209) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AspectJ는&amp;nbsp;언어&amp;nbsp;차원에서&amp;nbsp;관점을&amp;nbsp;모듈화&amp;nbsp;구성으로&amp;nbsp;지원하는&amp;nbsp;자바&amp;nbsp;언어&amp;nbsp;확장이다.&amp;nbsp;AspectJ는&amp;nbsp;관점을&amp;nbsp;분리하는&amp;nbsp;강력하&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;고 풍부한 도구 집합을 제공하지만, 새 도구를 사용하고 새로운 언어 문법과 사용법을 익혀야 한다는 단점이 있다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[&amp;nbsp;테스트&amp;nbsp;주도&amp;nbsp;시스템&amp;nbsp;아키텍처&amp;nbsp;구축&amp;nbsp;]&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;관점으로&amp;nbsp;관심사를&amp;nbsp;분리하는&amp;nbsp;방식은&amp;nbsp;막강하며,&amp;nbsp;도메인&amp;nbsp;논리를&amp;nbsp;POJO로&amp;nbsp;작성(=코드&amp;nbsp;수즌에서&amp;nbsp;아키텍처&amp;nbsp;관심사를&amp;nbsp;분리)할&amp;nbsp;수&amp;nbsp;있다면&amp;nbsp;테스트&amp;nbsp;주도&amp;nbsp;아키텍처&amp;nbsp;구축이&amp;nbsp;가능해진다.&amp;nbsp;따라서&amp;nbsp;단순하면서&amp;nbsp;깔끔하게&amp;nbsp;분리된&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;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&amp;nbsp;최선의&amp;nbsp;시스템&amp;nbsp;구조는&amp;nbsp;각각의&amp;nbsp;POJO&amp;nbsp;객체로&amp;nbsp;구현되는&amp;nbsp;모듈화된&amp;nbsp;관심사&amp;nbsp;영역(도메인)으로&amp;nbsp;구성된다.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[&amp;nbsp;의사&amp;nbsp;결정을&amp;nbsp;최적화하라&amp;nbsp;]&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;사라진다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&amp;nbsp;관심사로&amp;nbsp;모듈을&amp;nbsp;분리한&amp;nbsp;POJO&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;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;최적의 결정을 내리기 쉬워지며, 결정의 복잡성도 줄어든다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[&amp;nbsp;명백한&amp;nbsp;가치가&amp;nbsp;있을&amp;nbsp;때&amp;nbsp;표준을&amp;nbsp;현명하게&amp;nbsp;사용하라&amp;nbsp;]&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;쉽다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[&amp;nbsp;시스템&amp;nbsp;도메인&amp;nbsp;특화&amp;nbsp;언어가&amp;nbsp;필요하다&amp;nbsp;]&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DSL(Domain-Specific&amp;nbsp;Language)은&amp;nbsp;간단한&amp;nbsp;스크립트&amp;nbsp;언어나&amp;nbsp;표준&amp;nbsp;언어로&amp;nbsp;구현한&amp;nbsp;API를&amp;nbsp;말한다.&amp;nbsp;DSL로&amp;nbsp;짠&amp;nbsp;코드는&amp;nbsp;도메인&amp;nbsp;전문가가&amp;nbsp;작성한&amp;nbsp;구조적인&amp;nbsp;산문처럼&amp;nbsp;읽힌다.&amp;nbsp;이렇듯&amp;nbsp;좋은&amp;nbsp;DLS은&amp;nbsp;도메인&amp;nbsp;개념과&amp;nbsp;그&amp;nbsp;개념을&amp;nbsp;구현한&amp;nbsp;코드&amp;nbsp;사이에&amp;nbsp;존재하는&amp;nbsp;'의사소통&amp;nbsp;간극'을&amp;nbsp;줄여준다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&amp;nbsp;DSL을&amp;nbsp;사용하면&amp;nbsp;고차원&amp;nbsp;정책에서&amp;nbsp;저차원 세부사항까지&amp;nbsp;모든&amp;nbsp;추상화&amp;nbsp;수준과&amp;nbsp;도메인을&amp;nbsp;POJO로&amp;nbsp;표현할&amp;nbsp;수&amp;nbsp;있다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=======================================&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;것이다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;** EJB(엔터프라이즈 자바 빈), POJO&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Book Review</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/260</guid>
      <comments>https://cocobi.tistory.com/260#entry260comment</comments>
      <pubDate>Fri, 3 Feb 2023 21:07:12 +0900</pubDate>
    </item>
    <item>
      <title>[React Native] React Native Cli에서 Expo 모듈 설치하여 사용하기</title>
      <link>https://cocobi.tistory.com/259</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kzL23/btrXUS4ERhD/QqsdX2WVUCKj8kYZ4JwcUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kzL23/btrXUS4ERhD/QqsdX2WVUCKj8kYZ4JwcUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kzL23/btrXUS4ERhD/QqsdX2WVUCKj8kYZ4JwcUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkzL23%2FbtrXUS4ERhD%2FQqsdX2WVUCKj8kYZ4JwcUk%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;377&quot; height=&quot;130&quot; data-origin-width=&quot;580&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;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  React native cli에서 Expo modules 사용하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;React native cli와 Expo를 고민하던 중 네이티브 기능에 대한 확장 가능성으로 인해 React native cli를 선택하여 개발을 시작하였다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러던 중 Expo에서는 간단하게 구현할 수 있는 기능이 많아 생산성을 높이기 위해 현재 프로젝트에 Expo 모듈을 추가하기로 하였다.&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;zwj;  설치방법&lt;/span&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;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ 방법 1 - Expo 공식 사이트의 가이드 따라 하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Expo에서 제공하는&lt;/span&gt;&amp;nbsp;메뉴얼인 &lt;a href=&quot;https://docs.expo.dev/bare/installing-expo-modules/&quot;&gt;Expo Docs :: Add Expo to an existing project&lt;/a&gt; &lt;span style=&quot;color: #000000;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ 방법 2 - npm 명령어 입력&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.&amp;nbsp;npx&amp;nbsp;install-expo-modules&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. yarn add expo-location&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. npm start android&lt;/span&gt;&lt;br /&gt;&lt;br /&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;&quot;&gt;&lt;b&gt;◾ 방법 3 - 나의 경우&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.&amp;nbsp;npx&amp;nbsp;install-expo-modules&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2.&amp;nbsp;yarn&amp;nbsp;add&amp;nbsp;expo-location&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3.&amp;nbsp;cd&amp;nbsp;android&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4.&amp;nbsp;./gradlew&amp;nbsp;clean&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5.&amp;nbsp;./gradlew&amp;nbsp;build&amp;nbsp;--warning-mode&amp;nbsp;all&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6.&amp;nbsp;npm&amp;nbsp;start&amp;nbsp;android&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7.&amp;nbsp;npm&amp;nbsp;install&amp;nbsp;graceful-fs&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;&quot;&gt;나의 경우에 Expo 공식사이트에서 가이드하는 방법으로 따라 해도 계속 오류 발생하여 정상적인 설치를 진행할 수 없었다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&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: #000000;&quot;&gt;따라서 직접 해결해야겠다고 생각하였고, 오류 내용을 보니 gradle 빌드가 실패한 게 주된 원인인 것 같아 gradle 빌드를 우선적인 목표로 잡고 진행하였다. (생각나는 오류 중 하나는 npm install-expo-modules를 하였을 때 android 관련 java파일이 자동으로 업데이트되는데 해당 파일 상단의 import와 package의 순서가 뒤죽박죽이었다.)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&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: #000000;&quot;&gt;gradle을 빌드할 때 --warning-mode all 옵션을 추가하면 오류 발생 원인이 상세히 나오는데 해당 원인들을 해결하여 빌드를 성공하였다. &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;&quot;&gt;gradle 빌드 이후 서버 기동시 오류가 발생하지 않을 거라고 생각하고 npm start &amp;nbsp;&amp;rarr; run on Android 를 하였으나 또다시 오류가 발생하였다. 오류내용 보니 graceful-fs라는 모듈에서 오류 발생하였기 때문에 해당 모듈 재설치하였더니 정상적으로 기동 되었다.&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;&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;</description>
      <category>Mobile/React Native</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/259</guid>
      <comments>https://cocobi.tistory.com/259#entry259comment</comments>
      <pubDate>Thu, 2 Feb 2023 15:05:43 +0900</pubDate>
    </item>
    <item>
      <title>[Node] npm 캐시(Cache) 관련 명령어 정리</title>
      <link>https://cocobi.tistory.com/258</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqmLOi/btrXMUifP6S/vdM7GvSnH1UzAricCVoFZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqmLOi/btrXMUifP6S/vdM7GvSnH1UzAricCVoFZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqmLOi/btrXMUifP6S/vdM7GvSnH1UzAricCVoFZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqmLOi%2FbtrXMUifP6S%2FvdM7GvSnH1UzAricCVoFZK%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;399&quot; height=&quot;244&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;734&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  npm cache를 다루는 명령어&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000;&quot;&gt;◾ npm의 캐시 데이터(&lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;http 요청 데이터와 패키지 관련 데이터&lt;/span&gt;)는 _cache라는 디렉토리에 저장된다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;◾ 캐시를 통과하는 모든 데이터는 삽입 및 추출 시 무결성이 완전히 검증된다. 또한, &lt;/span&gt;&lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;캐시 손상은 오류를 발생시키거나 데이터를 다시 가져와야 한다는 신호를 보내서 자동으로 데이터를 다시 가져온다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000;&quot;&gt;◾ npm은 자체적으로 &lt;span style=&quot;background-color: #fdfdfd;&quot;&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ add&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000;&quot;&gt;add 명령어는 지정한 패키지를 로컬 캐시에 추가한다. &lt;/span&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675259255197&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm cache add &amp;lt;package-spec&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ clean&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000;&quot;&gt;clean은 캐시 폴더에서 모든 데이터를 삭제한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;일반적으로 npm의 캐시는 자가 복구가 가능하고 데이터 손상 문제에 강하기 때문에 &lt;/span&gt;&lt;span style=&quot;background-color: #fdfdfd;&quot;&gt;디스크 공간을 늘리는 것 외의 이유로 는 잘 사용되지 않는다. 디스크 정리를 위해서는 --force 옵션을 주어 실행한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675259280152&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm cache clean [&amp;lt;key&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ verify&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000;&quot;&gt;캐시 폴더의 내용, 불필요한 데이터를 수집하는 가비지, 캐시 인덱스 및 캐싱 된 모든 데이터의 무결성을 확인한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675259291735&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm cache verify&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;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;&quot;&gt;&lt;b&gt;  참고사이트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.npmjs.com/cli/v8/commands/npm-cache&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;npm Docs :: npm-cache&lt;/a&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;&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;</description>
      <category>Backend/Node.js</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/258</guid>
      <comments>https://cocobi.tistory.com/258#entry258comment</comments>
      <pubDate>Wed, 1 Feb 2023 22:53:15 +0900</pubDate>
    </item>
    <item>
      <title>[Git] push 에러 해결 방법 (브랜치 생성 후 push 에러)</title>
      <link>https://cocobi.tistory.com/257</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1200px-Git-logo.svg.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KbWoc/btrXIjVguIu/RPFpKEwz1NkmnXDRBMz041/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KbWoc/btrXIjVguIu/RPFpKEwz1NkmnXDRBMz041/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KbWoc/btrXIjVguIu/RPFpKEwz1NkmnXDRBMz041/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKbWoc%2FbtrXIjVguIu%2FRPFpKEwz1NkmnXDRBMz041%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;228&quot; height=&quot;95&quot; data-filename=&quot;1200px-Git-logo.svg.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;501&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  깃 푸시 에러 해결하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675149837194&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fatal: 'development' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.&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: #000000;&quot;&gt;신규 브랜치 생성 후 push를 시도하였으나, 위와 같은 에러가 발생하였다.&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;&quot;&gt;해당 오류는 branch 이동 중 원격 저장소 내 branch 정보를 올바르게 읽지 못해 발생하는 문제이며,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;push, pull, merge 등 원격 저장소와 통신할 때 언제든지 발생할 수 있는 문제이다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;  해결 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ 원격 저장소 업데이트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;아래 명령어를 통해 branch 정보를 업데이트한 후 다시 작업을 진행한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675149965327&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git remote update&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: #000000;&quot;&gt;&lt;b&gt;2️⃣ 원격&amp;nbsp;저장소&amp;nbsp;연결&amp;nbsp;제거&amp;nbsp;후&amp;nbsp;재연결&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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: #000000;&quot;&gt;&lt;b&gt;ⅰ) 원격 저장소 확인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 명령어를 입력하면 현재 연결된 원격 저장소의 목록이 출력된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;목록이 출력되지 않는 경우 연결된 원격저장소가 존재하지 않는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675150186926&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git remote -v&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;210&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6pQTP/btrXECPfWlb/UxWNHPiUVJe7mzLf7N4dkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6pQTP/btrXECPfWlb/UxWNHPiUVJe7mzLf7N4dkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6pQTP/btrXECPfWlb/UxWNHPiUVJe7mzLf7N4dkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6pQTP%2FbtrXECPfWlb%2FUxWNHPiUVJe7mzLf7N4dkK%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;47&quot; data-origin-width=&quot;210&quot; data-origin-height=&quot;47&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;color: #000000;&quot;&gt;&lt;b&gt;ⅱ) 원격 저장소 제거&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 명령어를 입력한 후 1번에서 확인한 원격 저장소를 제거한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675150123594&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git remote remove [원격 저장소 이름(e.g., origin, master, main)]&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: #000000;&quot;&gt;&lt;b&gt;ⅲ) 원격 저장소 연결&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 명령어를 입력하여 제거한 원격 저장소를 다시 연결하도록 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675150328563&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git remote add [새로운 원격 저장소 이름(e.g., origin)] [github 원격저장소 URL]&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: #000000;&quot;&gt;&lt;b&gt;ⅳ) 원격 저장소 확인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1번의 명령어를 다시 입력하여 원격 저장소 연결이 제대로 이루어졌는지 확인한다.&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;450&quot; data-origin-height=&quot;49&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm6FCw/btrXHInPfqA/YYJofI9OCnhjj0DAnqvzn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm6FCw/btrXHInPfqA/YYJofI9OCnhjj0DAnqvzn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm6FCw/btrXHInPfqA/YYJofI9OCnhjj0DAnqvzn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm6FCw%2FbtrXHInPfqA%2FYYJofI9OCnhjj0DAnqvzn1%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;432&quot; height=&quot;47&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;49&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ 오류 해결&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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;508&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNt1v1/btrXIzKimnE/i7MdFcObHD6GnzdDFjRPJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNt1v1/btrXIzKimnE/i7MdFcObHD6GnzdDFjRPJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNt1v1/btrXIzKimnE/i7MdFcObHD6GnzdDFjRPJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNt1v1%2FbtrXIzKimnE%2Fi7MdFcObHD6GnzdDFjRPJK%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;488&quot; height=&quot;125&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;130&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;&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;</description>
      <category>Dev Tools</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/257</guid>
      <comments>https://cocobi.tistory.com/257#entry257comment</comments>
      <pubDate>Tue, 31 Jan 2023 16:37:38 +0900</pubDate>
    </item>
    <item>
      <title>[React Native] Expo-CLI 개발 환경 세팅 방법 정리</title>
      <link>https://cocobi.tistory.com/256</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btczKg/btrXnIiwKee/EDBkUuzJjiQt7yDNzJl7uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btczKg/btrXnIiwKee/EDBkUuzJjiQt7yDNzJl7uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btczKg/btrXnIiwKee/EDBkUuzJjiQt7yDNzJl7uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtczKg%2FbtrXnIiwKee%2FEDBkUuzJjiQt7yDNzJl7uk%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;377&quot; height=&quot;130&quot; data-origin-width=&quot;580&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;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  Expo-CLI 개발 환경 세팅 하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1️⃣&amp;nbsp;Expo&amp;nbsp;CLI&amp;nbsp;설치&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2️⃣&amp;nbsp;프로젝트&amp;nbsp;생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3️⃣&amp;nbsp;프로젝트&amp;nbsp;실행(웹/가상장치)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4️⃣&amp;nbsp;Expo&amp;nbsp;app에서&amp;nbsp;실행&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ Expo&amp;nbsp;CLI&amp;nbsp;설치&lt;/b&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;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;◾ expo-cli 설치 명령어 입력&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675036634558&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install --global expo-cli&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;874&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxcKkb/btrXwjgQUIe/7SXw6ZKhkgl0fKzh4bZRGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxcKkb/btrXwjgQUIe/7SXw6ZKhkgl0fKzh4bZRGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxcKkb/btrXwjgQUIe/7SXw6ZKhkgl0fKzh4bZRGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxcKkb%2FbtrXwjgQUIe%2F7SXw6ZKhkgl0fKzh4bZRGK%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;723&quot; height=&quot;307&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;371&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;color: #000000;&quot;&gt;global 설치를 원하지 않는 경우 프로젝트를 시작할 경로에서 아래 명령어를 입력한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675036617101&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install expo-cli&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;&lt;span style=&quot;color: #000000;&quot;&gt;◾설치 확인&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675036674652&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;expo-cli --version&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;418&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg0RBx/btrXn8Be0Hh/lRUMbB6X3rOJweI12vDqcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg0RBx/btrXn8Be0Hh/lRUMbB6X3rOJweI12vDqcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg0RBx/btrXn8Be0Hh/lRUMbB6X3rOJweI12vDqcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg0RBx%2FbtrXn8Be0Hh%2FlRUMbB6X3rOJweI12vDqcK%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;410&quot; height=&quot;49&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;50&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ 프로젝트 생성&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾ 프로젝트 생성할 폴더로 이동후 [ expo init 프로젝트명 ]&amp;nbsp; 입력&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675037301451&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;expo init 프로젝트명&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;&lt;span style=&quot;color: #000000;&quot;&gt;◾ template 선택&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;span style=&quot;color: #000000;&quot;&gt;blank : &lt;span style=&quot;color: #000000;&quot;&gt;비어있는&lt;span&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;&lt;span style=&quot;color: #000000;&quot;&gt;- blank(TypeScript) : blank와 동일하면서 TypeScript를 사용할 수 있는 템플릿&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- tabs(TypeScript) : react-navigation을 통해 여러 페이지가 만들어져 있는 템플릿&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Bare wokrflow : Non-Expo 앱을 만들때 사용&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;732&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E23Zn/btrXn6Dlycn/H1T2nL14w2w2kUmUzRZ530/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E23Zn/btrXn6Dlycn/H1T2nL14w2w2kUmUzRZ530/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E23Zn/btrXn6Dlycn/H1T2nL14w2w2kUmUzRZ530/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE23Zn%2FbtrXn6Dlycn%2FH1T2nL14w2w2kUmUzRZ530%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;718&quot; height=&quot;212&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;216&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;799&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A1VSU/btrXrMRrTF2/UkkqxocQ17Q6XbI9aDmBsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A1VSU/btrXrMRrTF2/UkkqxocQ17Q6XbI9aDmBsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A1VSU/btrXrMRrTF2/UkkqxocQ17Q6XbI9aDmBsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA1VSU%2FbtrXrMRrTF2%2FUkkqxocQ17Q6XbI9aDmBsK%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;716&quot; height=&quot;233&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;260&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ 프로젝트 실행(웹/가상장치)&lt;/b&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;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾ 프로젝트 폴더로 이동후 expo 실행&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675037502135&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd my-app
expo start 또는 npm start&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;863&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcs9wK/btrXtRrtUls/ibeNKrFxmck4TMDy8kCg90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcs9wK/btrXtRrtUls/ibeNKrFxmck4TMDy8kCg90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcs9wK/btrXtRrtUls/ibeNKrFxmck4TMDy8kCg90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdcs9wK%2FbtrXtRrtUls%2FibeNKrFxmck4TMDy8kCg90%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;740&quot; height=&quot;585&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;682&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;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾ 웹에서 실행&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;w버튼을 누를 경우 expo가 데스크탑 웹에서 실행된다.&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;886&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z6aOk/btrXt9FAJ0U/r4uH7Z4kfQ6NebwEYgssO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z6aOk/btrXt9FAJ0U/r4uH7Z4kfQ6NebwEYgssO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z6aOk/btrXt9FAJ0U/r4uH7Z4kfQ6NebwEYgssO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ6aOk%2FbtrXt9FAJ0U%2Fr4uH7Z4kfQ6NebwEYgssO1%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;648&quot; height=&quot;442&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;604&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;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾ 가상 장치에서 실행&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;a버튼을 누를 경우 안드로이드 스튜디오에 설치된 가상장치에서 expo가 실행된다.&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;564&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zKqB6/btrXrM4Z1k8/jkezKgL0cJjUj93Rm6kogk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zKqB6/btrXrM4Z1k8/jkezKgL0cJjUj93Rm6kogk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zKqB6/btrXrM4Z1k8/jkezKgL0cJjUj93Rm6kogk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzKqB6%2FbtrXrM4Z1k8%2FjkezKgL0cJjUj93Rm6kogk%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;541&quot; height=&quot;284&quot; data-origin-width=&quot;564&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;821&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/db3jf1/btrXyo3lcaY/2NJKz3FO2VSV6qmKa60w5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/db3jf1/btrXyo3lcaY/2NJKz3FO2VSV6qmKa60w5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/db3jf1/btrXyo3lcaY/2NJKz3FO2VSV6qmKa60w5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdb3jf1%2FbtrXyo3lcaY%2F2NJKz3FO2VSV6qmKa60w5k%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;609&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;821&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4️⃣ Expo app 에서 실행&lt;/b&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;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾ Expo app 설치&lt;/span&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;&lt;span style=&quot;color: #000000;&quot;&gt;- Android&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;u&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=host.exp.exponent&quot;&gt;https://play.google.com/store/apps/details?id=host.exp.exponent&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675041918280&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;Expo - Google Play 앱&quot; data-og-description=&quot;Expo는 JavaScript 및 React를 사용하여 앱을 제작하는 무료 및 오픈 소스 플랫폼입니다.&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=host.exp.exponent&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=host.exp.exponent&amp;amp;hl=ko&amp;amp;gl=JP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/m12Mq/hyNEfHBIyM/pk9L2KHOwbRG6F41PaX4D1/img.png?width=512&amp;amp;height=250&amp;amp;face=0_0_512_250,https://scrap.kakaocdn.net/dn/9tWQO/hyNEg0OYE9/H8umqErQZkHmGziNv2ON81/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=host.exp.exponent&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=host.exp.exponent&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/m12Mq/hyNEfHBIyM/pk9L2KHOwbRG6F41PaX4D1/img.png?width=512&amp;amp;height=250&amp;amp;face=0_0_512_250,https://scrap.kakaocdn.net/dn/9tWQO/hyNEg0OYE9/H8umqErQZkHmGziNv2ON81/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300');&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;Expo - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Expo는 JavaScript 및 React를 사용하여 앱을 제작하는 무료 및 오픈 소스 플랫폼입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.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;span style=&quot;color: #000000;&quot;&gt;- iOS App Store&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;a href=&quot;https://search.itunes.apple.com/WebObjects/MZContentLink.woa/wa/link?path=apps%2fexponent&quot;&gt;https://search.itunes.apple.com/WebObjects/MZContentLink.woa/wa/link?path=apps%2fexponent&lt;/a&gt;&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675041918283&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;Connecting to the iTunes Store.&quot; data-og-description=&quot;&quot; data-og-host=&quot;search.itunes.apple.com&quot; data-og-source-url=&quot;https://search.itunes.apple.com/WebObjects/MZContentLink.woa/wa/link?path=apps%2fexponent&quot; data-og-url=&quot;https://search.itunes.apple.com/WebObjects/MZContentLink.woa/wa/link?path=apps%2fexponent&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://search.itunes.apple.com/WebObjects/MZContentLink.woa/wa/link?path=apps%2fexponent&quot; data-source-url=&quot;https://search.itunes.apple.com/WebObjects/MZContentLink.woa/wa/link?path=apps%2fexponent&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('&amp;quot;&amp;quot;');&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;Connecting to the iTunes Store.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;search.itunes.apple.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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾ Expo app 실행 후 Scan QR Code&amp;nbsp; 선택 &amp;rarr; VS Code콘솔의 QR 코드 스캔&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PC와 모바일 기기가 동일한 네트워크에 연결되어 있어야 실행된다.&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;1080&quot; data-origin-height=&quot;2220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVMYj1/btrXAkzCDiz/OuXNr5qI3GHGkaKw3CFwpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVMYj1/btrXAkzCDiz/OuXNr5qI3GHGkaKw3CFwpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVMYj1/btrXAkzCDiz/OuXNr5qI3GHGkaKw3CFwpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVMYj1%2FbtrXAkzCDiz%2FOuXNr5qI3GHGkaKw3CFwpk%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;350&quot; height=&quot;719&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2220&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;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾ 실행 확인&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_KakaoTalk_20220308_141901021.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1996&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vhMVK/btrXoow5ynG/87J6TsNBTIk5IO3wOd1PK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vhMVK/btrXoow5ynG/87J6TsNBTIk5IO3wOd1PK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vhMVK/btrXoow5ynG/87J6TsNBTIk5IO3wOd1PK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvhMVK%2FbtrXoow5ynG%2F87J6TsNBTIk5IO3wOd1PK0%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;316&quot; height=&quot;650&quot; data-filename=&quot;edited_KakaoTalk_20220308_141901021.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1996&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;&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;</description>
      <category>Mobile/React Native</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/256</guid>
      <comments>https://cocobi.tistory.com/256#entry256comment</comments>
      <pubDate>Mon, 30 Jan 2023 22:18:45 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 컬렉션의 반복문 실행 시 인덱스 부여하기(enumerate)</title>
      <link>https://cocobi.tistory.com/255</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxkwjZ/btrXyksSDaB/P2fCjyC2sDskmnBvz9cB0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxkwjZ/btrXyksSDaB/P2fCjyC2sDskmnBvz9cB0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxkwjZ/btrXyksSDaB/P2fCjyC2sDskmnBvz9cB0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxkwjZ%2FbtrXyksSDaB%2FP2fCjyC2sDskmnBvz9cB0K%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;361&quot; height=&quot;107&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;379&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  파이썬 컬렉션의 반복문 실행 시 인덱스 부여하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;파이썬의 컬렉션 타입에는&amp;nbsp;list, tuple, dictionary, set가 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컬렉션 타입의 반복문을 실행하였을 때 인덱스를 가져오기 위해서는 enumerate &lt;span style=&quot;color: #000000;&quot;&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 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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;  예제로 알아보기&lt;/b&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: #000000;&quot;&gt;&lt;b&gt;◾ 기본 사용법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;for문을 통해 루프를 실행할 경우 컬렉션타입을 enumerate 함수로 감싸 실행하게 되면 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(index, element) 쌍으로 순회할 수 있다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래와 같이&amp;nbsp;for i, value로 선언하면, 튜플이 Unpacking 되어 index와 value에 값이 할당된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674996533886&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;animals = ['Cat', 'Dog', 'Giraffe', 'Hamster']

for i, value in enumerate(animals):
    print(f'Index: {i}, animal: {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;273&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cx8ZHx/btrXtSjne78/XyKY5uO0Knx43AeWSsa9c1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cx8ZHx/btrXtSjne78/XyKY5uO0Knx43AeWSsa9c1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cx8ZHx/btrXtSjne78/XyKY5uO0Knx43AeWSsa9c1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcx8ZHx%2FbtrXtSjne78%2FXyKY5uO0Knx43AeWSsa9c1%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;273&quot; height=&quot;91&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;91&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ 특정 index로 시작하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;enumerate를 통해 인덱스를 부여할 경우 인덱스는 0부터 시작한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;특정 인덱스부터 시작하기 원하는 경우&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래와 같이&amp;nbsp;enumerate의 인자로&amp;nbsp;start=n을 전달하면 index가&amp;nbsp;n부터 시작한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674996550077&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;animals = ['Cat', 'Dog', 'Giraffe', 'Hamster']

for i, value in enumerate(animals, start=1):
    print(f'Index: {i}, animal: {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;302&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPrgCK/btrXnIvJFPc/LWAFOibKd3QPnPvyj5KJO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPrgCK/btrXnIvJFPc/LWAFOibKd3QPnPvyj5KJO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPrgCK/btrXnIvJFPc/LWAFOibKd3QPnPvyj5KJO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPrgCK%2FbtrXnIvJFPc%2FLWAFOibKd3QPnPvyj5KJO0%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;302&quot; height=&quot;96&quot; data-origin-width=&quot;302&quot; data-origin-height=&quot;96&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;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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Backend/Python</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/255</guid>
      <comments>https://cocobi.tistory.com/255#entry255comment</comments>
      <pubDate>Sun, 29 Jan 2023 22:03:56 +0900</pubDate>
    </item>
    <item>
      <title>[JS] 자바스크립트 로컬 스토리지(localStorage) 사용 하기</title>
      <link>https://cocobi.tistory.com/253</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9ks5g/btrXmB29yHR/tXY6S6KYioRJeaKiKFy69K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9ks5g/btrXmB29yHR/tXY6S6KYioRJeaKiKFy69K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9ks5g/btrXmB29yHR/tXY6S6KYioRJeaKiKFy69K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9ks5g%2FbtrXmB29yHR%2FtXY6S6KYioRJeaKiKFy69K%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;510&quot; height=&quot;262&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;370&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  자바스크립트 로컬 스토리지 사용 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로컬 스토리지(localStorage) 는 사용자의 컴퓨터에 저장되기 때문에 로컬 저장소라고 한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한 로컬 스토리지는&lt;span style=&quot;background-color: #ffffff;&quot;&gt; 세션 스토리지(&lt;/span&gt;sessionStorage) &lt;span style=&quot;background-color: #ffffff;&quot;&gt;와 비슷하지만,&amp;nbsp;&lt;/span&gt;&lt;b&gt;로컬 스토리지&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;의 데이터는 명시적으로 제거하지 않는 이상 &lt;b&gt;자동으로 사라지지 않으나&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;세션 스토리지&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;의 데이터는 페이지 세션이 끝날 때, 즉 &lt;b&gt;페이지를 닫을 때 사라진다&lt;/b&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;span style=&quot;color: #000000;&quot;&gt;그리고 로컬 스토리지&lt;span style=&quot;background-color: #ffffff;&quot;&gt;에 저장된 데이터는&amp;nbsp;&lt;/span&gt;&lt;b&gt;페이지의 프로토콜별로 구분&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;된다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;예를 들어, HTTP&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;로 방문한 페이지에서 저장한 데이터는 같은 페이지의 HTTPS&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;와는 다른&amp;nbsp;&lt;/span&gt;로컬 스토리지&lt;span style=&quot;background-color: #ffffff;&quot;&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;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;로컬 스토리지의 데이터는 키와 값의 쌍으로 이루어져 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로컬 스토리지의 값으로 가능한 것은&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String&quot;&gt;DOMString&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&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;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;♂️ 예제로 알아보기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ 내장 메서드 사용&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로컬 스토어의 내장 메서드는 setItem, getItem, removeItem, clear가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674796808409&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* setItem */
localStorage.setItem(&quot;name&quot;, &quot;jinny&quot;);
console.log(localStorage) // {keyName: &quot;value&quot;}


/* getItem */
let locValue = localStorage.getItem(&quot;name&quot;);
console.log(locValue) // jinny


/* removeItem */
localStorage.removeItem(&quot;name&quot;);
console.log(localStorage) // {}


/* clear */
localStorage.setItem(&quot;name&quot;, &quot;jinny&quot;);
localStorage.clear();
console.log(localStorage) // {}&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: #000000;&quot;&gt;&lt;b&gt;◾ 로컬 스토리지에 객체 저장하고 사용하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로컬 스토어에 객체를 &lt;/span&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;저장할 경우 문자열 'object Object' 로 저장된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;따라서 객체를 저장할때는 JSON.stringify()를 사용해서 저장하면 객체가 JSON String 형태로 저장되고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 데이터를 꺼내서 쓸 때는 &lt;span style=&quot;color: #000000;&quot;&gt;JSON.parse()를 사용하여 다시 객체로 변환하여 사용하면 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674796874214&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let obj = [
  {
    name: &quot;Jinny&quot;,
    age: 30,
  }, {
    name: &quot;cocobi&quot;,
    age: 29,
  }, 
]


/* JSON.stringify */
localStorage.setItem( 'obj', JSON.stringify(obj) );
console.log(localStorage) 
// Storage&amp;nbsp;{obj: '[{&quot;name&quot;:&quot;Jinny&quot;,&quot;age&quot;:30},{&quot;name&quot;:&quot;cocobi&quot;,&quot;age&quot;:29}]', length: 1}


/* JSON.parse */
let userInfo = JSON.parse(localStorage.obj);
console.log(userInfo)
// [ 0: {&quot;name&quot;:&quot;Jinny&quot;,&quot;age&quot;:30}, 1: {&quot;name&quot;:&quot;cocobi&quot;,&quot;age&quot;:29}, length: 2 ]&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;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: #000000;&quot;&gt;&lt;b&gt;  참고사이트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/Window/localStorage&quot;&gt;MDN :: localStorage&lt;/a&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;&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;</description>
      <category>Frontend/JavaScript</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/253</guid>
      <comments>https://cocobi.tistory.com/253#entry253comment</comments>
      <pubDate>Fri, 27 Jan 2023 14:51:22 +0900</pubDate>
    </item>
    <item>
      <title>[Clean Code] 클린 코드 7장 ~ 9장 리뷰</title>
      <link>https://cocobi.tistory.com/251</link>
      <description>&lt;p style=&quot;text-align: left;&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;1280&quot; data-origin-height=&quot;1518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3R350/btrXgZXl4AI/MkBeaqqklGC10xeUtTJ7j1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3R350/btrXgZXl4AI/MkBeaqqklGC10xeUtTJ7j1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3R350/btrXgZXl4AI/MkBeaqqklGC10xeUtTJ7j1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3R350%2FbtrXgZXl4AI%2FMkBeaqqklGC10xeUtTJ7j1%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;279&quot; height=&quot;331&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1518&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 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  7장&amp;nbsp;::&amp;nbsp;오류처리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;깨끗한&amp;nbsp;코드와&amp;nbsp;오류&amp;nbsp;처리&amp;nbsp;사이에도&amp;nbsp;연관성은&amp;nbsp;있다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;오류&amp;nbsp;코드보다&amp;nbsp;예외를&amp;nbsp;사용하라&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예외&amp;nbsp;처리가&amp;nbsp;없다면&amp;nbsp;오류&amp;nbsp;플래그를&amp;nbsp;설정하거나&amp;nbsp;호출자에게&amp;nbsp;오류&amp;nbsp;코드를&amp;nbsp;반환해야&amp;nbsp;한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&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;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&amp;nbsp;오류&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;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;Try-Catch-Finally&amp;nbsp;문부터&amp;nbsp;작성하라&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어떤&amp;nbsp;면에서&amp;nbsp;try&amp;nbsp;블록은&amp;nbsp;트랜잭션과&amp;nbsp;비슷하다.&amp;nbsp;try&amp;nbsp;블록에서&amp;nbsp;무슨&amp;nbsp;일이&amp;nbsp;생기든지&amp;nbsp;catch&amp;nbsp;블록이&amp;nbsp;상태를&amp;nbsp;일관성&amp;nbsp;있게&amp;nbsp;유지해야&amp;nbsp;하기&amp;nbsp;때문이다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;따라서,&amp;nbsp;예외가&amp;nbsp;발생할&amp;nbsp;코드를&amp;nbsp;짤&amp;nbsp;때는&amp;nbsp;try-catch-finally&amp;nbsp;문으로&amp;nbsp;시작하는&amp;nbsp;편이&amp;nbsp;낫다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;미확인(unchecked)&amp;nbsp;예외를&amp;nbsp;사용하라&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;확인된&amp;nbsp;예외는&amp;nbsp;OCP(Open&amp;nbsp;Closed&amp;nbsp;Principle)을&amp;nbsp;위반한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&amp;nbsp;하위&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;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;크다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;예외에&amp;nbsp;의미를&amp;nbsp;제공하라&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;덧붙인다.) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&amp;nbsp;오류가&amp;nbsp;발생한&amp;nbsp;원인과&amp;nbsp;위치를&amp;nbsp;찾기가&amp;nbsp;쉬워진다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;호출자를&amp;nbsp;고려해&amp;nbsp;예외&amp;nbsp;클래스를&amp;nbsp;정의하라&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오류를&amp;nbsp;잡아내기&amp;nbsp;위해&amp;nbsp;예외&amp;nbsp;클래스를&amp;nbsp;정의한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;정상&amp;nbsp;흐름을&amp;nbsp;정의하라&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;특수&amp;nbsp;사례&amp;nbsp;패턴(SPECIAL&amp;nbsp;CASE&amp;nbsp;PATTERN)&amp;nbsp;:&amp;nbsp;클래스를&amp;nbsp;만들거나&amp;nbsp;객체를&amp;nbsp;조작해(=예외적인&amp;nbsp;상황을&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;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;null을&amp;nbsp;반환하지&amp;nbsp;마라&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;null을&amp;nbsp;반환하는&amp;nbsp;코드는&amp;nbsp;일거리를&amp;nbsp;늘린&amp;nbsp;뿐만&amp;nbsp;아니라&amp;nbsp;호출자에게&amp;nbsp;문제를&amp;nbsp;떠넘긴다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;null확인을&amp;nbsp;빼먹는다면&amp;nbsp;애플리케이션&amp;nbsp;통제&amp;nbsp;불능에&amp;nbsp;빠질지도&amp;nbsp;모른다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;메서드에서&amp;nbsp;null을&amp;nbsp;반환하고자&amp;nbsp;한다면&amp;nbsp;그&amp;nbsp;대신&amp;nbsp;예외를&amp;nbsp;던지거나&amp;nbsp;특수&amp;nbsp;사례&amp;nbsp;객체를&amp;nbsp;반환한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;null을&amp;nbsp;전달하지&amp;nbsp;마라&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;메서드에서&amp;nbsp;null을&amp;nbsp;반환하는&amp;nbsp;방식도&amp;nbsp;나쁘지만&amp;nbsp;메서드로&amp;nbsp;null을&amp;nbsp;전달하는&amp;nbsp;방식은&amp;nbsp;더&amp;nbsp;나쁘다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;정상적인&amp;nbsp;인수로&amp;nbsp;null을&amp;nbsp;기대하는&amp;nbsp;API가&amp;nbsp;아니라면&amp;nbsp;메서드로&amp;nbsp;null을&amp;nbsp;전달하는&amp;nbsp;코드는&amp;nbsp;최대한&amp;nbsp;피한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=======================================&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;깨끗한&amp;nbsp;코드는&amp;nbsp;읽기도&amp;nbsp;좋아야&amp;nbsp;하고&amp;nbsp;안정성도&amp;nbsp;높아야&amp;nbsp;한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오류&amp;nbsp;처리를&amp;nbsp;프로그램&amp;nbsp;논리와&amp;nbsp;분리하면&amp;nbsp;독립적인&amp;nbsp;추론이&amp;nbsp;가능해지며&amp;nbsp;코드&amp;nbsp;유지보수성도&amp;nbsp;크게&amp;nbsp;높아진다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;***&amp;nbsp;NullPointException&amp;nbsp;&lt;/span&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;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  8장&amp;nbsp;::&amp;nbsp;경계&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시스템에&amp;nbsp;들어가는&amp;nbsp;모든&amp;nbsp;소프트웨어를&amp;nbsp;직접&amp;nbsp;개발하는&amp;nbsp;경우는&amp;nbsp;드물다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;사용한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어떤&amp;nbsp;식으로든&amp;nbsp;이러한&amp;nbsp;외부&amp;nbsp;코드를&amp;nbsp;우리의&amp;nbsp;코드에&amp;nbsp;깔끔하게&amp;nbsp;통합해야만&amp;nbsp;한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;외부&amp;nbsp;코드&amp;nbsp;사용하기&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;주의한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;경계&amp;nbsp;살피고&amp;nbsp;익히기&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;학습&amp;nbsp;테스트&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;API를&amp;nbsp;사용하려는&amp;nbsp;목적에&amp;nbsp;초점을&amp;nbsp;맞춘다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;학습&amp;nbsp;테스트는&amp;nbsp;공짜&amp;nbsp;이상이다&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;크다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;아직&amp;nbsp;존재하지&amp;nbsp;않는&amp;nbsp;코드를&amp;nbsp;사용하기&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위에서&amp;nbsp;살펴본&amp;nbsp;것과&amp;nbsp;또&amp;nbsp;다른&amp;nbsp;경계는&amp;nbsp;아는&amp;nbsp;코드와&amp;nbsp;모르는&amp;nbsp;코드를&amp;nbsp;분리하는&amp;nbsp;경계이다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;분명해진다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;깨끗한&amp;nbsp;경계&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;경계에&amp;nbsp;위치하는&amp;nbsp;코드는&amp;nbsp;깔끔히&amp;nbsp;분리한다.&amp;nbsp;또한&amp;nbsp;기대치를&amp;nbsp;정의하는&amp;nbsp;테스트&amp;nbsp;케이스도&amp;nbsp;작성한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=======================================&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;잘&amp;nbsp;다룰&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;하자.&lt;/span&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;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  9장&amp;nbsp;::&amp;nbsp;단위&amp;nbsp;테스트&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;TDD&amp;nbsp;법칙&amp;nbsp;세&amp;nbsp;가지&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.&amp;nbsp;실패하는&amp;nbsp;단위&amp;nbsp;테스트를&amp;nbsp;작성할&amp;nbsp;때까지&amp;nbsp;실제&amp;nbsp;코드를&amp;nbsp;작성하지&amp;nbsp;않는다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2.&amp;nbsp;컴파일은&amp;nbsp;실패하지&amp;nbsp;않으면서&amp;nbsp;실행이&amp;nbsp;실패하는&amp;nbsp;정도로만&amp;nbsp;단위&amp;nbsp;테스트를&amp;nbsp;작성한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3.&amp;nbsp;현재&amp;nbsp;실패하는&amp;nbsp;테스트를&amp;nbsp;통과할&amp;nbsp;정도로만&amp;nbsp;실제&amp;nbsp;코드를&amp;nbsp;작성한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위&amp;nbsp;세&amp;nbsp;가지&amp;nbsp;규칙을&amp;nbsp;따르면&amp;nbsp;개발과&amp;nbsp;테스트가&amp;nbsp;약&amp;nbsp;30초&amp;nbsp;주기로&amp;nbsp;이루어진다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;나온다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;있다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;깨끗한&amp;nbsp;테스트&amp;nbsp;코드&amp;nbsp;유지하기&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지저분한&amp;nbsp;테스트&amp;nbsp;코드나&amp;nbsp;테스트를&amp;nbsp;하지&amp;nbsp;않는&amp;nbsp;것은&amp;nbsp;오십 보&amp;nbsp;백보,&amp;nbsp;아니&amp;nbsp;오히려&amp;nbsp;못하다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&amp;nbsp;실제&amp;nbsp;코드가&amp;nbsp;변경되면&amp;nbsp;테스트&amp;nbsp;코드도&amp;nbsp;변경되어야&amp;nbsp;하며,&amp;nbsp;테스트&amp;nbsp;코드가&amp;nbsp;더러울수록&amp;nbsp;변경하기&amp;nbsp;어려워진다.&amp;nbsp;경우에&amp;nbsp;따라&amp;nbsp;테스트&amp;nbsp;코드를&amp;nbsp;짜는&amp;nbsp;시간이&amp;nbsp;실제&amp;nbsp;코드를&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;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&amp;nbsp;테스트&amp;nbsp;코드는&amp;nbsp;실제&amp;nbsp;코드&amp;nbsp;못지않게&amp;nbsp;중요하다.&amp;nbsp;테스트&amp;nbsp;코드는&amp;nbsp;이류&amp;nbsp;시민이&amp;nbsp;아니다.&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;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;테스트는&amp;nbsp;유연성,&amp;nbsp;유지보수성,&amp;nbsp;재사용성을&amp;nbsp;제공한다.&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;깨끗한&amp;nbsp;테스트&amp;nbsp;코드&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;깨끗한&amp;nbsp;테스트&amp;nbsp;코드를&amp;nbsp;위해서는&amp;nbsp;세&amp;nbsp;가지가&amp;nbsp;필요하다.&amp;nbsp;가독성,&amp;nbsp;가독성,&amp;nbsp;가독성. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어쩌면&amp;nbsp;가독성은&amp;nbsp;실제&amp;nbsp;코드보다&amp;nbsp;테스트&amp;nbsp;코드에&amp;nbsp;더더욱&amp;nbsp;중요하다.(명료성,&amp;nbsp;단순성,&amp;nbsp;표현력) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;테스트&amp;nbsp;코드는&amp;nbsp;최소의&amp;nbsp;표현으로&amp;nbsp;많은&amp;nbsp;것을&amp;nbsp;나타내야&amp;nbsp;한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;도메인에&amp;nbsp;특화된&amp;nbsp;테스트&amp;nbsp;언어&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;이중&amp;nbsp;표준&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;메모리나&amp;nbsp;CPU효율과&amp;nbsp;관련&amp;nbsp;있는&amp;nbsp;경우&amp;nbsp;실제&amp;nbsp;환경과&amp;nbsp;테스트&amp;nbsp;환경은&amp;nbsp;달라도&amp;nbsp;문제되지&amp;nbsp;않는다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;테스트&amp;nbsp;당&amp;nbsp;assert&amp;nbsp;하나&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JUnit으로&amp;nbsp;테스트&amp;nbsp;코드를&amp;nbsp;작성할&amp;nbsp;때&amp;nbsp;함수마다&amp;nbsp;assert문을&amp;nbsp;단&amp;nbsp;하나씩만&amp;nbsp;사용해야&amp;nbsp;한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&amp;nbsp;assert문이&amp;nbsp;하나인&amp;nbsp;함수는&amp;nbsp;결론도&amp;nbsp;하나이기&amp;nbsp;때문에&amp;nbsp;테스트&amp;nbsp;코드를&amp;nbsp;빠르게&amp;nbsp;이해하기&amp;nbsp;쉽다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;테스트&amp;nbsp;당&amp;nbsp;개념&amp;nbsp;하나&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;테스트&amp;nbsp;함수마다&amp;nbsp;한&amp;nbsp;개념만&amp;nbsp;테스트하라,&amp;nbsp;개념&amp;nbsp;당&amp;nbsp;assert문&amp;nbsp;수를&amp;nbsp;최소로&amp;nbsp;줄여라 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;&amp;nbsp;F.I.R.S.T&amp;nbsp;&quot; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;F&lt;/span&gt;ast(빠르게)&amp;nbsp;:&lt;/b&gt;&amp;nbsp;테스트는&amp;nbsp;빨라야&amp;nbsp;한다.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;시작한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;I&lt;/span&gt;ndependent(독립적)&amp;nbsp;:&lt;/b&gt;&amp;nbsp;각&amp;nbsp;테스트는&amp;nbsp;서로&amp;nbsp;의존하면&amp;nbsp;안된다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;R&lt;/span&gt;epeatable(반복가능한)&amp;nbsp;:&lt;/b&gt;&amp;nbsp;테스트는&amp;nbsp;어떤&amp;nbsp;환경에서도&amp;nbsp;반복&amp;nbsp;가능해야한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;있다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&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: #000000;&quot;&gt;&lt;b&gt;◾&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;S&lt;/span&gt;elf-Validating(자가검증)&amp;nbsp;:&amp;nbsp;&lt;/b&gt;테스트는 bool 값으로 결과를 내야한다. 성공 아니면 실패다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&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;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&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: #000000;&quot;&gt;&lt;b&gt;◾&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;T&lt;/span&gt;imely(적시에)&amp;nbsp;:&amp;nbsp;&lt;/b&gt;테스트는 적시에 작성해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단위&amp;nbsp;테스트는&amp;nbsp;테스트하려는&amp;nbsp;실제&amp;nbsp;코드를&amp;nbsp;구현하기&amp;nbsp;직전에&amp;nbsp;구현한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;모른다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=======================================&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;세&amp;nbsp;가지의&amp;nbsp;TDD&amp;nbsp;법칙과&amp;nbsp;FIRST원칙.&amp;nbsp;&quot;테스트&amp;nbsp;당&amp;nbsp;개념&amp;nbsp;하나&quot;&amp;nbsp;는&amp;nbsp;함수&amp;nbsp;파트와&amp;nbsp;비슷한&amp;nbsp;내용이다.&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;&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;</description>
      <category>Book Review</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/251</guid>
      <comments>https://cocobi.tistory.com/251#entry251comment</comments>
      <pubDate>Thu, 26 Jan 2023 15:13:01 +0900</pubDate>
    </item>
    <item>
      <title>[Clean Code] 클린 코드 1장 ~ 6장 리뷰</title>
      <link>https://cocobi.tistory.com/250</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k7Bk2/btrXgq2fiqo/tnswKqfyBwq9cewZzkKjVk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k7Bk2/btrXgq2fiqo/tnswKqfyBwq9cewZzkKjVk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k7Bk2/btrXgq2fiqo/tnswKqfyBwq9cewZzkKjVk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk7Bk2%2FbtrXgq2fiqo%2FtnswKqfyBwq9cewZzkKjVk%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;279&quot; height=&quot;331&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1518&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  1장&amp;nbsp;::&amp;nbsp;깨끗한&amp;nbsp;코드&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&quot;코드가&amp;nbsp;존재하리라&quot;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DSL(Domain Specific Language) : 도메인에 특화된 언어, 특정 문제 해결 기법에 사용할 목적으로 만든 프로그래밍 언어나 명세 언어를 의미한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&quot;나쁜&amp;nbsp;코드&quot;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;르블랑의 법칙 : 나중은 결코 오지 않는다. 나중에 손 보겠다고 한 코드, 돌아간다는 사실에 안도감을 느끼고 위로하며 결국에는 고치지 않는다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&quot;나쁜&amp;nbsp;코드로&amp;nbsp;치르는&amp;nbsp;대가&quot;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&quot;보이스카우트&amp;nbsp;규칙&quot;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;캠프장은&amp;nbsp;처음&amp;nbsp;왔을&amp;nbsp;때보다&amp;nbsp;더&amp;nbsp;깨끗하게&amp;nbsp;해 놓고&amp;nbsp;떠나라.&amp;nbsp;&amp;rArr;&amp;nbsp;지속적인&amp;nbsp;개선 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&quot;설계&amp;nbsp;원칙&quot;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;SRP(Single&amp;nbsp;Responsibility&amp;nbsp;Principle):&amp;nbsp;클래스에는&amp;nbsp;단&amp;nbsp;한&amp;nbsp;가지&amp;nbsp;변경&amp;nbsp;이유만&amp;nbsp;존재해야&amp;nbsp;한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;OCP(Open&amp;nbsp;Closed&amp;nbsp;Principle):&amp;nbsp;클래스는&amp;nbsp;확장에&amp;nbsp;열려있어야&amp;nbsp;하며&amp;nbsp;변경에&amp;nbsp;닫혀있어야&amp;nbsp;한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;LSP(Liskou&amp;nbsp;Subsitution&amp;nbsp;Principle):&amp;nbsp;상속받은&amp;nbsp;클래스는&amp;nbsp;기초&amp;nbsp;클래스를&amp;nbsp;대체할&amp;nbsp;수&amp;nbsp;있어야&amp;nbsp;한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;DIP(Depending&amp;nbsp;Inversion&amp;nbsp;Principle):&amp;nbsp;추상화에&amp;nbsp;의존하라,&amp;nbsp;구체화하지&amp;nbsp;마라 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;ISP(Interface&amp;nbsp;Seregation&amp;nbsp;Principle):&amp;nbsp;클라이언트에&amp;nbsp;밀접한&amp;nbsp;작게&amp;nbsp;쪼개진&amp;nbsp;인터페이스를&amp;nbsp;유지하라&lt;/span&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;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;nbsp;2장 :: 의미&amp;nbsp;있는&amp;nbsp;이름&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;불용어를&amp;nbsp;지양하고&amp;nbsp;구체적인&amp;nbsp;단어의&amp;nbsp;사용하라 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;theUserData&amp;nbsp;-&amp;nbsp;userData,&amp;nbsp;user&amp;nbsp;-&amp;nbsp;userInfo&amp;nbsp;-&amp;nbsp;userDate &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾ 발음하기 쉬운 이름을 사용하라&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;검색하기&amp;nbsp;쉬운&amp;nbsp;이름을&amp;nbsp;사용하라 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;긴&amp;nbsp;이름&amp;nbsp;&amp;gt;&amp;nbsp;짧은 이름,&amp;nbsp;상수는&amp;nbsp;변수에&amp;nbsp;할당하여&amp;nbsp;사용 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;인코딩을&amp;nbsp;피하라 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;불필요한&amp;nbsp;정신적&amp;nbsp;부담은&amp;nbsp;피하라 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;접두어는&amp;nbsp;버려라 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;자신의&amp;nbsp;기억력을&amp;nbsp;자랑하지&amp;nbsp;마라&amp;nbsp;(p.31) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;기발한&amp;nbsp;이름은&amp;nbsp;피하라 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;한&amp;nbsp;개념에&amp;nbsp;한&amp;nbsp;단어를&amp;nbsp;사용하라 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;해법&amp;nbsp;영역에서&amp;nbsp;가져온&amp;nbsp;이름을&amp;nbsp;사용하라(p.34) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;코드를&amp;nbsp;읽을&amp;nbsp;사람은&amp;nbsp;개발자&amp;nbsp;이므로&amp;nbsp;기술용어를&amp;nbsp;이름으로&amp;nbsp;하는데&amp;nbsp;거부감을&amp;nbsp;갖지&amp;nbsp;말라. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;문제&amp;nbsp;영역에서&amp;nbsp;가져온&amp;nbsp;이름을&amp;nbsp;사용하라(p.34) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;의미&amp;nbsp;있는&amp;nbsp;맥락을&amp;nbsp;추가하라,&amp;nbsp;불필요한&amp;nbsp;맥락을&amp;nbsp;없애라 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=========================&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모든 것에&amp;nbsp;이름은&amp;nbsp;중요하다.&amp;nbsp;따라서&amp;nbsp;이름을&amp;nbsp;잘&amp;nbsp;지어야&amp;nbsp;한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그렇다면&amp;nbsp;의도가&amp;nbsp;분명한&amp;nbsp;네이밍이란?&amp;nbsp;-&amp;gt;&amp;nbsp;모호하다.&amp;nbsp;어느 게&amp;nbsp;의도가&amp;nbsp;분명한 거지?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;것이다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;있다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기억할만하다고&amp;nbsp;생각한 것은&amp;nbsp;31~33페이지에&amp;nbsp;있는&amp;nbsp;내용이다.&lt;/span&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;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;nbsp;3장 :: 함수&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;함수를&amp;nbsp;잘&amp;nbsp;만드는&amp;nbsp;방법&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;가능한&amp;nbsp;작게&amp;nbsp;만들어라 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;블록과&amp;nbsp;들여쓰기:&amp;nbsp;중첩문안에서도&amp;nbsp;작은&amp;nbsp;함수를&amp;nbsp;호출하도록&amp;nbsp;하면&amp;nbsp;좋다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;한&amp;nbsp;가지만&amp;nbsp;해라&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;하나의&amp;nbsp;함수는&amp;nbsp;한&amp;nbsp;가지의&amp;nbsp;역할만&amp;nbsp;해야&amp;nbsp;하며,&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;위에서&amp;nbsp;아래로&amp;nbsp;자연스럽게&amp;nbsp;읽히는&amp;nbsp;함수를&amp;nbsp;만들어라 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;서술적인&amp;nbsp;이름을&amp;nbsp;사용하라 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;&quot;코드를&amp;nbsp;읽으면서&amp;nbsp;짐작했던&amp;nbsp;기능을&amp;nbsp;각&amp;nbsp;루틴이&amp;nbsp;그대로&amp;nbsp;수행한다면&amp;nbsp;깨끗한&amp;nbsp;코드라&amp;nbsp;불러도&amp;nbsp;된다&quot; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;함수&amp;nbsp;인수 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;인수는&amp;nbsp;가능한&amp;nbsp;적을수록&amp;nbsp;이상적이다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;명령과&amp;nbsp;조회를&amp;nbsp;분리하라 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;이&amp;nbsp;말&amp;nbsp;역시&amp;nbsp;하나의&amp;nbsp;기능만&amp;nbsp;하라는&amp;nbsp;말이다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;오류&amp;nbsp;코드보다&amp;nbsp;예외를&amp;nbsp;사용하라 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;if문을&amp;nbsp;통해&amp;nbsp;오류&amp;nbsp;코드를&amp;nbsp;체크하는 것보다&amp;nbsp;try-catch를&amp;nbsp;이용한&amp;nbsp;예외처리를 한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;반복하지&amp;nbsp;마라 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;중복은&amp;nbsp;소프트웨어에서&amp;nbsp;모든&amp;nbsp;악의&amp;nbsp;근원이다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;구조적&amp;nbsp;프로그래밍,&amp;nbsp;AOP,&amp;nbsp;COP&amp;nbsp;모두&amp;nbsp;어떤&amp;nbsp;면에서는&amp;nbsp;중복&amp;nbsp;제거&amp;nbsp;전략이다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&amp;nbsp;구조적&amp;nbsp;프로그래밍 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;데이크스트라&amp;nbsp;&quot;모든&amp;nbsp;함수와&amp;nbsp;함수&amp;nbsp;내&amp;nbsp;모든&amp;nbsp;블록에&amp;nbsp;입구와&amp;nbsp;출구가&amp;nbsp;하나만&amp;nbsp;존재해야&amp;nbsp;한다&quot; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;return는&amp;nbsp;하나여야&amp;nbsp;한다,&amp;nbsp;루프에서&amp;nbsp;break&amp;nbsp;/&amp;nbsp;continue를&amp;nbsp;사용해서는&amp;nbsp;안된다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;그럼에도&amp;nbsp;불구하고&amp;nbsp;함수가&amp;nbsp;작다면&amp;nbsp;위의&amp;nbsp;규칙은&amp;nbsp;큰&amp;nbsp;이익을&amp;nbsp;제공하지&amp;nbsp;못한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;있다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=========================&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일단&amp;nbsp;함수를&amp;nbsp;작성한&amp;nbsp;후&amp;nbsp;계속해서&amp;nbsp;다듬어&amp;nbsp;나감으로써&amp;nbsp;좋은&amp;nbsp;함수를&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있다.&lt;/span&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;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;nbsp;4장 :: 주석&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&quot;나쁜&amp;nbsp;코드에&amp;nbsp;주석을&amp;nbsp;달지&amp;nbsp;마라.&amp;nbsp;새로&amp;nbsp;짜라&quot;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&quot;주석은 기껏해야 필요 악이다.&quot;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;코드로&amp;nbsp;의도를&amp;nbsp;표현하지&amp;nbsp;못해&amp;nbsp;주석을&amp;nbsp;사용한다.&amp;nbsp;즉,&amp;nbsp;주석은&amp;nbsp;실패를&amp;nbsp;의미한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;주석은&amp;nbsp;나쁜&amp;nbsp;코드를&amp;nbsp;보완하지&amp;nbsp;못한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;주석을&amp;nbsp;쓸&amp;nbsp;시간을&amp;nbsp;나쁜&amp;nbsp;코드를&amp;nbsp;보완하는데&amp;nbsp;써라 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;======&amp;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;없어진다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&quot;좋은&amp;nbsp;주석&quot;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;법적인&amp;nbsp;주석 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;정보를&amp;nbsp;제공하는&amp;nbsp;주석 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;의도를&amp;nbsp;설명하는&amp;nbsp;주석 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;의미를&amp;nbsp;명료하게&amp;nbsp;밝히는&amp;nbsp;주석 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;결과를&amp;nbsp;경고하는&amp;nbsp;주석 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;TODO&amp;nbsp;주석 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;중요성을&amp;nbsp;강조하는&amp;nbsp;주석 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&quot;나쁜&amp;nbsp;주석&quot;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;주절거리는&amp;nbsp;주석 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;같은&amp;nbsp;이야기를&amp;nbsp;중복하는&amp;nbsp;주석 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;오해할&amp;nbsp;여지가&amp;nbsp;있는&amp;nbsp;주석 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;의무적으로&amp;nbsp;다는&amp;nbsp;주석 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;이력을&amp;nbsp;기록하는&amp;nbsp;주석 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;있으나&amp;nbsp;마나&amp;nbsp;한&amp;nbsp;주석 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;무서운&amp;nbsp;잡음 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;함수나&amp;nbsp;변수로&amp;nbsp;표현할&amp;nbsp;수&amp;nbsp;있다면&amp;nbsp;주석을&amp;nbsp;달지&amp;nbsp;마라 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;위치를&amp;nbsp;표시하는&amp;nbsp;주석 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;닫는&amp;nbsp;괄호에&amp;nbsp;다는&amp;nbsp;주석 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 공로를 돌리거나 저자를 표시하는 주석&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 주석으로 처리한 코드&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;HTML주석 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;전역&amp;nbsp;정보 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;너무&amp;nbsp;많은&amp;nbsp;정보 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;모호한&amp;nbsp;관계(추가적인&amp;nbsp;설명을&amp;nbsp;요구하는&amp;nbsp;주석) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;함수헤더 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;비공개&amp;nbsp;코드에서의&amp;nbsp;Javadocs &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=========================&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4장의&amp;nbsp;핵심&amp;nbsp;문구&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;나쁜&amp;nbsp;코드에&amp;nbsp;주석을&amp;nbsp;달지&amp;nbsp;마라.&amp;nbsp;새로&amp;nbsp;짜라&quot; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;주석은&amp;nbsp;기껏해야&amp;nbsp;필요악이다.&quot;&amp;nbsp;-&amp;nbsp;p.68 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;코드로&amp;nbsp;의도를&amp;nbsp;표현하지&amp;nbsp;못해&amp;nbsp;주석을&amp;nbsp;사용한다.&amp;nbsp;즉,&amp;nbsp;주석은&amp;nbsp;실패를&amp;nbsp;의미한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;주석은&amp;nbsp;나쁜&amp;nbsp;코드를&amp;nbsp;보완하지&amp;nbsp;못한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;주석을&amp;nbsp;쓸&amp;nbsp;시간을&amp;nbsp;나쁜&amp;nbsp;코드를&amp;nbsp;보완하는데&amp;nbsp;써라 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;평소&amp;nbsp;함수명&amp;nbsp;위에&amp;nbsp;주석으로&amp;nbsp;해당&amp;nbsp;함수에&amp;nbsp;대해&amp;nbsp;간략하게&amp;nbsp;주석을&amp;nbsp;달았었는데 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주석&amp;nbsp;없이&amp;nbsp;의미가&amp;nbsp;전달되는&amp;nbsp;함수명을&amp;nbsp;짓도록&amp;nbsp;노력해야겠다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고&amp;nbsp;나쁜&amp;nbsp;주석에서&amp;nbsp;기억이&amp;nbsp;남는 건&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 공로를 돌리거나 저자를 표시하는 주석&amp;nbsp; ---&amp;gt; 코드 관리 시스템을 믿어라 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 주석으로 처리한 코드 ---&amp;gt; 코드 관리 시스템을 믿어라 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;해야겠다.&lt;/span&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;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  5장 :: 형식&amp;nbsp;맞추기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로그래머라면&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;한다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&quot;형식을&amp;nbsp;맞추는&amp;nbsp;목적&quot;&lt;/b&gt; &lt;br /&gt;-&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;미친다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&quot;적절한&amp;nbsp;행&amp;nbsp;길이를&amp;nbsp;유지하라&quot;&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;신문&amp;nbsp;기사처럼&amp;nbsp;작성하라 &lt;br /&gt;-&amp;nbsp;개념은&amp;nbsp;빈&amp;nbsp;행으로&amp;nbsp;분리하라 &lt;br /&gt;-&amp;nbsp;세로&amp;nbsp;밀집도 &lt;br /&gt;-&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;선언한다. &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;배치한다. &lt;br /&gt;개념적&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;rarr;저차원) &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&quot;가로&amp;nbsp;형식&amp;nbsp;맞추기&quot;&lt;/b&gt; &lt;br /&gt;추천하는&amp;nbsp;행&amp;nbsp;길이는&amp;nbsp;120자 &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;p.109 &lt;br /&gt;-&amp;nbsp;들여 쓰기:&amp;nbsp;들여 쓰기가&amp;nbsp;없다면&amp;nbsp;인간이&amp;nbsp;코드를&amp;nbsp;읽기란&amp;nbsp;거의&amp;nbsp;불가능할 것이다.&amp;nbsp;구조파악&amp;uarr; &lt;br /&gt;-&amp;nbsp;가짜범위:&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&quot;팀&amp;nbsp;규칙&quot;&lt;/b&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;=========================&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;코드를&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;br /&gt;그런&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;의무이다. &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;미친다.&lt;/span&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;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  6장 :: 객체와&amp;nbsp;자료&amp;nbsp;구조&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;객체는&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;&quot;자료&amp;nbsp;추상화&quot;&lt;/b&gt; &lt;br /&gt;-&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;것이다. &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;&quot;자료/객체&amp;nbsp;비대칭&quot;&lt;/b&gt; &lt;br /&gt;-&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;쉽다. &lt;br /&gt;-&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;적합한&amp;nbsp;상황도&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&quot;디미터&amp;nbsp;법칙&quot;&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; &lt;br /&gt;&amp;nbsp; &amp;nbsp;ctxt.getXXX().getXXX().getXXX(); &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rarr; ctxt.options.scratchDir.absoltePath; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;[잡종&amp;nbsp;구조]&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp;절반은 객체, 절반은 자료 구조인 잡종. &lt;br /&gt;&amp;nbsp; &amp;nbsp;새로운 함수는 물론이고 새로운 자료 구조도 추가하기 어렵다.(양쪽의 단점만 모아놓은 구조이다) &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;[구조체&amp;nbsp;감추기] &lt;br /&gt;&amp;nbsp; &amp;nbsp;ctxt.getAbsolutePathOfScratchDirectoryOption(); &lt;br /&gt;&amp;nbsp; &amp;nbsp;ctxt.getScratchDirectoryOption().getAbsolutePath(); &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;rarr; ctxt.creatScratchFileStream(classFileName); &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&quot;자료&amp;nbsp;전달&amp;nbsp;객체&quot;&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;클래스이다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;rarr;&amp;nbsp;이런&amp;nbsp;자료&amp;nbsp;구조체를&amp;nbsp;때로는&amp;nbsp;자료&amp;nbsp;전달&amp;nbsp;객체(Data&amp;nbsp;Transfer&amp;nbsp;Object,&amp;nbsp;DTO)라고&amp;nbsp;한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;rarr;&amp;nbsp;DTO는&amp;nbsp;데이터베이스와&amp;nbsp;통신하거나&amp;nbsp;소켓에서&amp;nbsp;받은&amp;nbsp;메시지의&amp;nbsp;구문분석 시&amp;nbsp;유용하다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;rarr;&amp;nbsp;또한,&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;구조체이다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;rarr;&amp;nbsp;일반적인&amp;nbsp;형태는&amp;nbsp;빈(Bean)&amp;nbsp;구조다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;rarr;&amp;nbsp;빈은&amp;nbsp;비공개&amp;nbsp;변수를&amp;nbsp;조회/설정&amp;nbsp;함수로&amp;nbsp;조작하며,&amp;nbsp;일종의&amp;nbsp;사이비&amp;nbsp;캡슐화이다. &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;[활성&amp;nbsp;레코드] &lt;br /&gt;활성&amp;nbsp;레코드는&amp;nbsp;DTO의&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;결과이다. &lt;br /&gt;활성&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;=========================&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;객체는&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;어렵다. &lt;br /&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;새&amp;nbsp;자료&amp;nbsp;구조를&amp;nbsp;추가하기는&amp;nbsp;어렵다. &lt;br /&gt;&lt;br /&gt;시스템을&amp;nbsp;구현할&amp;nbsp;때&amp;nbsp; &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;구조와&amp;nbsp;절차적인&amp;nbsp;코드가&amp;nbsp;적합하다.&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;&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;</description>
      <category>Book Review</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/250</guid>
      <comments>https://cocobi.tistory.com/250#entry250comment</comments>
      <pubDate>Wed, 25 Jan 2023 16:40:21 +0900</pubDate>
    </item>
    <item>
      <title>[Vite] 번들링 없는 프론트 빌드 Vite란 무엇일까?</title>
      <link>https://cocobi.tistory.com/249</link>
      <description>&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;1244&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rLx2T/btrWZVOPIZZ/FYnF2mawOIPsVg7Yorlj00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rLx2T/btrWZVOPIZZ/FYnF2mawOIPsVg7Yorlj00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rLx2T/btrWZVOPIZZ/FYnF2mawOIPsVg7Yorlj00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrLx2T%2FbtrWZVOPIZZ%2FFYnF2mawOIPsVg7Yorlj00%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;402&quot; height=&quot;241&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  Vite 란 무엇일까?&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이미 프론트엔드 개발 생태계는 웹팩을 중심으로 한 개발 환경과 배포 시스템이 견고하게 구축되어 있지만,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹팩을 사용할 때보다 훨씬 더 빠르게 개발하고 배포할 수 있기 때문에 비트(Vite)라는 도구가 새롭게 나오게 되었다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&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: #000000;&quot;&gt;비트(Vite)는 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;Vue의 창시자 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;Evan You에 의해 개발되었고,&lt;/span&gt; 프론트앤드의 주요 프레임워크 커뮤니티에서 주목받고 있는 도구이자 &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules&quot;&gt;자바스크립트 네이티브 모듈(ESM)&lt;/a&gt;&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #000000;&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;&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ &lt;b&gt;자바스크립트 네이티브 모듈 (&lt;/b&gt;ESM)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESM은 모듈화 문법인&lt;span&gt;&amp;nbsp;&lt;/span&gt;import,&lt;span&gt;&amp;nbsp;&lt;/span&gt;export를 브라우저에서 자체적으로 실행할 수 있는 모듈 방식을 의미한다.&lt;/p&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_1674625753657&quot; class=&quot;lasso&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// app.js
import { sum } from './math.js';
console.log(sum(10, 20));&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1674625649585&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;./app.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2882&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tWK6U/btrW9k77kjx/FwC6UiQLgAuX8loMX5qTn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tWK6U/btrW9k77kjx/FwC6UiQLgAuX8loMX5qTn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tWK6U/btrW9k77kjx/FwC6UiQLgAuX8loMX5qTn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtWK6U%2FbtrW9k77kjx%2FFwC6UiQLgAuX8loMX5qTn0%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;794&quot; height=&quot;24&quot; data-origin-width=&quot;2882&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&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;하지만, script&lt;span&gt;&amp;nbsp;&lt;/span&gt;태그에 type=&quot;module&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성을 추가하면 정상적으로 동작하는데, 이와 같이 브라우저에서 import와 export를 실행할 수 있는 능력을 ESM라고 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674625658185&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;module&quot; src=&quot;./app.js&quot;&amp;gt;&amp;lt;/script&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;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;&lt;span style=&quot;color: #000000;&quot;&gt;2️⃣ Esbuild&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대부분의 리액트 개발자들은 공식 리액트 보일러 플레이트이며&amp;nbsp;&lt;b&gt;&lt;a href=&quot;https://webpack.kr/concepts/hot-module-replacement/&quot;&gt;HMR&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(Hot Module Replacement)&lt;/span&gt;&lt;/b&gt;과 같은 유용한 기능을 제공하기 때문에 주로&amp;nbsp;Create React App(CRA)을 이용하여 리액트 프로젝트를 생성할 것이다.&amp;nbsp;&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;CRA는&lt;span&gt; 웹팩(&lt;/span&gt;Webpack)을 사용하며 웹팩은 자바스크립트 코드로 구성된 번들러이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹팩의 경우 자바스크립트의 언어적 특성(&lt;span&gt;interpreted&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;그래서 개발자들은 Go와 같은 로우레벨 언어(low-level language)를 활용하여 자바스크립트의 새로운 툴을 만들려는 시도를 하였고, 그렇게 해서 생겨난 게&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Esbuild&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbVeDD/btrW2tE9Snl/anTUgks2ETwPgDI7JhkCA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbVeDD/btrW2tE9Snl/anTUgks2ETwPgDI7JhkCA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbVeDD/btrW2tE9Snl/anTUgks2ETwPgDI7JhkCA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbVeDD%2FbtrW2tE9Snl%2FanTUgks2ETwPgDI7JhkCA0%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;599&quot; height=&quot;310&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ Vite&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 살펴본 것처럼 Vite는&lt;span&gt;&amp;nbsp;&lt;/span&gt;Esbuild를 기반으로 만들어진 프론트엔드 빌드툴이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vite는 &lt;span style=&quot;background-color: #ffffff; color: #2c3e50;&quot;&gt;ESM 방식을 사용(=브라우저가 필요로 하는 애플리케이션 코드의 일부분만 변환하고 제공)하기 때문에&lt;/span&gt; 자바스크립트 코드를 모두 번들할 필요 없이 브라우저에서 자바스크립트 애플리케이션을 작동시킬 수 있다.&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #2c3e50;&quot;&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;b&gt;◾ Vite의 특징&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ◽ 의존성 모듈은&lt;span&gt;&amp;nbsp;&lt;/span&gt;node_modules&lt;span&gt;&amp;nbsp;&lt;/span&gt;폴더로부터 import 되는 자바스크립트 모듈이며 esbuild를 사용하여 처리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; ◽&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Webpack이 브라우저의 요청 이전에 모든 자바스크립트 모듈을 처리하는 반면,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Vite는 브라우저 요청 전에 의존성 모듈만 미리 번들링 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; ◽&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Vite는 &lt;span&gt;native&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;ESM을 기반으로 HMR을 구현한다. 따라서 모듈이 수정될 때 Vite는 수정된 모듈과 관련된 부분만을&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;교체하고, 브라우저에서 해당 모듈을 요청하면 교체된 모듈을 전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; ◽&lt;span&gt;&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;&lt;span&gt;&amp;nbsp; ◽&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Vite는 브라우저의 요청이 있을 시에만 소스코드를 변환하고 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyLNQf/btrXaqNQBgT/LDEaj0HoSPT5yQk2IeKOKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyLNQf/btrXaqNQBgT/LDEaj0HoSPT5yQk2IeKOKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyLNQf/btrXaqNQBgT/LDEaj0HoSPT5yQk2IeKOKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyLNQf%2FbtrXaqNQBgT%2FLDEaj0HoSPT5yQk2IeKOKk%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;604&quot; height=&quot;354&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bud4Ag/btrW1O3xIEq/OynLs7w0IprPmUkEJqnmlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bud4Ag/btrW1O3xIEq/OynLs7w0IprPmUkEJqnmlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bud4Ag/btrW1O3xIEq/OynLs7w0IprPmUkEJqnmlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbud4Ag%2FbtrW1O3xIEq%2FOynLs7w0IprPmUkEJqnmlk%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;606&quot; height=&quot;356&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;359&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  참고사이트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://joshua1988.github.io/vue-camp/vite/intro.html#vite%E1%84%85%E1%85%A1%E1%86%AB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cracking Vue :: Vite&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://vitejs.dev/guide/why.html#why-vite&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;vitejs :: Why Vite&lt;/a&gt;&lt;/p&gt;
&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;&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;</description>
      <category>Frontend/JavaScript</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/249</guid>
      <comments>https://cocobi.tistory.com/249#entry249comment</comments>
      <pubDate>Tue, 24 Jan 2023 22:33:48 +0900</pubDate>
    </item>
    <item>
      <title>[Node] Koyeb으로 서버 무료로 배포하기 (헤로쿠 대체 플랫폼!!)</title>
      <link>https://cocobi.tistory.com/248</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s8Hmr/btrWWsskfpV/7rhnU60bistkevtbnSJkNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s8Hmr/btrWWsskfpV/7rhnU60bistkevtbnSJkNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s8Hmr/btrWWsskfpV/7rhnU60bistkevtbnSJkNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs8Hmr%2FbtrWWsskfpV%2F7rhnU60bistkevtbnSJkNK%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;453&quot; height=&quot;130&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;367&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;❔&lt;b&gt; Koyeb 이란&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2022년 11월 28일부로 헤로쿠(Heroku)의 서비스가 &lt;a href=&quot;https://help.heroku.com/RSBRUH58/removal-of-heroku-free-product-plans-faq&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;유료로 전환&lt;/a&gt;되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;따라서 헤로쿠의 프리티어를 대체할 플랫폼을 찾던 중 Koyeb을 발견하여 사용법을 정리할 겸 포스팅하게 되었다.&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;&quot;&gt;Koyeb은 배포를 위해 두 가지 방법을 제공한다. 첫 번째 방법은 도커 이미지를 통해 배포하는 것이고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;두 번째 방법은 깃허브와 연동하여 repository를 선택하여 배포하는 방법이다. 또한, 깃허브를 통해 배포할 경우에는 브랜치에 커밋할 때 자동으로 deploy가 되는 편리함을 제공한다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt; &amp;zwj; &lt;/span&gt;&lt;/span&gt;&lt;b&gt; 계정 및 앱 생성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://app.koyeb.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Koyeb&lt;/a&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: #000000;&quot;&gt;◾ 계정 생성은 github 아이디로 할 수 있으므로, github 아이디와 연동한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾ 계정 생성이 완료되면 아래와 같은 화면으로 이동된다. Create App 버튼을 클릭하여 앱 생성을 진행한다.&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;1235&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cReGvH/btrWXipEmaF/dXuIJIOwXb0itMkl2Peyq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cReGvH/btrWXipEmaF/dXuIJIOwXb0itMkl2Peyq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cReGvH/btrWXipEmaF/dXuIJIOwXb0itMkl2Peyq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcReGvH%2FbtrWXipEmaF%2FdXuIJIOwXb0itMkl2Peyq1%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;804&quot; height=&quot;401&quot; data-origin-width=&quot;1235&quot; data-origin-height=&quot;616&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;color: #000000;&quot;&gt;&lt;b&gt;◾ Step 1 :: &lt;span style=&quot;background-color: #ffffff;&quot;&gt;Select deployment method&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;첫 번째 단계로 깃허브 저장소를 이용하거나 도커 이미지를 이용해 배포할 수 있다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;이 포스팅에서는 깃허브 저장소를 통해 배포하는 방법을 소개하므로 GitHub 버튼을 선택 한다.&lt;/span&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;1211&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8Wff9/btrWS2OHdrz/01fk7FYXRF53hGojtELWo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8Wff9/btrWS2OHdrz/01fk7FYXRF53hGojtELWo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8Wff9/btrWS2OHdrz/01fk7FYXRF53hGojtELWo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8Wff9%2FbtrWS2OHdrz%2F01fk7FYXRF53hGojtELWo0%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;809&quot; height=&quot;254&quot; data-origin-width=&quot;1211&quot; data-origin-height=&quot;380&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ Step 2 :: &lt;span style=&quot;background-color: #ffffff;&quot;&gt;Import project&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;GitHub 버튼을 누르면 아래 화면으로 이동되고, 배포할 저장소를 검색하여 선택한 후 Continue 버튼을 클릭한다.&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;1065&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m9TK4/btrWTJO2zSY/cTLuehmMSBVl54wG13f9KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m9TK4/btrWTJO2zSY/cTLuehmMSBVl54wG13f9KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m9TK4/btrWTJO2zSY/cTLuehmMSBVl54wG13f9KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm9TK4%2FbtrWTJO2zSY%2FcTLuehmMSBVl54wG13f9KK%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;792&quot; height=&quot;330&quot; data-origin-width=&quot;1065&quot; data-origin-height=&quot;444&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ Step 3 :: &lt;span style=&quot;background-color: #ffffff;&quot;&gt;Configure service and deploy  &lt;/span&gt;&lt;/b&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;1085&quot; data-origin-height=&quot;847&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Etfn4/btrWXjB4Tzf/wXDF0Nbk3XkBK83IZWt1A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Etfn4/btrWXjB4Tzf/wXDF0Nbk3XkBK83IZWt1A1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Etfn4/btrWXjB4Tzf/wXDF0Nbk3XkBK83IZWt1A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEtfn4%2FbtrWXjB4Tzf%2FwXDF0Nbk3XkBK83IZWt1A1%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;824&quot; height=&quot;643&quot; data-origin-width=&quot;1085&quot; data-origin-height=&quot;847&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;color: #000000;&quot;&gt;① 배포할 저장소의 브랜치를 선택한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;선택한 브렌치에 커밋하거나 병합할 경우 자동으로 배포가 실행된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;② Koyeb 인스턴스를 선택할 수 있으며, 무료로 사용하기 위해서 Nano 또는 Micro를 선택한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(Nano의 경우 2개의 인스턴스를 사용할 수 있으므로 Nano를 선택하자)&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;&quot;&gt;③ 도메인 이름을 지정할 수 있다. 원하는 이름을 입력 후 Deploy 버튼을 클릭하면 인스턴스가 생성된다.&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;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ DashBoard&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대시보드에서 생성된 인스턴스의 추가 옵션을 지정하기 위해 Setting 버튼을 눌러 Service settings 메뉴로 이동한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1031&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Riqnr/btrWR64RaVN/Dlsn3LdKknSkgd8UKnUsYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Riqnr/btrWR64RaVN/Dlsn3LdKknSkgd8UKnUsYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Riqnr/btrWR64RaVN/Dlsn3LdKknSkgd8UKnUsYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRiqnr%2FbtrWR64RaVN%2FDlsn3LdKknSkgd8UKnUsYK%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;777&quot; height=&quot;262&quot; data-origin-width=&quot;1031&quot; data-origin-height=&quot;348&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ Service settings&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Service settings에서는 빌드 명령어나 실행 명령어를 입력할 수 있고 포트를 변경할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&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;span style=&quot;color: #000000;&quot;&gt;모든 설정을 마친 후 Apply 버튼을 클릭하면 배포가 진행된다.&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;1233&quot; data-origin-height=&quot;1903&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HVRVM/btrWXjhNnhq/3jzqxiL9yS0kbtCRy1yK7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HVRVM/btrWXjhNnhq/3jzqxiL9yS0kbtCRy1yK7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HVRVM/btrWXjhNnhq/3jzqxiL9yS0kbtCRy1yK7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHVRVM%2FbtrWXjhNnhq%2F3jzqxiL9yS0kbtCRy1yK7k%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;800&quot; height=&quot;1235&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;1903&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;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾ 배포 확인&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Deploy를 실행하면 아래 화면으로 이동하고, Build logs의 마지막에 &lt;span style=&quot;background-color: #ffffff; color: #121212;&quot;&gt;&lt;u&gt;Build succeeded ✅&lt;/u&gt; 메시지가 뜬 것이 확인되면 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #121212;&quot;&gt;배포가 성공한 것이다. 따라서 인스턴스 생성 시 입력한 Url에 접속하여 정상적인 화면이 보이나 확인하면 된다.&lt;/span&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;1050&quot; data-origin-height=&quot;877&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfecnb/btrWRCJRH1L/5unvHhwxbQVd03v6UboKPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfecnb/btrWRCJRH1L/5unvHhwxbQVd03v6UboKPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfecnb/btrWRCJRH1L/5unvHhwxbQVd03v6UboKPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdfecnb%2FbtrWRCJRH1L%2F5unvHhwxbQVd03v6UboKPk%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;776&quot; height=&quot;648&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;877&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;721&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bll6hj/btrW39ecXxz/eO5mTWoAvDFA7gIFk4pxv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bll6hj/btrW39ecXxz/eO5mTWoAvDFA7gIFk4pxv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bll6hj/btrW39ecXxz/eO5mTWoAvDFA7gIFk4pxv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbll6hj%2FbtrW39ecXxz%2FeO5mTWoAvDFA7gIFk4pxv1%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;415&quot; height=&quot;616&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;721&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;&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;</description>
      <category>Backend/Node.js</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/248</guid>
      <comments>https://cocobi.tistory.com/248#entry248comment</comments>
      <pubDate>Mon, 23 Jan 2023 23:51:38 +0900</pubDate>
    </item>
    <item>
      <title>[Svelte] 스벨트의 특수한 컴포넌트 (Dynamic, Recursive)</title>
      <link>https://cocobi.tistory.com/247</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lJU0m/btrWTJ1WHGm/qYZdd96SXePDSAGXl9WTn1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lJU0m/btrWTJ1WHGm/qYZdd96SXePDSAGXl9WTn1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lJU0m/btrWTJ1WHGm/qYZdd96SXePDSAGXl9WTn1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlJU0m%2FbtrWTJ1WHGm%2FqYZdd96SXePDSAGXl9WTn1%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;407&quot; height=&quot;109&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  스벨트의 특수한 컴포넌트 정리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스벨트에서 제공하는 특수한 컴포넌트에는 동적(Dynamic) 컴포넌트와 재귀(Recursive) 컴포넌트 그리고 윈도우 객체를 다룰 수 있는 윈도우 컴포넌트, 교차(Cross) 컴포넌트가 있다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ 동적(Dynamic)&amp;nbsp;컴포넌트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;분기를 통해 다른 컴포넌트를 보여주어야 할 때 스밸트의 동적 컴포넌트를 이용하여 코드를 쉽게 작성할 수 있다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffff8e; color: #000000;&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;background-color: #ffff8e; color: #000000;&quot;&gt;&amp;nbsp;&lt;b&gt;&amp;lt;scelte:component&amp;nbsp;this={컴포넌트명}&amp;gt;&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffff8e; color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674367744750&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- App.svelte --&amp;gt;
&amp;lt;script&amp;gt;
  import Product from &quot;./Product.svelte&quot;;
  import CartItem from &quot;./CartItem.svelte&quot;;

  let renderedComponent = { cmp: Product, title: &quot;Test Product&quot;, id: &quot;p1&quot; };

  function toggle() {
    if (renderedComponent.cmp === Product) {
      renderedComponent = { cmp: CartItem, title: &quot;Another Product&quot;, id: &quot;p2&quot; };
    } else {
      renderedComponent = { cmp: Product, title: &quot;Test Product&quot;, id: &quot;p1&quot; };
    }
  }
&amp;lt;/script&amp;gt;

&amp;lt;button on:click={toggle}&amp;gt;Toggle Display&amp;lt;/button&amp;gt;

&amp;lt;svelte:component 
    this={renderedComponent.cmp} 
    title={renderedComponent.title} 
    id={renderedComponent.id} /&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ 재귀(Recursive)&amp;nbsp;컴포넌트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;재귀 컴포넌트는 each문에서 트리 구조의 렌더링시 사용한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffff8e;&quot;&gt;&lt;/span&gt;&lt;/b&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: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffff8e;&quot;&gt;&amp;lt;svelte:self&amp;nbsp;/&amp;gt;&lt;/span&gt;&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674367835221&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- App.svelte --&amp;gt;
&amp;lt;script&amp;gt;
  import FamilyNode from &quot;./FamilyNode.svelte&quot;;

  let familyStructure = [
    {
      isParent: true,
      name: &quot;Chris&quot;,
      children: [
        {
          isParent: true,
          name: &quot;Moe&quot;,
          children: [{ isParent: false, name: &quot;Julie&quot; }]
        }
      ]
    },
    { isParent: false, name: &quot;Anna&quot; }
  ];

&amp;lt;/script&amp;gt;

{#each familyStructure as familyMember}
  &amp;lt;FamilyNode member={familyMember} /&amp;gt;
{/each}&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;아래 코드에서 트리 구조를 표현하기 위해 each에서 재귀 컴포넌트(svelte:self)를 사용하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1674367840264&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- FamilyNode.svelte --&amp;gt;
&amp;lt;script&amp;gt;
  export let member;
&amp;lt;/script&amp;gt;

&amp;lt;style&amp;gt;
  div {
    margin-left: 2rem;
  }
&amp;lt;/style&amp;gt;

&amp;lt;div&amp;gt;
  &amp;lt;h1&amp;gt;{member.name}&amp;lt;/h1&amp;gt;
  {#if member.isParent}
    {#each member.children as child}
      &amp;lt;svelte:self member={child} /&amp;gt;
    {/each}
  {/if}
&amp;lt;/div&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ 윈도우 컴포넌트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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: #000000;&quot;&gt;윈도우 컴포넌트는 사용하지 않고 스크립트단에서 window 객체를 사용해도 되지만, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;페이지의 환경과 상호작용하는 svelte의 특성상 상태 변화를 관리하기에 유리하며 이벤트를 바인딩하여 사용하기에도 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;편리하기 때문에 사용해 볼 법하다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674368123823&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;svelte:window on:{event} /&amp;gt;
&amp;lt;svelte:head on:{event} /&amp;gt;
&amp;lt;svelte:body on:{event} /&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4️⃣ 교차&amp;nbsp;컴포넌트(cross-component)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;교차 컴포넌트는 컴포넌트에 있는 스크립트를 단 한 번만 실행되도록 한 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674368204544&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script context=&quot;module&quot;&amp;gt;
	// 이 태그에 있는 코드는 인스턴스가 아닌 파일단위
	// 즉, 컴포넌트 단위로 한 번 실행된다. 
&amp;lt;/script&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;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;</description>
      <category>Frontend/Svelte</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/247</guid>
      <comments>https://cocobi.tistory.com/247#entry247comment</comments>
      <pubDate>Sun, 22 Jan 2023 15:21:14 +0900</pubDate>
    </item>
    <item>
      <title>[Svelte] 스벨트 모션 사용하기(tweened, spring)</title>
      <link>https://cocobi.tistory.com/246</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mM22R/btrWRyzvyb5/Z69KUl1suE72L0Lew9KSRk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mM22R/btrWRyzvyb5/Z69KUl1suE72L0Lew9KSRk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mM22R/btrWRyzvyb5/Z69KUl1suE72L0Lew9KSRk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmM22R%2FbtrWRyzvyb5%2FZ69KUl1suE72L0Lew9KSRk%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;407&quot; height=&quot;109&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;nbsp;스벨트 모션 사용 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스벨트에서 사용할 수 있는 모션의 종류에는 tweened와 spring이 있다.&lt;/p&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ tweened&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;tweened는 값이 변경될 때 적용될 애니메이션의 저장소이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한, tweened는 숫자, 날짜, 숫자와 날짜를 값으로 가지는 객체와 배열에 애니메이션을 추가할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674264215725&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- 이 예제에서는 따로 스토어를 만들지 않고 컨테이너에 저장소를 직접 만든다. --&amp;gt;
&amp;lt;script&amp;gt;
    import { writable } from 'svelte/store';
    import { tweened } from 'svelte/motion';
    import { cubicIn } from 'svelte/easing';

    const progress = tweened(0, {
        delay: 1, // 애니메이션이 시작할 때까지 걸리는 시간
        duration: 1500,// 애니메이션의 길이, 기본값은 400밀리초
        easing: cubicIn // 스밸트 내장 함수
    }); 
    setTimeout(() =&amp;gt; {
        progress.set(1);
    }, 1500);
&amp;lt;/script&amp;gt;

&amp;lt;progress value={$progress} /&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ 결과&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0qeJY/btrWTKFLIvi/pHZrQWicMQwuGRkplbOHn0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0qeJY/btrWTKFLIvi/pHZrQWicMQwuGRkplbOHn0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0qeJY/btrWTKFLIvi/pHZrQWicMQwuGRkplbOHn0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/b0qeJY/btrWTKFLIvi/pHZrQWicMQwuGRkplbOHn0/img.gif&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;224&quot; height=&quot;28&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;28&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ Spring&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://svelte.dev/tutorial/spring&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;예시 참고 : Svelte Tutorial :: Spring&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674265591149&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
  import { writable } from 'svelte/store';

  let coords = writable({ x: 50, y: 50 });
  let size = writable(10);
&amp;lt;/script&amp;gt;

&amp;lt;div style=&quot;position: absolute; right: 1em;&quot;&amp;gt;
  &amp;lt;label&amp;gt;
    &amp;lt;h3&amp;gt;stiffness ({coords.stiffness})&amp;lt;/h3&amp;gt;
    &amp;lt;input bind:value={coords.stiffness} type=&quot;range&quot; min=&quot;0&quot; max=&quot;1&quot; step=&quot;0.01&quot;&amp;gt;
  &amp;lt;/label&amp;gt;

  &amp;lt;label&amp;gt;
    &amp;lt;h3&amp;gt;damping ({coords.damping})&amp;lt;/h3&amp;gt;
    &amp;lt;input bind:value={coords.damping} type=&quot;range&quot; min=&quot;0&quot; max=&quot;1&quot; step=&quot;0.01&quot;&amp;gt;
  &amp;lt;/label&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;svg
  on:mousemove=&quot;{e =&amp;gt; coords.set({ x: e.clientX, y: e.clientY })}&quot;
  on:mousedown=&quot;{() =&amp;gt; size.set(30)}&quot;
  on:mouseup=&quot;{() =&amp;gt; size.set(10)}&quot;
&amp;gt;
  &amp;lt;circle cx={$coords.x} cy={$coords.y} r={$size}/&amp;gt;
&amp;lt;/svg&amp;gt;

&amp;lt;style&amp;gt;
  svg {
    width: 100%;
    height: 100%;
    margin: -8px;
  }
  circle {
    fill: #ff3e00;
  }
&amp;lt;/style&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ 정리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;애니메이션 저장소는 컴포넌트 전용 저장소가 합리적이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;왜냐하면 컴포넌트 내부에 애니메이션을 적용할 값이 있을 경우 tweened나 spring 저장소에 해당 값을 저장하면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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: #000000;&quot;&gt;따라서 별도의 파일을 만들 필요 없이 컴포넌트에 애니메이션을 넣고 싶다면 하나의 컴포넌트 안에서 애니메이션을 설정하는 것이 더 낫다. 하지만, 컴포넌트 간에 공유하는 데이터에 애니메이션을 적용하려면 tweened와 spring을 별도의 파일에 저장하는 것이 더 낫다.&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;&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  참고사이트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://svelte.dev/docs#tweened&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Svelte Docs :: tweened&lt;/a&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;&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;</description>
      <category>Frontend/Svelte</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/246</guid>
      <comments>https://cocobi.tistory.com/246#entry246comment</comments>
      <pubDate>Sat, 21 Jan 2023 11:13:28 +0900</pubDate>
    </item>
    <item>
      <title>[Svelte] 스벨트의 읽기 가능 스토어란? (Readable Stores)</title>
      <link>https://cocobi.tistory.com/245</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btYxCD/btrWO032WjV/R6dWa72O42nQI2P6StOdgk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btYxCD/btrWO032WjV/R6dWa72O42nQI2P6StOdgk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btYxCD/btrWO032WjV/R6dWa72O42nQI2P6StOdgk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtYxCD%2FbtrWO032WjV%2FR6dWa72O42nQI2P6StOdgk%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;407&quot; height=&quot;109&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  &lt;span style=&quot;color: #000000;&quot;&gt;스벨트의 읽기 가능한 스토어 (Readable Stores)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;읽기 가능한 스토어는 &lt;a href=&quot;https://cocobi.tistory.com/244&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;쓰기 가능한 스토어&lt;/a&gt;와 달리 외부에서 값을 변경할 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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;&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ Store 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;쓰기 가능한 스토어가 &lt;span style=&quot;background-color: #f8f8f8;&quot;&gt;writable을 통해 생성된 것과 비슷하게 읽기 가능한 스토어는 readable을 통해 생성한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674192194523&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* timer_store.js */
import { readable } from 'svelte/store'

export const timer = readable(0);&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ readable 메서드 및 스토어의 값 변경&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;readable은 writable 스토어와 달리 두 번째 인수를 가지며 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;두 번째 인수는 함수이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한 이 함수는 한 개의 인수를 갖는데, 이 역시 함수이고, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 함수는 스토어를 set 할 수 있다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주로 읽기 가능한 스토어는, 타이머가 증가하거나 인터벌이 있는 경우, 또는 위치 정보를 가져올 경우에 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674192307731&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* timer_store.js */
import { readable } from 'svelte/store'

let count = 0;

export const timer = readable(0, (set) =&amp;gt; {
    const interval = setInterval(() =&amp;gt; {
        count++;
        set();
    }, 1000);

    /* 저장소가 필요 없을 때 Svelte가 자동으로 호출하는 함수로 인터벌을 제거하여 메모리 누수를 방지한다. */
    return () =&amp;gt; {
        clearInterval(interval);
    }
});&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: #000000;&quot;&gt;HTML 태그에 달러 표시를 붙인 스벨트 문법을 사용하여 실시간으로 변수 값의 변화를 보여주거나,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;값의 변경이 필요할 경우 스크립트단에서 추가적인 로직을 구현할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674192412783&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- App.svelte --&amp;gt;
&amp;lt;script&amp;gt;
    import { timer } from ',/timer-store.js';
/*    timer.subscribe(count =&amp;gt; {
        console.log('App: ' + count); 
    });
*/
&amp;lt;/script&amp;gt;

&amp;lt;p&amp;gt;Count: {$timer}&amp;lt;/p&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;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;</description>
      <category>Frontend/Svelte</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/245</guid>
      <comments>https://cocobi.tistory.com/245#entry245comment</comments>
      <pubDate>Fri, 20 Jan 2023 14:32:52 +0900</pubDate>
    </item>
    <item>
      <title>[Svelte] 스벨트의 쓰기 가능 스토어란? (Writable Stores)</title>
      <link>https://cocobi.tistory.com/244</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7uAkY/btrWI2nZPTc/WhchfTz1vn6EkccID9fDoK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7uAkY/btrWI2nZPTc/WhchfTz1vn6EkccID9fDoK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7uAkY/btrWI2nZPTc/WhchfTz1vn6EkccID9fDoK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7uAkY%2FbtrWI2nZPTc%2FWhchfTz1vn6EkccID9fDoK%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;407&quot; height=&quot;109&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  스벨트의 쓰기 가능한 스토어 (Writable Stores)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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: #000000;&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: #000000;&quot;&gt;&lt;b&gt;◾&amp;nbsp;쓰기&amp;nbsp;가능한&amp;nbsp;저장소(writable)&lt;/b&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp;▫ 쓰기 가능한 저장소를 생성하려면 특정 함수를 호출해야 한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp;▫&amp;nbsp;저장소는 javascript에서 사용하므로 어느 컴포넌트에서나 불러올 수 있다. &lt;br /&gt;&amp;nbsp; &amp;nbsp;▫ 저장소를 불러온 컴포넌트에서는 두 가지 작업을 할 수 있다. &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ⅰ) subscribe&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 저장소의 데이터가 바뀔 때마다 이를 전달받은 컴포넌트가 변화에 반응하는 것(ex.데이터 출력)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ⅱ) set, update&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 데이터를 저장소에 설정(set)하거나 업데이트(update)할 수 있다.&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;1556&quot; data-origin-height=&quot;833&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKDh5y/btrWIYMPLLb/oddEttkZpjwrJceJL5Uyr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKDh5y/btrWIYMPLLb/oddEttkZpjwrJceJL5Uyr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKDh5y/btrWIYMPLLb/oddEttkZpjwrJceJL5Uyr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKDh5y%2FbtrWIYMPLLb%2FoddEttkZpjwrJceJL5Uyr1%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;720&quot; height=&quot;385&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;833&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ store&amp;nbsp;생성&amp;nbsp;및&amp;nbsp;subscribe&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;먼저 아래 코드와 같이 svelte 파일이 아닌 js 파일에 데이터를 만들고&amp;nbsp; writable하여 스토어를 등록한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 해당 데이터를 스벨트에서 사용하기 위해 export 시킨다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674131763697&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* cart_store.js */
import { writable } from 'svelte/store'

const cart = writable([
    {
        id: 'p1',
        title: 'Test',
        price: 9.99
    }, {
        id: 'p2',
        title: 'Test',
        price: 9.99
    }
])

export default cart;&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: #000000;&quot;&gt;위 스토어 데이터를 사용하기 위해 import한 스토어 컴포넌트를 subscribe 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674131781102&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- cart.svelte --&amp;gt;
&amp;lt;script&amp;gt;
    import cartItems from './cart-store.js'; // cartItems 자리에는 원하는 이름을 쓰면 된다.

    let items;

    cartItems.subscribe(its =&amp;gt; {
        items = its
    });
    // items : [{id:&quot;p1&quot;, title:&quot;Test&quot;, ...},{id:&quot;p2&quot;, title:&quot;Test&quot;, ...}]
&amp;lt;/script&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ store&amp;nbsp;업데이트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스토어에 있는 데이터를 갱신하기 위해 import한 스토어 컴포넌트에 update 메서드를 사용하고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로직을 구현한 후 리턴값을 전달하여 스토어 갱신을 완료한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674131836474&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- cart.svelte --&amp;gt;
&amp;lt;script&amp;gt;
    import cartItems from './cart-store.js'; // cartItems 자리에는 원하는 이름을 쓰면 된다.

    function addToCart() {
        // cartItems.set([]); // 해당 store에 적용한 subscribe 기능이 실행된다.
        cartItems.update(items =&amp;gt; {
            return [
                ...items,
                {
                    id: 'p3',
                    title: 'Test',
                    price: 9.99
                }
            ]
        }); // 현재 store의 데이터를 업데이트 한다.
        /* cartItems : [
            {id:&quot;p1&quot;, title:&quot;Test&quot;, ...}
            ,{id:&quot;p2&quot;, title:&quot;Test&quot;, ...}
            ,{id:&quot;p3&quot;, title:&quot;Test&quot;, ...}
           ]
        */
    }
&amp;lt;/script&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ store&amp;nbsp;subscribe&amp;nbsp;관리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;subscribe는 언마운트 되기 전까지 메모리에 계속 남아있는 상태이다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;따라서 메모리 누수를 방지하기 위해 상수에 subscribe를 담아 임의로 제거해 줄 필요가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674131991545&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* cart.svelte */
&amp;lt;script&amp;gt;
    import { onDestroy } form 'svelte';
    import cartItems from './cart-store.js'; // cartItems 자리에는 원하는 이름을 쓰면 된다.

    let items;

    const unsubscribe =  cartItems.subscribe(its =&amp;gt; {
        items = its
    });

    onDestroy(() =&amp;gt; {
        if (unsubscribe) {
            unsubscribe();
        }
    })
&amp;lt;/script&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;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;4️⃣ 자동&amp;nbsp;subscribe&amp;nbsp;사용하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 기능을 사용하면 별도의 함수로 subscribe를 해제할 필요가 없어지며, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$cartItems를 하면 자동으로 subscribe가 실행되고 DOM에서 컴포넌트가 제거될 때 자동으로 해제된다. &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;&quot;&gt;또한, 이 방법은 3️⃣보다 간결하게 작성할 수 있지만, 마크업에 사용하기 전에 데이터를 변환하거나 어떤 조작이 필요할 때 3️⃣의 방법을 작성하도록 하자.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674132083100&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- cart.svelte --&amp;gt;
&amp;lt;script&amp;gt;
    import { onDestroy } form 'svelte';
    import cartItems from './cart-store.js'; // cartItems 자리에는 원하는 이름을 쓰면 된다.
&amp;lt;/script&amp;gt;

&amp;lt;section&amp;gt;
    &amp;lt;h1&amp;gt;Cart&amp;lt;/h1&amp;gt;
    &amp;lt;ul&amp;gt;
        {#each $cartItems as item (item.id)}
            &amp;lt;CartItem id={item.id} title={item.title} price={item.price} /&amp;gt;
        {:else}
            &amp;lt;p&amp;gt;No items in cart yet!&amp;lt;/p&amp;gt;
        {/each}
    &amp;lt;/ul&amp;gt;
&amp;lt;/section&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;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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/Svelte</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/244</guid>
      <comments>https://cocobi.tistory.com/244#entry244comment</comments>
      <pubDate>Thu, 19 Jan 2023 21:49:29 +0900</pubDate>
    </item>
    <item>
      <title>[TS] 타입스크립트 개발환경 환경 설정하기(VS Code)</title>
      <link>https://cocobi.tistory.com/243</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k19SB/btrWCci2ttT/VgrEznBtukwsW33hh0f6V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k19SB/btrWCci2ttT/VgrEznBtukwsW33hh0f6V1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k19SB/btrWCci2ttT/VgrEznBtukwsW33hh0f6V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk19SB%2FbtrWCci2ttT%2FVgrEznBtukwsW33hh0f6V1%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;423&quot; height=&quot;238&quot; data-origin-width=&quot;1024&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;&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;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  타입스크립트 개발환경 세팅하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;타입스크립트 개발환경을 구성하기 위해서는 npm이 필요하기 때문에 node.js가 설치되어 있어야 하며, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개발 툴로는 Visual studio Code를 사용할 것이기에 두 가지 모두 설치되어 있다는 가정하에 포스팅한다.&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;&quot;&gt;또한, vscode는 추가적인 플러그인을 설치하지 않아도 Typescript에 대한 intellisense를 제공한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ 타입스크립트 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 명령어를 통해 typescript를 설치한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674027381029&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install 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;span style=&quot;color: #000000;&quot;&gt;설치가 정상적으로 완료되었는지 확인하기 위해 버전을 확인하는 명령어를 입력한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674027428282&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx tsc -v&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;488&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blbF8N/btrWCT4Ts5L/8SO85x9bTzhwnY7fGdkXCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blbF8N/btrWCT4Ts5L/8SO85x9bTzhwnY7fGdkXCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blbF8N/btrWCT4Ts5L/8SO85x9bTzhwnY7fGdkXCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblbF8N%2FbtrWCT4Ts5L%2F8SO85x9bTzhwnY7fGdkXCK%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;488&quot; height=&quot;45&quot; data-origin-width=&quot;488&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;&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ tsconfig.json 생성 및 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;tsconfig.json 파일이 필요한 데에는 두 가지 이유가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- vscode의 intellisense가 .ts 파일을 인식하는 방법을 제어하기 위해서 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- tsc가 타입스크립트를 자바스크립트로 컴파일하는 과정에서 필요하다.&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;&quot;&gt;&lt;b&gt;◾ 파일 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 명령어를 통해 tsconfig.json을 생성하거나 직접 파일을 만든다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674027530762&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx tsc --init&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;183&quot; data-origin-height=&quot;24&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I9hDR/btrWCVuoEV1/MTuEIfUk6uKQsEOeDK9Mu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I9hDR/btrWCVuoEV1/MTuEIfUk6uKQsEOeDK9Mu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I9hDR/btrWCVuoEV1/MTuEIfUk6uKQsEOeDK9Mu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI9hDR%2FbtrWCVuoEV1%2FMTuEIfUk6uKQsEOeDK9Mu1%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;183&quot; height=&quot;24&quot; data-origin-width=&quot;183&quot; data-origin-height=&quot;24&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;color: #000000;&quot;&gt;&lt;b&gt;◾ 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.typescriptlang.org/tsconfig&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Typescript Docs&lt;/a&gt; &lt;span style=&quot;color: #000000;&quot;&gt;를 참고하여 설정 파일을 작성한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674020242119&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 작성 예시 */
{
  &quot;compilerOptions&quot;: {
    &quot;target&quot;: &quot;es2016&quot;, // 'es3', 'es5', 'es2015', 'es2016', 'es2017','es2018', 'esnext' 가능
    &quot;module&quot;: &quot;commonjs&quot;, //무슨 import 문법 쓸건지 'commonjs', 'amd', 'es2015', 'esnext'
    &quot;allowJs&quot;: true, // js 파일들 ts에서 import해서 쓸 수 있는지 
    &quot;checkJs&quot;: true, // 일반 js 파일에서도 에러체크 여부 
    &quot;jsx&quot;: &quot;preserve&quot;, // tsx 파일을 jsx로 어떻게 컴파일할 것인지 'preserve', 'react-native', 'react'
    &quot;declaration&quot;: true, //컴파일시 .d.ts 파일도 자동으로 함께생성 (현재쓰는 모든 타입이 정의된 파일)
    &quot;outFile&quot;: &quot;./&quot;, //모든 ts파일을 js파일 하나로 컴파일해줌 (module이 none, amd, system일 때만 가능)
    &quot;outDir&quot;: &quot;./&quot;, //js파일 아웃풋 경로바꾸기
    &quot;rootDir&quot;: &quot;./&quot;, //루트경로 바꾸기 (js 파일 아웃풋 경로에 영향줌)
    &quot;removeComments&quot;: true, //컴파일시 주석제거 
    &quot;strict&quot;: true, //strict 관련, noimplicit 어쩌구 관련 모드 전부 켜기
    &quot;noImplicitAny&quot;: true, //any타입 금지 여부
    &quot;strictNullChecks&quot;: true, //null, undefined 타입에 이상한 짓 할시 에러내기 
    &quot;strictFunctionTypes&quot;: true, //함수파라미터 타입체크 강하게 
    &quot;strictPropertyInitialization&quot;: true, //class constructor 작성시 타입체크 강하게
    &quot;noImplicitThis&quot;: true, //this 키워드가 any 타입일 경우 에러내기
    &quot;alwaysStrict&quot;: true, //자바스크립트 &quot;use strict&quot; 모드 켜기
    &quot;noUnusedLocals&quot;: true, //쓰지않는 지역변수 있으면 에러내기
    &quot;noUnusedParameters&quot;: true, //쓰지않는 파라미터 있으면 에러내기
    &quot;noImplicitReturns&quot;: true, //함수에서 return 빼먹으면 에러내기 
    &quot;noFallthroughCasesInSwitch&quot;: true, //switch문 이상하면 에러내기 
  }
}&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ Typescript 컴파일&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;타입스크립트 파일은 자바스크립트 파일로 컴파일되어야 하며, 컴파일 명령어는 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674040733700&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx tsc&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;1118&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8FwsJ/btrWDdvnda8/EQLkfGtumCH7DRDEy3kg1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8FwsJ/btrWDdvnda8/EQLkfGtumCH7DRDEy3kg1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8FwsJ/btrWDdvnda8/EQLkfGtumCH7DRDEy3kg1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8FwsJ%2FbtrWDdvnda8%2FEQLkfGtumCH7DRDEy3kg1K%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;1118&quot; height=&quot;306&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;306&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;color: #000000;&quot;&gt;앞의 명령어는 명령어를 입력해야지만 컴파일되는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기존 명령어에-w 옵션을 붙여 입력하면 파일을 수정 후 저장할 때마다 자동으로 컴파일된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674040896542&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx tsc -w&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;904&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JjQcT/btrWDETOphZ/V22uEVjpYymtPcfMYAQp60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JjQcT/btrWDETOphZ/V22uEVjpYymtPcfMYAQp60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JjQcT/btrWDETOphZ/V22uEVjpYymtPcfMYAQp60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJjQcT%2FbtrWDETOphZ%2FV22uEVjpYymtPcfMYAQp60%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;904&quot; height=&quot;274&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;274&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  번외) 컴파일하지 않고 TS파일을 실행하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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: #000000;&quot;&gt;먼저 터미널에 아래 명령어를 입력하여 ts-node를 설치한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674041185425&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install --save-dev ts-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;&lt;span style=&quot;color: #000000;&quot;&gt;설치 완료 후 아래 명령어를 입력하여 결괏값을 터미널로 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674041246906&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx ts-node [경로]&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;947&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SjGnf/btrWCU3PA7H/kg5uhfZEHYR6jaXJjjOEAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SjGnf/btrWCU3PA7H/kg5uhfZEHYR6jaXJjjOEAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SjGnf/btrWCU3PA7H/kg5uhfZEHYR6jaXJjjOEAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSjGnf%2FbtrWCU3PA7H%2Fkg5uhfZEHYR6jaXJjjOEAK%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;947&quot; height=&quot;244&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;244&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/TypeScript</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/243</guid>
      <comments>https://cocobi.tistory.com/243#entry243comment</comments>
      <pubDate>Wed, 18 Jan 2023 17:00:06 +0900</pubDate>
    </item>
    <item>
      <title>[JS] 자바스크립트 논리 연산자 AND (&amp;amp;&amp;amp;)를 이용한 조건문</title>
      <link>https://cocobi.tistory.com/242</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wE0gx/btrWwqa9HjS/HBg0Otfhjxa1NTinDoUja0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wE0gx/btrWwqa9HjS/HBg0Otfhjxa1NTinDoUja0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wE0gx/btrWwqa9HjS/HBg0Otfhjxa1NTinDoUja0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwE0gx%2FbtrWwqa9HjS%2FHBg0Otfhjxa1NTinDoUja0%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;510&quot; height=&quot;262&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;370&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  자바스크립트 논리 연산자를 이용하여 조건문 작성하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자바스크립트의 논리 연산자 중 AND (&amp;amp;&amp;amp;) 연산자를 이용하여 조건문을 작성할 수 있다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;♂️ 예제로 알아보기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;논리연산자 &amp;amp;&amp;amp;&amp;nbsp;는 앞에는 조건을 작성하며 조건이 True일 때 &amp;amp;&amp;amp; 연산자 뒤의 괄호 속 코드를 실행한다.&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;&quot;&gt;&lt;b&gt;◾ 변수의 값에 따라 값 할당&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 코드는 &amp;amp;&amp;amp; 연산자를 활용해 조건문을 대신한 코드의 예제이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673959028453&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 조건이 false일 때 &amp;amp;&amp;amp; 연산자 뒤 괄호 속 코드는 동작하지 않는다. */
let x = 10
x == 5 &amp;amp;&amp;amp; (x = 100)
console.log(x) // 10

/* 조건이 true일 때 &amp;amp;&amp;amp; 연산자 뒤 괄호 속 코드가 동작하며 한번에 여러 일을 할 수 있다. */
let y = 10
y == 10 &amp;amp;&amp;amp; (y = 100, x = 999)
console.log(y) // 100
console.log(x) // 999&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: #000000;&quot;&gt;&lt;b&gt;◾ 함수의 경우&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673958920227&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const A = () =&amp;gt; {
  console.log('called A');
  return false;
}
const B = () =&amp;gt; {
  console.log('called B');
  return true;
}

console.log(A() &amp;amp;&amp;amp; B());
// called A
// false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ⅰ) A( )가 실행되기 때문에 콘솔에는 called A가 출력된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ⅱ) A( )의 리턴값이 false이기 때문에 &amp;amp;&amp;amp; 연산자 뒤의 코드는 동작하지 않고 리턴값인 false가 출력된다.&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  참고사이트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Logical_AND&quot;&gt;MDN :: Logical AND (&amp;amp;&amp;amp;)&lt;/a&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/JavaScript</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/242</guid>
      <comments>https://cocobi.tistory.com/242#entry242comment</comments>
      <pubDate>Tue, 17 Jan 2023 21:47:30 +0900</pubDate>
    </item>
    <item>
      <title>[JS] 자바스크립트 특정 값으로 배열의 값 채우기(Arr.fill( ))</title>
      <link>https://cocobi.tistory.com/241</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xL4qK/btrWnojjHlM/oqtS7cXS0e4aJLc0xTfSf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xL4qK/btrWnojjHlM/oqtS7cXS0e4aJLc0xTfSf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xL4qK/btrWnojjHlM/oqtS7cXS0e4aJLc0xTfSf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxL4qK%2FbtrWnojjHlM%2FoqtS7cXS0e4aJLc0xTfSf1%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;510&quot; height=&quot;262&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;370&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  자바스크립트 특정한 값으로 배열을 채우는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자바스크립트의 배열을 특정 값으로 채우는 방법은 배열의 기본 메서드인 fill( ) 을 사용하는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한, fill 메서드를 통해 특정 인덱스를 지정하여 해당하는 인덱스에 값을 할당할 수도 있다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;  기본 구문&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673840267085&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;arr.fill(value[, start[, end]])&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: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;◾ &lt;/b&gt;매개변수&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;◽ value &lt;/b&gt;: 배열을 채울 값&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;◽&lt;/b&gt;&amp;nbsp;&lt;/b&gt;start&lt;/b&gt;&amp;nbsp;: 시작 지점의 인덱스, 기본 값은 0이며 생략할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;◽&lt;/b&gt;&amp;nbsp;&lt;/b&gt;end&lt;/b&gt;&amp;nbsp;: 끝나는 &amp;nbsp;지점의 인덱스, 기본 값은 배열의 길이(this.length)이며 생략할 수 있다.&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_1673840858080&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const array1 = [1, 2, 3, 4];

/* 값 0을 2번째 인덱스부터 4번째 인덱스까지 채운다 */
console.log(array1.fill(0, 2, 4));
// Expected output: Array [1, 2, 0, 0]

/* 값 5를 1번째 인덱스부터 마지막 인덱스까지 채운다 */
console.log(array1.fill(5, 1));
// Expected output: Array [1, 5, 5, 5]

/* 값 0을 모든 인덱스에 채운다 */
console.log(array1.fill(6));
// Expected output: Array [6, 6, 6, 6]&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;♂️ 예제로 알아보기&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;start가 음수일 때 시작 인덱스는 length+start이며, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;end가 음수이면 끝 인덱스는&amp;nbsp;length+end이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한, fill&amp;nbsp;메서드는&amp;nbsp;this&amp;nbsp;객체를 변형한 배열을 반환한다는 점에서 주의하여야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673840352221&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[1, 2, 3].fill(4);               // [4, 4, 4]
[1, 2, 3].fill(4, 1);            // [1, 4, 4]
[1, 2, 3].fill(4, 1, 2);         // [1, 4, 3]
[1, 2, 3].fill(4, 1, 1);         // [1, 2, 3]
[1, 2, 3].fill(4, 3, 3);         // [1, 2, 3]
[1, 2, 3].fill(4, -3, -2);       // [4, 2, 3]
[1, 2, 3].fill(4, NaN, NaN);   // [1, 2, 3]
[1, 2, 3].fill(4, 3, 5);         // [1, 2, 3]
Array(3).fill(4);                // [4, 4, 4]
[].fill.call({ length: 3 }, 4);  // {0: 4, 1: 4, 2: 4, length: 3}

let arr = Array(3).fill({}); // [{}, {}, {}]
arr[0].hi = &quot;hi&quot;; // [{ hi: &quot;hi&quot; }, { hi: &quot;hi&quot; }, { hi: &quot;hi&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;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;&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;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/fill&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MDN :: Array.prototype.fill()&lt;/a&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/JavaScript</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/241</guid>
      <comments>https://cocobi.tistory.com/241#entry241comment</comments>
      <pubDate>Mon, 16 Jan 2023 12:53:36 +0900</pubDate>
    </item>
    <item>
      <title>[JS] 렉시컬 스코프(Lexical Scope)란 무엇일까?</title>
      <link>https://cocobi.tistory.com/240</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JgJWg/btrWc1XDATu/7cohcYgXoeYkty3REqT4lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JgJWg/btrWc1XDATu/7cohcYgXoeYkty3REqT4lK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JgJWg/btrWc1XDATu/7cohcYgXoeYkty3REqT4lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJgJWg%2FbtrWc1XDATu%2F7cohcYgXoeYkty3REqT4lK%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;510&quot; height=&quot;262&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;370&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  자바스크립트 렉시컬 스코프(Lexical Scope) 정리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;렉시컬 스코프(Lexical Scope)는 클로저(Closure)를 이해하기 위해 알아두어야 할 개념이다. &amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;  렉시컬 스코프(Lexical Scope)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;렉시컬 스코프의 정의는 &lt;u&gt;&lt;b&gt;함수 또는 변수의 스코프를 결정하는 방식이다.&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다른 말로는 함수의 호출위치가 아닌, &lt;u&gt;&lt;b&gt;선언된 위치에 따라 스코프가 결정되는 것이라고&lt;/b&gt;&lt;/u&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: #000000;&quot;&gt;즉,&amp;nbsp;함수의&amp;nbsp;선언 위치에 따라 상위 스코프를 결정한다는 뜻이며&amp;nbsp;정적 스코프(Static scope)라 부르기도 하다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;♂️ 예제로 알아보기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 예제는 x의 값을 콘솔로 출력하는 코드이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673785055790&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let x = 1;

const first = (() =&amp;gt; {
  let x = 10;
  second();
})

const second = (() =&amp;gt; {
  console.log(x);
})

first();
second();&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: #000000;&quot;&gt;얼핏 보면 first 함수 내에서 x에 10을 할당하였기 때문에 콘솔에 10과 1이 출력될 것 같이 보인다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 실제 출력 값은 전역에 있는 x의 값인 1이 두 번 출력된다.&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;&quot;&gt;이러한 결과의 이유는 실행 단계에서 코드들의 스코프를 결정하기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◽ global 범위에 있는 변수 x&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◽&lt;/span&gt;&amp;nbsp;first( ) 함수 안에 있는 변수 x&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◽&lt;/span&gt;&amp;nbsp;second( ) 함수 안에 있는 변수 x&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;&quot;&gt;즉, 위 예제에서 가장 중요한 것은 second( ) 함수의 상위 스코프가 무엇인지에 따라 출력값이 결정된다는 것이다.&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;&quot;&gt;다시 한번 말하자면, 자바스크립트는 렉시컬 스코프를 따르기 때문에 함수를 선언한 시점에 상위 스코프가 결정된다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;=&amp;gt; 함수의 호출 위치는 중요하지 않으며, 스코프 결정에 영향을 주지 않는다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&amp;gt; first 함수 안에서 &lt;span style=&quot;color: #000000;&quot;&gt;second가 &lt;/span&gt;호출된 것과 상관없이 second는&amp;nbsp;global&amp;nbsp;범위에 선언되어 있으므로,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;global 범위에 있는 변수 x의 값(=1)이 두 번 출력된 것이다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;❓ &lt;/b&gt;함수의 호출로 인해 상위 스코프가 결정된다면&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;함수의 선언 위치가 아니라 호출 위치에 따라 상위 스코프가 정해지는 것을 Dynamic Scope라고 한다.&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;&quot;&gt;예제에서 렉시컬 스코프가 아닌 다이나믹 스코프를 따른다면, second의 상위 스코프는 자신을 호출한 함수 first와 전역(global)을 가리키게 되어 함수 first를 호출하여 console.log()를 출력했을 때 x의 결과는 10이 출력될 것이다.&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/JavaScript</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/240</guid>
      <comments>https://cocobi.tistory.com/240#entry240comment</comments>
      <pubDate>Sun, 15 Jan 2023 22:35:27 +0900</pubDate>
    </item>
    <item>
      <title>[Svelte] 스벨트 컴포넌트 생명주기(Lifecycle) 정리</title>
      <link>https://cocobi.tistory.com/238</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wBec1/btrWbL6yo2F/xp7vhuJzk7duKyOXY8Fz6K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wBec1/btrWbL6yo2F/xp7vhuJzk7duKyOXY8Fz6K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wBec1/btrWbL6yo2F/xp7vhuJzk7duKyOXY8Fz6K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwBec1%2FbtrWbL6yo2F%2Fxp7vhuJzk7duKyOXY8Fz6K%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;407&quot; height=&quot;109&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  스벨트 컴포넌트 라이프사이클(Svelte Lifecycle)&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;1244&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y36FJ/btrV9WOnDIT/bzacOLaQrCn09uAZ8RgUJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y36FJ/btrV9WOnDIT/bzacOLaQrCn09uAZ8RgUJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y36FJ/btrV9WOnDIT/bzacOLaQrCn09uAZ8RgUJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY36FJ%2FbtrV9WOnDIT%2FbzacOLaQrCn09uAZ8RgUJK%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;791&quot; height=&quot;403&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;634&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ Creation&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾ Script Executes &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;- DOM 이 랜더링 될 때 실행/초기화 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;- 컴포넌트 내 프로퍼티 및 변수 지정, 함수 정의 ... &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;onMount( ) &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;- 데이터가 페칭될때 실행&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;onDestroy( ) &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;- 컴포넌트가 DOM에서 분리될 때 실행&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ Updates&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;beforeUpdate( )&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;- 업데이트가 실제 DOM에 반영되기 직전에 코드를 실행&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&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;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;afterUpdate( ) &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;-&amp;nbsp;Svelte가&amp;nbsp;DOM에&amp;nbsp;연결된&amp;nbsp;직후에&amp;nbsp;실행 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&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;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;tkck( ) &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;-&amp;nbsp;수행할&amp;nbsp;작업을&amp;nbsp;예약한&amp;nbsp;다음&amp;nbsp;작업이&amp;nbsp;완료되면&amp;nbsp;작업&amp;nbsp;루프에서&amp;nbsp;제거&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;- Node.js의 이벤트 루프를 생각하면 된다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;-&amp;nbsp;tick을&amp;nbsp;사용하면&amp;nbsp;각각의&amp;nbsp;완료된&amp;nbsp;작업을&amp;nbsp;연결할&amp;nbsp;수&amp;nbsp;있다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;- Svelte가 DOM을 업데이트하는 것을 기다린 다음 필요한 작업을 수행하며, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;해당 작업이 완료되었을 때 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DOM에 연결되어 업데이트가 진행된다. &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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/Svelte</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/238</guid>
      <comments>https://cocobi.tistory.com/238#entry238comment</comments>
      <pubDate>Fri, 13 Jan 2023 14:25:39 +0900</pubDate>
    </item>
    <item>
      <title>[Svelte] 스벨트 전개(Spread) 프로퍼티와 슬롯(Slot) 사용하기</title>
      <link>https://cocobi.tistory.com/237</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwq7q1/btrV6doo0az/n8IOfPvKKJTnydkAhozki0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwq7q1/btrV6doo0az/n8IOfPvKKJTnydkAhozki0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwq7q1/btrV6doo0az/n8IOfPvKKJTnydkAhozki0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwq7q1%2FbtrV6doo0az%2Fn8IOfPvKKJTnydkAhozki0%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;407&quot; height=&quot;109&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  Each문에서의 Spread 프로퍼티 및 Slot 사용 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-purpose=&quot;course-header-title&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Svelte.js - 완벽 가이드의 [섹션 6:: 컴포넌트에 대해 자세히 알아보기]&amp;nbsp;&lt;span style=&quot;letter-spacing: 0px;&quot;&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 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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ Spread 프로퍼티&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기존에는 컴포넌트를 랜더하기 위해 each문을 쓸 때 아래와 같이 프로퍼티를 일일이 추가해 주었다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673503561068&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- Spread 프로퍼티 --&amp;gt;
{#each products as product}
&amp;lt;Product
    title = product.title
    price = product.price
    ...
/&amp;gt;
{/each}&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: #000000;&quot;&gt;하지만 ES6의 전개연산자와 비슷하게 아래와 같은 문법을 사용함으로써 간결한 코드를 작성할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673503574497&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{#each products as product}
&amp;lt;Product
    {...product}
/&amp;gt;
{/each}&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ Slot&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;상위 컴포넌트에서 하위 컴포넌트 사이에 태그를 작성하였을 때, 해당 하위 컴포넌트에서 slot태그가 존재하여야만 결과가 출력된다. 만약 slot 태그 없이 App.svelte에서 Modal 사이에 태그를 작성한다면 해당 태그는 랜더 되지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673503617670&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- App.svelte --&amp;gt;
&amp;lt;Modal&amp;gt;
    &amp;lt;h1&amp;gt;Hello&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;This works!&amp;lt;/p&amp;gt;
&amp;lt;/Modal&amp;gt;


&amp;lt;!-- Modal.svelte --&amp;gt;
&amp;lt;div&amp;gt;
    &amp;lt;slot /&amp;gt;
&amp;lt;/div&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ namedSlot&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;슬롯에 이름을 지정할 수 있으며, 이름 있는 슬롯과 이름 없는 슬롯이 함께 존재하는 경우 이름 없는 슬롯이 기본 슬롯이 된다.&amp;nbsp;또한,&amp;nbsp;이름&amp;nbsp;없는&amp;nbsp;기본&amp;nbsp;슬롯은&amp;nbsp;한&amp;nbsp;개만&amp;nbsp;존재해야&amp;nbsp;한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673503682901&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- App.svelte --&amp;gt;
&amp;lt;Modal&amp;gt;
    &amp;lt;h1 slot=&quot;header&quot;&amp;gt;Hello&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;This works!&amp;lt;/p&amp;gt;
&amp;lt;/Modal&amp;gt;


&amp;lt;!-- Modal.svelte --&amp;gt;
&amp;lt;div&amp;gt;
    &amp;lt;header&amp;gt;
        &amp;lt;slot name=&quot;header&quot;/&amp;gt;
    &amp;lt;header&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;slot /&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&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;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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/Svelte</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/237</guid>
      <comments>https://cocobi.tistory.com/237#entry237comment</comments>
      <pubDate>Thu, 12 Jan 2023 15:23:18 +0900</pubDate>
    </item>
    <item>
      <title>[Svelte] 스벨트 커스텀 이벤트와 이벤트 데이터 추출하기</title>
      <link>https://cocobi.tistory.com/236</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jbfme/btrV09OS1Wg/vYXXinkIIVvrx6xJGfGU61/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jbfme/btrV09OS1Wg/vYXXinkIIVvrx6xJGfGU61/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jbfme/btrV09OS1Wg/vYXXinkIIVvrx6xJGfGU61/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJbfme%2FbtrV09OS1Wg%2FvYXXinkIIVvrx6xJGfGU61%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;407&quot; height=&quot;109&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  커스텀 이벤트 추가 및 이벤트 데이터 추출하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-purpose=&quot;course-header-title&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Svelte.js - 완벽 가이드의 [섹션 6:: 컴포넌트에 대해 자세히 알아보기]&amp;nbsp;&lt;span style=&quot;letter-spacing: 0px;&quot;&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 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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;  커스텀 이벤트와 데이터 추출&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;커스텀 이벤트에 있어 중요한 키워드는 dispatch이다.&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;&quot;&gt;하위 컴포넌트의 스크립트에서 createEventDispatcher를 통해 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;커스텀 이벤트의 이름과 전달할 데이터를 바인딩 한 메서드에 dispatch한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673502870443&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- Product.svelte --&amp;gt;
&amp;lt;script&amp;gt;
import { createEventDispatcher } from 'svelte';

const dispatch = createEventDispatcher();

function addToCart(){
    dispatch('add-to-cart', {id: 'p1'}); //첫번째인수는 이벤트 이름, 두번쨰는 전달할 데이터
}
&amp;lt;/script&amp;gt;

&amp;lt;button on:click=&quot;{addToCart}&quot;&amp;gt;Add to Cart&amp;lt;/button&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;span style=&quot;color: #000000;&quot;&gt;하위 컴포넌트에서 dispatch한 커스텀 이벤트와 데이터를 상위 컴포넌트에서 사용할 수 있게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673502670739&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- App.svelte --&amp;gt;
&amp;lt;Product on:add-to-cart={() =&amp;gt; alert(''Add to cart!)} /&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;span style=&quot;color: #000000;&quot;&gt;또한 하위 컴포넌트에서 전달한 이벤트의 데이터를 추출하기 위해서는 아래와 같이 하위 컴포넌트의 프로퍼티에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;메서드를 바인딩한 후 인자값을 받아와 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673502714048&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- App.svelte --&amp;gt;
&amp;lt;script&amp;gt;
function addToCart(event) {
    console.log(event.detail) // p1
}
&amp;lt;/script&amp;gt;

&amp;lt;Product on:add-to-cart={addToCart} /&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;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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/Svelte</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/236</guid>
      <comments>https://cocobi.tistory.com/236#entry236comment</comments>
      <pubDate>Thu, 12 Jan 2023 15:01:55 +0900</pubDate>
    </item>
    <item>
      <title>[Eclipse] 이클립스 디버깅 에러 해결 (Unable Install breakpoint ...)</title>
      <link>https://cocobi.tistory.com/235</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SiSH1/btrVWy2sMUX/asGPMhgUOKmklKBK2i4XE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SiSH1/btrVWy2sMUX/asGPMhgUOKmklKBK2i4XE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SiSH1/btrVWy2sMUX/asGPMhgUOKmklKBK2i4XE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSiSH1%2FbtrVWy2sMUX%2FasGPMhgUOKmklKBK2i4XE1%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;401&quot; height=&quot;94&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;599&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  이클립스 디버깅 오류 해결 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오랜만에 이클립스로 개발할 일이 생겨 디버깅 모드로 기동 하였으나 아래와 같은 오류가 발생하였다.&amp;nbsp;&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;540&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccbn69/btrVZuLWswr/jh9PAQQA8VtqobvUPlTza0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccbn69/btrVZuLWswr/jh9PAQQA8VtqobvUPlTza0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccbn69/btrVZuLWswr/jh9PAQQA8VtqobvUPlTza0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fccbn69%2FbtrVZuLWswr%2Fjh9PAQQA8VtqobvUPlTza0%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;468&quot; height=&quot;220&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;254&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ 경고 끄기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;상단의 Windows &amp;gt; Preferences &amp;gt; Java &amp;gt; Debug &amp;gt;&amp;nbsp; Warn when unable to install breakpoint due to missing line number attributes 체크 해제&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hjk5H/btrV1aS0yi1/hJyyKoJijWP7mbBhIZQZ11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hjk5H/btrV1aS0yi1/hJyyKoJijWP7mbBhIZQZ11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hjk5H/btrV1aS0yi1/hJyyKoJijWP7mbBhIZQZ11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHjk5H%2FbtrV1aS0yi1%2FhJyyKoJijWP7mbBhIZQZ11%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;687&quot; height=&quot;862&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;862&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ 프로젝트 Clean 및 breakpoint 제거&lt;/b&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: #000000;&quot;&gt;&lt;b&gt;◾ 톰캣 서버 Clean&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Serves &amp;gt; 디버깅 오류가 뜨는 서버 우클릭 &amp;gt; Clean&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;511&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfjHjG/btrV0g7hbYR/mG88KX3NofEj2q9GbsPNe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfjHjG/btrV0g7hbYR/mG88KX3NofEj2q9GbsPNe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfjHjG/btrV0g7hbYR/mG88KX3NofEj2q9GbsPNe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfjHjG%2FbtrV0g7hbYR%2FmG88KX3NofEj2q9GbsPNe0%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;437&quot; height=&quot;433&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;506&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;color: #000000;&quot;&gt;&lt;b&gt;◾ 프로젝트 Clean&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;상단의 Project &amp;gt; Clean&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;564&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XF5Zx/btrV1gFCn0X/ROiL1ujyYr5R2k8qJ3jjvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XF5Zx/btrV1gFCn0X/ROiL1ujyYr5R2k8qJ3jjvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XF5Zx/btrV1gFCn0X/ROiL1ujyYr5R2k8qJ3jjvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXF5Zx%2FbtrV1gFCn0X%2FROiL1ujyYr5R2k8qJ3jjvK%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;564&quot; height=&quot;252&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;252&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;color: #000000;&quot;&gt;&lt;b&gt;◾ breakpoint 제거&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;상단의 Run &amp;gt; Remove All Breakpoints&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;728&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWRTMN/btrVZWahWox/9GJAGhyy9uqjMJ9lF3fS7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWRTMN/btrVZWahWox/9GJAGhyy9uqjMJ9lF3fS7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWRTMN/btrVZWahWox/9GJAGhyy9uqjMJ9lF3fS7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWRTMN%2FbtrVZWahWox%2F9GJAGhyy9uqjMJ9lF3fS7K%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;728&quot; height=&quot;730&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;730&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  참고사이트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/957822/eclipse-unable-to-install-breakpoint-due-to-missing-line-number-attributes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Stackoverflow :: Eclipse&amp;nbsp;-&amp;nbsp;Unable&amp;nbsp;to&amp;nbsp;install&amp;nbsp;breakpoint&amp;nbsp;due&amp;nbsp;to&amp;nbsp;missing&amp;nbsp;line&amp;nbsp;number&amp;nbsp;attributes&lt;/a&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Dev Tools</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/235</guid>
      <comments>https://cocobi.tistory.com/235#entry235comment</comments>
      <pubDate>Wed, 11 Jan 2023 19:13:40 +0900</pubDate>
    </item>
    <item>
      <title>[JS] 자바스크립트 배열 평탄화하기 (flat, flatMap)</title>
      <link>https://cocobi.tistory.com/232</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eb5vAD/btrVOcR2T7d/6MLrqeUCeAvk8IvuBQUhs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eb5vAD/btrVOcR2T7d/6MLrqeUCeAvk8IvuBQUhs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eb5vAD/btrVOcR2T7d/6MLrqeUCeAvk8IvuBQUhs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feb5vAD%2FbtrVOcR2T7d%2F6MLrqeUCeAvk8IvuBQUhs1%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;510&quot; height=&quot;262&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;370&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  자바스크립트 중첩 배열 평탄화 하는 방법 정리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;중첩된 배열을 평탄화하기 위해 배열의 내장 메서드인 arr.flat() 을 통해 쉽게 처리할 수 있다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ flat( )&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ 기본 구문&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673261501159&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const arr = oldArr.flat([depth])
// depth : 중첩된 배열을 평탄화할 때 사용하는 깊이 값이며 기본값은 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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ 사용방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673261633057&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 기본 depth인 1만큼 평탄화한다. */
const arr = [1, 2, [3, 4]];
arr.flat(); // [1, 2, 3, 4]

/* 입력한 숫자만큼의 depth를 평탄화한다. */
const arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat(); // [1, 2, 3, 4, [5, 6]]
arr2.flat(2); // [1, 2, 3, 4, 5, 6]

const arr3 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
arr3.flat(Infinity); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ &lt;b&gt;flatMap( )&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;flatMap( )&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;메서드는 각 엘리먼트에 대해 map을 수행한 후 결과값을 새로운 배열로 평탄화한다.&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: #000000;&quot;&gt;&lt;b&gt;◾ 기본 구문&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673261965116&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;arr.flatMap(callback(currentValue[, index[, array]])[, thisArg])&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: #000000;&quot;&gt;&lt;b&gt;◾ 사용방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673262112189&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];

arr.map(x =&amp;gt; [x * 2]);
// [[2], [4], [6], [8]]

arr.flatMap(x =&amp;gt; [x * 2]);
// [2, 4, 6, 8]

// 한 depth만 평탄화됨
arr.flatMap(x =&amp;gt; [[x * 2]]);
// [[2], [4], [6], [8]]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1673262226202&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const arr = [&quot;it's Sunny in&quot;, &quot;&quot;, &quot;California&quot;];

arr.map(x=&amp;gt;x.split(&quot; &quot;));
// [[&quot;it's&quot;,&quot;Sunny&quot;,&quot;in&quot;],[&quot;&quot;],[&quot;California&quot;]]

arr.flatMap(x =&amp;gt; x.split(&quot; &quot;));
// [&quot;it's&quot;,&quot;Sunny&quot;,&quot;in&quot;,&quot;California&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;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  참고사이트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/flat&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MDN&amp;nbsp;::&amp;nbsp;Array.prototype.flat()&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MDN :: Array.prototype.flatMap()&lt;/a&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/JavaScript</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/232</guid>
      <comments>https://cocobi.tistory.com/232#entry232comment</comments>
      <pubDate>Mon, 9 Jan 2023 20:05:43 +0900</pubDate>
    </item>
    <item>
      <title>[Svelte] 두 가지 종류의 컴포넌트 (Container  VS Presentational component)</title>
      <link>https://cocobi.tistory.com/231</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qQbLd/btrVAZ6p8mt/I59ZtNnxGJux42KyfFIzSk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qQbLd/btrVAZ6p8mt/I59ZtNnxGJux42KyfFIzSk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qQbLd/btrVAZ6p8mt/I59ZtNnxGJux42KyfFIzSk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqQbLd%2FbtrVAZ6p8mt%2FI59ZtNnxGJux42KyfFIzSk%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;407&quot; height=&quot;109&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  Container (=Stateful components) VS Presentational component&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-purpose=&quot;course-header-title&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Svelte.js - 완벽 가이드의 [섹션 5:: 강의 프로젝트 첫 번째 단계] &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&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 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;컴포넌트의 종류.PNG&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;637&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/taRSQ/btrVALtNBkI/SCmvAZ7WCmRcTF8lTNo920/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/taRSQ/btrVALtNBkI/SCmvAZ7WCmRcTF8lTNo920/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/taRSQ/btrVALtNBkI/SCmvAZ7WCmRcTF8lTNo920/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtaRSQ%2FbtrVALtNBkI%2FSCmvAZ7WCmRcTF8lTNo920%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;1089&quot; height=&quot;637&quot; data-filename=&quot;컴포넌트의 종류.PNG&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;637&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;position: absolute;&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;&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ Container&amp;nbsp;(=Stateful&amp;nbsp;components)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾ 데이터를 가지고 있으면서 관리하는 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&lt;/span&gt; 다른 컴포넌트에 데이터를 전달한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾ &lt;/span&gt;스테이트풀에서의 스테이트(=상태)는 데이터를 의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&lt;/span&gt; 스테이트풀의 데이터는 정적일 필요가 없고, 상호작용에 의해 서버로부터 페칭(fetch)되어 변경될 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&lt;/span&gt;&amp;nbsp;예) App, Product ... : 데이터 관리를 위한 루트 위치 또는 메인 기능 컴포넌트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&lt;/span&gt;&amp;nbsp;스테이트풀 컴포넌트는 소수이다.(유지보수&amp;uarr;) &lt;/span&gt;&lt;br /&gt;&lt;br /&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ Presentational&amp;nbsp;component&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&lt;/span&gt; 프레젠테이션 컴포넌트에는 정적인 데이터가 있는데, 이 데이터는 모두 외부로부터 수신한 데이터이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&lt;/span&gt; 프레젠테이션 컴포넌트에서는 데이터를 변경하는 일이 거의 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&lt;/span&gt; 데이터를 조작하지 않고 출력만 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&lt;/span&gt; 사용자와 상호작용하는 버튼을 출력할 수 있으나, 상호작용에 의해 발생한 데이터를 그대로 스테이트풀 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;컴포넌트에 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;력하고 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스테이트풀 컴포넌트가 이 데이터를 받아 변경하거나 필요한 작업을 하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&lt;/span&gt; 예) Modal, Card, Button ... : 사용자 인터페이스 요소에 해당한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&lt;/span&gt;&amp;nbsp;프레젠테이션 컴포넌트는 다수이다. &lt;/span&gt;&lt;br /&gt;&lt;br /&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;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/Svelte</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/231</guid>
      <comments>https://cocobi.tistory.com/231#entry231comment</comments>
      <pubDate>Sun, 8 Jan 2023 15:45:22 +0900</pubDate>
    </item>
    <item>
      <title>[Mobile] 모바일 크롬 개발자 모드 디버깅 환경 구축하기</title>
      <link>https://cocobi.tistory.com/230</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kVpgU/btrVAMlrgA1/s4ka08QkVersVAhpBXsqQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kVpgU/btrVAMlrgA1/s4ka08QkVersVAhpBXsqQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kVpgU/btrVAMlrgA1/s4ka08QkVersVAhpBXsqQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkVpgU%2FbtrVAMlrgA1%2Fs4ka08QkVersVAhpBXsqQ1%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;404&quot; height=&quot;256&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;256&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  모바일 크롬에서 개발자 모드 구축하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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;&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣&amp;nbsp;&lt;/b&gt;&lt;b&gt;안드로이드 개발자 모드 활성화&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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: #000000;&quot;&gt;&lt;b&gt;휴대전화 정보 &amp;rarr; &lt;/b&gt;&lt;b&gt;&amp;nbsp;&amp;rarr;&amp;nbsp; 소프트웨어 정보 &lt;/b&gt;&lt;b&gt;&amp;nbsp;&amp;rarr;&amp;nbsp; 빌드번호 7번 클릭 시&lt;/b&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2964&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAAd9p/btrVP9s90oT/7j5O8wjKkZNDNnsPHmM8kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAAd9p/btrVP9s90oT/7j5O8wjKkZNDNnsPHmM8kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAAd9p/btrVP9s90oT/7j5O8wjKkZNDNnsPHmM8kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAAd9p%2FbtrVP9s90oT%2F7j5O8wjKkZNDNnsPHmM8kK%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;2964&quot; height=&quot;1536&quot; data-origin-width=&quot;2964&quot; data-origin-height=&quot;1536&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;span style=&quot;color: #000000;&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: #000000;&quot;&gt;&lt;b&gt;개발자 옵션 &amp;rarr; 켜진 상태로 유지&amp;nbsp;&amp;rarr; USB 디버깅&lt;/b&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2964&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M4tiA/btrVNf2klGE/3KgYiIEkBrMVedne2Q3bxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M4tiA/btrVNf2klGE/3KgYiIEkBrMVedne2Q3bxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M4tiA/btrVNf2klGE/3KgYiIEkBrMVedne2Q3bxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM4tiA%2FbtrVNf2klGE%2F3KgYiIEkBrMVedne2Q3bxK%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;2964&quot; height=&quot;1536&quot; data-origin-width=&quot;2964&quot; data-origin-height=&quot;1536&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ PC와 휴대폰 연결&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;USB를 통해 PC와 휴대폰을 연결한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ 크롬 개발자 도구 페이지로 이동 및 포트 포워딩&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;URL에 &lt;span style=&quot;color: #006dd7;&quot;&gt;chrome://inspect/#devices&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;를 검색하여 개발자 도구 페이지로 이동한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개발자 도구 페이지로 이동하면&amp;nbsp;몇 초 후에 USB가 연결된 안드로이드 기기 정보가 디바이스 목록에 표시된다.&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;&quot;&gt;디버깅을 원하는 사이트의 URL을 입력하거나 이미 켜져 있는 사이트의 inspect 버튼을 눌러 디버깅을 진행하면 된다&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;867&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcaJnG/btrVOymQEFm/ik0CaYGHx4v8kiwaFbNOK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcaJnG/btrVOymQEFm/ik0CaYGHx4v8kiwaFbNOK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcaJnG/btrVOymQEFm/ik0CaYGHx4v8kiwaFbNOK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcaJnG%2FbtrVOymQEFm%2Fik0CaYGHx4v8kiwaFbNOK0%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;867&quot; height=&quot;394&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;394&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;color: #000000;&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;1020&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpCHzW/btrVOcR1hjf/MW0zkZB8nJeN9oXO9Vtjr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpCHzW/btrVOcR1hjf/MW0zkZB8nJeN9oXO9Vtjr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpCHzW/btrVOcR1hjf/MW0zkZB8nJeN9oXO9Vtjr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpCHzW%2FbtrVOcR1hjf%2FMW0zkZB8nJeN9oXO9Vtjr0%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;1020&quot; height=&quot;484&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;484&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;&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;&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;</description>
      <category>Mobile</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/230</guid>
      <comments>https://cocobi.tistory.com/230#entry230comment</comments>
      <pubDate>Sat, 7 Jan 2023 16:13:53 +0900</pubDate>
    </item>
    <item>
      <title>[Eclipse] 이클립스 search시 기존 탭 유지 &amp;amp; 새 탭 열기</title>
      <link>https://cocobi.tistory.com/229</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t4Fqu/btrVxsaC7po/oO56C9yZTsdr341nNkhu01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t4Fqu/btrVxsaC7po/oO56C9yZTsdr341nNkhu01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t4Fqu/btrVxsaC7po/oO56C9yZTsdr341nNkhu01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft4Fqu%2FbtrVxsaC7po%2FoO56C9yZTsdr341nNkhu01%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;401&quot; height=&quot;94&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;599&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  이클립스 파일 검색 시 기존 탭 유지 후 새 탭 여는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ 문제&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이클립스에서 Ctrl + h 를 통해 파일을 검색하고 해당 파일을 열을 때 기존에 찾은 다른 파일이 열려있다면 해당 파일의 탭에 새로운 파일이 열리게 된다. 이러한 것은 기본 이클립스 설정이 새로운 탭을 열지 않고 기존 탭을 재사용하기 때문이므로 설정을 변경해 주어야 한다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&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;&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ 해결방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;상단 메뉴의 Window - Preferences &amp;gt; General &amp;gt; Search &amp;gt; Reuse editors to show matches 체크 해제&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;626&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8fV1V/btrVBeaBpFB/HbZ2kOaF6pBEkXmpG5vnf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8fV1V/btrVBeaBpFB/HbZ2kOaF6pBEkXmpG5vnf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8fV1V/btrVBeaBpFB/HbZ2kOaF6pBEkXmpG5vnf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8fV1V%2FbtrVBeaBpFB%2FHbZ2kOaF6pBEkXmpG5vnf1%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;626&quot; height=&quot;555&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;555&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Dev Tools</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/229</guid>
      <comments>https://cocobi.tistory.com/229#entry229comment</comments>
      <pubDate>Fri, 6 Jan 2023 23:03:30 +0900</pubDate>
    </item>
    <item>
      <title>[Android Studio] 안드로이드 스튜디오 다운로드하기</title>
      <link>https://cocobi.tistory.com/228</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blQlhq/btrVqIj7LUw/89o9sTWcnkKDBqYSjbeCSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blQlhq/btrVqIj7LUw/89o9sTWcnkKDBqYSjbeCSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blQlhq/btrVqIj7LUw/89o9sTWcnkKDBqYSjbeCSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblQlhq%2FbtrVqIj7LUw%2F89o9sTWcnkKDBqYSjbeCSK%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;404&quot; height=&quot;256&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;256&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  안드로이드 스튜디오 다운로드&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ 설치파일 다운로드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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;a href=&quot;https://developer.android.com/studio?hl=ko&quot;&gt;https://developer.android.com/studio?hl=ko&lt;/a&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;1647&quot; data-origin-height=&quot;677&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czDyP3/btrVvlASNf5/1V3oSPYG1kfiOWI34oFqA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czDyP3/btrVvlASNf5/1V3oSPYG1kfiOWI34oFqA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czDyP3/btrVvlASNf5/1V3oSPYG1kfiOWI34oFqA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczDyP3%2FbtrVvlASNf5%2F1V3oSPYG1kfiOWI34oFqA1%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;1647&quot; height=&quot;677&quot; data-origin-width=&quot;1647&quot; data-origin-height=&quot;677&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ 설치 진행&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b22qPP/btrVvkWhpGz/XcOLzYqGpNIsbzyhPR9Thk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b22qPP/btrVvkWhpGz/XcOLzYqGpNIsbzyhPR9Thk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b22qPP/btrVvkWhpGz/XcOLzYqGpNIsbzyhPR9Thk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb22qPP%2FbtrVvkWhpGz%2FXcOLzYqGpNIsbzyhPR9Thk%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;504&quot; height=&quot;393&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;393&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;color: #000000;&quot;&gt;Next 클릭한다.&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.PNG&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N7JZl/btrVtTrMG1A/Ky4AiezAutosEdup8v5h21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N7JZl/btrVtTrMG1A/Ky4AiezAutosEdup8v5h21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N7JZl/btrVtTrMG1A/Ky4AiezAutosEdup8v5h21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN7JZl%2FbtrVtTrMG1A%2FKy4AiezAutosEdup8v5h21%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;503&quot; height=&quot;393&quot; data-filename=&quot;2.PNG&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;393&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;color: #000000;&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.PNG&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beQduQ/btrVvtlkjrE/iKd6v9oupSuDkPJa4Kab91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beQduQ/btrVvtlkjrE/iKd6v9oupSuDkPJa4Kab91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beQduQ/btrVvtlkjrE/iKd6v9oupSuDkPJa4Kab91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeQduQ%2FbtrVvtlkjrE%2FiKd6v9oupSuDkPJa4Kab91%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;504&quot; height=&quot;394&quot; data-filename=&quot;3.PNG&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;394&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;color: #000000;&quot;&gt;설치 경로를 선택 후 Next 클릭한다.&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.PNG&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctUg4E/btrVqfPQ0AU/VFtSTquTkM3Ej8sPOcxLH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctUg4E/btrVqfPQ0AU/VFtSTquTkM3Ej8sPOcxLH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctUg4E/btrVqfPQ0AU/VFtSTquTkM3Ej8sPOcxLH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctUg4E%2FbtrVqfPQ0AU%2FVFtSTquTkM3Ej8sPOcxLH0%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;505&quot; height=&quot;394&quot; data-filename=&quot;4.PNG&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;394&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;color: #000000;&quot;&gt;Install을 클릭한다.&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.PNG&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3bcuP/btrVqg83KjX/tnVJk7YLsZNYJxkzRoitI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3bcuP/btrVqg83KjX/tnVJk7YLsZNYJxkzRoitI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3bcuP/btrVqg83KjX/tnVJk7YLsZNYJxkzRoitI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3bcuP%2FbtrVqg83KjX%2FtnVJk7YLsZNYJxkzRoitI1%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;504&quot; height=&quot;395&quot; data-filename=&quot;5.PNG&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;395&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;color: #000000;&quot;&gt;설치가 진행되며 완료 후 Next를 클릭한다.&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6.PNG&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bI870i/btrVv2uiCYa/qJwoHnvUrwjCyyK1sg4Ou1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bI870i/btrVv2uiCYa/qJwoHnvUrwjCyyK1sg4Ou1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bI870i/btrVv2uiCYa/qJwoHnvUrwjCyyK1sg4Ou1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI870i%2FbtrVv2uiCYa%2FqJwoHnvUrwjCyyK1sg4Ou1%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;506&quot; height=&quot;395&quot; data-filename=&quot;6.PNG&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;395&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;color: #000000;&quot;&gt;설치가 완료되었으며 기본 설정을 하기 위해 Start Android Stuid에 체크 후 Finish를 클릭한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ 기본 설정 및 완료&lt;/b&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7.PNG&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pYgd5/btrVt2hLJgs/dVBGmZ3clD9KFK51tb7k91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pYgd5/btrVt2hLJgs/dVBGmZ3clD9KFK51tb7k91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pYgd5/btrVt2hLJgs/dVBGmZ3clD9KFK51tb7k91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpYgd5%2FbtrVt2hLJgs%2FdVBGmZ3clD9KFK51tb7k91%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;380&quot; height=&quot;179&quot; data-filename=&quot;7.PNG&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;179&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;color: #000000;&quot;&gt;이미 설정이 되어있는 config 파일이 있으면 해당 import 하고 없는 경우 아래에 체크 후 Ok를 클릭한다.&amp;nbsp;&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;8.PNG&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC8E80/btrVuCplQNI/JG5ZXI6cKfftZ38k8T8oA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC8E80/btrVuCplQNI/JG5ZXI6cKfftZ38k8T8oA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC8E80/btrVuCplQNI/JG5ZXI6cKfftZ38k8T8oA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC8E80%2FbtrVuCplQNI%2FJG5ZXI6cKfftZ38k8T8oA0%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;792&quot; height=&quot;600&quot; data-filename=&quot;8.PNG&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;600&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;color: #000000;&quot;&gt;Don't send를 선택한다.&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9.PNG&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzFkhD/btrVuHD70Yg/oZlH9f9cX2dw0pjn46vlGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzFkhD/btrVuHD70Yg/oZlH9f9cX2dw0pjn46vlGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzFkhD/btrVuHD70Yg/oZlH9f9cX2dw0pjn46vlGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzFkhD%2FbtrVuHD70Yg%2FoZlH9f9cX2dw0pjn46vlGK%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;793&quot; height=&quot;600&quot; data-filename=&quot;9.PNG&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;600&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;color: #000000;&quot;&gt;Next 버튼을 클릭한다.&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10.PNG&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W34sK/btrVpZl4ufo/m3LyKKwRgEnDfl2I80XpY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W34sK/btrVpZl4ufo/m3LyKKwRgEnDfl2I80XpY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W34sK/btrVpZl4ufo/m3LyKKwRgEnDfl2I80XpY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW34sK%2FbtrVpZl4ufo%2Fm3LyKKwRgEnDfl2I80XpY0%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;791&quot; height=&quot;599&quot; data-filename=&quot;10.PNG&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;599&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;color: #000000;&quot;&gt;설치 타입을 선택하는 단계이며 표준인 Standard를 선택 후 Next 버튼을 클릭한다.&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11.PNG&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfVpTM/btrVqfPQ0CK/XjL6K2UiKm20W1XO6xGzBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfVpTM/btrVqfPQ0CK/XjL6K2UiKm20W1XO6xGzBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfVpTM/btrVqfPQ0CK/XjL6K2UiKm20W1XO6xGzBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfVpTM%2FbtrVqfPQ0CK%2FXjL6K2UiKm20W1XO6xGzBK%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;792&quot; height=&quot;600&quot; data-filename=&quot;11.PNG&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;600&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;color: #000000;&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;12.PNG&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;601&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vqjt8/btrVukWNh2u/ULJGikKHtdmziKw8RALVp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vqjt8/btrVukWNh2u/ULJGikKHtdmziKw8RALVp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vqjt8/btrVukWNh2u/ULJGikKHtdmziKw8RALVp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvqjt8%2FbtrVukWNh2u%2FULJGikKHtdmziKw8RALVp0%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;791&quot; height=&quot;601&quot; data-filename=&quot;12.PNG&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;601&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;color: #000000;&quot;&gt;안드로이드 개발을 현재 세팅을 확인하는 단계이며 Next 버튼을 클릭한다.&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;13.PNG&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE6qfE/btrVt5rWf1m/aRcv1XN782raWL5SWTeRQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE6qfE/btrVt5rWf1m/aRcv1XN782raWL5SWTeRQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE6qfE/btrVt5rWf1m/aRcv1XN782raWL5SWTeRQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE6qfE%2FbtrVt5rWf1m%2FaRcv1XN782raWL5SWTeRQ0%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;792&quot; height=&quot;599&quot; data-filename=&quot;13.PNG&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;599&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;color: #000000;&quot;&gt;안드로이드 개발을 위한 추가 파일을 설치하는 단계이며 왼쪽에서 라이선스 선택 후 Accept 선택, Finish를 클릭한다.&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;14.PNG&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnDasF/btrVuAZlcZv/1KjIadnE3XTeZSarcyUru0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnDasF/btrVuAZlcZv/1KjIadnE3XTeZSarcyUru0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnDasF/btrVuAZlcZv/1KjIadnE3XTeZSarcyUru0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnDasF%2FbtrVuAZlcZv%2F1KjIadnE3XTeZSarcyUru0%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;792&quot; height=&quot;599&quot; data-filename=&quot;14.PNG&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;599&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;color: #000000;&quot;&gt;추가파일 설치를 진행하며 해당 설치가 완료되면 프로젝트를 생성하거나 Clone 하여 개발을 진행하면 된다.&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;</description>
      <category>Dev Tools</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/228</guid>
      <comments>https://cocobi.tistory.com/228#entry228comment</comments>
      <pubDate>Thu, 5 Jan 2023 22:30:57 +0900</pubDate>
    </item>
    <item>
      <title>[JS] 자바스크립트 열거형(Enum) 구현하기</title>
      <link>https://cocobi.tistory.com/227</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqGenf/btrVmggu9A6/RpzTa7z1a81K5bIUXvXKK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqGenf/btrVmggu9A6/RpzTa7z1a81K5bIUXvXKK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqGenf/btrVmggu9A6/RpzTa7z1a81K5bIUXvXKK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqGenf%2FbtrVmggu9A6%2FRpzTa7z1a81K5bIUXvXKK0%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;510&quot; height=&quot;262&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;370&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  자바스크립트 열거형(Enum) 구현하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Enum은 enumerated type의 줄임말이며 열거형 타입이라는 의미를 갖는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만, 자바스크립트에는 열거형(Enum) 타입이 존재하지 않으므로&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;enum타입을 사용하기 위해서는 직접 구현해야 한다.&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;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;♂️ 열거형 타입을 사용하는 이유&lt;/b&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;&lt;span style=&quot;color: #000000;&quot;&gt;코드가 단순해지며 가독성이 좋아진다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하나의 변수에 대해서 고정값으로 사용할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;특정값을 반복해서 체크해야 하는 상황에서 오류의 발생을 줄일 수 있다.&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ 상수를 이용한 구현&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672831045850&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Fruit = {
  APPLE : 100,
  BANANA : 200,
  ORANGE : 300
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 코드와 같이 const를 통해 상수 값을 할당하면 간편하게 Enum처럼 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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: #000000;&quot;&gt;따라서 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Object.freeze()&lt;/a&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_1672831588442&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Fruit = {
  APPLE : 100,
  BANANA : 200,
  ORANGE : 300
};

Object.freeze(Fruit);

Fruit.APPLE = 500;   // 값이 변경되지 않는다
console.log(Fruit.APPLE); // 100&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣Symbol을 이용한 구현 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Enum을 구현할 때, Enum의 value를 Symbol로 감싸주면 다른 변수와 구분하여 사용할 수 있다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;또한, Symbol을 이용하였을 때는 Enum값의 구분을 위해 switch문을 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672831708432&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Fruit = {
  APPLE : Symbol(100),
  BANANA : Symbol(200),
  ORANGE : Symbol(300)
};

Object.freeze(Fruit);&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: #000000;&quot;&gt;위 코드를 간소화한 코드는 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672832103089&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Fruit = Object.freeze({
  APPLE : Symbol(100),
  BANANA : Symbol(200),
  ORANGE : Symbol(300)
});&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ Enum에 여러가지 속성 부여하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Enum타입의 값에 여러가지 속성을 부여하고 싶을 때에는 아래와 같이 구현할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672832302213&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Fruit = Object.freeze({
  APPLE:   { name: &quot;apple&quot;, price: 100 },
  BANANA:  { name: &quot;banana&quot;, price: 200 },
  ORANGE: { name: &quot;orange&quot;, price: 300 }
});&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;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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  참고 사이트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/44447847/enums-in-javascript-with-es6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;stackoverflow :: Enums&amp;nbsp;in&amp;nbsp;Javascript&amp;nbsp;with&amp;nbsp;ES6&lt;/a&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/JavaScript</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/227</guid>
      <comments>https://cocobi.tistory.com/227#entry227comment</comments>
      <pubDate>Wed, 4 Jan 2023 20:47:22 +0900</pubDate>
    </item>
    <item>
      <title>[Node] node Express에 스웨거(Swagger) 추가하기</title>
      <link>https://cocobi.tistory.com/226</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vjn5v/btrVfrPSZmc/wd986SNPB3SMpBJU4Lw7gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vjn5v/btrVfrPSZmc/wd986SNPB3SMpBJU4Lw7gK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vjn5v/btrVfrPSZmc/wd986SNPB3SMpBJU4Lw7gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvjn5v%2FbtrVfrPSZmc%2Fwd986SNPB3SMpBJU4Lw7gK%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;399&quot; height=&quot;244&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;734&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  node.js Express 서버에 스웨거 추가하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;별도의 서버 구축 없이 Express 서버에 Swagger를 연결하는 방법에 대한 포스팅이다.&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ 스웨거 패키지 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672737057556&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install swagger-jsdoc swagger-ui-express --save-dev&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◽&amp;nbsp;&lt;b&gt;swagger-jsdoc :&lt;/b&gt; jsdoc 주석을 사용하여 Swagger API 문서를 작성하기 위한 패키지&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◽&amp;nbsp;&lt;b&gt;swagger-ui-express :&lt;/b&gt; swagger UI와 express를 연결하기 위한 패키지&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2️⃣ &lt;b&gt;스웨거 설정파일 추가 및 route 등록&lt;/b&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: #000000;&quot;&gt;&lt;b&gt;◾ 임의의 경로에 swagger.js 파일을 추가한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;중요한 부분은 apis인데, 해당 부분에는 api 주석을 작성하는 경로를 입력해 준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;보통 routes 경로를 입력하는데, 여기서는 깔끔함을 위해 컨트롤러 파일이 있는 경로를 입력하였다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672737209201&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* swagger/swagger.js */
const swaggerUi = require(&quot;swagger-ui-express&quot;)
const swaggereJsdoc = require(&quot;swagger-jsdoc&quot;)
const options = {
  swaggerDefinition: {
  openapi: &quot;3.0.0&quot;,
  info: {
      title: &quot;Jinny`s Swagger&quot;,
      version: &quot;1.0.0&quot;,
      description: &quot;Node.js Swaager UI With.swagger-jsdoc&quot;
  },
  servers: [
      {
        url: &quot;http://localhost:3000/&quot;, // 요청 URL
      },
    ],
  },
  apis: [&quot;./api/controllers/*.js&quot;], //Swagger 주석이 존재하는 파일의 경로
}
const specs = swaggereJsdoc(options)

module.exports = { swaggerUi, specs }&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: #000000;&quot;&gt;&lt;b&gt;◾ app.js 파일에 route를 등록한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;nodejs의 최상위 컨테이너 파일인 app.js에 스웨거를 사용하기 위한 코드를 작성한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672737397402&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* app.js */
const express = require(&quot;express&quot;)
const api = require(&quot;./routers&quot;)

const app = express()

// ...

const { swaggerUi, specs } = require(&quot;./swagger/swagger&quot;)
app.use(&quot;/api-docs&quot;, swaggerUi.serve, swaggerUi.setup(specs))

// ...&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: #000000;&quot;&gt;위 과정까지 마친 후 http://localhost:3000/api-docs 로 접속하면 아래와 같은 화면이 보인다.&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;811&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bePkpI/btrVhS0IkT6/ZNX7VDhBwQ8fHjiDUWwQ7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bePkpI/btrVhS0IkT6/ZNX7VDhBwQ8fHjiDUWwQ7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bePkpI/btrVhS0IkT6/ZNX7VDhBwQ8fHjiDUWwQ7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbePkpI%2FbtrVhS0IkT6%2FZNX7VDhBwQ8fHjiDUWwQ7K%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;811&quot; height=&quot;344&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;344&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ api 문서화하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;swagger.js의&amp;nbsp;apis에 입력한 경로에 있는 파일로 돌아가 swagger 주석을 작성한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672738143338&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* controllers/xxxController.js */
/**
 * @swagger
 * tags:
 *   name: Delivery
 *   description: Delivery API
 */
 
const deliveryController = () =&amp;gt; {
  // 배송권역수신
  /**
   * @swagger
   * paths:
   *  /api/zipcodes:
   *    get:
   *      summary: &quot;배송권역수신&quot;
   *      description: &quot;배송권역수신&quot;
   *      tags: [getZipcodes]
   *      responses:
   *        &quot;200&quot;:
   *          description: 배송권역수신
   *          content:
   *            application/json:
   *              schema:
   *                type: object
   *                properties:
   *                    ok:
   *                      type: boolean
   *                    users:
   *                      type: object
   *                      example:
   *                          [
   *                            { &quot;key&quot;: 1, &quot;value&quot;: &quot;1&quot; },
   *                            { &quot;key&quot;: 2, &quot;value&quot;: &quot;2&quot; },
   *                            { &quot;key&quot;: 3, &quot;value&quot;: &quot;3&quot; },
   *                          ]
   */
  const getZipcodes = async (req, res, next) =&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;span style=&quot;color: #000000;&quot;&gt;주석 작성 이후 다시 웹 화면으로 돌아가면 아래와 같이 보일 것이고, 이제 API 문서를 작성하면 된다.&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;1180&quot; data-origin-height=&quot;931&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DYqVp/btrVhT6ifyf/9pMDaJ9pOjOROKwVDRxUKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DYqVp/btrVhT6ifyf/9pMDaJ9pOjOROKwVDRxUKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DYqVp/btrVhT6ifyf/9pMDaJ9pOjOROKwVDRxUKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDYqVp%2FbtrVhT6ifyf%2F9pMDaJ9pOjOROKwVDRxUKK%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;1180&quot; height=&quot;931&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;931&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Backend/Node.js</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/226</guid>
      <comments>https://cocobi.tistory.com/226#entry226comment</comments>
      <pubDate>Tue, 3 Jan 2023 18:45:26 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 자바 특정문자로 시작, 특정문자로 끝나는지 체크하기</title>
      <link>https://cocobi.tistory.com/225</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/waHAL/btrU442gdSP/D2JQzk4HGnnSYjOwKvTCSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/waHAL/btrU442gdSP/D2JQzk4HGnnSYjOwKvTCSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/waHAL/btrU442gdSP/D2JQzk4HGnnSYjOwKvTCSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwaHAL%2FbtrU442gdSP%2FD2JQzk4HGnnSYjOwKvTCSK%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;626&quot; height=&quot;262&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;535&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  자바 특정문자로 시작, 특정문자로 끝나는지 확인하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문자열이 특정문자로 시작하거나 끝나는지 확인하기 위해 String 클래스의 메서드를 이용하면 된다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ 특정 문자로 시작하는지 확인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;startsWith( ) 는 문자열이&amp;nbsp;특정 문자&amp;nbsp;또는&amp;nbsp;문자열로&amp;nbsp;시작하는지 체크하는 함수이며, boolean&lt;/span&gt;&lt;span&gt;&amp;nbsp;값을 리턴한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672666809235&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class StartsWithTest{
    public static void main(String[] args){
        String startsWithT = &quot;Java, Hello World&quot;;
        System.out.println( startsWithT.startsWith(&quot;Java&quot;) );   // true
        System.out.println( startsWithT.startsWith(&quot;Ja&quot;) );     // true
        System.out.println( startsWithT.startsWith(&quot;Java, &quot;) ); // true
        System.out.println( startsWithT.startsWith(&quot;  Java&quot;) ); // false
    }
}&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ 특정 문자로 끝나는지 확인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;endsWith&lt;/span&gt;( )&lt;span&gt;&amp;nbsp;&lt;/span&gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;문자열이 특정 문자 또는 문자열로 &lt;span style=&quot;color: #000000;&quot;&gt;끝나는지&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;체크하는 함수이며,&lt;span&gt;&amp;nbsp;&lt;/span&gt;boolean&lt;/span&gt;&amp;nbsp;값을 리턴한다.&lt;/p&gt;
&lt;pre id=&quot;code_1672666853412&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class EndsWithTest{
    public static void main(String[] args){
        String endsWithT = &quot;Java, Hello World &quot;;
        System.out.println( endsWithT.endsWith(&quot;World &quot;) );// true
        System.out.println( endsWithT.endsWith(&quot;d &quot;) );    // true
        System.out.println( endsWithT.endsWith(&quot;World&quot;) );  // false
    }
}&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;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;</description>
      <category>Backend/Java (Spring)</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/225</guid>
      <comments>https://cocobi.tistory.com/225#entry225comment</comments>
      <pubDate>Mon, 2 Jan 2023 22:41:33 +0900</pubDate>
    </item>
    <item>
      <title>[JS] ES-Lint 비활성화 하는 방법</title>
      <link>https://cocobi.tistory.com/224</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FBv7R/btrVcnrPNyD/WiF0MP6bVtwDgsKs9218T0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FBv7R/btrVcnrPNyD/WiF0MP6bVtwDgsKs9218T0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FBv7R/btrVcnrPNyD/WiF0MP6bVtwDgsKs9218T0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFBv7R%2FbtrVcnrPNyD%2FWiF0MP6bVtwDgsKs9218T0%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;510&quot; height=&quot;262&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;370&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  Lint 비활성화하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일부 파일 또는 전체 파일에 적용된 Lint를 비활성화하는 방법이다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ 주석을 이용한 방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;lint를 비활성화할 파일의 최상단에 &lt;b&gt;/* eslint-disable */&lt;/b&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;473&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H59jD/btrU8Enkcp1/usee65kAxLVR7gGKMsNxRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H59jD/btrU8Enkcp1/usee65kAxLVR7gGKMsNxRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H59jD/btrU8Enkcp1/usee65kAxLVR7gGKMsNxRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH59jD%2FbtrU8Enkcp1%2Fusee65kAxLVR7gGKMsNxRk%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;62&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;62&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ .eslintignore 를 이용한 방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.gitignore와 비슷하게 .eslintignore 파일을 추가 후 lint가 적용되지 않을 파일명을 작성하면 비활성화된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;119&quot; data-origin-height=&quot;20&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhGcHD/btrU1qw8hm0/9qiIpHxMIaX0QoN6GMclhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhGcHD/btrU1qw8hm0/9qiIpHxMIaX0QoN6GMclhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhGcHD/btrU1qw8hm0/9qiIpHxMIaX0QoN6GMclhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhGcHD%2FbtrU1qw8hm0%2F9qiIpHxMIaX0QoN6GMclhk%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;119&quot; height=&quot;20&quot; data-origin-width=&quot;119&quot; data-origin-height=&quot;20&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ 사용 중인 프레임워크의 config 설정 추가&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;react, vue등의 프레임워크를 사용 중이라면 해당 프레임워크의 config에 lint관련 설정을 추가함으로써 비활성화할 수 있다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/JavaScript</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/224</guid>
      <comments>https://cocobi.tistory.com/224#entry224comment</comments>
      <pubDate>Sun, 1 Jan 2023 21:25:04 +0900</pubDate>
    </item>
    <item>
      <title>[Oracle] 테이블 스페이스(Table Space)란 무엇일까?</title>
      <link>https://cocobi.tistory.com/222</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P8PdA/btrUi3W3CWQ/ggT1zIE6qgYm3ZY0IRm2wK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P8PdA/btrUi3W3CWQ/ggT1zIE6qgYm3ZY0IRm2wK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P8PdA/btrUi3W3CWQ/ggT1zIE6qgYm3ZY0IRm2wK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP8PdA%2FbtrUi3W3CWQ%2FggT1zIE6qgYm3ZY0IRm2wK%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;354&quot; height=&quot;177&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;250&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  테이블 스페이스(Table Space) 란?&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;&quot;&gt;테이블 스페이스(Table Space)라는 이름 그대로 의미를 생각해 본다면, 단순히 테이블을 저장하는 공간이 떠오를 수 있다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&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: #000000;&quot;&gt;오라클에서 데이터를 저장하는 가장 작은 논리적 단위는 데이터 블록(Data Block)이며, 데이터 블록이 모여서 익스텐트(Extent)가 되고, 익스텐트가 모여서 세그먼트(Segment), 세그먼트가 모여서 테이블 스페이스(Tablespace)가 된다.&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;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BEST(&lt;span style=&quot;color: #ee2323;&quot;&gt;B&lt;/span&gt;lock - &lt;span style=&quot;color: #ee2323;&quot;&gt;E&lt;/span&gt;xtent - &lt;span style=&quot;color: #ee2323;&quot;&gt;S&lt;/span&gt;egment - &lt;span style=&quot;color: #ee2323;&quot;&gt;T&lt;/span&gt;ablespace)&lt;/span&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;&lt;span style=&quot;color: #000000;&quot;&gt;즉, &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffff7e;&quot;&gt;&lt;b&gt;데이터베이스를 구성하는 &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffff7e;&quot;&gt;&lt;b&gt;논리적&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffff7e;&quot;&gt;&lt;b&gt;&amp;nbsp;구조&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;를&amp;nbsp;&lt;span style=&quot;background-color: #ffff7e;&quot;&gt;&lt;b&gt;테이블스페이스&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(&lt;/span&gt;Tablespace&lt;span style=&quot;background-color: #ffffff;&quot;&gt;)라고 하며, &lt;/span&gt;테이블 스페이스에는&amp;nbsp;테이블 이외에도 인덱스, 프로시저, 뷰 등 여러 가지 객체들이 저장된다.&amp;nbsp;&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;&quot;&gt;또한, 오라클의 실제 데이터가 저장되어 있는 &lt;span style=&quot;background-color: #ffff9e;&quot;&gt;&lt;b&gt;데이터 파일&lt;/b&gt;&lt;/span&gt;이&amp;nbsp;&lt;span style=&quot;background-color: #ffff9e;&quot;&gt;&lt;b&gt;물리적 공간&lt;/b&gt;&lt;/span&gt;에 저장된다는 것과 대응되기 때문에 하나의 테이블 스페이스는 최소 1개의 데이터 파일로 구성된다는 것은 기억할만 하다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;521&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JqMhU/btrUk5FAnGd/Jp0GUhKSavkS0Y4Gyh4QE0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JqMhU/btrUk5FAnGd/Jp0GUhKSavkS0Y4Gyh4QE0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JqMhU/btrUk5FAnGd/Jp0GUhKSavkS0Y4Gyh4QE0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/JqMhU/btrUk5FAnGd/Jp0GUhKSavkS0Y4Gyh4QE0/img.gif&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;381&quot; height=&quot;521&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;521&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Database/Oracle</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/222</guid>
      <comments>https://cocobi.tistory.com/222#entry222comment</comments>
      <pubDate>Mon, 26 Dec 2022 15:35:55 +0900</pubDate>
    </item>
    <item>
      <title>[Svelte] HTML에서의 조건문과 루프 방법 정리</title>
      <link>https://cocobi.tistory.com/221</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c51EjS/btrT9yB9EWc/nJ32ATAsty9cwHkPKiVyY0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c51EjS/btrT9yB9EWc/nJ32ATAsty9cwHkPKiVyY0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c51EjS/btrT9yB9EWc/nJ32ATAsty9cwHkPKiVyY0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc51EjS%2FbtrT9yB9EWc%2FnJ32ATAsty9cwHkPKiVyY0%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;407&quot; height=&quot;109&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  Svelte HTML의 조건문과 루프 작업&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-purpose=&quot;course-header-title&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Svelte.js - 완벽 가이드의 [섹션 3:: 조건문 및 루프 작업]과 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[섹션 4:: 반응성(Reactivity)들여다보기] &lt;span style=&quot;letter-spacing: 0px;&quot;&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 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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ if&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스벨트의 HTML에 if 문은 중괄호와 #으로 표현할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한 if문을 종료하기(/if) 전에 else문을 작성할 수 있으며 else 앞에 콜론을 붙여 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671519292993&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
&amp;lt;/script&amp;gt;

...

{#if formState === 'done'}
    &amp;lt;ContactCard 
        userName={name} 
        jobTitle={title} 
        {description} 
        userImage={image} /&amp;gt;
{:else if formState === 'invalid'}
	&amp;lt;p&amp;gt;Invalid input.&amp;lt;/p&amp;gt;
{:else}
	&amp;lt;p&amp;gt;Please Enter some data and hit the button!&amp;lt;/p&amp;gt;
{/if}&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ each&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스벨트의 HTML에서 반복문을 사용하기 위해서는 each문을 사용하며 중괄호와 #으로 표현할 수 있다.&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;&quot;&gt;주목해야 할 점은 스크립트단에서 객체에 push하는 것이 아닌 값을 재할당 하는 것인데, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스벨트에서는 원시타입의 변화만 인식할 수 있기 때문에 push와 pop을 하였을 때 값의 변화를 인식할 수 없다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&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: #000000;&quot;&gt;(참고 : &lt;a href=&quot;https://cocobi.tistory.com/155&quot;&gt;[JS]자바스크립트의 원시 타입과 참조 타입&lt;/a&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: #000000;&quot;&gt;아래 코드는 스크립트단에서 선언한 createdContacts 객체의 값을 반복하는 each문이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671520028336&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
    let createdContacts = [];
    createdContacts = [
    	...createdContacts, 
        {
            name : name,
            jobTitle: title,
            imageUrl: image,
            desc: description
        }
    ];
&amp;lt;/script&amp;gt;

{#each createdContacts as contact}
&amp;lt;ContactCard 
    userName={contact.name} 
    jobTitle={contact.jobTitle} 
    description={contact.desc}
    userImage={contact.imageUrl} /&amp;gt;
{/each}&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: #000000;&quot;&gt;또한, each문은 객체에 alias을 붙여 사용할 수 있고, 추가적으로 인덱스와 고유의 id 값을 지정해 줄 수 있다.&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;&quot;&gt;&lt;b&gt;◾ each의 인덱스와 each-else문&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;each문에서 alias 뒤에 오는 것은 인덱스이다. 인덱스는 i, idx 등 원하는 단어를 입력할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한, each문에도 else를 사용할 수 있는데, 반복 대상 객체가 비어있을 때 else로 분기하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671520437362&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{#each createdContacts as contact, i}
&amp;lt;h2&amp;gt;# {i+1}&amp;lt;/h2&amp;gt;
&amp;lt;ContactCard 
	userName={contact.name} 
	jobTitle={contact.jobTitle} 
	description={contact.desc}
	userImage={contact.imageUrl} /&amp;gt;
{:else}
	&amp;lt;p&amp;gt;Please start adding some contacts, We found None!&amp;lt;/p&amp;gt;
{/each}&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: #000000;&quot;&gt;&lt;b&gt;◾ each의 고유 아이디&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;each문에서 인덱스 뒤에 괄호를 사용함으로써 반복문을 통해 생성된 DOM 객체에 아이디를 지정할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671520608853&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{#each createdContacts as contact, i (contact.id)}
&amp;lt;h2&amp;gt;# {i+1}&amp;lt;/h2&amp;gt;
&amp;lt;ContactCard 
	userName={contact.name} 
	jobTitle={contact.jobTitle} 
	description={contact.desc}
	userImage={contact.imageUrl} /&amp;gt;
{:else}
	&amp;lt;p&amp;gt;Please start adding some contacts, We found None!&amp;lt;/p&amp;gt;
{/each}&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ 이벤트 수식어(Modifier)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이벤트 수식어란 HTML 태그에서 스벨트의 이벤트를 지정하였을 때 추가적인 옵션을 지정하는 것으로&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 코드와 같이 이벤트(on:click)에 버티컬 바(|) 와 수식어를 붙여 씀으로써 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671520766298&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;button on:click|preventDefault={addContact} type=&quot;submit&quot;&amp;gt;Add Contact Card&amp;lt;/button&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4️⃣ HTML 태그에서 인라인 함수 사용&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스크립트단에 작성한 함수를 바인드 하는 것이 아니라 HTML 태그 내에 직접 함수를 작성할 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671520878352&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;button on:click={event =&amp;gt; createdContacts = createdContacts.slice(1)}&amp;gt;
	Delete First
&amp;lt;/button&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;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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/Svelte</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/221</guid>
      <comments>https://cocobi.tistory.com/221#entry221comment</comments>
      <pubDate>Tue, 20 Dec 2022 16:25:42 +0900</pubDate>
    </item>
    <item>
      <title>[Svelte] 기본 구문 및 핵심 기능 정리</title>
      <link>https://cocobi.tistory.com/220</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwbmLH/btrTCguDANd/5KpAMUNKbHo0DAddp8LKO1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwbmLH/btrTCguDANd/5KpAMUNKbHo0DAddp8LKO1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwbmLH/btrTCguDANd/5KpAMUNKbHo0DAddp8LKO1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwbmLH%2FbtrTCguDANd%2F5KpAMUNKbHo0DAddp8LKO1%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;407&quot; height=&quot;109&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  Svelte 기본 구문 및 핵심 정리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-purpose=&quot;course-header-title&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Svelte.js - 완벽 가이드의 [섹션 2:: 기본 구문 및 핵심 정리]를 수강한 후에 정리한 내용이다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ 구조&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스벨트는 Vue와 비슷하게 하나의 .svelte 파일 안에 [자바스크립트 / css / html] 을 작성한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671413437635&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
&amp;lt;/script&amp;gt;

&amp;lt;style&amp;gt;
&amp;lt;/style&amp;gt;

&amp;lt;html&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;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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2️⃣ &lt;b&gt;HTML의 동적 변수 사용과 바인딩&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다른 작업 없이 중괄호 { } 를 사용하여 스크립트단의 변수와 연결하여 동적 변수를 만들 수 있으며,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스벨트 문법에 따라 HTML 태그 안에 변수를 바인딩할 수도 있다.&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;&quot;&gt;아래 코드는 스크립트단의 변수 name과 age를 html단에 바인딩한 것이며, button에 클릭 이벤트를 주어 incrementAge라는 함수를 바인딩하였다. 또한 버튼을 누를 때마다 age가 동적으로 1씩 증가하는 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671413685744&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
    let name = 'Jinny';
    let age = 29;

    function incrementAge() {
        age++;
    }
&amp;lt;/script&amp;gt;

&amp;lt;h1&amp;gt;Hello  My name is {name}, my age is {age}!&amp;lt;/h1&amp;gt;
&amp;lt;button on:click=&quot;{incrementAge}&quot;&amp;gt;Change Age&amp;lt;/button&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ 반응형 변수&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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: #000000;&quot;&gt;또한, 달러 $: 표시를 변수 앞에 붙임으로써 반응형 변수를 만들 수 있고,&amp;nbsp;반응형 변수를 만들 때에는 var, let, 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;&lt;span style=&quot;color: #000000;&quot;&gt;아래 코드는 name의 값이 바뀔 때마다 반응형 변수인 uppercaseName의 값이 변경되어 h1태그에 뿌려준다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671414064149&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
    let name = 'Jinny';
    let age = 29;

    $: uppercaseName = name.toUpperCase();
&amp;lt;/script&amp;gt;

&amp;lt;h1&amp;gt;Hello  My name is {uppercaseName}, my age is {age}!&amp;lt;/h1&amp;gt;
&amp;lt;input type=&quot;text&quot; bind:value=&quot;{name}&quot;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4️⃣ 컴포넌트 import / export 및 바인딩&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ES6문법과 동일하게 자식 컴포넌트를 import 하여 부모 컴포넌트에 불러올 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한, 자식 컴포넌트의 이름을 HTML 태그로 사용하여 화면에 랜더 할 수 있다.&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;&quot;&gt;여기까지는 다른 프론트 프레임워크와 동일하다고 볼 수 있지만, 복잡한 처리 없이 자식 컴포넌트 태그에 Property 변수를 바인딩할 수 있다는 점이 스벨트의 장점이라고 생각된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671414743199&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- app.svelte --&amp;gt;
&amp;lt;script&amp;gt;
    import ContactCard from &quot;./ContactCard.svelte&quot;;
    ...
&amp;lt;/script&amp;gt;

...
 
&amp;lt;ContactCard 
    userName=&quot;{name}&quot; 
    jobTitle=&quot;{title}&quot; 
    description=&quot;{description}&quot; 
    userImage={image}
/&amp;gt;



&amp;lt;!-- ContactCard.svelte --&amp;gt;
&amp;lt;script&amp;gt;
    export let userName;
    export let jobTitle;
    export let description;
    export let userImage;
&amp;lt;/script&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5️⃣ 클래스 토글&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;HTML 태그 내에 class: 옵션을 지정하여 클래스 토글을 할 수 있다.&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;&quot;&gt;아래 코드는 div 태그에 기본 클래스로 thumb를 적용하였고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;userImage의 여부에 따라 thumb-placeholder 클래스를 추가한다는 class: 옵션을 추가한 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671415380852&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
    let userName = 'Jinny';
    let userImage = &quot;&quot;;
&amp;lt;/script&amp;gt;


&amp;lt;style&amp;gt;
.thumb {
	width: 33%;
	height: 100%;
}
.thumb-placeholder{
	background: #ccc;
}
&amp;lt;/style&amp;gt;


&amp;lt;div class=&quot;thumb&quot; class:thumb-placeholder=&quot;{!userImage}&quot;&amp;gt;
	&amp;lt;img src=&quot;{userImage}&quot; alt={userName}/&amp;gt;
&amp;lt;/div&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;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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/Svelte</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/220</guid>
      <comments>https://cocobi.tistory.com/220#entry220comment</comments>
      <pubDate>Mon, 19 Dec 2022 11:11:03 +0900</pubDate>
    </item>
    <item>
      <title>[Svelte - 완벽 가이드] 수강 시작!</title>
      <link>https://cocobi.tistory.com/219</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sXrAb/btrTDYmXKnt/JMB0SSkL3Nkr2UnVze3D1k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sXrAb/btrTDYmXKnt/JMB0SSkL3Nkr2UnVze3D1k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sXrAb/btrTDYmXKnt/JMB0SSkL3Nkr2UnVze3D1k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsXrAb%2FbtrTDYmXKnt%2FJMB0SSkL3Nkr2UnVze3D1k%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;407&quot; height=&quot;109&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  Svelte - 완벽 가이드&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;&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: #000000;&quot;&gt;그러던 중 스벨트(Svelte)를 기반으로 빠른 프론트 작업이 가능하다는 것을 알게 되었고,&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;&quot;&gt;새로운 프레임워크를 익힐 겸 독학을 하기 위한 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자료를 찾던 중 유데미에서 &lt;a href=&quot;https://www.udemy.com/course/svelte-js-korean/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;좋은 강의&lt;/a&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: #000000;&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: #000000;&quot;&gt;따라서 당분간은 Svelte에 대한 강의를 수강하며 관련된 내용을 포스팅하려고 한다.&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/Svelte</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/219</guid>
      <comments>https://cocobi.tistory.com/219#entry219comment</comments>
      <pubDate>Wed, 14 Dec 2022 12:45:09 +0900</pubDate>
    </item>
    <item>
      <title>[Svelte] Svelte 개발환경 세팅 방법</title>
      <link>https://cocobi.tistory.com/218</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yXdxi/btrSYniKnh3/TcZO1r2WGnQvhdkkr0YQGk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yXdxi/btrSYniKnh3/TcZO1r2WGnQvhdkkr0YQGk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yXdxi/btrSYniKnh3/TcZO1r2WGnQvhdkkr0YQGk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyXdxi%2FbtrSYniKnh3%2FTcZO1r2WGnQvhdkkr0YQGk%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;407&quot; height=&quot;109&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  Svelte 프로젝트 개발환경 세팅하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스벨트(Svelte)는 React 또는 Vue처럼 Node를 기반으로 하기 때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스벨트 프로젝트를 시작하기 위해서는 먼저 node가 설치되어 있어야 한다.&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;&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;&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;zwj;♂️ 준비사항&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▪ Node&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▪&lt;/span&gt; Visual studio code&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▪&lt;/span&gt; visual studio code Extention&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;265&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCyXhz/btrS0LvQsGm/0MRhuhcHAKEz9YdXnIOIKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCyXhz/btrS0LvQsGm/0MRhuhcHAKEz9YdXnIOIKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCyXhz/btrS0LvQsGm/0MRhuhcHAKEz9YdXnIOIKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCyXhz%2FbtrS0LvQsGm%2F0MRhuhcHAKEz9YdXnIOIKk%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;265&quot; height=&quot;165&quot; data-origin-width=&quot;265&quot; data-origin-height=&quot;165&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;  프로젝트 생성 ~ 로컬 기동&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ npm create vite@latest&amp;nbsp;&lt;span style=&quot;background-color: #f89009; color: #ffffff;&quot;&gt;myapp&lt;/span&gt; -- --template svelte&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;myapp 부분에는 프로젝트의 이름을 입력하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FZkXA/btrS0Fh1yTc/o5nulGzQYBpteKOmBzWolk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FZkXA/btrS0Fh1yTc/o5nulGzQYBpteKOmBzWolk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FZkXA/btrS0Fh1yTc/o5nulGzQYBpteKOmBzWolk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFZkXA%2FbtrS0Fh1yTc%2Fo5nulGzQYBpteKOmBzWolk%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;501&quot; height=&quot;291&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;291&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ cd myapp&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ npm install&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1mGh6/btrSZzC3TNF/2xihSAhAXfKTWD4QGjXKc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1mGh6/btrSZzC3TNF/2xihSAhAXfKTWD4QGjXKc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1mGh6/btrSZzC3TNF/2xihSAhAXfKTWD4QGjXKc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1mGh6%2FbtrSZzC3TNF%2F2xihSAhAXfKTWD4QGjXKc1%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;685&quot; height=&quot;294&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;294&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ npm run dev&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본 포트인 5173 포트에 스벨트 프로젝트가 정상적으로 기동된 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;293&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqRzNT/btrS3HzrMSz/uXDfuHOFm8PgvIRogrn331/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqRzNT/btrS3HzrMSz/uXDfuHOFm8PgvIRogrn331/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqRzNT/btrS3HzrMSz/uXDfuHOFm8PgvIRogrn331/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqRzNT%2FbtrS3HzrMSz%2FuXDfuHOFm8PgvIRogrn331%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;194&quot; data-origin-width=&quot;293&quot; data-origin-height=&quot;194&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ 브라우저 접속&lt;/b&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;1905&quot; data-origin-height=&quot;1018&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDDzKM/btrSZyjWnr9/O94wV4QnLz49pKoUTzBKg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDDzKM/btrSZyjWnr9/O94wV4QnLz49pKoUTzBKg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDDzKM/btrSZyjWnr9/O94wV4QnLz49pKoUTzBKg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDDzKM%2FbtrSZyjWnr9%2FO94wV4QnLz49pKoUTzBKg1%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;1905&quot; height=&quot;1018&quot; data-origin-width=&quot;1905&quot; data-origin-height=&quot;1018&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  참고 사이트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://svelte.dev/docs#getting-started&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Svelte Docs :: GETTING&amp;nbsp;STARTED&lt;/a&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/Svelte</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/218</guid>
      <comments>https://cocobi.tistory.com/218#entry218comment</comments>
      <pubDate>Wed, 7 Dec 2022 12:46:12 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 자바 ArrayList를 이용한 집합 연산 방법</title>
      <link>https://cocobi.tistory.com/217</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOQOg8/btrSOxK69m5/pLHhT4uTmevEHxa4bl2Qg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOQOg8/btrSOxK69m5/pLHhT4uTmevEHxa4bl2Qg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOQOg8/btrSOxK69m5/pLHhT4uTmevEHxa4bl2Qg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOQOg8%2FbtrSOxK69m5%2FpLHhT4uTmevEHxa4bl2Qg0%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;626&quot; height=&quot;262&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;535&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt; &amp;nbsp;자바 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;ArrayList를 통해 집합 연산하기&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자바의 ArrayList는 List 인터페이스를 상속받은 클래스이다.&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-filename=&quot;Array.png&quot; data-origin-width=&quot;1417&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sw4xV/btrSKQkiRiP/MLh56bLJpFyZHrCPJVMhbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sw4xV/btrSKQkiRiP/MLh56bLJpFyZHrCPJVMhbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sw4xV/btrSKQkiRiP/MLh56bLJpFyZHrCPJVMhbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsw4xV%2FbtrSKQkiRiP%2FMLh56bLJpFyZHrCPJVMhbk%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;556&quot; height=&quot;108&quot; data-filename=&quot;Array.png&quot; data-origin-width=&quot;1417&quot; data-origin-height=&quot;276&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;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;일반적인 배열과 같이 인덱스로 내부의 객체를 관리한다는 점이 유사하지만 한번 생성되면 크기가 변하지 않는 배열과는 달리&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ArrayList는&amp;nbsp;객체들이 추가되어&amp;nbsp;저장 용량(capacity)을 초과하면 자동으로 부족한 크기만큼 저장 용량이 늘어나는 특징을 가지고 있다.&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Array2.png&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTdhAJ/btrSKuIrnYO/PjHkiyz7dI2WAR9H9z6df0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTdhAJ/btrSKuIrnYO/PjHkiyz7dI2WAR9H9z6df0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTdhAJ/btrSKuIrnYO/PjHkiyz7dI2WAR9H9z6df0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTdhAJ%2FbtrSKuIrnYO%2FPjHkiyz7dI2WAR9H9z6df0%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;497&quot; height=&quot;211&quot; data-filename=&quot;Array2.png&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;285&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ 교집합&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;List클래스의 &lt;b&gt;retainAll( )&lt;/b&gt;메서드를 사용하여 교집합을 구할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1670210752796&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.ArrayList;
import java.util.List;

public class 교집합 {
    public static void main(String[] args) {
        List&amp;lt;String&amp;gt; arrayList = new ArrayList&amp;lt;String&amp;gt;();
        arrayList.add(&quot;A&quot;);
        arrayList.add(&quot;B&quot;);
        arrayList.add(&quot;C&quot;);

        List&amp;lt;String&amp;gt; arrayList2 = new ArrayList&amp;lt;String&amp;gt;();
        arrayList2.add(&quot;A&quot;);
        arrayList2.add(&quot;B&quot;);
        arrayList2.add(&quot;C&quot;);
        arrayList2.add(&quot;D&quot;);
        arrayList2.add(&quot;E&quot;);
        arrayList2.add(&quot;F&quot;);

        arrayList.retainAll(arrayList2);
        System.out.println(&quot;교집합 : &quot;+ arrayList ); // 교집합 : [A, B, C]
    }

}&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣&amp;nbsp;부분집합 판단&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;List클래스의 &lt;b&gt;containsAll( ) 메서드를&lt;/b&gt; 사용하여 부분집합을 구할 수 있다. &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1670210814179&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class 부분집합 {
    public static void main(String[] args) {
        List&amp;lt;String&amp;gt; arrayList = new ArrayList&amp;lt;String&amp;gt;();
        arrayList.add(&quot;A&quot;);
        arrayList.add(&quot;B&quot;);
        arrayList.add(&quot;C&quot;);

        List&amp;lt;String&amp;gt; arrayList2 = new ArrayList&amp;lt;String&amp;gt;();
        arrayList2.add(&quot;A&quot;);
        arrayList2.add(&quot;B&quot;);
        arrayList2.add(&quot;C&quot;);
        arrayList2.add(&quot;D&quot;);
        arrayList2.add(&quot;E&quot;);
        arrayList2.add(&quot;F&quot;);

        List&amp;lt;String&amp;gt; arrayList3 = new ArrayList&amp;lt;String&amp;gt;(Arrays.asList(&quot;A&quot;, &quot;B&quot;, &quot;C&quot;));

        boolean isVal = arrayList.containsAll(arrayList2);
        boolean isVal2 = arrayList2.containsAll(arrayList3);

        System.out.println(&quot;isVal: &quot;+ isVal);   // isVal: false
        System.out.println(&quot;isVal2: &quot;+ isVal2); // isVal2: true
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;isVal은 arrayList2가 arrayList의 부분집합에 속하는지에 대한 결과로 false 값을 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;isVal2는&amp;nbsp;&lt;/span&gt;arrayList3는 arrayList2의&amp;nbsp;&lt;span style=&quot;background-color: #ffffff;&quot;&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;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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ 차집합&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;List클래스의 &lt;b&gt;removeAll( ) 메서드를&lt;/b&gt; 사용하여 차집합을 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;구할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1670210839189&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.ArrayList;
import java.util.List;

public class 차집합 {
    public static void main(String[] args) {
        List&amp;lt;String&amp;gt; arrayList = new ArrayList&amp;lt;String&amp;gt;();
        arrayList.add(&quot;A&quot;);
        arrayList.add(&quot;B&quot;);
        arrayList.add(&quot;X&quot;);
        arrayList.add(&quot;Y&quot;);

        List&amp;lt;String&amp;gt; arrayList2 = new ArrayList&amp;lt;String&amp;gt;();
        arrayList2.add(&quot;A&quot;);
        arrayList2.add(&quot;B&quot;);
        arrayList2.add(&quot;C&quot;);
        arrayList2.add(&quot;D&quot;);
        arrayList2.add(&quot;E&quot;);
        arrayList2.add(&quot;F&quot;);

        arrayList.removeAll(arrayList2);
        System.out.println(&quot;차집합 : &quot;+ arrayList ); // 차집합 : [X, Y]
    }

}&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4️⃣ 합집합&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;List클래스의 &lt;b&gt;addAll( ) &lt;/b&gt;메서드를 사용하여 합집합을 구할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;addAll( ) 메서드는 중복 값을 제거해 주지 않기 때문에 HashSet을 통하여 중복 값을 제거한 것에 유의하자.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1670210939568&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

public class 합집합 {
    public static void main(String[] args) {
        List&amp;lt;String&amp;gt; arrayList = new ArrayList&amp;lt;String&amp;gt;();
        arrayList.add(&quot;X&quot;);
        arrayList.add(&quot;Y&quot;);
        arrayList.add(&quot;Z&quot;);

        List&amp;lt;String&amp;gt; arrayList2 = new ArrayList&amp;lt;String&amp;gt;();
        arrayList2.add(&quot;A&quot;);
        arrayList2.add(&quot;B&quot;);
        arrayList2.add(&quot;C&quot;);

        // 중복이 포함될 수 있는 합집합 리스트
        arrayList.addAll(arrayList2);

        //HashSet을 통합 중복제거
        HashSet&amp;lt;String&amp;gt; hash1 = new HashSet&amp;lt;String&amp;gt;();
        hash1.addAll(arrayList);

        // 출력
        Iterator iterator = hash1.iterator();
        while(iterator.hasNext()) {
            System.out.print(iterator.next() + &quot; &quot;); // A B C X Y Z 
        }

    }

}&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;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;</description>
      <category>Backend/Java (Spring)</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/217</guid>
      <comments>https://cocobi.tistory.com/217#entry217comment</comments>
      <pubDate>Mon, 5 Dec 2022 12:49:31 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 순열과 조합 (permutation, combination)</title>
      <link>https://cocobi.tistory.com/216</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OS1ed/btrSwkfvRrL/Eg0MLfvsh3T2GfWMPD8QjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OS1ed/btrSwkfvRrL/Eg0MLfvsh3T2GfWMPD8QjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OS1ed/btrSwkfvRrL/Eg0MLfvsh3T2GfWMPD8QjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOS1ed%2FbtrSwkfvRrL%2FEg0MLfvsh3T2GfWMPD8QjK%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;361&quot; height=&quot;107&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;379&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  파이썬 순열, 조합 값 반환받기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;파이썬의 내장 모듈인 itertools를 이용하면 순열과 조합의 값을 반환받을 수 있다.&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ 순열 (permutation)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;순열이란 몇 개를 골라 순서를 고려해 나열한 경우의 수를 말한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉, 서로 다른 n 개 중 r 개를 골라 순서를 정해 나열하는 가짓수이며&amp;nbsp; 순열은 가능한 모든 순서쌍을 만들며 중복된 값은 갖지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1669864854246&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import itertools

arr = ['A', 'B', 'C']
nPr = itertools.permutations(arr, 2)
print(list(nPr))

# [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ 조합 (combination)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;조합이란 서로 다른 n개 중에서 r개(n&amp;ge;r) 를 선택하여 쌍을 만들 때 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;각각의 값을 n개 중에서 r개 선택한 것을 의미한다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한 조합의 각각의 쌍에서 순서는 큰 의미를 갖지 않으며, 중복값도 갖지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1669864895484&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import itertools

arr = ['A', 'B', 'C']
nCr = itertools.combinations(arr, 2)
print(list(nCr))

# [('A', 'B'), ('A', 'C'), ('B', 'C')]&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ 정리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.7209%;&quot;&gt;&lt;span&gt;&lt;span&gt;이터레이터&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.093%;&quot;&gt;&lt;span&gt;인자&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 54.0698%;&quot;&gt;&lt;span&gt;결과&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.7209%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://docs.python.org/ko/3/library/itertools.html#itertools.product&quot;&gt;product()&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.093%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;p, q, &amp;hellip; &lt;br /&gt;[repeat=1]&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 54.0698%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데카르트 곱(cartesian product), 중첩된 for 루프와 동등&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.7209%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://docs.python.org/ko/3/library/itertools.html#itertools.permutations&quot;&gt;permutations()&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.093%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;p[, r]&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 54.0698%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;r-길이 튜플들, 모든 가능한 순서, 반복되는 요소 없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.7209%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://docs.python.org/ko/3/library/itertools.html#itertools.combinations&quot;&gt;combinations()&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.093%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;p, r&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 54.0698%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;r-길이 튜플들, 정렬된 순서, 반복되는 요소 없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.7209%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://docs.python.org/ko/3/library/itertools.html#itertools.combinations_with_replacement&quot;&gt;combinations_with_replacement()&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.093%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;p, r&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 54.0698%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;r-길이 튜플들, 정렬된 순서, 반복되는 요소 있음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;예&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;결과&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;product('ABCD',&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;repeat=2)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;AA&amp;nbsp;AB&amp;nbsp;AC&amp;nbsp;AD&amp;nbsp;BA&amp;nbsp;BB&amp;nbsp;BC&amp;nbsp;BD&amp;nbsp;CA&amp;nbsp;CB&amp;nbsp;CC&amp;nbsp;CD&amp;nbsp;DA&amp;nbsp;DB&amp;nbsp;DC&amp;nbsp;DD&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;permutations('ABCD',&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;2)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;AB&amp;nbsp;AC&amp;nbsp;AD&amp;nbsp;BA&amp;nbsp;BC&amp;nbsp;BD&amp;nbsp;CA&amp;nbsp;CB&amp;nbsp;CD&amp;nbsp;DA&amp;nbsp;DB&amp;nbsp;DC&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;combinations('ABCD',&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;2)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;AB&amp;nbsp;AC&amp;nbsp;AD&amp;nbsp;BC&amp;nbsp;BD&amp;nbsp;CD&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;combinations_with_replacement('ABCD',&amp;nbsp;2)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;AA&amp;nbsp;AB&amp;nbsp;AC&amp;nbsp;AD&amp;nbsp;BB&amp;nbsp;BC&amp;nbsp;BD&amp;nbsp;CC&amp;nbsp;CD&amp;nbsp;DD&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&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;&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;&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: #000000;&quot;&gt;  참고사이트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▪&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.python.org/ko/3/library/itertools.html&quot;&gt;Python Docs :: itertools&lt;/a&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Backend/Python</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/216</guid>
      <comments>https://cocobi.tistory.com/216#entry216comment</comments>
      <pubDate>Thu, 1 Dec 2022 12:41:34 +0900</pubDate>
    </item>
    <item>
      <title>[Svelte] Svelte bundle 오류 해결 방법(404: bundle...)</title>
      <link>https://cocobi.tistory.com/215</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nVI93/btrRSig3vMq/ApodYeoSwtokZ702D5dAr0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nVI93/btrRSig3vMq/ApodYeoSwtokZ702D5dAr0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nVI93/btrRSig3vMq/ApodYeoSwtokZ702D5dAr0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnVI93%2FbtrRSig3vMq%2FApodYeoSwtokZ702D5dAr0%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;407&quot; height=&quot;109&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;139&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  Svelte 실행 오류 해결 (bundle파일 미생성 해결)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Svelte 프로젝트를 처음 세팅한 후 아래 두 가지 명령어를 통해 실행할 수 있다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;▪ npm start dev&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;▪&amp;nbsp;npm run dev&lt;/b&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: #000000;&quot;&gt;위 명령어를 실행 후 localhost:5000에 접속시 아래와 같은 에러를 마주칠 수 있다.&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;444&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/46JaL/btrRROHueaH/Hx4WXjcill7sk2dutBhGp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/46JaL/btrRROHueaH/Hx4WXjcill7sk2dutBhGp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/46JaL/btrRROHueaH/Hx4WXjcill7sk2dutBhGp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F46JaL%2FbtrRROHueaH%2FHx4WXjcill7sk2dutBhGp0%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;444&quot; height=&quot;134&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;134&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 오류는 로컬에 접속하였을 때 build폴더에 생겨야 할 bundle 파일이 생성되지 않는 현상을 발생시킨다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;  해결방법&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾ npm start dev로 실행한 경우 npm run dev 명령어로 실행한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾ localhost가 아닌 http://127.0.0.1:5000/로 접속한다.&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;&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;i&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;참고 :&lt;/span&gt; &lt;a href=&quot;https://github.com/sveltejs/template/issues/184&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/sveltejs/template/issues/184&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/Svelte</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/215</guid>
      <comments>https://cocobi.tistory.com/215#entry215comment</comments>
      <pubDate>Tue, 22 Nov 2022 21:10:41 +0900</pubDate>
    </item>
    <item>
      <title>[Oracle] 오라클 ROUND함수(소수점 반올림하기)</title>
      <link>https://cocobi.tistory.com/214</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfTU2q/btrRnZXrQx0/42s9PXZ6LCGqYdWFAQ5qsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfTU2q/btrRnZXrQx0/42s9PXZ6LCGqYdWFAQ5qsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfTU2q/btrRnZXrQx0/42s9PXZ6LCGqYdWFAQ5qsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfTU2q%2FbtrRnZXrQx0%2F42s9PXZ6LCGqYdWFAQ5qsK%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;354&quot; height=&quot;177&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;250&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  오라클 SQL 반올림하는 방법 (ROUND 함수)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오라클 SQL에서 ROUND 함수를 사용하면 소수점을 반올림할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한, 소수점을 반올림하지 않고 잘라내기만을(=절사) 원한다면&amp;nbsp;TRUNC함수를 사용하면 된다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;nbsp; ROUND&amp;nbsp; 함수&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾ 기본 사용방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입력한 자리수만큼의 실수 값을 반환하며, 자릿수를 넘기지 않는 경우 반올림된 정수를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한 자리수에 음수 값을 입력하면 정수 자릿수에서 반올림을 실행한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668655937256&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT ROUND(&quot;값&quot;, &quot;자리수&quot;) 
FROM TABLE&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: #000000;&quot;&gt;◾ 소수점 반올림&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668656142547&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT ROUND(1235.543)    -- 1236
     , ROUND(1235.443)    -- 1235
     , ROUND(1235.443, 0) -- 1235
     , ROUND(1235.345, 1) -- 1235.3
     , ROUND(1235.345, 2) -- 1235.35
     , ROUND(1235.345, 3) -- 1235.345
  FROM dual&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;&lt;span style=&quot;color: #000000;&quot;&gt;◾ 정수 반올림&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자리수에 음수를 입력할 경우에는 자릿수 절댓값의 정수 자리에서 반올림이 실행된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668656291429&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT ROUND(1235.345, -1) -- 1240
     , ROUND(1235.345, -2) -- 1200
     , ROUND(1235.345, -3) -- 1000
  FROM dual&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;&lt;span style=&quot;color: #000000;&quot;&gt;◾ 날짜 반올림&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Date형식의 날짜를 반올림할 경우 정오를 기준으로 반올림이 실행된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668656387480&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT ROUND(to_date('2022-11-17 11:50', 'yyyy-mm-dd hh24:mi')) -- 2022-11-17 00:00
     , ROUND(to_date('2022-11-17 12:10', 'yyyy-mm-dd hh24:mi')) -- 2022-11-18 00:00
  FROM dual&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;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;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Database/Oracle</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/214</guid>
      <comments>https://cocobi.tistory.com/214#entry214comment</comments>
      <pubDate>Thu, 17 Nov 2022 12:44:56 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 자바 문자열 반복하기(repeat)</title>
      <link>https://cocobi.tistory.com/213</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uZGmE/btrQJipWAFS/qGltpP9nqq1KlQSKg3WJ61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uZGmE/btrQJipWAFS/qGltpP9nqq1KlQSKg3WJ61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uZGmE/btrQJipWAFS/qGltpP9nqq1KlQSKg3WJ61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuZGmE%2FbtrQJipWAFS%2FqGltpP9nqq1KlQSKg3WJ61%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;626&quot; height=&quot;262&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;535&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;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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt; &lt;span style=&quot;color: #000000;&quot;&gt; 자바 특정 문자열 반복하기&lt;/span&gt;&lt;/b&gt;&lt;/b&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: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;파이썬을 접해보았다면&amp;nbsp; 문자열을 반복할 때&amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;&lt;i&gt;&quot;ABC&quot; * 정수&lt;/i&gt;&lt;/span&gt;&amp;nbsp; 와 같은 코드를 사용한 경험이 있을 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;파이썬과 비슷하게 자바에서는 String클래스의 repeat 메서드를 통해 &lt;span style=&quot;background-color: #ffffff;&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;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;repeat 메서드는 &lt;/span&gt;자바 11에서 새롭게 추가된 String 메서드이며, 파라미터로 전달하는 정수만큼 문자열을 반복한다. &lt;/span&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;또한, 0을 입력할 경우 빈 문자열을 반환하며, 음수를 입력하면 IllegalArgumentExceptionthrow 이 발생한다.&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;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;repeat의 내부 로직을 살펴보면&lt;/span&gt;&amp;nbsp;Arrays.fill()과&amp;nbsp;System.arraycopy() 를&amp;nbsp;통해 문자열을 만들어 반환하며,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;반복 횟수를 n&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;주어진 문자열을 s라 할 때, O(n|s|)의 시간 복잡도를 갖는다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ Java 11 이전의 방식&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;n을 문자열의 반복 횟수, 반복할 문자열을&amp;nbsp;s라고 할 때 아래와 같다.&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;&quot;&gt;&lt;b&gt;◾ StringBuilder와 for문을 통한 반복&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;반복할 횟수만큼 for 루프를 실행하며 각 루프마다 StringBuilder에 주어진 문자열을 추가해준다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667965502439&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String str = &quot;ab&quot;;
StringBuilder sb = new StringBuilder();

for(int i = 0; i &amp;lt; 5; i++) {
	sb.append(str);
}

System.out.println(&quot;result : &quot; + sb); // result : ababababab&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: #000000;&quot;&gt;&lt;b&gt;◾ &lt;span style=&quot;background-color: #ffffff;&quot;&gt;Java 1.5&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;n개의 문자 배열을 String으로 만든 후 각각의 문자를 주어진 문자열로 replace 시킨다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667965014626&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String repeated = new String(new char[n]).replace(&quot;\0&quot;, s);

// 예시
String repeated = new String(new char[5]).replace(&quot;\0&quot;, &quot;ab&quot;);
System.out.println(repeated); // ababababab&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: #000000;&quot;&gt;&lt;b&gt;◾&amp;nbsp;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Java 7&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;길이가 n인 문자 포맷의 각 자리를 주어진 문자열로 replace 시킨다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667965178596&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String.format(&quot;%0&quot; + n + &quot;d&quot;, 0).replace(&quot;0&quot;, s);

//예시
String repeated = String.format(&quot;%0&quot; + 5 + &quot;d&quot;, 0).replace(&quot;0&quot;, &quot;ab&quot;);
System.out.println(repeated); // ababababab&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: #000000;&quot;&gt;&lt;b&gt;◾&amp;nbsp;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Java 8&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;자바8에서 추가된 Collections의 nCopies 메서드를 이용한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667965304630&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String.join(&quot;&quot;, Collections.nCopies(n, s));

// 예시
String repeated = String.join(&quot;&quot;, Collections.nCopies(5, &quot;ab&quot;));
System.out.println(repeated); // ababababab&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣&amp;nbsp;Java 11&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;repeat 메서드는 자바11에서 추가된 String의 메서드이며 문자열을 반복하는 가장 쉬운 방법이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667965378043&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;s&quot;.repeat(n);

//예시
String repeated = &quot;ab&quot;.repeat(5);
System.out.println(repeated); // ababababab&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;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;span style=&quot;color: #000000;&quot;&gt;  참고사이트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▪ &lt;a href=&quot;https://www.javastring.net/java/string/java-string-repeat-method&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;JavsString.net :: repeat() Method&lt;/a&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Backend/Java (Spring)</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/213</guid>
      <comments>https://cocobi.tistory.com/213#entry213comment</comments>
      <pubDate>Wed, 9 Nov 2022 12:55:36 +0900</pubDate>
    </item>
    <item>
      <title>[Intelli J] 파일 입출력 설정</title>
      <link>https://cocobi.tistory.com/212</link>
      <description>&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;800&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nOiQ5/btrQE5pIZ8l/MXyjbGfkYAvsyazK0oRFoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nOiQ5/btrQE5pIZ8l/MXyjbGfkYAvsyazK0oRFoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nOiQ5/btrQE5pIZ8l/MXyjbGfkYAvsyazK0oRFoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnOiQ5%2FbtrQE5pIZ8l%2FMXyjbGfkYAvsyazK0oRFoK%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;366&quot; height=&quot;252&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;551&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 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  인텔리제이(Intelli J) 파일 입출력 설정하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;&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;&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;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0️⃣ Input을 위한 파일 생성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;163&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZg1sa/btrQAxH1H8C/vUqkd9piwSJGzejJC7msD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZg1sa/btrQAxH1H8C/vUqkd9piwSJGzejJC7msD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZg1sa/btrQAxH1H8C/vUqkd9piwSJGzejJC7msD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZg1sa%2FbtrQAxH1H8C%2FvUqkd9piwSJGzejJC7msD1%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;163&quot; height=&quot;66&quot; data-origin-width=&quot;163&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;&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;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1️⃣ 우측 상단의 드롭다운 버튼 클릭 &amp;gt; Edit Configurations 클릭&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;( 상단 메뉴 중 Run &amp;gt; Edit Configurations를 통해서도 접근이 가능하다.)&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;1257&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7VobY/btrQEHCnXF8/C7DCgn2jkCRDa8mK3rHQC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7VobY/btrQEHCnXF8/C7DCgn2jkCRDa8mK3rHQC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7VobY/btrQEHCnXF8/C7DCgn2jkCRDa8mK3rHQC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7VobY%2FbtrQEHCnXF8%2FC7DCgn2jkCRDa8mK3rHQC0%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;1257&quot; height=&quot;426&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;426&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2️⃣ Build and run &amp;gt; Modify options &amp;gt; Redirect input 선택&lt;/span&gt;&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;1075&quot; data-origin-height=&quot;683&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8KNbU/btrQBKN7kQk/lVB1fHnK42JBinz1yuMpsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8KNbU/btrQBKN7kQk/lVB1fHnK42JBinz1yuMpsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8KNbU/btrQBKN7kQk/lVB1fHnK42JBinz1yuMpsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8KNbU%2FbtrQBKN7kQk%2FlVB1fHnK42JBinz1yuMpsk%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;1075&quot; height=&quot;683&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;683&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3️⃣ Build and run &amp;gt; &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Redirect input from &amp;gt; 인풋 파일 선택&amp;nbsp; &amp;gt; Apply &amp;gt; OK&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&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;827&quot; data-origin-height=&quot;683&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bml0bY/btrQFZW1qxq/GjUXDp6smy8qKvHKmq1Uik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bml0bY/btrQFZW1qxq/GjUXDp6smy8qKvHKmq1Uik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bml0bY/btrQFZW1qxq/GjUXDp6smy8qKvHKmq1Uik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbml0bY%2FbtrQFZW1qxq%2FGjUXDp6smy8qKvHKmq1Uik%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;827&quot; height=&quot;683&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;683&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;&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: #000000;&quot;&gt;3️⃣번 과정까지 마치면 input파일 적용이 완료되며, BufferedReader 등으로 파일의 내용을 입력받을 수 있다.&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;&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;</description>
      <category>Dev Tools</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/212</guid>
      <comments>https://cocobi.tistory.com/212#entry212comment</comments>
      <pubDate>Tue, 8 Nov 2022 12:51:59 +0900</pubDate>
    </item>
    <item>
      <title>[Java] DecimalFormat을 이용한 숫자 형식 변경</title>
      <link>https://cocobi.tistory.com/211</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkqZkg/btrQyvoqEJT/7PardieDhkcE26bQ8otrPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkqZkg/btrQyvoqEJT/7PardieDhkcE26bQ8otrPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkqZkg/btrQyvoqEJT/7PardieDhkcE26bQ8otrPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkqZkg%2FbtrQyvoqEJT%2F7PardieDhkcE26bQ8otrPK%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;626&quot; height=&quot;262&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;535&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;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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;  자바 10진수 형식의 Format 변경&lt;/b&gt;&lt;/b&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;background-color: #ffffff; color: #555555;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자바의 &lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/text/package-summary.html&quot;&gt;java.text&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 패키지에는 Format을 변경할 수 있는 클래스가 존재하며 그 중 10진수 형식의 Format을 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;변경할 수 있도록 하는 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;DecimalFormat 클래스를 사용하여 원하는 형식으로 변경할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&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;size14&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ex) 자릿수에 따른 쉼표, 빈자리 채우기, 단위 표시 등 ...&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 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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ &lt;/b&gt;&lt;b&gt;Decimal Pattern&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 361px;&quot; border=&quot;1&quot; data-ke-style=&quot;style15&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 16.3954%; height: 17px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;Pattern&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 55.9302%; height: 17px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;Describe&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%; height: 17px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;return&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 51px;&quot;&gt;
&lt;td style=&quot;width: 16.3954%; height: 51px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 55.9302%; height: 51px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;10진수, 값이 없는 자리는 0으로 채운다&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%; height: 51px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0.0&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;000.000&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 51px;&quot;&gt;
&lt;td style=&quot;width: 16.3954%; height: 51px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 55.9302%; height: 51px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;10진수, 값이 없어도 채우지 않는다.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%; height: 51px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#.##&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;####.###&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 51px;&quot;&gt;
&lt;td style=&quot;width: 16.3954%; height: 51px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 55.9302%; height: 51px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;소수점 표시&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%; height: 51px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;###.##&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;###.00&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;00.00&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.3954%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 55.9302%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단위 구분자 표시&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#,##.#&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 16.3954%; height: 34px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;+, -&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 55.9302%; height: 34px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지수 기호를 표시, E 이후 0를 써서 표현&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%; height: 34px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;+#.##&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-#.##&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.3954%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;E&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 55.9302%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지수 문자&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0.0#00&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 16.3954%; height: 40px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 55.9302%; height: 40px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;양수와 음수를 모두 표시할 경우의&amp;nbsp;구분자&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%; height: 40px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;+#.##;-#.##&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.3954%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;%&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 55.9302%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;100을 곱하고 백분율로 표시&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#.###%&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.3954%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;\u2030&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 55.9302%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1000을 곱하고 밀리 값으로 표시&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.3954%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;\u00A4&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 55.9302%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;통화 표시&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;\u00A4####.##&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 16.3954%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;'&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 55.9302%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;escape문자, #을 문자로 나타내고 싶다면 '#' 으로 표현&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.5581%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2️⃣ Exemple Code&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667792472591&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class DecimalFormatExemple {

	public static void main(String[] args) {
		// 변환할 값
		double n = 12345.6789; 
		
		// 빈자리를 0으로 채워 표현
		DecimalFormat df = new DecimalFormat(&quot;0&quot;); 
		System.out.println(df.format(n)); // 출력값 : 12346
		
		df = new DecimalFormat(&quot;0.0&quot;); 
		System.out.println(df.format(n)); // 출력값 : 12345.7
		
		df = new DecimalFormat(&quot;000000.00000&quot;); 
		System.out.println(df.format(n)); // 출력값 : 012345.67890
		
        
		// 빈자리 채우지 않고 표현
		df = new DecimalFormat(&quot;#&quot;); 
		System.out.println(df.format(n)); // 출력값 : 12346

		df = new DecimalFormat(&quot;######.###&quot;);
		System.out.println(df.format(n)); // 출력값 : 12345.679
		
        
		// 빈자리 채우기와 채우지 않기의 조합 + 단위구분(,)
		df = new DecimalFormat(&quot;#,###.00000&quot;);
		System.out.println(df.format(n)); // 출력값 : 12,345.67890


		// 백분율 표시
		df = new DecimalFormat(&quot;#.##%&quot;); 
		System.out.println(df.format(n)); // 출력값 : 1234567.89%


		// 통화표시(\u00A4 )
		df = new DecimalFormat(&quot;\u00A4####.##&quot;); 
		System.out.println(df.format(n)); // 출력값 : ￦12345.68

		// NumberFormat을 이용하여 통화표시를 지정할 수 있다.
		// Locale을 사용하여 국가 지정시 해당 국가의 통화기호 및 자리수 구분까지 된다.
		NumberFormat nf = NumberFormat.getCurrencyInstance( Locale.KOREA );
        
		// 소수점 2자리까지 지정
		nf.setMaximumFractionDigits(2);
		System.out.println(nf.format(n)); // 출력값 : ￦12,345.68

	}
}&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;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;&quot;&gt;  참고사이트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▪&lt;a href=&quot;https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/text/DecimalFormat.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt; Oracle Docs - DecimalFormat&lt;/span&gt;&lt;/a&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Backend/Java (Spring)</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/211</guid>
      <comments>https://cocobi.tistory.com/211#entry211comment</comments>
      <pubDate>Mon, 7 Nov 2022 12:50:00 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 숫자 왼쪽에 0으로 값 채우기</title>
      <link>https://cocobi.tistory.com/210</link>
      <description>&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;1280&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6u3bo/btrQkRzlg28/pAW3fSQoFXLGszg4wGnttk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6u3bo/btrQkRzlg28/pAW3fSQoFXLGszg4wGnttk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6u3bo/btrQkRzlg28/pAW3fSQoFXLGszg4wGnttk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6u3bo%2FbtrQkRzlg28%2FpAW3fSQoFXLGszg4wGnttk%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;626&quot; height=&quot;262&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;535&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;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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt; &amp;nbsp;자바 숫자 앞에 0으로 채우기&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시퀀스를 생성하거나 특정한 경우에 정수 왼쪽에 자릿수만큼 0으로 채워야 하는 경우가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667532550686&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;아래와 같이 5자리로 표현해야 하는 값이 있을 때
1

부족한 자리수만큼 정수값의 왼쪽에 0으로 채워야 한다.
00001&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: #000000;&quot;&gt;이러한 경우에 두 가지 방법을 이용하여 해결할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾ String.format()를 이용한 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;◾&lt;/span&gt;&amp;nbsp;&lt;a href=&quot;https://cocobi.tistory.com/211&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DecimalFormat&lt;/a&gt;를 이용한 방법&amp;nbsp;&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;&quot;&gt;번외로, 콘솔에 해당 값의 출력을 원하는 경우에는 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;System.out.printf()를 사용할 수도 있다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ String.format()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;String.format(format, num) 함수는 인자로 전달된 format에 맞게 숫자를 문자열로 변환한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래에서 &quot;%0Nd&quot;는 정수를 N개의 자릿수로 반환하며, 왼쪽의 비어있는 공간은 0으로 채운다는 의미이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667531807302&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Example {

    public static void main(String[] args) {
        int num = 1234;
        
        String str = String.format(&quot;%06d&quot;, num);
        System.out.println(str); // 001234

        str = String.format(&quot;%010d&quot;, num);
        System.out.println(str); // 0000001234
    }
}&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ DecimalFormat&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DecimalFormat는 new 연산자를 통해 객체를 초기화해야 사용할 수 있으며 초기화시&amp;nbsp;자릿수를 지정한다.&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;&quot;&gt;아래 예제와 같이 new DecimalFormat(&quot;000000&quot;)으로 자릿수(0의 개수)를 지정하여 객체를 초기화한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 후 df.format(num)을 통해 비어있는 공간은 0으로 채워 변환된 값을 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667531846563&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.text.DecimalFormat;

public class Example1 {

    public static void main(String[] args) {

        int num = 1234;

        DecimalFormat df = new DecimalFormat(&quot;000000&quot;);
        String str = df.format(num);
        System.out.println(str); // 001234

        df = new DecimalFormat(&quot;0000000000&quot;);
        str = df.format(num);
        System.out.println(str); // 0000001234
    }
}&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ System.out.printf()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;printf()는 String.format()과 같이 특정 형식으로 주어진 정수를 문자열로 변환할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한, printf()는 변환된 값을 리턴하지 않고 콘솔에 출력하므로 제한된 상황에서만 사용성을 갖는다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667531891440&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Example2 {

    public static void main(String[] args) {

        int num = 1234;

        System.out.printf(&quot;%06d&quot;, num); // 001234

        System.out.println();

        System.out.printf(&quot;%010d&quot;, num); // 0000001234
    }
}&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;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;span style=&quot;color: #000000;&quot;&gt;  참고사이트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▪ &lt;a href=&quot;https://codechacha.com/ko/java-fill-zeros-with-string/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;codechacha :: java-fill-zeros-with-string&lt;/a&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Backend/Java (Spring)</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/210</guid>
      <comments>https://cocobi.tistory.com/210#entry210comment</comments>
      <pubDate>Fri, 4 Nov 2022 12:47:58 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 튜플 이해하기 (+사용 방법)</title>
      <link>https://cocobi.tistory.com/209</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uZ47I/btrQfLS4Vd2/uyjIxG8Rw7zyWgbGVH6Sck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uZ47I/btrQfLS4Vd2/uyjIxG8Rw7zyWgbGVH6Sck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uZ47I/btrQfLS4Vd2/uyjIxG8Rw7zyWgbGVH6Sck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuZ47I%2FbtrQfLS4Vd2%2FuyjIxG8Rw7zyWgbGVH6Sck%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;361&quot; height=&quot;107&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;379&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  파이썬 튜플(Tuple) 사용 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;튜플(tuple)은 리스트와 비슷하지만 다른 자료형이며 가장 큰 차이는 값을 변화시킬 수 있는가의 여부이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;따라서 프로그램이 실행되는 동안 값이 변하지 않는 상수값을 저장하고 싶다면 튜플을 사용해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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: #000000;&quot;&gt;✔ 튜플과 리스트의 차이점&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;▪&amp;nbsp;리스트는 값의 생성, 삭제, 수정이 가능하지만 튜플은 요소의 값을 바꿀 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;▪&amp;nbsp;리스트는 대괄호 [ ]로 둘러싸지만 튜플은 괄호 ( )로 둘러싼다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;▪ 튜플이 1개의 요소를 가질 때 요소 뒤에 콤마(,)를 붙여야 하며, 튜플을 감싸는 괄호를 생략해도 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 다양한 형태의 튜플
tuple_1 = ()
tuple_2 = (1,)
tuple_3 = (1, 2, 3)
tuple_4 = 1, 2, 3
tuple_5 = ('a', 'b', ('aa', 'bb'))
tuple_6 = ('a', 'b', {'key': 'value'})
tuple_7 = ('a', 'b', ['aa', 'bb'])&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ 튜플 사용 시 주의사항&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾&amp;nbsp; 튜플 요소의 삭제&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;del 함수를 이용해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;튜플의 요소를&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;삭제하려 할 때 요소를 지울 수 없다는 오류&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;메시지를 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667446875045&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ex_tuple = (1, 2, 'a', 'b')
del ex_tuple[0]

# Traceback (most recent call last):
#   File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
# TypeError: 'tuple' object doesn't support item deletion&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: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;◾&lt;/b&gt; 튜플 요소의 변경&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;튜플의 요솟값을 변경할 경우에도 제거할 때와 마찬가지로 오류가 발생하는 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667447031097&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ex_tuple = (1, 2, 'a', 'b')
ex_tuple[0] = 'c'

# Traceback (most recent call last):
#   File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
# TypeError: 'tuple' object does not support item assignment&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ 튜플 인덱싱 및 슬라이싱&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;_4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾&lt;/b&gt;&amp;nbsp;인덱싱&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리스트와 마찬가지로 인덱스 번호를 이용하여 인덱싱할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667447130516&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ex_tuple = (1, 2, 'a', 'b')
ex_tuple[0] # 1
ex_tuple[3] # 'b'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;_5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾&lt;/b&gt; 슬라이싱&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리스트와 마찬가지로 인덱스 번호를 이용하여 슬라이싱할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667447192324&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ex_tuple = (1, 2, 'a', 'b')
ex_tuple[1:] # (2, 'a', 'b')&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ 튜플의 연산&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;_6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾&lt;/b&gt;&amp;nbsp;튜플의 더하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;튜플 자료형끼리 더하기 연산을 하게 되면 두 개의 튜플이 하나의 튜플로 합쳐지게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;참고) 튜플의 빼기 연산은 지원되지 않는다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667447251635&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tuple_1 = (1, 2, 'a', 'b')
tuple_2 = (3, 4)
tuple_1 + tuple_2 # (1, 2, 'a', 'b', 3, 4)&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 id=&quot;_7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;◾&lt;/b&gt;&amp;nbsp;튜플의 곱하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;튜플 자료형에 정수의 곱하기 연산을 하게 되면 정수만큼 튜플의 요소가 반복된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667447565625&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ex_tuple = (5, 2)
ex_tuple * 2 # (5, 2, 5, 2)&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;size18&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;&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;span style=&quot;color: #000000;&quot;&gt;  참고사이트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▪ &lt;a href=&quot;https://wikidocs.net/15&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;점프 투 파이썬 - 튜플 자료형&lt;/a&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Backend/Python</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/209</guid>
      <comments>https://cocobi.tistory.com/209#entry209comment</comments>
      <pubDate>Thu, 3 Nov 2022 12:55:48 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 집합 연산자 사용 하기</title>
      <link>https://cocobi.tistory.com/208</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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IDmu9/btrP3Md0loP/XGAWudNpKEg6ljuiwhvyGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IDmu9/btrP3Md0loP/XGAWudNpKEg6ljuiwhvyGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IDmu9/btrP3Md0loP/XGAWudNpKEg6ljuiwhvyGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIDmu9%2FbtrP3Md0loP%2FXGAWudNpKEg6ljuiwhvyGK%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;361&quot; height=&quot;107&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;379&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  파이썬 집합 연산자 사용 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;파이썬에서 set은 수학의 집합과 같이 순서가 없고 중복 요소를 허용하지 않는 특성이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;따라서 set을 이용하여 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;합집합, 교집합, 차집합과 같은 집합 연산을 하거나 값의 중복을 제거하여 unique 값만 남길 수 있다.&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&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 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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1️⃣ 합집합(Union)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;set.union&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt; 메서드를 사용하거나 &lt;/span&gt;OR 연산자 |&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;를 사용하여 합집합을 구할 수 있다.&lt;/span&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;254&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8PgSl/btrP3Txs5AR/3fenv3GOU7OeUNALTI5Tt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8PgSl/btrP3Txs5AR/3fenv3GOU7OeUNALTI5Tt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8PgSl/btrP3Txs5AR/3fenv3GOU7OeUNALTI5Tt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8PgSl%2FbtrP3Txs5AR%2F3fenv3GOU7OeUNALTI5Tt0%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;254&quot; height=&quot;258&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1667273004953&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 방법1. a | b
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a | b)  # {1, 2, 3, 4, 5, 6}

# 방법2. set.union(a, b)
set.union(a, b)  # {1, 2, 3, 4, 5, 6}&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2️⃣ 교집합(Intersection) &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;set.intersection&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;메서드를 사용하거나 AND 연산자 &lt;/span&gt;&amp;amp;를 사용하여 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;교집합을 구할 수 있다&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;.&amp;nbsp;&lt;/span&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;270&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tiSP2/btrP3zFXSNc/epXkCsdsj0tEXLN042XXY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tiSP2/btrP3zFXSNc/epXkCsdsj0tEXLN042XXY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tiSP2/btrP3zFXSNc/epXkCsdsj0tEXLN042XXY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtiSP2%2FbtrP3zFXSNc%2FepXkCsdsj0tEXLN042XXY1%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;270&quot; height=&quot;246&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1667273360555&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 방법1. a &amp;amp; b
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a &amp;amp; b)  # {3, 4}

# 방법2. set.intersection(a, b)
set.intersection(a, b)  # {3, 4}&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3️⃣ 차집합(difference)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;set.&lt;span style=&quot;background-color: #ffffff;&quot;&gt;difference&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;메서드를 사용하거나 뺄셈 연산자 -&lt;/span&gt;를 사용하여&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;차집합을 구할 수 있다&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;.&amp;nbsp;&lt;/span&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;238&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zgZbV/btrP4wBKtpT/3Y1Jw6eu3cnJm1G49182S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zgZbV/btrP4wBKtpT/3Y1Jw6eu3cnJm1G49182S0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zgZbV/btrP4wBKtpT/3Y1Jw6eu3cnJm1G49182S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzgZbV%2FbtrP4wBKtpT%2F3Y1Jw6eu3cnJm1G49182S0%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;238&quot; height=&quot;240&quot; data-origin-width=&quot;238&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1667273525976&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 방법1. a - b
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a - b)  # {1, 2}
print(b - a)  # {5, 6}

# 방법2. set.difference(a, b)
set.difference(a, b)  # {1, 2}
set.difference(b, a)  # {5, 6}&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;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4️⃣&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;대칭 차집합(symmetric difference)&lt;/span&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;set.symmetric_difference&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;메서드를 사용하거나 XOR 연산자 ^&lt;/span&gt;를 사용하여 대칭 차집합을&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt; 구할 수 있다&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&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;&lt;span style=&quot;color: #000000;&quot;&gt;대칭차집합은 XOR 연산자의 특성을 그대로 따르며 XOR은 서로 다를 때 참이다. 따라서 집합에서는 두 집합 중 겹치지 않는 요소만 포함한다.&amp;nbsp;&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;348&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1j6qJ/btrP3SFlhVT/wQJ11xK9zu1ieVOffZKvJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1j6qJ/btrP3SFlhVT/wQJ11xK9zu1ieVOffZKvJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1j6qJ/btrP3SFlhVT/wQJ11xK9zu1ieVOffZKvJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1j6qJ%2FbtrP3SFlhVT%2FwQJ11xK9zu1ieVOffZKvJk%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;245&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1667273844860&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 방법1. a ^ b
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a - b)  # {1, 2, 5, 6}

# 방법2. set.symmetric_difference(a, b)
set.symmetric_difference(a, b)  # {1, 2, 5, 6}&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;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;span style=&quot;color: #000000;&quot;&gt;  참고사이트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▪&lt;a href=&quot;https://dojang.io/mod/page/view.php?id=2315&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt; 파이썬 코딩도장 :: 집합 연산자&lt;/span&gt;&lt;/a&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Backend/Python</category>
      <author>cocobi</author>
      <guid isPermaLink="true">https://cocobi.tistory.com/208</guid>
      <comments>https://cocobi.tistory.com/208#entry208comment</comments>
      <pubDate>Tue, 1 Nov 2022 12:41:01 +0900</pubDate>
    </item>
  </channel>
</rss>