<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>다른생각 - 개발 로그</title>
    <link>https://diff-frontend.tistory.com/</link>
    <description>공부만이 살길이다</description>
    <language>ko</language>
    <pubDate>Mon, 8 Jun 2026 19:31:41 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>richready2011</managingEditor>
    <item>
      <title>프론트엔드 로드맵</title>
      <link>https://diff-frontend.tistory.com/20</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 항상 불안하다.. 내가 뒤쳐지고 있는거 아닐까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불!안!해!서!! 누구도 정답을 얘기해 주지 않아서!! 비난의 함정에 빠진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불!안!하!지! 말자!! 우리에겐 집단지성이 있지 않은가! 참으로 감사한 일.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적어도 아래의 노란색중 걸리는게 크게 없다면, 상위 30% 라고 생각해도 되지 않을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 노란색을 모두 다 알기 위해서는 상당한 공부량이 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 뒤쳐지고 있는지 아닌지를 보려면 이걸 보면 된다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;로드맵!&lt;/h2&gt;
&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://github.com/kamranahmedse/developer-roadmap&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/kamranahmedse/developer-roadmap&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664204065272&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - kamranahmedse/developer-roadmap: Community effort to create roadmaps, guides and other educational content to help the &quot; data-og-description=&quot;Community effort to create roadmaps, guides and other educational content to help the developers get an idea about the software development landscape, learn and grow in their career. - GitHub - kam...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/kamranahmedse/developer-roadmap&quot; data-og-url=&quot;https://github.com/kamranahmedse/developer-roadmap&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nGtwX/hyPVtLd2id/iuDj4fEK8xHpF4eD9DVzjK/img.png?width=1200&amp;amp;height=600&amp;amp;face=961_135_1039_219&quot;&gt;&lt;a href=&quot;https://github.com/kamranahmedse/developer-roadmap&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/kamranahmedse/developer-roadmap&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nGtwX/hyPVtLd2id/iuDj4fEK8xHpF4eD9DVzjK/img.png?width=1200&amp;amp;height=600&amp;amp;face=961_135_1039_219');&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;GitHub - kamranahmedse/developer-roadmap: Community effort to create roadmaps, guides and other educational content to help the&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Community effort to create roadmaps, guides and other educational content to help the developers get an idea about the software development landscape, learn and grow in their career. - GitHub - kam...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모조품 주의&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;frontend-1.jpg&quot; data-origin-width=&quot;3434&quot; data-origin-height=&quot;9639&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdjpxR/btrM2pNr4t5/wai8ZnQIq5Z9N2kNt64Vek/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdjpxR/btrM2pNr4t5/wai8ZnQIq5Z9N2kNt64Vek/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdjpxR/btrM2pNr4t5/wai8ZnQIq5Z9N2kNt64Vek/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdjpxR%2FbtrM2pNr4t5%2Fwai8ZnQIq5Z9N2kNt64Vek%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;3434&quot; height=&quot;9639&quot; data-filename=&quot;frontend-1.jpg&quot; data-origin-width=&quot;3434&quot; data-origin-height=&quot;9639&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>frontend</category>
      <category>Roadmap</category>
      <author>richready2011</author>
      <guid isPermaLink="true">https://diff-frontend.tistory.com/20</guid>
      <comments>https://diff-frontend.tistory.com/20#entry20comment</comments>
      <pubDate>Mon, 26 Sep 2022 23:52:33 +0900</pubDate>
    </item>
    <item>
      <title>우분투에 구글 NativeScript 설치</title>
      <link>https://diff-frontend.tistory.com/19</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;웹과 앱이 하나로 통합 될 거라는 얘기를 종종 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적인 생각이지만, 웹을 중심으로 앱이 통합되는 형태 보다는, 앱이 살아남고, 웹은 서포트 역할이 될거다 라고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹은 URL을 외우고, 접속하기 위해 키보드가 필요하지만, 앱은 설치하고 터치하면 된다.&lt;br /&gt;구글 글래스에서 동작하는 방식을 키보드로 할 수 없다. 냉장고에 키보드를 포함할 수도 없다.&lt;br /&gt;TV 에서 넷플릭스를 보기위해 블루투스 키보드를 사야되나?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹을 사용하려면 브라우저를 탑재해야 하는데, 브라우저는 다양한 기능을 소화할 수 있도록 개발되기 때문에 무겁다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤게 더 편할까 생각이 들었고, 앱을 만들어야 겠다는 생각을 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱개발의 지식이 없기 때문에, 가지고 있는 기술을 활용할 수 있는 테크트리를 선택하고 싶었고 자바스크립트로 작성할 수 있는 선택지가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;gt; (수정) 웹이 앱이 되어가고 있음.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프레임워크&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Fuse&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.fusetools.com/&quot;&gt;Fuse&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/a9GGcymfHRud3EgfJQF0ucwIDn0aw17Z2IEyzMR2TYEoEif0gE7BLPhBOzugCSn0lzsMmrE2vrVeZhTpxbDGdwV-VEgnwskCMiiUxekVGEpIEW3bKVMitnLuXXRUHroqXWj-gNhJzhthsOamYDMMUfZzb2600DldZnGoKBYs-XE_KSd6INW5uDouHmCwpcS5Rd2Y4w7D58FGfqRY-I7rE7uGM5XCOrjXFlWpn-jdyyMxZAKW6moHgYu-a3d2Ta-CCI3wS-bYSm4lKUKEqp7NBJZ8bxjNkrMm9NQ7U2mRvue1Dy0XG7huitYFCdjY6-DWF4vvPvd5-aaAopSyaxC0l28bHafJkflwtEquAxhxRT34W4QKCywAzYr7ZnXm7MZyXFshCGivE9bBIC_X0ZDK-AyaRinMTTV9x8Rhj66oxYxxgXgmxY57DmQejXcgs0n5T08YFZsQyzFkO95dtCHbZRI5_aFvblXDANSmXwFlXuscWIEn9eUHNcu6bVtmF9BnvQVVBjiaduerXayA4uoc4LAK9x8fOegj0erIeINAKozrOKmJIZ2eG7RncLIE9KkLdX3PMg4zVSmSJPgbo6fQZn4SrQJMdC5Mnh7O8ikqoqAA-VXQUER8Mly-CIGMtgxkzW7TozXX_8KR0jeTCZUDuVHpRrvpmyCl=w1215-h1170-no&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전부터 풍부한 예제들이 탐나서, 해야지 해야지 했는데, 2018년을 기점으로 사업을 접겠다는 기사가 났다. 이유는 거대한 대기업의 잠식으로 이길수 없겠다고는 했는데, 아쉬운 부분.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Google Native-Script&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.nativescript.org/&quot;&gt;Google NativeScript&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/FtzDVRFhVnrCH3NbVQCPTq5dAMUBVu_CQsghy_7mx_A0T4bbpfggQARYzVrI9wSOMmZKZMlmjvu0ffUIzikOKfXq1zPSEzrrbHriYm6dLMBJS4XjVNJm1s_gOwL4vvsISgOK__BeLsIPtz7IkUr0Y0aioEf9rwUejEbcjKy9yTkkUtp9VAST8jW6wtm1lW3RM7hu4S_r7_2Ahgv8VIuly1X0ULAUiZgPUj1d3Vng4S8ntd13wzRKl0SQyhcJ_v24U-1ePfnGQHJTbzNSCvVbJ5TZ7fvWjWqrdP0eduYjPec7YDDFoDb9RJno94aooWRLj_8HIFkVL_1Dz0KI5HYBxHKJbc3qjZa3WzJYY6-TfWUQOWZfK5_Gp7kzBUCsODgbi1EmpjBV2AOThqTB5O7BLmPio566KCz3cUnxLxLzcNlDzifzBXS8rxCagaVxZyropTGD3DknrptBGETlQZ-nFPeBI3wKU8eKFlm98ne7kwd6UlFu5o3NBFdgVgVNpnjagKM3TXrdcIHcnFUb3mmat9hT_vdO6nDMkk6RRET696WswOeQsChEI-F-cI9NtIKpwnmz_iadLHSmf52Hm0MluhVR3eiZ-m0KhhTWPFzx8eK3zLlaydImlndMlqw12qNCAbSAM9kweOLGGG3Ucs9CYiPtTE7rMbkV=w1215-h1120-no&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2년전인가 테스트 해보려고 접속했을 때는, 어마무시하게 엉망인 웹사이트 였으나, 오랜만에 접속하니 아주 깔끔하고, 구조도 잘 잡혀 있어서 향후 지원이 더 기대된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;React-Native&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://facebook.github.io/react-native/&quot;&gt;React-Native&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/OEtR5gYZuCFAemPeLrpZRw_DO5Qv9FdqmcJTeYex9nMXIVEsrQSe8gK42kto5mqhQi4XN5e3r-wTCIVraulCDKO9boCYIa5qgXTmn3tTeAy9QbtHzaP-g1xJwu31fZIzS7b4P3yc2ymlr5lI_IS8cXxa_vVK43XC2yv8zKFxNYobtZY-PE9-e5TQ3qGEKrtQnVvoh2E6GPMnilApC7Wial3fUkbzeVL98uDTpfPqrgwI2Xvp2z4l6nKivocVeoHUx87lgdlU_nK4EH_vPBIBD-8N6tAUlU4TczN824AIr5q5qJQ03RSEavm7G9SnRAfpKRjuYCd8nE17yt7K30owUO3-zZWg6HOaKC8oG3KeiJwBbSI4V2DC85QQwdbE0jQFR0xHJXj4kdfHpaH8KBOjNPTo9VVGaKOtNevBVvxT4CtD3JC4lJaCroiX_tYQjBYX4IYTyNRG1fqL8IRviGyXQkTY11yAn8vx6gh65PTPiRzqxxp2MNBZrF-4ppeOiq9ki9DSOCPbQmRnB9Oo6mIpZY2LdekcukoBtMoWPboVgVZSJ2E0YmMJg5D0awLQWFxxiaEQLRR6OX7v2gbWws1MdKhmOcesYN749vPVxNEy6hMGMm2M85YWVrJUQmgKcfc5llmgAVg_iysByFh9iJT1MggE23uW7W9X=w1215-h956-no&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VUE.js 와 같이 React 의 진입장벽이 Angular 에 비해 원만했기에, 사용자층이 높고, 생태계 또한 잘 활성화 되어 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Google Flutter&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://flutter.dev/&quot;&gt;Flutter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/63pVup7-8flvZLldivWOHgdh0kbu4DyMZOyyJj3-MCzo4kK1Muxrz-RTEddZnt5x5C447vbEvqG6PILmdFAGXWmjGg62pnW5fFuOY0SWZWNcj1W3taWqzDCx2WuMXTOwBdMh2RGwExPbUBcs2-r97PhlppliKyYaQoDo_qolm_MyTGo40dOuc7ZB4WOUk9jM8CfOsGBiCRyrwXaA5q8p5tBfB5SR4a5fFEAC-xZ-nSOO1c3Z1hl6j4rG7ASsH1RDuEnyLS3OUDFyUtjGm51d5ccEUjyVTndqfVJ_NU6NovGFfkJ09II8mMSq8WITGMKrgNHLdXyifjpTP_675yDc3P31MOy40OaiFlMakZntYQm8KkaNfbeE455T2bj12bsJQIo4fCEHbOors67rVtFarD7pz0SoiNAkLMWqXLbwvLlJPr-oDd_FZQvI6WZKlV7lPXhOYlw3LFSk-skyemE-eObBDPznGrtY16Q4vD5DiUZ6u1K50xut9MCiZl56CMpMd0YJMi6ywVqK9fR3xkpUAW70AamTA9Id8PVve7RsSYw70es6Q7YNxoZMiUeDbKs4ObdMk8VEOqHm1TQ9HekP6tesQHCJKtLTtIaderqScdCs8U2Q8sDiTTnFPOilmo0nNFjrBMrHvKw036nXt3WprNiCiOZc2jak=w1215-h1262-no&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글에서 만든 &lt;code&gt;크로스플래폼 UI SDK&lt;/code&gt; 이다. WEB/APP 다 이거로 하면 된다고 만든듯 싶은데, 구글은 완성본을 오픈하는 회사가 아니라&lt;br /&gt;베타를 지속적 업데이트 하기 때문에, 조금 지나서 사용해봐야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것들은 자바스크립트 코드로 작성하면, &lt;code&gt;Android &amp;amp; Ios 앱파일&lt;/code&gt; 로 &lt;code&gt;build&lt;/code&gt; 해준다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가상화 환경 구성하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OS 선택하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React 는 이상하게 손이 안가고, Angular 선호 하기도 해서, &lt;code&gt;Google Native Script&lt;/code&gt; 를 선택했다.&lt;br /&gt;개발하려고 필요한 환경을 윈도우, 맥에 설치하는데 왜인지 모르겠지만, 원클릭으로 되지 않는다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;권한이 어쩌구 저쩌구&quot;&lt;br /&gt;&quot;adbmanager 킷이 어쩌구 저쩌구&quot;&lt;br /&gt;&quot;jdk 버전이 어쩌구 저쩌구&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진입장벽은 저런것들 이다. 저런 환경을 만들다가 지쳐버리고 포기하고 싶게 만드는 러닝커브의 대표적 장벽이다.&lt;br /&gt;윈도우는 그나마 설치하는데 매끄러웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.android.com/studio/install?hl=ko&quot;&gt;Android Studio&lt;/a&gt; 를 설치하고,&lt;br /&gt;&lt;a href=&quot;https://www.nativescript.org/nativescript-sidekick&quot;&gt;Nativescript-Sidekick&lt;/a&gt; 설치 후에,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에 접속하여&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;command&amp;gt; tns doctor&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 입력하면, 관련된 프로그램들을 알아서 설치해줘서 문제가 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맥에서는 권한문제, 폴더문제, Nodejs 문제 등등.. 대부분 권한문제가 대부분 이였고, 리눅스권한에 어두운 나는 &lt;b&gt;공장초기화&lt;/b&gt;를 진행하고,&lt;br /&gt;클린설치된 맥에서 다시 하나하나 설치하다 보니, 다른 개발환경이랑 또 다른 &lt;b&gt;버전문제/권한문제&lt;/b&gt; 를 일으키겠구나 싶었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 이걸 다시 반복할 자신이 없다. (윈도우 98 설치하던 때가 떠오르며)&lt;br /&gt;가상화 환경(VirtualBox/Vmware) 에 해당개발에 필요한 최소설치 만이 된 백업본이 필요하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 가상화환경 OS를 &lt;code&gt;CentOS&lt;/code&gt; 로 했는데, 뭔가가 잘 작동하지 않는다. 이유없이 멈추거나 한다.&lt;br /&gt;&lt;code&gt;Ubuntu&lt;/code&gt; 를 설치했더니, 아주 만족스러운 성능이 나왔다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;우분투 설치하고, 한글 언어팩 등록하기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://ubuntu.com/download/desktop&quot;&gt;우분투 Desktop 이미지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://inpages.tistory.com/102&quot;&gt;Vmware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://extrememanual.net/7223&quot;&gt;Virtualbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gabii.tistory.com/entry/Ubuntu-1804-LTS-%ED%95%9C%EA%B8%80-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%84%A4%EC%A0%95&quot;&gt;한글언어 변환&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괴로운 설정은 아니여서 설치법은 링크로 대체한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개발환경 설치하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Nodejs 10 버전 설치하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;NativeScript&lt;/code&gt; 는 &lt;code&gt;Nodejs 10 버전 이상&lt;/code&gt; 을 필요로 한다. 우분투의 터미널을 열고 아래를 실행하자.&lt;br /&gt;(&lt;code&gt;vim&lt;/code&gt;은 &lt;code&gt;vi 편집기&lt;/code&gt; 보다 유용하므로, 옵션설치 항목이지만 설치하는 것을 추천한다.)&lt;br /&gt;(&lt;code&gt;git&lt;/code&gt;이 기본으로 탑재됐을거 같은 느낌이지만, 그렇지 않기 때문에 설치하는 것을 추천한다.)&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;command&amp;gt; sudo apt update
command&amp;gt; sudo apt install vim
command&amp;gt; sudo apt install git
command&amp;gt; sudo apt install build-essential apt-transport-https lsb-release ca-certificates curl
command&amp;gt; curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
command&amp;gt; sudo apt install nodejs
command&amp;gt; node --version
v10.16.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 NodeJS 설치 까지만 한 상태를 기본으로 두고, 가상화머신을 &lt;code&gt;복제&lt;/code&gt; 해서 쓰기로 했다.&lt;br /&gt;(다음 설치를 하다가 문제 생기면 시원하게 지워버리고 다시 복제하기 위해서..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Nodejs&lt;/code&gt; 를 사용한다면 아래와 같이 권한을 획득해 두는게 정신건강에 좋다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;command&amp;gt; sudo chown -R $(whoami) ~/.npm&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JDK 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Android SDK는 &lt;code&gt;자바 8버전&lt;/code&gt; 에서 최적호환 되는듯 하다.&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;command&amp;gt; sudo apt-get install openjdk-8-jdk
command&amp;gt; vim $HOME/.bashrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키보드 화살표로 제일 아래로 내려가서, &lt;code&gt;i&lt;/code&gt;키 누르고 JAVA_HOME 을 추가후, &lt;code&gt;esc&lt;/code&gt;키 누르고 &lt;code&gt;wq&lt;/code&gt; 로 저장종료.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[추가:i]&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;export JAVA_HOME=$(update-alternatives --query javac | sed -n -e 's/Best: *\(.*\)\/bin\/javac/\1/p')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[저장:esc:wq]&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;command&amp;gt; source $HOME/.bashrc&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;KVM 설치 (옵션)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 계열에서 가상화환경의 작업관리를 해주는 것이 &lt;code&gt;KVM&lt;/code&gt; 인듯 한데, 정확히는 모르겠지만,&lt;br /&gt;안드로이드 스튜디오는 이게 성능이 좋으니 연동해서 쓰라고 조언해 준다. 모르겠고 설치...&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;command&amp;gt; egrep -c '(vmx|svm)' /proc/cpuinfo
4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;0&lt;/code&gt; 이면 host 운영체제가 가상화 지원상태가 아니기 때문에, 이후 설치는 &lt;code&gt;skip&lt;/code&gt; 하자&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;command&amp;gt; sudo apt install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그룹권한 처리를 해야 하는데&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;command&amp;gt; sudo adduser $(whoami) libvirtd&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 그룹이 없다고 나오면&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;command&amp;gt; groups&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하고, &lt;code&gt;libvirt&lt;/code&gt; 가 있는지 확인하고 그거라면&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;command&amp;gt; sudo adduser $(whoami) libvirt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;kvm&lt;/code&gt; 그룹에도 추가&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;command&amp;gt; sudo adduser $(whoami) kvm
command&amp;gt; sudo virsh -c qemu:///system list
command&amp;gt; apt install virt-manager&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치하고 나면 애플리케이션 목록에 &quot;가상머신 관리자&quot; 생긴다&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;command&amp;gt; reboot&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;안드로이드 스튜디오 설치&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.android.com/studio/install.html&quot;&gt;안드로이드 스튜디오 설치 권고안&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 설치는 권고안 대로 설치하지 않고, 블로그를 참조해서 만든 설치 방법이다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;command&amp;gt; sudo apt install libcanberra-gtk-module &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;?? 뭔지는 모르겠지만 설치 안하면 없다고 에러난다.&lt;/p&gt;
&lt;pre class=&quot;smali&quot;&gt;&lt;code&gt;command&amp;gt; sudo add-apt-repository ppa:maarten-fonville/android-studio
command&amp;gt; sudo apt update
command&amp;gt; sudo apt install android-studio&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 설치는 끝나는데, 안드로이드 스튜디오를 실행해서, 각종설정을 마치고 나면, &lt;code&gt;Android SDK&lt;/code&gt; 나 그 외에 필요한 소프트웨어를&lt;br /&gt;자동으로 설치해 준다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;command&amp;gt; /opt/android-studio/bin/studio.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정이 끝나면 &lt;code&gt;ANDROID_HOME&lt;/code&gt; 을 환경변수에 추가해 줘야 한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;command&amp;gt; vim $HOME/.bashrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키보드 화살표로 제일 아래로 내려가서, &lt;code&gt;i&lt;/code&gt;키 누르고 &lt;code&gt;JAVA_HOME&lt;/code&gt; 을 추가 후, &lt;code&gt;esc&lt;/code&gt;키 누르고 &lt;code&gt;wq&lt;/code&gt; 로 저장종료.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[추가:i]&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;export ANDROID_HOME=$HOME/Android/Sdk
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[저장:esc:wq]&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;command&amp;gt; source $HOME/.bashrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 설정이 끝났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;native-script&lt;/code&gt; 설치는 &lt;code&gt;JAVA_HOME, ANDROID_HOME&lt;/code&gt; 설정이 필수로 요구되기 때문에, 꼭 환경변수에 추가해 두자.&lt;br /&gt;혹시 설치 후 &lt;code&gt;/opt/android-studio&lt;/code&gt; 권한문제가 있다면&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;command&amp;gt; sudo chmod 777 -R /opt/android-studio&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹여 뭔가 부족한게 있을까 싶어서, 안드로이드 스튜디오의 &lt;code&gt;adbmanager&lt;/code&gt; 디바이스 하나 추가하고, &lt;code&gt;sdkmanager&lt;/code&gt; 에서 안드로이드 8.0 이상 체크하고 설치를 해두었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;네이티브 스크립트 설치하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치되는 것들이 정확히 뭔지는 모르고, 관심도 없어서, 필요하다 싶은거는 죄다 설치했다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;command&amp;gt; sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 libbz2-1.0:i386 libstdc++6:i386 lib32z1     
command&amp;gt; sudo npm install nativescript -g --unsafe-perm&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치과정에서 에러를 뱉어내지 않았다면은, 정상설치가 되었을 거고, &lt;code&gt;nativescript&lt;/code&gt;의 &lt;code&gt;tns&lt;/code&gt; 명령어를 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 &lt;code&gt;android sdk&lt;/code&gt; 확인하고 &lt;code&gt;build-tool&lt;/code&gt; 을 설치하자&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;command&amp;gt; $ANDROID_HOME/tools/bin/sdkmanager
command&amp;gt; $ANDROID_HOME/tools/bin/sdkmanager &quot;build-tools;25.0.2&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;NativeScript&lt;/code&gt; 는 &lt;code&gt;Android SDK 28&lt;/code&gt; 또는 그 이상의 버전도 요구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 스튜디오의 &lt;code&gt;Configure &amp;gt; SDK Manager&lt;/code&gt; 에 가서 &lt;code&gt;Android SDK 28&lt;/code&gt; 버전 설치를 하자.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/tx6ftTn_PkfYl7FZePPuq-7Yh4cCCsp2vOndbRFJbuflqHR9bsqel_uZ-ghCqWQg0OiWxa6toL00tfvfcgBVv4Pey_Ii6pkktF7MnsvCXatDxJ2KrnTF-hSup98y5oDVGw-asVQZAPHRdjaHKXuJLh_5TPYX5tfrGAiJkZCYwccZjCuXwhwAe-1woSiUu6uaHBjcXc4QRpYLj8RkT3mH3i0mZMUd73-C7ZOkpg5JKwmO06NmY6FzOJHTcHCmTwZYN7yM3tZhLMpi5uDnVfcKcEydo1djn-aFCj7B2Q5qHpgGeY3HHsVaUNiLLHidzE8IMvgw8adfohNP1NOOXKLS-qHLdEV0c4CRfnxoYccDOrlzvi0TX030-5mTzd9tyyYdytlrtX2lsCJv-UMOC2veQ6FBl0076wMnR2VkYvUrzYG60Tv0MByS69sOznd6TTbpZ-knSYS7ZbpVxlJzb9Rpdgmt7NJfdGeWMduNXk9a_sud3T84IqUImtXfhKtUQUyPw89q32ky9TY2RCd3fwpA8zzCHlbLqVhyVYO02QbeuJG4dOShHBRQf6Rbp2PHdt2hFoTIzHmnzjNV7pHooHqR0RJu2F8Kryx3AgRYekfbJrbHsPFx1g4KDq8KynoOTgmYutsB8-dnNoW5p9V3ubtEkMCrqJIGIITp=w1234-h767-no&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/TiSdomp2ivd-Okkcr9X0awc84lY_RuH55B3_ZnH1Yw3QcFZ3HCXj3td-CEnT83SAdvhKdRW2T35dVMcfLvYydXaZ0qe6jSIZBohTKJBxt1fzKnNEfUpqq_9oxi4urj1GTvd2CsnFoF0ujx35CPtTT_HnpjL8fP-x5laHGLF49jkJ3mhkH1Gw7ySuK9SqKFbJJnAnIjmLd343NO2KFvs3sBeINWux0UAG6MJGFvg_8jazWMrSI04UY3Cp7moxBLWBAHNkUrTCHDj1zZPDlzyWSeJ9okgY6paEbSTKP5G5_TK9wWxMV7uwYUnBY1uBowklnvQu5Knwsp4zMzKRECoiq0tGLSHuJxyNPulUPENldttqExKnA_NFPxCREuTBCwTWKh9FfxOrJ7JJhJct2VuzHqu7Sg8SfijqmvBXEE2m8y3B_Ei0VRyLL1j9JSho727uGWkrXTakujbctF1PoSea3zVzIDg-PsNbZvC0viw_ws7WWz7vUZ6YVAuuYAoPPG0gn9Kr4Ttq5U_Qy-SQQWQp-lWTYyfrtEP7wfGGbIC0kkByy0G_c7rb7uNJrBTSoWJJ9y6K98vPbgnHyrnWu6M7HLhsgjzW2IMqOAOjTxXRvT9Ro5LazKDC88K51bqNQxle9WtMsiPQiYrOglnanIR8lAG4Ky8BEkyH=w1234-h767-no&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 &lt;code&gt;tns doctor&lt;/code&gt; 로 부족한 환경이 있는지 확인한다.&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;command&amp;gt; tns doctor&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;No issues were detected&lt;/code&gt; 가 나오면 성공&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/XEYR9lkdSGBrFhwI-fAC3qgxAg_NGOd0-fgjWFE90Zbq5urZ6fH4fn3iP2-OJkm1eMB0ydDvIXMOvifAqdZw1ib4GjSpVTy7YWq73adq7E52ivRFAGuyK19wNrgwaPptlckLVAxCN3WoQH-MNb4Tj14tkQS05hyUGtYqvkYI-Axuz5h8KNTqqRwep-MpAsZ25ed5iCXNX5rwrOt0QVLfQBvQ_hhbilmHd0XQWY8yCJJrIApPytA_Ush6IixZzWqfoTt7hxUNL16mbB5P8KOvemH5_i7Gak8E-kUh_7kVSWj9SsQalJbSS-7VIQ3Ch-fBDSw5sOHJ8cgoSuVRX_BnYulcvd0tBXVhXx9IWPVx1nC9mLxCpC7-LZcbPZLX4ZK3lLKWEjqfLqC9_Zty0iJQOSmkiAgdea3JG0LIh3jUHUR7alF8OV1xMN5PMzS2UTPpk_inBsM5WzdSCYEaSijon9sWNLhrLVxvW8UpcTW3rMQWhoqYWDB-KOxIVp-kRcnXVWmrikiywk0CzEDKhVAAGUXWQfRsKJkZzdVDraHmMHuJC3avmtSUy3rpFEAmtyWp7ReFLCjfXKvTpZv7J4Gw93tHPnFJFobVgZ6FtaqlFXz8tVsNwCiHUeQnuZWVj0jegXYXLEHMNhYbzs8yxYwzvU4wVD7JfLWD=w1234-h255-no&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 구글이 제공해주는 코드샘플과 에뮬레이터 도우미 도구인 &lt;a href=&quot;https://www.nativescript.org/nativescript-sidekick&quot;&gt;sidekick&lt;/a&gt; 를 다운받아 설치하면 끝이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;linux version&lt;/code&gt; 을 다운로드 하면 &lt;code&gt;.deb&lt;/code&gt; 파일이 받아지는데, 설치패키지 파일이므로 실행하면 설치된다.&lt;br /&gt;(아이콘이 없는 상태로 설치되는데 왜그런지 모르겠음.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 설치하고 싶으면, 터미널을 열고 다운로드 받은곳으로 이동해서&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;command&amp;gt; sudo dpkg -i NativeScriptSidekick__amd64.deb
command&amp;gt; sudo apt-get install -f # Install dependencies&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 &lt;code&gt;Native Script&lt;/code&gt; 사용에 필요한 최소한의 설치(?)가 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 가상화파일을 기준으로 프로젝트가 생길때 마다 &lt;code&gt;복제&lt;/code&gt; 하여, 독립된 개발환경으로 사용하기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 성능문제가 있지 않을까 심히 고민했는데, 그냥 &lt;code&gt;virtualbox, vmware&lt;/code&gt; 의 스펙을 최대한 올려서 구동했더니, 나름 빠르게 동작해서 불편함 없이 사용할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포토샵은 설치가 안되서 이미지편집은 &lt;code&gt;GIMP&lt;/code&gt; 로 하는방법 뿐인거 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ubuntupit.com/top-10-linux-photoshop-alternative-photo-management-software/&quot;&gt;Linux 이미지 편집툴&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>환경</category>
      <category>nativescript</category>
      <category>가상화</category>
      <category>우분투</category>
      <author>richready2011</author>
      <guid isPermaLink="true">https://diff-frontend.tistory.com/19</guid>
      <comments>https://diff-frontend.tistory.com/19#entry19comment</comments>
      <pubDate>Tue, 20 Sep 2022 22:21:51 +0900</pubDate>
    </item>
    <item>
      <title>ES5 -&amp;gt; ES6</title>
      <link>https://diff-frontend.tistory.com/18</link>
      <description>&lt;p&gt;&lt;code&gt;Ajax&lt;/code&gt; 의 관심도가 증가하고, &lt;code&gt;Server Side&lt;/code&gt; 에서 &lt;code&gt;Client Side&lt;/code&gt; 로 변화하면서, 현재의 자바스크립트의 고도화 필요성이 생김.&lt;/p&gt;
&lt;h2&gt;ES6 는 무엇인가&lt;/h2&gt;
&lt;p&gt;현재 우리가 사용하고 있는 것은 &lt;code&gt;ES5&lt;/code&gt; 이고, 2009년에 제정됨. 이후 2015년 &lt;code&gt;ES6 (ECMASCRIPT 2015)&lt;/code&gt; 제정되어 현재는 컴파일 과정을 거쳐서 &lt;code&gt;ES5&lt;/code&gt; 변환 후 브라우저에서 인식하는 것이 현대의 흐름이다.&lt;/p&gt;
&lt;h2&gt;컴파일을 위한 TASK RUNNER&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Grunt&lt;/li&gt;
&lt;li&gt;Gulp&lt;/li&gt;
&lt;li&gt;WEBPACK&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;그 외에 브라우저가 채택하고 있는 표준&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;BOM (Browser Object Model)&lt;/li&gt;
&lt;li&gt;DOM (Document Object Model)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;주요 변경 사항&lt;/h3&gt;
&lt;h5&gt;let, const&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;let&lt;/strong&gt;.  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;블록단위에 scope (수정 가능)&lt;/li&gt;
&lt;li&gt;루프문 안에서는 매번 새로 생성됨 (for, while등)&lt;/li&gt;
&lt;li&gt;윈도우의 속성이 아님&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;const&lt;/strong&gt;. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;let 과 동일하지만 선언 후 수정이 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Arrow function&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;함수를 간결하게 작성할 수 있도록 람다식표현중 &lt;code&gt;Arrow&lt;/code&gt; 가 추가됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;
// ES5
var selected = allJobs.filter(function (job) {
  return job.isSelected();
});

// ES6
var selected = allJobs.filter(job =&amp;gt; job.isSelected());

// ES5
var total = values.reduce(function (a, b) {
  return a + b;
}, 0);

// ES6
var total = values.reduce((a, b) =&amp;gt; a + b, 0);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;화살표 함수표현식 으로 인해, 이전에 사용하던 &lt;code&gt;this&lt;/code&gt; 를 참조하기 위한 구문이 필요치 않다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;//ES5
{
  ...
  addAll: function addAll(pieces) {
    var self = this;
    _.each(pieces, function (piece) {
      self.add(piece);
    });
  },
  ...
}

// ES6
{
  ...
  addAll: function addAll(pieces) {
    _.each(pieces, piece =&amp;gt; this.add(piece));
  },
  ...
}

// ES6 with method syntax
{
  ...
  addAll(pieces) {
    _.each(pieces, piece =&amp;gt; this.add(piece));
  },
  ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;function arguments&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// ES6
&amp;#39;use strict&amp;#39;;

function loop(func, count = 3) {
    for (var i = 0; i &amp;lt; count; i++) {
        func();
    }
}

function sum(...numbers) {
    return numbers.reduce(function(a, b) { return a + b; });
}

loop(function(){ console.log(&amp;#39;hello&amp;#39;)}); // hello hello hello
console.log(sum(1, 2, 3, 4)); // 10&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;for/for in/for of&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// Before
for (var index = 0; index &amp;lt; myArray.length; index++) {
  console.log(myArray[index]);
}

// ES5 추가 (return, break등으로 탈출 불가)
myArray.forEach(function (value) {
  console.log(value);
});

// Object를 순회하기 위한 방법
for (var index in myArray) {
  console.log(myArray[index]);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;For-in 은 객체의 순회를 위한 반복문으로 몇가지 특징을 가진다.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;prototype chain도 순회한다.&lt;/li&gt;
&lt;li&gt;순서가 무작위이다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;var index&lt;/code&gt; 가 &lt;code&gt;string&lt;/code&gt; 이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For-in도 순회문 이지만 몇가지 특징이 있다.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;break/continue/return 등으로 탈출 가능&lt;/li&gt;
&lt;li&gt;배열순회용 이기 때문에, 정확히 객체의 배열만 순회한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Template String&lt;/h5&gt;
&lt;p&gt;새로운 문자표현식이 추가되었다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;console.log(`Hello ${a} I&amp;#39;m ${b} year&amp;#39;s old`)&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;Module&lt;/h5&gt;
&lt;p&gt;기능별로 파일을 구분하여 페이지에서 로딩하였으나, &lt;code&gt;export&lt;/code&gt; 와 &lt;code&gt;import&lt;/code&gt; 구문을 통해 모듈을 로딩 할 수 있도록 추가 되었다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;
// num.js

export const random = Math.random(); 
export function double(x) { return 2 * x; }

// 혹은

const random = Math.random(); 
function double(x) { return 2 * x; } 

export { random, double };&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;다른 모듈 에서는 &lt;code&gt;export&lt;/code&gt; 로 불러올 수 있음.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;
//main.js 
import { random, double } from &amp;#39;./num.js&amp;#39;;

// 불러올게 많을 때 한번에 부를 수 있다.
import * as num from &amp;#39;./num.js&amp;#39;;

// 이름을 바꿔서 불러올 수 있다.
import { random as ran, double as db } from &amp;#39;./num.js&amp;#39;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;Promise&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;비동기 통신이 늘어나면서 콜백에 대한 번거로움을 해소하고자 도입됨. 통신에 한정되지 않고, 무한하게 활용할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// ES5
&amp;#39;use strict&amp;#39;;

function sleep(callback, msec) {
  setTimeout(callback, msec);
}

sleep(function(){
  console.log(&amp;#39;wake!&amp;#39;)
}, 1000);


// ES6
&amp;#39;use strict&amp;#39;;

function sleep(msec) {
  return new Promise(function(resolve, reject){
    setTimeout(resolve, msec);
  });
}

sleep(1000).then(function(){
  console.log(&amp;#39;wake!&amp;#39;);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Refer : &lt;a href=&quot;http://azu.github.io/promises-book/&quot;&gt;http://azu.github.io/promises-book/&lt;/a&gt;&lt;br&gt; &lt;/p&gt;
&lt;h5&gt;Class&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;자바스크립트 에서도 클래스를 지원하게 되었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;
// ES5 
function Box(length, width) {
    this.length = length; 
    this.width = width; 
}

Box.prototype.calculateArea = function() {
    return this.length * this.width; 
}

var box = new Box(2, 2); 
box.calculateArea(); //4

// ES6
class Box { 
    constructor(length, width) { 
        this.length = length; 
        this.width = width; 
    } 

    calculateArea() { 
        return this.length * this.width; 
    } 
} 

let box = new Box(2, 2); 
box.calculateArea(); // 4&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;클래스를 확장하는 것도 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;
class Shape {

    constructor(color) {
        this._color = color;
    }

}

class Circle extends Shape {

    constructor(color, radius) {
        super(color);
        this.radius = radius;
    }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;또 다른 예&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// ES5
&amp;#39;use strict&amp;#39;;

function User(name) {
  this._name = name;
}

User.prototype = Object.create(null, {
    constructor: {
        value: User
    },

    say: {
        value: function() {
            return &amp;#39;My name is &amp;#39; + this._name;
        }
    }
});

function Admin(name) {
    User.apply(this, arguments);
}

Admin.prototype = Object.create(User.prototype, {
    constructor: {
        value: Admin
    },

    say: {
        value: function() {
            var superClassPrototype = Object.getPrototypeOf(this.constructor.prototype);
            return &amp;#39;[Administrator] &amp;#39; + superClassPrototype.say.call(this);
        }
    }
});

var user = new User(&amp;#39;Alice&amp;#39;);
console.log(user.say()); // My name is Alice

var admin = new Admin(&amp;#39;Bob&amp;#39;);
console.log(admin.say()); // [Administrator] My name is Bob&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// ES6
&amp;#39;use strict&amp;#39;;

class User {
  constructor(name) {
    this._name = name;
  }

  say() {
    return &amp;#39;My name is &amp;#39; + this._name;
  }
}

class Admin extends User {
  say() {
    return &amp;#39;[Administrator] &amp;#39; + super.say();
  }
}

var user = new User(&amp;#39;Alice&amp;#39;);
console.log(user.say()); // My name is Alice

var admin = new Admin(&amp;#39;Bob&amp;#39;);
console.log(admin.say()); // [Administrator] My name is Bob&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Reference : &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/create&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/create&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Generator&lt;/h5&gt;
&lt;h5&gt;await/async&lt;/h5&gt;</description>
      <category>자바스크립트</category>
      <category>ES6</category>
      <author>richready2011</author>
      <guid isPermaLink="true">https://diff-frontend.tistory.com/18</guid>
      <comments>https://diff-frontend.tistory.com/18#entry18comment</comments>
      <pubDate>Thu, 1 Sep 2022 22:15:38 +0900</pubDate>
    </item>
    <item>
      <title>display: grid</title>
      <link>https://diff-frontend.tistory.com/17</link>
      <description>&lt;p&gt;@참조 : &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.usefulparadigm.com/2017/03/31/a-few-ways-to-make-a-grid-layout/&quot;&gt;http://www.usefulparadigm.com/2017/03/31/a-few-ways-to-make-a-grid-layout/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hackernoon.com/the-ultimate-css-battle-grid-vs-flexbox-d40da0449faf&quot;&gt;https://hackernoon.com/the-ultimate-css-battle-grid-vs-flexbox-d40da0449faf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3schools.com/cssref/pr_grid.asp&quot;&gt;https://www.w3schools.com/cssref/pr_grid.asp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Grid_Layout&quot;&gt;https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Grid_Layout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sonim1.com/198&quot;&gt;https://blog.sonim1.com/198&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;grid&lt;/code&gt; 는 css 로 레이아웃을 구현을 도와준다. 이전에 &lt;code&gt;table&lt;/code&gt; 태그로 레이아웃을 설계했을 때처럼, 중앙정렬 이라던지, 격자형태의 레이아웃 구현을 가능하게 한다.&lt;/p&gt;
&lt;p&gt;현재의 레이아웃 구현방식은 &lt;code&gt;block element&lt;/code&gt; 에 높이나 너비를 조정하고, &lt;code&gt;float&lt;/code&gt; 나 &lt;code&gt;position&lt;/code&gt; 을 통해서 해당요소를 배치하는 형태이다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;grid&lt;/code&gt; 는 &lt;code&gt;flex&lt;/code&gt; 와 성격이 비슷한 부분이 있기 때문에, 비교대상이 된다.&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;grid&lt;/code&gt; 와 &lt;code&gt;flex&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;flex&lt;/code&gt;와 &lt;code&gt;grid&lt;/code&gt;가 박스모델을 배치한다는 성격의 유사함 때문일까? 표준문서에서도 이를 서두부터 비교하고 있다. (&lt;a href=&quot;https://www.w3.org/TR/css-grid/#intro&quot;&gt;https://www.w3.org/TR/css-grid/#intro&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.w3.org/TR/css-grid/images/grid-layout.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;flex&lt;/code&gt; 가 &lt;code&gt;가로축 혹은 세로축 기준의 1차원배열식&lt;/code&gt; 으로 나열 한다면, &lt;code&gt;grid&lt;/code&gt; 는 &lt;code&gt;가로,세로축을 가지는 2차원배열식&lt;/code&gt; 으로 나열하는 방식이다.&lt;/p&gt;
&lt;p&gt;즉 한방향으로 배치하는 것(가로축 혹은 세로축)에는 &lt;code&gt;flex&lt;/code&gt; 가 맞다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/1600/1*h6dcLWRp0lXeWklPAFK8cA.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;가로세로축을 생각해야 하는 배치에는 &lt;code&gt;grid&lt;/code&gt; 가 더 어울린다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2000/1*AxItLokVtaF56WMo_ZF6Pw.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;flex와 grid는 분명한 용도의 차이&lt;/code&gt; 가 있고, 성격적으로 보자면, 구글의 이미지검색 서비스처럼, 적층식으로 나열하는 방식에는 &lt;code&gt;flex&lt;/code&gt; 가 어울리고, &lt;code&gt;2차원 형태의 레이아웃 구현&lt;/code&gt; 을 위해서는 &lt;code&gt;grid&lt;/code&gt; 가 좋아 보인다.&lt;/p&gt;
&lt;p&gt;예제로 비교해 보자&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;header&amp;gt; 
    &amp;lt;div&amp;gt;홈&amp;lt;/div&amp;gt; 
    &amp;lt;div&amp;gt;검색&amp;lt;/div&amp;gt; 
    &amp;lt;div&amp;gt;로그 아웃&amp;lt;/div&amp;gt; 
&amp;lt;/header&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
header { background: gold; }
div { color:hotpink; padding:10px; }
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/uem1kJHBx2WME4R_Lii1faPNtPs43z1IhbfEVjCayceT-SjAZFNc14KTCyqt9nz-XZ9agSSUM4rNMUUuUVb7SR5gotZUS7DqdFF8wtQzs-j4IuonvOmRWlZEU5bfRGPGdh3GyTbqLPJsOMc28fxSTosOOH6AjyJg-XVrYKDHIOH5sxaeaQYWGYAs6qxzU-jOgh_s5kswFm0FP858rNdx1PEAPEaaoTuuYw0KNsYFa12vYp6msCFyGXfBARBNJhd18Z0lHOx2w9969KjUpnJ44AubkzXuLsMeKpbhLGuXfOe59FhYYsB6rmfY185eCiD-zCESqO2_lt5j6MBqqaQINVEj_qJIdMmb9JLri9zbq-HaILmWoIBJlaHV6QtVKwbuJ8rM0hJMnc4GD66UOt1HYXlKNds9Q-2exPEn2VhABimWG9qLuakr31DfAZ0c1k6NKBxJfHEsORSPkpvnGWRCWQLNZAgJxhMYYxPStBMnt3ihsZBz7IAyr2GUCSCXH2ofMQMjQE6UlaeGZjoEH7XVSxcWp-CQ0a6C0vW3zjlBmbvuXxa6NYFgM3y7nFZakxnxzA5G0Ep_Z9VO0A_KqbABFn2lKJVZW3XME7L-Qq0pC3LCN-pTIH6yMiS7Y6CSD7oG9Vahw6I8uA4iZfySLRjLYKJxwOneWphx=w1438-h1244-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;여기에 &lt;code&gt;flex&lt;/code&gt; 를 적용하자&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;header&amp;gt; 
    &amp;lt;div&amp;gt;홈&amp;lt;/div&amp;gt; 
    &amp;lt;div&amp;gt;검색&amp;lt;/div&amp;gt; 
    &amp;lt;div&amp;gt;로그 아웃&amp;lt;/div&amp;gt; 
&amp;lt;/header&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
header { display:flex; background: gold; }
div { color:hotpink; padding:10px; }
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/nG0P925dveiNFUtR5QVFcxCbEyB-wlS2_cE9nBMeWxa2-1O8UvktMnDtrh3dcYVxnJ-nDViuuEUjDUGCvqEnwPAqF9x9L-ScNOIIFPdCFK-TBdWGTMmwYxbS0K61GMXZfWNtm2pFI9HFEPjoENwyHZHc0IDPZMGhHr3neT-6vG-5ZcamKMrBVQU0PMg0dCxizY8jWHD9Szw6fMeuVY7KLfYgTJbsgR4xjb2fj4PQpz3PPfTocIdtQ6HjhkJuSDsDMkteOgj3Y_VMHVHBVEAoJ3uZAoQOMy38B380w8uT-5DoswLggzpDHJ90bF0zoh0CEJxllCuFTEaQWO_x_0lSMJ4KumUVxdj606ScCJkjT6vuJz0QNFLAbDoNgsAbV2h6MrMieQfy4EbOD5pe4206_ZtD6vTj7yyS9kiI43t2A6XfCUfjC8NOqslUbzG-Hl118tjReGnux2oPBcKFFTThFRbaEn188Nvh80eZEq_OTRnJoD748Ve82YPJfi60BZzss_q8ucVD1kTUFSELFU6MuiDWGvBqaG3gDqNfizsQtmZQg5V33oIiGAZMl5bchCiv6Ck9ZVOzypgOzGqKg0Uh72sjIM2zhRLrfYcyMsAtr0sVI9YWidsI8vAiHnwChOGJViTCCCjR-2_k2ZzwQiC_8nQO6xh_9-VW=w1526-h1332-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;여기서 &lt;code&gt;로그아웃&lt;/code&gt; 버튼을 우측에 배치한다면 아래와 같은 코드가 될 것이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;header&amp;gt; 
    &amp;lt;div&amp;gt;홈&amp;lt;/div&amp;gt; 
    &amp;lt;div&amp;gt;검색&amp;lt;/div&amp;gt; 
    &amp;lt;div&amp;gt;로그 아웃&amp;lt;/div&amp;gt; 
&amp;lt;/header&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
header { display:flex; background: gold; }
div { color:hotpink; padding:10px; }
div:nth-child(3) { margin-left: auto; }
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/5o6GnaYkMfIyTWEj6dvQdw-rDsbkrH7L6aKrpbpvzE9eeRdCd2ifY_YwO755Csf7qXbJVtKK64Y6fCifWcU7NJ3mdWQaceBaSEc3Hl5OT4RLAqcalFIJpZlJvtfGuz-m8zLmKEqzKjx3d0NvpfsuvrUDye4jtKB2f1eSIMcGjO0U5cjjMmlLhdchTXvaSu-c8gtgIe5mhlwUfyzsSBSyRxHA-_7eT2xB6HMHOI3l5x626nKrB0QUrcQZf3hekYChaPeG5NSIH8hCsMvJ3K6sNO3WbuCeQj3nb7VvydM6YttUkkaSaR-N8idUbrlkzYJ71UNUvAjSrvjjP2eNt3P58yKWfI__NeYdDHfnKnxcIXjLaqrrTcCLEn7-Kr4yjDyaIrofZa4EQq-zw546t8uby_-bcVnSVf21PRehIt--bGgiL25UHpJ32gXhT3UA1c0lImmWD5zAB4cQLKruSbLGGqjrhiyN1Voo2TltPYBenb-E5w44gOENqbzDrUgpDC1KxIINZAG33SlzXIo3E8BXq2D1CekBcaNgy86_BKEpLJO1N73lPFgyX2maRdSzOHNRiQ2VHEfqFDifs2640gCBaaDUV84jLHrCorWsIby0x3FICf32ykrFVfvAkSfMh2UI2FXqoZhSbPkc6ZtRkATm6JFqlrM0p0sS=w1526-h1332-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;가로형 배치에 대해서 예제를 보았다. 이것을 &lt;code&gt;grid&lt;/code&gt; 로 변경하면 다음과 같이 된다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;header&amp;gt; 
    &amp;lt;div&amp;gt;홈&amp;lt;/div&amp;gt; 
    &amp;lt;div&amp;gt;검색&amp;lt;/div&amp;gt; 
    &amp;lt;div&amp;gt;로그 아웃&amp;lt;/div&amp;gt; 
&amp;lt;/header&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
header { 
    display:grid; grid-template-columns : repeat(10, 1fr); 
    background: gold; 
}
div { color:hotpink; padding:10px; }
div:nth-child(3) { grid-column: 10; }
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/TKrW0v2AFqjoZXy7an_WF62jHoH4eYdRlBTC3BxZVjRQX5zrW_uSDK5IKSstiKTaGGypc7xvTTGe3S_dfFv9TJVWlXtlXRRaw9_dXKd-iWBTpT75mTLQdAKc05sQQkk34ZujfgBBR88SJw7IktKTb-V4xM03OJzNL3ECI5OEQJhFA7yA794D_bM43KODxcv87etPrwQ032VFHaJ3VDgo8ALgjWKZPwm65jq76CRb4N8b-QgdMj6Owj8ZgXu8bL-TPRQ50qxbkz140LxFn4-tRRM9d4tgh3gowCgvJbnaPpNIPq_4AZLcjV--y5OSvwtK1myfO7Q9DtbQNA3Zf1O-PTsYN2IL06nbLQHo9opvPPipt7yHn9J_jtik_pKdF0nxv3Fo6uTkTnnUJtUkW54qIl9XMkd5ncDCvD5iOsR_bs2VKPhBFxbFgIXyoytulQFJ_eu6AtuM2D2YdYYQHILRidQVvlYBHfWQ7ZnQglFX37HqFynXREEFultcyhkVy8Ta4Yu21pnpW5jdOTIzt5xiBykJ049986bcCWa6E4WSsj6DZyn4OAS_T_pb0p-o7aDsx2C0cZtYyojG8H9XWtles1FZC22ebD1c3w_E1kc50HHPTj7qkJh7cmS_WQdcylYFgfMMcOlG8ch3TPVsddGc39MqZUD0Gn4g=w1566-h1468-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;grid&lt;/code&gt; 는 사용할 때, &lt;code&gt;column&lt;/code&gt; 을 어떻게 나눌지를 &lt;code&gt;grid-template-columns&lt;/code&gt; 를 사용해서 지정한다. &lt;code&gt;flex&lt;/code&gt; 는 해당 컬럼을 어떻게 나눌지 지정을 안해도 자동으로 배치되는 것과 다르다.&lt;/p&gt;
&lt;p&gt;만약 &lt;code&gt;grid-template-columns&lt;/code&gt; 를 지정하지 않으면, &lt;code&gt;column&lt;/code&gt;에 대한 지정이 없으므로, 종렬로 자동 등분된다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;header&amp;gt; 
    &amp;lt;div&amp;gt;홈&amp;lt;/div&amp;gt; 
    &amp;lt;div&amp;gt;검색&amp;lt;/div&amp;gt; 
    &amp;lt;div&amp;gt;로그 아웃&amp;lt;/div&amp;gt; 
&amp;lt;/header&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
header { 
    display:grid; 
    background: gold; 
}
div { color:hotpink; padding:10px; }
div:nth-child(3) {  }
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/NNIovZg-zSUhr2ubOr_pXYSum7879ZE3sdkuy30l-D1D__XSuRcdoBA8Ev1karPiScq2typ37jA6Zcut1oIfXNdJVjZH7kbdduaXIs_nMss94W7xXt4UfglUdpBqNVd-di1y76cfxlq3FBY5krtB5G3Agxl5aEC1gp5XQ_w4G4WQ2yTU7d9dBB4EuVqadbmOYnEHRtwFXp3jU8T-_tGCJU0rVjmfk25AkHR0CNt5LCpXrQiClmZaYPiFnwJyDYWm7MUIh2UJ0B6PV9hvQoTlnGPwRDfJ_WGcraDkw-BPHlk3iT_pnsOyGk2B2ErZq6ZVWLcMWKWe-SLpZSBEkTDp3mrCgKXZEMriACUN46FF_NP0FqLJV3xWZzHjWe906i1ueEHXvptvgdnQ_rHVcOwNS9dN7_DRpGkNQXuz4BlMopGFswSyIIl_wqoRItKTNRUosfyhYWUeqIXiw6B9uuetC0DpNcqVUUA6l0ChjPG1d646Ye8MXKgGlrqdqIp4Ck5ZHRyB58EqJhrk-gWMaO2zLSnUDfm0vBOkngelZcoEmjl4b5je42fa_mG1etOanSWyC3_yS8tUs9gu0CykrQn4uA1TZBh1Q2rQgOq8iurA4eutNG1i7QuSnyyoTd5KFnNR2WF48UsNsP5HpS5T-tMA5kunYOeu0v3_=w1566-h1468-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;본격적으로 &lt;code&gt;grid&lt;/code&gt; 의 속성들을 들여다보자.&lt;/p&gt;
&lt;h2&gt;grid 컨테이너가 가지는 속성&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;display: grid&lt;/code&gt; 를 설정하면 &lt;code&gt;grid&lt;/code&gt; 속성을 사용할 수가 있다.&lt;/p&gt;
&lt;p&gt;이 속성은 6가지 다른 속성에 대한 축약형이고, 기본값은 &lt;code&gt;none&lt;/code&gt; 이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;grid-template-rows : 세로축 지정하기&lt;/li&gt;
&lt;li&gt;grid-template-columns : 가로축 지정하기&lt;/li&gt;
&lt;li&gt;grid-template-areas : 미리지정된 그리드영역의 이름을 이용해서 배치&lt;/li&gt;
&lt;li&gt;grid-auto-rows : 배치되는 아이템의 높이 지정&lt;/li&gt;
&lt;li&gt;grid-auto-columns : 배치되는 아이템의 너비 지정&lt;/li&gt;
&lt;li&gt;grid-auto-flow : 배치의 흐름을 지정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;grid: none|grid-template-rows / grid-template-columns|grid-template-areas|grid-template-rows / [grid-auto-flow] grid-auto-columns|[grid-auto-flow] grid-auto-rows / grid-template-columns|initial|inherit;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;grid-template, grid-template-rows, grid-template-columns&lt;/h3&gt;
&lt;p&gt;그리드 아이템들의 &lt;code&gt;너비,높이&lt;/code&gt; 를 어떻게 가져갈 것인가에 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&amp;quot;grid&amp;quot;&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;1&amp;lt;/div&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;2&amp;lt;/div&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;3&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;4&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;5&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;6&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;7&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;8&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;9&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;1000000&amp;lt;/div&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
.grid { 
    display:grid; 
    grid-template-columns : 20px 20px 100px 20px 30px; 
    background: gold; 
}
.grid-item { 
    color:hotpink; 
    padding:10px; 
}
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/MDclbrc783ohuwHci8TFgGULo127fDJzug-oo66lRk8EQC5R3adSV_uYIdBLnWWvI2VnZrmhE-WBQ-NT0v2cCfpufu1GUxADUNJJFIQcDa9Kx6LyhEbu2KwJKDh-u8IyIZz5Nj5oeOwU2zGU-8K05YH85e7--9F_tj20MScue0uVxMOEwe3gdSa466qj4550f2KJspNnX04bayGUo_AUCXWuCWru82r4dJzgy4W1IF3oFmIZQU3SRJqkcYc9ur2JWCVtfzoIheRsPg18OoXx_uTtK3h3tnYxjW5D9Zt3hkXod-NE7aNdbEqrw2NoTtPWUeYQr2ATLFZxlmkk0vZP2zRa7eU041au3YszoVfVhZlARptdOvkTw6xHxWqnuRcM_lND_P9iFLNUIGkIJdFJBdIkWdGzusPp3eKGuvJw_pmRJAhefpUiHNfjqJ4NyLPZKV4oUwrNAucsPFZ3nyhy093Sgu70ccRN6JYVRl1ewHCRH2diJS2c7wO5DryC8mTwTylzDL5rhyJ0JddaLSjUrKEsdOjGHcg0nilNP6vExJ4QgLZABN13vSt_y4UldutMKgDE7kIwgFkGXjkQDFWGu24JZaHGz3PMMY5Pu8F5G1KxWlvGCeTgCwci60OiMSzxMtNbSpGdRo-k8ocMcViyj9rxhbFMbRcb=w1566-h1468-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;grid-template-columns&lt;/code&gt; 에 5가지를 대입하였기 때문에, &lt;code&gt;.grid-item&lt;/code&gt; 의 배치들이 5컬럼으로 표현되었다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;grid-template-rows&lt;/code&gt; 를 대입해 보자.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&amp;quot;grid&amp;quot;&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;1&amp;lt;/div&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;2&amp;lt;/div&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;3&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;4&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;5&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;6&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;7&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;8&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;9&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;1000000&amp;lt;/div&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
.grid { 
    display:grid; 
    grid-template-columns : 20px 20px 100px 20px 30px; 
    grid-template-rows : 50px 50px 50px;
    background: gold; 
}
.grid-item { 
    color:hotpink; 
    padding:10px; 
}
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/P_LB1EfqrX2j8YJZVUgTVDcUPrrVzZkA_ExyEeg78D-qn2pH5aYyp7_sID4bHwXMvmVtLD-g3imA6X509Z-A0a5S3cQBQ8Rm7YlT82FtTI0O5Xzzbvelg00WW8CEjguNEsCWzm17LKY2ViSo4qY1-RTh_m5L6d7tuDDEvuJHqIulF17Q_l0NC8YBGkJmijsMu0UhLtUElBIa6hFGfV5PYAJ1EVjDFL4aZiQ6__JNigyi25DzRZwGCd9VutLAKCHbsIiWe1mLrjU8_9eOycqmlDw4yITJVQfHIq5Dkvntqk-CBAqdkNivp9lSnOaQR6NUkj_l1mQqLhzaaovmW2lwLvzcxJdUg6QiBe5BjnmY1KiEuREj9l7njTUpX_wTlXkodcyhIqhmC28dGg4eVMBnFRaFjMnP6btF0SwQM2e4jO5pKSszNLXafvWaWa9_Rgp5ADQvCTVBBsRAztMqc2Dp8fYKB2FnYlJ87aLWVT8Axkzwm96pC2lheYnKQpLoc6_3kzomTM4ru8AkLWU4hLArTgoK9_f4bObMNGPW9JL_YYuljuXa3E8vfl-20Zy9p5Up7IpEktWIpbL4coC_jDMzeA3DUgGS3sYc-plwcZ8z9hnnEh_u1hvg_n5BCrv80G_hrRyYiWT3DtBeT5LZxzjwNViA0HLb_d4r=w1566-h1468-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;rows&lt;/code&gt; 로 3가지를 지정했더니, &lt;code&gt;50px&lt;/code&gt; 3줄이 생겼다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;auto&lt;/code&gt; 값도 가능한데, 중간에 &lt;code&gt;auto&lt;/code&gt; 를 넣어보면,&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&amp;quot;grid&amp;quot;&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;1&amp;lt;/div&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;2&amp;lt;/div&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;3&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;4&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;5&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;6&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;7&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;8&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;9&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;1000000&amp;lt;/div&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
.grid { 
    display:grid; 
    grid-template-columns : 20px auto 100px auto 30px; 
    grid-template-rows : 50px 50px 50px;
    background: gold; 
}
.grid-item { 
    color:hotpink; 
    padding:10px; 
}
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/B4I9EZy_U_3eN4GOhHmvtM0PA1_JuNYComYtZIuC15I-6QpHzk4yCjoIZmJbum4KVnFSIg-UGT6wi2jq9KEkLc-lE_ClkwPUENyLnURr5vUkz331DOoaGDvBNtLTfIKn4ew1GZVf2hm8aP75OrW9IyL5PYiE8OMWnZmuDr18BnG0l-oHS3vAvC_IAa0LRDsR6n6L0d21ZwVvIdDvCOJoZ0pOj4gPZ9gbM255R62YY2EQs-GKjKY1Z37pPvTTur1dn7nf7ORlUumM0tO1DjE7PVeyzXBPto32RV8FGvBF1dqUTKHGpN6fuDTZABzERWx7bIXh3b6WXoBzEOBVpB7DAe4Y_9SoTpgo-ETC1cCibASHRkoVm2E4Ab99UVjBi48MfniYafCq68nMJsZ-L05ckvw11RCTAaYPRxUQUg9Hjok0tc5Q5VtQLlnGuXtfFSj1aUa_j2Q3xKyBX96tfVFUKnVXT29pAPAm8tJxRwV5uZ8ADYGj7Un0_73gkwppBdqQmRVCX-mqYUiMEkijoxwLYYWMmmzMOK_vDRDRUM2NXEmr279dCF_Acqo0imkmgrItoTgZoL0q5XggUAsBpKx6otSMo6r_vsf4o19TCE3QATef2FUWoObZqC5-rKDV74ECmKMu2u6idmtReixd6UBAfP1LwE61heU2=w1566-h1468-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;이와 같이 명시된 &lt;code&gt;px&lt;/code&gt; 외에는 자동으로 너비를 넓혀주고 있는데, 2번째와 4번째의 너비가 동일하다는 것을 주의깊게 보자. 나머지 &lt;code&gt;auto&lt;/code&gt; 적용되는 요소들은 남은 너비를 등분해서 가져같다는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;grid-template-rows&lt;/code&gt; 도 동일한 공식이 적용된다.&lt;/p&gt;
&lt;p&gt;기타 속성값으로 &lt;code&gt;max-content, min-content&lt;/code&gt; 등을 지정할 수 있는데, 해당컬럼 혹은, 해당로우에 최대값 혹은 최소값 기준으로 적용된다.&lt;/p&gt;
&lt;p&gt;이 외에 값에 대한 단위로 &lt;code&gt;fr&lt;/code&gt; 단위를 쓰는 경우가 있다. 분수(fraction) 를 표현하는 단위로 &lt;code&gt;grid&lt;/code&gt; 로 설정된 아이템들에게 적용된다. 쉽게 얘기해서 남는 공간에 대한 비율이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.grid {
    display: grid;
    grid-template-columns: auto 100px 1fr 2fr;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3번쨰는 &lt;code&gt;1/3&lt;/code&gt; 공간을 차지하고, 4번째는 &lt;code&gt;2/3&lt;/code&gt; 공간을 차지하는데, &lt;code&gt;grid-template-columns: auto 100px 200px auto;&lt;/code&gt; 라고 했을때 &lt;code&gt;auto&lt;/code&gt; 는 남는공간을 같은 크기로 등분하는데 반해 &lt;code&gt;fr&lt;/code&gt; 단위를 사용했을 때에 &lt;code&gt;auto&lt;/code&gt; 적용하는 부분은 최대값으로 너비가 결정되는 차이가 있다. 이렇게 단위가 충돌함으로 인해, 계산이 변칙적인 성격을 가지게 되면 오류의 요소를 찾기 어렵기 때문에, &lt;code&gt;auto와 fr&lt;/code&gt;은 혼용해서 사용하지 않는 것이 좋다.&lt;/p&gt;
&lt;p&gt;축약표현으로 &lt;code&gt;grid-template: 150px / auto auto auto;&lt;/code&gt; 이렇게도 사용한다.&lt;br&gt;&lt;code&gt;grid-template: rows / cols&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;grid-auto-columns, grid-auto-rows&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;grid-template-columns&lt;/code&gt; 가 일일히 칸을 지정한다면 &lt;code&gt;grid-auto-columns&lt;/code&gt;는 한번에 지정한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&amp;quot;grid&amp;quot;&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;1&amp;lt;/div&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;2&amp;lt;/div&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;3&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;4&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;5&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;6&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;7&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;8&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;9&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;1000000&amp;lt;/div&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
.grid { 
    display:grid; 
    grid-auto-columns: 60px;
    background: gold; 
}
.grid-item { 
    color:hotpink; 
    padding:10px; 
}
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/PYmLtdicBn9AjPWjb1dGPeO25rRoUn5fC_MUfJPv82sXSSAnyaWzwjNjLeH6lSgeIrSJaiI9snxaRJgnTX_st8UAFjMFz7NsJWmtTqT12kmkPg4rSjELMnhMnR-WGnOnKzWCHVznS9C45OMtTa0A_GADMNrs8QKkmN8EHrsVUdq2Yo4TThZ_ShnHw9iRb81r6_NXeZyPcyqZnZ2eeL7MvqWmb3EOiqeDgGAMMOVERO192t5mTDetN0A1XR5kdOwsqm7ZZ1ckIPOLHKq32zTOpXVdNFxGrHAktWZChmogPCUgstiPHk2Ys654JBR4zdoy6QW6O7JY0tl-Jbnve82T9591u4HZRW8g1YWBL2ccpZR5S8H4fRiPgWBrZVnBhP8iOY6me4OpKRGOa7qiAZEZ3toJqplGIGrc8w1X4Zqq1YoCa1E_JsOIEdSU4IosNefsFw0UkHNuT_XBw84AFSia9HQGs5stykyEDx1ZT5Qx4hvcPEsLAqvYyuoc3kfxN-Rvyv7uPFPeXOqPUuuYu9GstqWanE7KuQmHGD5BAD_8itYfmCNbQreQj3uM7AA6cl5OKT5LENp49KKFwGlymMhvQmZJME90GJlB2_9L-wyemzgb5EafAhYxNfZrJWkzNeG0o5QeVy_OgeKKHS2O6vtcX9GeAKykcgVQ=w1566-h1468-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;columns&lt;/code&gt; 를 지정했는데, 가로로 배치되지가 않았다. 그래서 이 속성은 혼자서 사용할 수 없다. 그리드를 좀더 구체화 할 수 있는 다른속성과 같이 사용해야 한다.&lt;/p&gt;
&lt;p&gt;예를들어 그리드아이템에 적용할 수 있는 &lt;code&gt;grid-column&lt;/code&gt; 같은 속성과 같이 사용하면 너비를 참조해서 렌더링 해준다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&amp;quot;grid&amp;quot;&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;1&amp;lt;/div&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;2&amp;lt;/div&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;3&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;4&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;5&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;6&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;7&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;8&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;9&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;1000000&amp;lt;/div&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
.grid { 
    display:grid; 
    grid-auto-columns: 60px;
    background: gold; 
}
.grid-item {
    color:hotpink; 
    padding:10px; 
    grid-column: 2/4;
}
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/PiBfWRih4cJv6SHA1QNj9-Hx8ButsrjbExV2QaDOfpxdMGYg2cbSqyiV_LnZp2qnNrtKGP8sKtqHoC2Qc1Iy8WykmEvsjcw3wSUtMv8AH7fFLuGZq_GmPERyWwOeJlc0qdGoit9FzM6Ms1A-0gKIE7xhPa8hdcF5Hz4tcSTLTdtmkKBfpryutQ-CeiH9m5w-doOefW1GWIXlcMINJQocZOFNpWWjF8MUNGtXzfWHEdojmV_HMOvPiK6AdlCYsIh-xCr6brwOgZTBo37apnhT69Me8UrOECZEXJfrLn8vpPwC_OtqJAerh7W2w02_M5wJwbMLh-es6Rm_E_Cpaj5nn8WvJjYRCEhVRyiPr9-8_OGCvPIJ5nQUn561BRogPi3uJ5U6BCmAtyYWXT0IHiqG2lykC3eelcWz2SZ3Fyil40I5vg2EcM6wX_J7JWqvPWzd1-WmAN0nOO65VV6ECTK5jY_U0TASAXGj9HWEx8VfEpqmk-l0Tkvt5DJwy4U9PxgCFJz8XegUuNw7d55IVdaHySgz5K4PJdYltRCfT0hjrfNi_sDKwz26RexRsVXzDq70ic9uUECip3RpR39CFzzE4SXqkgv-v1WZI9CJQpyLsLFQ02FFM-UdW8Akh9XzveQkv51ze7luDZlSV8qf9IDJ--37LF5wD9dn=w1566-h1468-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;grid-auto-columns&lt;/code&gt; 에 지정된 &lt;code&gt;60px&lt;/code&gt; 을 기준으로 2칸을 차지하였다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;grid-auto-columns, grid-auto-rows&lt;/code&gt; 는 그리드의 남는 공간을 채우는 하나의 옵션으로 이해하면 될 거 같다.&lt;/p&gt;
&lt;h3&gt;grid-auto-flow&lt;/h3&gt;
&lt;p&gt;그리드의 흐름을 정한다. 기본값은 &lt;code&gt;row&lt;/code&gt; 이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&amp;quot;grid&amp;quot;&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;1&amp;lt;/div&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;2&amp;lt;/div&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;3&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;4&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;5&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;6&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;7&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;8&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;9&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;1000000&amp;lt;/div&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
.grid { 
    display: grid; 
    grid-auto-flow: row;
    grid-template-columns: 50px 50px 50px;
    background: gold; 
}
.grid-item {
    color:hotpink; 
    padding:10px; 
}
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/GLXa3eivSsHiptcXEj7Q5bmxSEWbj2uhi9_r9eaJl3YJGkoHbjgNh0VTFMGvmctMEa5EM75-SgBdncMGdaKQ4wAG7NGRR6ogaP2xWMZOOGaLAwFEiGPkirEjRos9rvBsq3_qMApKp8YzCOY78huDrKGmj_0JJOtR969ml74G7pnyBPmzCv8t4ZMLh8c7qVWJIDae3ZsWh_jEq33oX6OSwP6rxR6LtusTGSqY5cSW8aQOGeGpx-X9w7-pI94zjqiTqm58BxAI7P8kVe05hwdXJw9-aUfXBTVxKaKemi4CzQurKHRLnZos5FvH2SDLrS-XXqHFr5fQf8V7uCrDG-h-pAE688k11QM-VK1EdQL8YMrYaUlCv5DqcYw0OrZLeFHEeIaH9GHPd3L6iRdCbW02Gq6DjHnn6W48Rzv6Rb6wTNOtGMXe3XjBUM-H_S4EaCjdAEMF8lFTdSxOPBgodraUJxf8auT4VpsKRzKQGt1SgvUqombRgEBGpG_XEa1l91wR01wIslf1sPJB0bnzMpcIVEzlS8TTmfBQJm8YBS7bx2N3oM8zm9_qRotjFlxlsNusfBDpCCeq5yUKqdgGcvQ8boD0kcAArLdnpKvNBWQZvwMr0WemyPZ5Uiu5xxOk8JwCauozmIekBHlxM0hPueD80RIrsd4sFFpL=w1258-h1180-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;이게 기본이라면 &lt;code&gt;column&lt;/code&gt; 으로 지정하면 배치가 달라진다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/1PiYMO3ndb5IQedZNuTUBXNLWhfTdLbOmRWL0cdDhNP_YIIx1GqOijnQHc0btf53Nq_TtOTumXrCkrIn80p5lWcwyHOetEwjp1wUqgVCVJ577FTDg5XgKsKzR1TeBJdOZg34Kvd0kJ17hj4pU8rqoemYdnZoCeCmXwChuYHAs7kYNgcHD4pWJ4wb5ayeJgsM48z78SBMo-1_5BTgfJEF3FH9ssJDtDzlELKxn1E8XXD2hr0x71p3gaOCOay4C_y3uLyx-Ttqa2M-XnHSXHrTmJWFyGeINinLoTZOQGPsfApuQ2SMgdbs4BHZA1XnsAue6Hu_2aoZP6YuykmqK3pIXzo2VB147FJmJsV2Ay8DgRwqHolOt9xeNfsOevkAYSpTTXByOCwvVNSon-NvrLrbARgDKTCHtOWl1DFfsDu644JXtb81XNaT47_Mbl62mVqLSNmV2W2CfcE2vbFnlSKQU2NQZk_fVB-6MkgePFcEqS66tycQYR6q4NueengcQrLcw_Qsd3sOreIj4Vrk0DRG_NWaJyustKuizgf8yIBZuectACfVmChpe-ghAQIYJYCIE57w7l2tsjHw1zj69XVvRi_Af6hzXjFqSmXiIzef_0e-ymyvTjn4GEK66Rga5Uzq3fxcp9rhvsaeaLMb0z88MqQxUd_VTqhq=w1258-h1180-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;위와 같이 자식으로 있는 그리드아이템이 지정된 그리드영역에 배치되는 흐름에 대한 설정이다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;dense&lt;/code&gt; 속성값이 있는데, 이것은 배치하다가 남는 공간을 기준으로 자동배치 인데, &lt;code&gt;row dense&lt;/code&gt; 와 &lt;code&gt;column dense&lt;/code&gt; 같은 &lt;code&gt;row 기준에 남는공간배치&lt;/code&gt; 와 &lt;code&gt;column 기준에 남는공간배치&lt;/code&gt; 같은 개념이 있다. &lt;/p&gt;
&lt;p&gt;만약에 &lt;code&gt;100px 100px 100px&lt;/code&gt; 이 있을 경우에 해당 그리드 아이템이 &lt;code&gt;100px&lt;/code&gt;을 넘으면 넘길거야? 같은 옵션으로 생각하면 된다. &lt;/p&gt;
&lt;p&gt;이것은 그리드에 대한 명시가 명확하지 않고, 논리적으로 지정하는 그리드에서 사용이 용이하다. 예를 들어 &lt;code&gt;grid-column, grid-row&lt;/code&gt; 같이 논리적 배치에 대한 단서가 제공될 때 배치를 어떻게 가져갈 것인가에 대해서 활용도가 있다. (반응형 설계에 적합)&lt;/p&gt;
&lt;p&gt;이 배치방법은 그리드를 통한 반응형 예제를 통해 따로 살펴봐야 겠다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;grid&lt;/code&gt; 가 되는 &lt;code&gt;그리드 컨테이너&lt;/code&gt; 가 가질 수 있는 속성에 대해서 알아보았다. 위에 속성들을 축약해서 &lt;code&gt;grid: 100px/ 70px 70px 70px&lt;/code&gt; 로 표현할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.grid { 
    display: grid; 
    grid: 100px/ 70px 70px 70px;
    background: gold; 
}

.grid { 
    display: grid; 
    grid-template-columns: 70px 70px 70px;
    grid-template-rows: 100px;
    background: gold; 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;grid: none|grid-template-rows / grid-template-columns|grid-template-areas|grid-template-rows / [grid-auto-flow] grid-auto-columns|[grid-auto-flow] grid-auto-rows / grid-template-columns|initial|inherit;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;이 공식에 맞춰서 다른 설정되지 않는 것들은 기본값으로 설정된다.&lt;/p&gt;
&lt;h3&gt;grid-gap, grid-column-gap, grid-row-gap&lt;/h3&gt;
&lt;p&gt;이 외에 그리드 컨테이너가 가지는 속성중에서 이 속성은 그리드 사이에 여백을 지정하는 방법이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&amp;quot;grid&amp;quot;&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;1&amp;lt;/div&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;2&amp;lt;/div&amp;gt; 
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;3&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;4&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;5&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;6&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;7&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;8&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;9&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;grid-item&amp;quot;&amp;gt;1000000&amp;lt;/div&amp;gt; 
&amp;lt;/div&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
.grid { 
    display: grid; 
    grid-auto-flow: row;
    grid: 100px/ 70px 70px 70px;
    grid-row-gap: 10px;
    grid-column-gap: 10px;
    background: gold; 
}
.grid-item {
    color:hotpink; 
    padding:10px; 
}
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/yrFcjlRUbsUusVNhZasPVr410IFgBn0VhIQCwHRP422EM1mtQ_MDCwyeyIyrNWVxz6kWHrMDEwD3mI4q4NTFHcSGvWGg7jhpMR6CfEzvd_xoHz3gIWULiE0f8omuf6twGqG6-aEoJExPsXC_gIVYRWiisi79Qe2bWlIscjjNDoawjlWsBx3CV4xDH7fUIDL-sV-cltEEVWKGv0x6912Tfk8a8gJsa3ZDfC7o5I98YZ8ElRNbOhyWAS0n5lVQuRa9dUwfYPzUsg8G5gW_9pWABzAVrfPGQCGLW4SrAE-mnCWiwhzShpBfJQp-AfFOSPXk9Jt2gc67sfkyCoqVfGjfz2Xq3lSHmn144AQxuljN4cmLfX1fDQiFDbjh7jGc6u6Geu2Npm6tCTfw0veqxTkjueEB2JJQbMtJ857EUgArkjLUPPKKMBsHOADlOPr3UOT_QsFGdh8ro4OIM-pHkuQ-ScsO1yI35_fCbGc6bcooVORJluy34TJylBRQiPJmkE4WKoHyW7HeVt8-puyAZhtDGzhm-rS1-fmTUBcRVzrj-GgknvnTFUkyIsx8a25DI2TR54Qw24UxtSMSXVGho3l7lfneUcXwMDBSo_FWgYobJ_K7IjauRCGK0pOvpVajl2StHs1IMWXVz2M0bnSIgmh6F14HqLqw-lk-=w1258-h1180-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;위에 설정은 축약형으로 &lt;code&gt;grid-gap: 10px;&lt;/code&gt; 으로 할 수 있다.&lt;/p&gt;
&lt;p&gt;그리드아이템이 가지는 속성에 대해서 알아보자.&lt;/p&gt;
&lt;h2&gt;grid 아이템이 가지는 속성&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;grid-area&lt;/li&gt;
&lt;li&gt;grid-column&lt;/li&gt;
&lt;li&gt;grid-row&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;grid-area, grid-column, grid-row&lt;/h3&gt;
&lt;p&gt;grid 영역에 대한 이름을 지정한다. 예를 들어 그리드아이템에&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.header {
    grid-area: hd;
}
.footer {
    grid-area: ft;
}
.content {
    grid-area: main;
}
.sidebar {
    grid-area: sd;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이런 이름을 지정하고,&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.grid {
    display: grid;
    grid-template-columns: repeat(9, 1fr);
    grid-template-areas: 
      &amp;quot;hd hd hd hd   hd   hd   hd   hd   hd&amp;quot;
      &amp;quot;sd sd sd main main main main main main&amp;quot;
      &amp;quot;ft ft ft ft   ft   ft   ft   ft   ft&amp;quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같이 나누어진 그리드의 영역을 배치하는 것이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&amp;quot;grid&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;header&amp;quot;&amp;gt;Header&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;sidebar&amp;quot;&amp;gt;Sidebar&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;Content&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;footer&amp;quot;&amp;gt;Footer&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
.grid { 
    display: grid;
    grid-template-columns: repeat(9, 1fr);
    grid-template-rows: 200px auto 100px;
    grid-template-areas: 
      &amp;quot;hd hd hd hd   hd   hd   hd   hd   hd&amp;quot;
      &amp;quot;sd sd sd main main main main main main&amp;quot;
      &amp;quot;ft ft ft ft   ft   ft   ft   ft   ft&amp;quot;; 
}

.header {
    grid-area: hd;
    background: goldenrod;
}
.footer {
    grid-area: ft;
    background: goldenrod;
}
.sidebar {
    grid-area: sd;
    background:indianred;
}
.content {
    grid-area: main;
    background: grey;
}
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/LUZJlKNL-6eSow45QihGw0qLrTyUauYQGb6q4oKn6xRR_tQwFQdtpzLF3wLIQ41mlCP3eO9IQeDww5REnAqZGPzYIhGIj9YdTC8RluwRxjftdk3IAiffQs_NXgneE8SxBvxfDDbCJ6GFjrOxrtNP8XPcWVc8qxlAV4hFnNiM6Bya433cRdO-RqMWybAbUbsamEHrxRXB-6AHVJT3R-bj_MNSP_DAjBzVJbRO4gOWZqmrIe3BwYbogjqI_MaqbO8BtyyVPtJmNsZyRq0JyGek3cNTa4ye6g63ZLcvhMzzZjtfblV1Powp1txLMJ4i6vL3aCS7jGK2vjxJJK6eY-I2dylEBsTwWWPoIG8rKC_f1XbMVGqepAe9DARmfWWzcbfb5RdRSKK9M_ou9p1UnwVbv3cD5BZv9gJIhzrtuAFnpcuKbubfagOrGQ6rJ_73SRUrIv9B5_e1RrkP7guJ0ITG2BM9xOH58DSEJ3x-plGNEZBchCQngfwDshmVvGGuivN6p9F5f6qNyy57toqKJyoMCMBlvSjxMIfI0-Uz8rU_zVpySUWq2j90YBrvyEYuD6vIKIubiWJUYUP1W1Qnb9T3OikEruoSZi5tN8oYgfzdIB9DUjtZGzk5IEuRakmVaM8y1v_ofIC-wglohOuhRV1XBADgM5nUIn0C=w1258-h1180-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;위의 예제는 모든배치를 지정한 것이지만, 필요한 부분만 지정해두고, 해당 미디어쿼리에서 배치순서를 변경할 수 있다는 것이 장점이다.&lt;/p&gt;
&lt;p&gt;위와 같이 이름을 지정할 수도 있지만, 숫자로의 지정도 된다. 지정법은 &lt;code&gt;grid-column: start/end&lt;/code&gt; 이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&amp;quot;grid&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;header&amp;quot;&amp;gt;Header&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;sidebar&amp;quot;&amp;gt;Sidebar&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;Content&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;footer&amp;quot;&amp;gt;Footer&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
.grid { 
    display: grid;
    grid-template-columns: repeat(10, 1fr);
    grid-template-rows: 100px auto 50px;
}

.header {
    grid-column: 2/5;
    background: goldenrod;
}
.footer {
    grid-column: 1/11;
    background: goldenrod;
}
.sidebar {
    grid-column: 4/7;
    background:indianred;
}
.content {
    grid-column: 4/7;
    background: grey;
}
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/6_AlF-1UAyftsoPIowzd_W9gQvaw1Oc8Pu5MEgfoOKgtJQBvGDbpKcdXJeSSOhHq5_Rov9VIMCgpEmDBG6d2f45I6sF7LS3J39oQVNnygcBtwMhqVumigIC58C9rGqlAgSsCFOkb6hm-raohgvKLQaM7g2QQ4-NyjrvzO8reIMCLlZGwpP3IYDC12_R5pT7apKjJhZ9ovzfI6DqpGmFDNcm4CUBNY8rsaZHihqo36w4_8T4eVqf3FO3j_TUFayTn4Os4xpWKzs7LVDUF6xb86S6MNfZR0tlCLo7uvxxVoElP26oR1-f1k1X8pHhwMeiM1RmYlQT-pHpOr4-O5ynHNtgJpmh6K6Z1P2gtkYyp9TmTc6sH3PkfglY5C7D8vkIvYEkw5j06BeNTjUPprTx9UI3IvbiKlXZAtUtsqD-2bvU3zxumpgiH6afQC0ck_byVaPQXvFNRJ6PXJJSP0hwAlo3aVVE_GJtPgKeMomgS4ReXRWEH5k28nzX6FoDo2MOyyl72B7BHSI7xspZ9DqBsiYc5RvqJPqVd_vfZjFxiDX7Yx4NVKOBeSBndhu5hU8ZMJHUOWVzmjQQ_MXTBBzE9dnt96mwtiJztOKvomqxUd3NmaREk8Wu0q2VCUL1G_-brEmGKLtTBjmhQw4onq6DeL2ztnekdx0B9=w1258-h1180-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;이렇게 컬럼의 시작과 끝을 지정해서 배치할 수도 있고, &lt;code&gt;grid-row&lt;/code&gt; 를 넣으면 겹치게도 가능해진다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&amp;quot;grid&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;header&amp;quot;&amp;gt;Header&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;sidebar&amp;quot;&amp;gt;Sidebar&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;Content&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;footer&amp;quot;&amp;gt;Footer&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
.grid { 
    display: grid;
    grid-template-columns: repeat(10, 1fr);
    grid-template-rows: 100px auto 50px;
}

.header {
    grid-column: 2/5;
    grid-row: 1/4;
    background: goldenrod;
}
.footer {
    grid-column: 1/11;
    background: goldenrod;
}
.sidebar {
    grid-column: 4/7;
    grid-row: 2/7;
    background:indianred;
}
.content {
    grid-column: 4/7;
    background: grey;
}
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/JXiDF_6ubNoIvFbei4WBApsmudpbY2zFQhDNwXOGeDcL6fHDURIv5Bijv8-pgMAbtpA2Iq_oXBaGZ6mQaU5Ow_bGFiV9o8RAX17in5EMtHqi2LJ8BUEx1BtgaZc7Z8HzZuBuFiWlw01aP9gg-bRrLySFtCiV7h1tAWot-jdl-d-50tM3yeLuzZ2tX_c9DXHWPGXYC6b3Bgf1SK419YIYMGeeu5CDiwqSYBAQMKDLSFsg4BpnwyoPclyu4GyGJterw-0psAZJmUT_aI8QwxVMuuB10NyIoXM1Nhiw8cSUzrBYtpu9RjET2RQI9sBWivaC948gfjMk5Q9Va1z1t9qpT_Fy76nYtA3ppBMwmLTXm1aB89bHbK--g3CaYxIMugc33SVkFbuz5cOBjBy9lRvBlzw60GzltiRAe84rFZAKU1Q_uKXFhcQ-y-xgCjw9aCyqxDYWrFluGfNFXmRczv79vyUrMsl-f_IGJEjeMyiiRUJJajPXKQ7iPQMYeM4ki5-aF2OyxPVumF7engb040GX0p5xUz31SrBhFWbgiGLYah3nbIJn9K6UZA8b_hJNMhJ3Z-5eHR5ZaIpcxrFT3p80DcQ2IJ56nXqSUzW0vlQmTlV5dy-N-HnpfD26Sw58mU8rDfSclNGWxrgyrcV3YyA1NDY6JTnLrbGQ=w1258-h1180-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;위를 축약형으로 사용하면 &lt;code&gt;grid-area: grid-row-start / grid-column-start / grid-row-end / grid-column-end | itemname;&lt;/code&gt; 이렇게 된다.&lt;/p&gt;
&lt;h2&gt;grid를 통한 일반적인 레이아웃 예제&lt;/h2&gt;
&lt;p&gt;그리드에 대한 속성은 다 보았고, 실제로 적용할 레이아웃을 만들어 보자.&lt;/p&gt;
&lt;p&gt;일반적인 레이아웃은 &lt;code&gt;상단헤더, 좌측메뉴, 우측컨텐츠, 하단푸터&lt;/code&gt; 이므로, 이것을 기준으로 하면&lt;/p&gt;
&lt;p&gt;우선 &lt;code&gt;html,body&lt;/code&gt; 에 &lt;code&gt;높이 100%&lt;/code&gt; 를 주고, &lt;code&gt;.grid에 height:100%&lt;/code&gt; 가 높이를 상속받도록 한다. &lt;/p&gt;
&lt;p&gt;컬럼은 10컬럼으로 나누고 &lt;code&gt;header, footer&lt;/code&gt; 만 우선 배치해보자&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&amp;quot;grid&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;header&amp;quot;&amp;gt;Header&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;sidebar&amp;quot;&amp;gt;Sidebar&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;Content&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;footer&amp;quot;&amp;gt;Footer&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
html,body { height:100%; }

.grid {
    height: 100%;
    display: grid;
    grid-template: 100px auto 50px / repeat(10, 1fr);
}

.header {
    background: goldenrod;
    grid-area: 1/1/1/11;
}
.sidebar {
    background:indianred;
}
.content {
    background: grey;
}
.footer {
    background: goldenrod;
    grid-area: 3/1/3/11;
}
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/zM8X9h2tSR4FyoxXfAZDQ9PRw3KSbqPOxNQbEMXAmPzOcb9ATDDfVvVGcYPIdboSWdjYPyDG6xCJZA9RMTjEosiQgiiXnQNX7PyWheId4xDrN2IaSRJDEKRV-PmcnjkGILY4hdPw-jG2OecXMQ7cbE8XF2OaSpzjioSr-iMmEonDIFG8x2hnjWAfHL40ErhOyEUp2SzB8ZUvWdt55-TJCKHd_kDnwr-uJtYjP08JafcErcxPkENGYtbD5gmv4m6RClmgw476F8_WHazBJJBMYX_sCshaIzXWEmar5z84uYAU2xDJfhQegyS-GkDODK2n_hwl-6uw_29HtkgyeFsXartRoMFgreB-5HGmh3i1Md9P79p-s7fW_E0noxXC3wnF9vjUpvFMVM234c0OEoBGXpMF6Xbj-Jru53iNmaAGpivu5uTMHWwnP1VM-xE2_mrXNno6ZsHiHYA_SqZ7wkC7-MVxR3NVFiG2HwKXQ9t_STY_9H39OK3VJ8pIdCdDg2W9TtEjLLxWQbIFkaxbAOdP5OoZUvGcbHqj7g3frYwNGgOUUxS8MNA7KSO3DuIT1AdnCtNC-B792xYb5KM912N02mrnTGMRzBPLuKDTvh-gYhvauarKZqfvs1zYSUefDOpb4HF2i-pn35P-XOuEzp5Cgfbwk3jmvgr2=w1258-h1180-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;이제 &lt;code&gt;sidebar, content&lt;/code&gt; 자리만 잡으면 된다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&amp;quot;grid&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;header&amp;quot;&amp;gt;Header&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;sidebar&amp;quot;&amp;gt;Sidebar&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;Content&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;footer&amp;quot;&amp;gt;Footer&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
html,body { height:100%; }

.grid {
    height: 100%;
    display: grid;
    grid-template: 100px auto 50px / repeat(10, 1fr);
}

.header {
    background: goldenrod;
    grid-area: 1/1/1/11;
}
.sidebar {
    background:indianred;
    grid-area: 2/1/2/3;
}
.content {
    background: grey;
    grid-area: 2/3/2/11;
}
.footer {
    background: goldenrod;
    grid-area: 3/1/3/11;
}
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;grid-area&lt;/code&gt; 의 &lt;code&gt;row-start/column-start/row-end/column-end&lt;/code&gt; 지정법이 조금 헷갈리긴 하는데, 이렇게 간단한 설정만으로도 &lt;code&gt;100% 레이아웃&lt;/code&gt; 을 구성했다는 것에 상당히 만족스럽다. 혹여 &lt;code&gt;html,body의 100%&lt;/code&gt; 높이지정으로 인해, 컨텐츠가 안밀려 내려가지 않을까 했는데, 다행이 아주 정상적으로 밀려 내려갔다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&amp;quot;grid&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;header&amp;quot;&amp;gt;Header&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;sidebar&amp;quot;&amp;gt;Sidebar&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;br&amp;gt;Content&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;footer&amp;quot;&amp;gt;Footer&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;style&amp;gt;
* { margin:0; padding:0; }
html,body { height:100%; }

.grid {
    height: 100%;
    display: grid;
    grid-template: 100px auto 50px / repeat(10, 1fr);
}

.header {
    background: goldenrod;
    grid-area: 1/1/1/11;
}
.sidebar {
    background:indianred;
    grid-area: 2/1/2/3;
}
.content {
    background: grey;
    grid-area: 2/3/2/11;
}
.footer {
    background: goldenrod;
    grid-area: 3/1/3/11;
}
&amp;lt;/style&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/qMBFrEdJuXTr5ojNksNDTkp6mqPgCUixZP6snZLI7jmaWRikmDnfxVjgKy_ZVacJDs6knl8gzcyeOmERkpKwc7xxjHfjvkXtlV_kgywcw3XFwnqiwddUrePLT1-5X-WfTkN2uXhjgQ_lDJKmE1ME6ivP2W543qWuMWOmYqvaHVzwIk-7h_0te5x8b4JgpBeOpi2Fx7nv_wwD5bNkOJpQAL-U3N313sllvzIDibpRafkzduRNt_jBdeFlt7MsZJ3qVNBSYCZjMsPQM1lFFudefP6FYqH1JKHbHp8VwXsTn7lRV3j_NU9FpHNSfUiUyDDSbjOu3kuvP8JIB0JQaeFI0rsJRT7fkrifDMsmJAPS_HutADoGZMcX75HV1Okmggabw4sRMFpzj6TLjf72t-dsnvUpEELlfd1hO2R4CtaasKK4zvJe19BJmt6j0YnbsB7GX19qh8tQl_HJ_cKQlQSOx1ji_WHtY174O65FqGOqzO8HhaWomDUx5TmQOjwiYiDXDb3n60IZr6o7N2pdNYgdaFYu7RKFX4aaBLBcP8Xb_LaeAoS-FFslEZF1KdW7uBuHRH2_miCsj_QaiaUTOHbkGCfkznWC7dHAIByetbeoKqfyLP6yzBTIzBcGfjFa7KGlpyAKobIalhH8DrNa0TS58tXW8FAePtPB=w1258-h1180-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;이렇게 간단하게 사용할 수 있는 &lt;code&gt;grid&lt;/code&gt; 를 사용하지 않을 이유가 없다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/QOEuk3BYJOg2e99KL2mE5iOhuNz-VM1OVVUAIAIZTCdNQlGGrIn_6hSY3DGd-oif1G1a75zcIJc7iRg7V6seLH1crxQdsEJVMMKSWw0GpXd5H-qvpWIHX9RkxBvxFQt6xHQn23NHJAAuSyoP3x6SXDvImb8LPR_YNh7Xg1K5trxFfZPu2HWt9GETTY1V-XXouGtY4xU0MZJ-Xdwbq5j8Ee5gQrjaiDZQHxT9MSwxrBbFtIGTM1X0GsvYn_zB2S9AxcAgei7_fNaQMl69zoFxW1rqixKW7GtDo7ZW4M_NcUg1bIGSTbBdcp9_uzZAJ8hBvQIGvrCANXwgknKVs_3uyO7Xkhcf-q9vLASNMhUdpBQmdD0KMrB3q7yoPfWpVkEv5lARPg_tIvYPxaRCG7On93sSeArUCk75RTko8XO0KLHuFOGtZNW49ZVjA_K3G3MAAXOsw4Dg6jrstU4ljms_VtlzY-GBGPk91S8HFArTebpMc3lZvvurvRt-VtD4ff0rxvFCRpIhWy8N05HeB7TE73-iHpg-ndqJBpLt69i_N0iifG8d0jrhZPvTr6I5uC9n5q8oQXT35OKoKqOzlwLfTU_tTxFFNmh5SnS9htOj2j9_fwVFC4yvOWyJQLZ0VtKs6dkJ7yH3A-m7RMPwDwco330L8sNz6nT5=w1258-h1180-no&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</description>
      <category>스타일</category>
      <category>css</category>
      <author>richready2011</author>
      <guid isPermaLink="true">https://diff-frontend.tistory.com/17</guid>
      <comments>https://diff-frontend.tistory.com/17#entry17comment</comments>
      <pubDate>Thu, 25 Aug 2022 14:17:24 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트의 몇가지 좋은 습관</title>
      <link>https://diff-frontend.tistory.com/16</link>
      <description>&lt;p&gt;@참조 : &lt;a href=&quot;https://www.devbridge.com/articles/javascript-best-practices/&quot;&gt;https://www.devbridge.com/articles/javascript-best-practices/&lt;/a&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;해당글은 의역 되었고, 오역이 있을 수 있습니다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;다음은 깨끗한 JavaScript 코드 작성을 위한 권장 사항 및 일반적인 지침이 담긴 글이다.&lt;/p&gt;
&lt;p&gt;이러한 권고 사항은 앞으로 더 정교한 개발 도구 라던지, 새로운 언어 기능 으로 인해, 변경 될 수 있지만, 결코 변하지 않는 것들이 있다. &lt;/p&gt;
&lt;p&gt;그것은 당신이 이해하기 쉬운 코드를 작성 해야 한다는 것이다. &lt;/p&gt;
&lt;p&gt;다음은 Start 예제로 좋은글 이다.&lt;br&gt;&lt;a href=&quot;http://javascript.crockford.com/code.html&quot;&gt;- http://javascript.crockford.com/code.html&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;전역 변수 사용의 최소화&lt;/h1&gt;
&lt;p&gt;코드에 네임 스페이스를 사용하여 모듈로 구성 하고 코드 충돌을 피하라.&lt;br&gt;소개되는 글로벌 변수의 최적 개수는 &lt;code&gt;0&lt;/code&gt; 이며, 불가피 하게 옵션이 되어야 한다면 &lt;code&gt;1&lt;/code&gt; 에 고정 하라.&lt;br&gt;아래 코드는 익명 함수 내에서 코드를 캡슐화 하고 함수를 즉시 실행 하는 방법 이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;(function(){
    // Do stuff here
}());&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;익명 함수를 작성하고, 바로 실행 하는 코드를 괄호로 랩핑 해서 전역변수를 최소화 하자.&lt;br&gt;이 코드는 즉각적 호출이 발생 한다.&lt;/p&gt;
&lt;h1&gt;Scope 마다 단일한 &amp;quot;var&amp;quot; 선언 사용&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;var&lt;/code&gt;는 여러 선언을 허용 하기 때문에 많이 사용할 이유가 없다.&lt;br&gt;모든 스코프 변수는 뭐가 됬든 무조건 상단 으로 이동 한다. (이를 호이스팅이라고 함).&lt;br&gt;중복된 이름이 중첩 되거나, 다른 논리적 실수가 있을 경우 발생할 수 있는 오류 동작을 줄일 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;(function(){

    var firstName = &amp;#39;John&amp;#39;,
        lastName = &amp;#39;Doe&amp;#39;,
        fullName = firstName + &amp;#39; &amp;#39; + lastName;

    // The rest of the function body

}());&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;JSLint 를 당신의 친구처럼 생각 하라.&lt;/h1&gt;
&lt;p&gt;이 게시물 에서 자바스크립트의 좋은 습관에 대해서, 반복해서 나열 할 수 있지만, JSLint를 사용하면 알아서 당신에게 얘기해 줄 것이다.&lt;/p&gt;
&lt;p&gt;경고! JSLint는 당신의 감정을 상하게 할 것이다. &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.jslint.com&quot;&gt;www.jslint.com&lt;/a&gt; 은 엉성한 코드 작성 이후에 벌어지는 많은 수정 들이 벌어지기 이전에, 경고 함으로써, 개발자 에게 도움을 준다.&lt;/p&gt;
&lt;p&gt;당신이 자주 jslint 를 사용하면 적절한 코딩 스타일과 규율에 익숙한 개발을 하게 될 것이고, 그것은 우리 모두가 만드는 사소한 실수를 발견하는데 도움을 주는 좋은 친구가 될 것이다. &lt;/p&gt;
&lt;p&gt;각 소스 파일의 맨 위에 있는 JSLint 설정을 사용 하면, 일일히 JSLint 할 때마다 옵션을 지정할 필요가 없다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;/*jslint browser: true, sloppy: false, eqeq: false, vars: false, maxerr: 50,
 indent: 4 */&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;페이지 하단의 위에 옵션중 변경할 것은 변경 하고, 소스 코드를 복사하여 다른 페이지 에도 붙이자. 오류 수를 줄이기 위해 불량 코드 (예 : == 및! = 허용)를 활성화 하지 말고, 소스 에서 불량 코드를 업데이트 하여 제거 하자.&lt;/p&gt;
&lt;p&gt;아래의 코드는 모든 전역 변수 선언에 대해 알려 주는 부분이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;/*global jQuery, otherGlobalVariable */&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Use Strict 를 사용하자&lt;/h1&gt;
&lt;p&gt;ECMAScript5 를 사용하기 전에는 &lt;code&gt;var&lt;/code&gt; 로 선언 되지 않은 변수는 전역 변수에 할당 되었다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;(function(){
    name = &amp;#39;John&amp;#39;;
}());&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;하지만 &lt;code&gt;use strict&lt;/code&gt;를 사용하면 에러가 발생한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;(function(){
    &amp;#39;use strict&amp;#39;;
    name = &amp;#39;John&amp;#39;;
}());&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;실수로 전역 변수를 사용 하지 않도록 하고, 오류를 일찍 찾아내는 데 도움이 되기 때문에, 사용하기를 권장 한다.&lt;/p&gt;
&lt;h1&gt;모듈 패턴&lt;/h1&gt;
&lt;p&gt;응용 프로그램에 대한 단일 네임 스페이스 지정 :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;var App = (function () {
    &amp;#39;use strict&amp;#39;;

    var settings;

    return {

        init: function(initialSettings){
            settings = initialSettings;
        },

        getVersion: function (){
            return settings.version;
        }

    };
}());&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;코드를 모듈로 정리 하고, 모듈에 모듈을 첨부해서, 응용 프로그램을 강화 하자.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// Search module:
(function (app) {

    var module = {};

    module.find = function (query) {
        // Perform search
    };

    module.verifyQuery = function (query) {
        // Ver
    };

    // More module methods go here

    app.search = module;

}(App));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;어떤것을 비공개로 유지할 필요가 있거나, 선호하는 경우, 모듈 내부에 공개와 비공개를 선택하는 모듈 패턴을 사용하자.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// Search module:
(function (app) {

    // Private methods:

    function find(query) {
        // Perform search
    }

    function verifyQuery(query) {
        // Verify query
    }

    // Public methods:

    app.search = {
        find: find,
        verifyQuery: verifyQuery
    };

}(App));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;모든 것을 수행 하는 함수를 작성 하지 말자. 모든 것을 catch 하여 스마트 하게 처리하는 함수 보다는, 특정 작업을 수행하는 작은 기능의 함수를 여러개 작성 하는 편이 확장성에 좋고, 유지보수에 이롭고, 성능 면에서도 우월할 확률이 높다.&lt;/p&gt;
&lt;h1&gt;개발자를 위한 개발 코드를 작성하자&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;당신만을 위한 코드를 작성 하지 말고, 다른 개발자가 이 코드를 사용 할 것이라고 가정하라.&lt;br&gt;간결함 보다 선명도를 선호 하라. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;즉, 함수 및 변수 이름 지정이 짧지 않고 의미가 있어야 한다.&lt;br&gt;JavaScript Compressor (Closure Compiler, YUI Compressor)는 긴 이름을 축소해 주기 때문에, 변수나 함수명이 길다고 해서 부담을 가지지 않아도 되고, 이 규칙은 많은 다른 언어 에도 적용 된다.&lt;br&gt;다른 언어 에서도 잘 작동하는 Rule 을 적용하면, JavaScript 에서도 잘 작동한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;가능한 한 많이 기록하라. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;최소한 콘솔을 볼 때 콘솔에 로그가 표시 될 수 있도록 하라.&lt;br&gt;이것은 시스템이 복잡하면 할수록, 어떤 일이 벌어지고 있는지 더 잘 이해할 수 있도록 도와준다. 나중에 이러한 주석 들은 코드를 유지 관리하는 다른 개발자 에게 유용 하다.&lt;br&gt;필요한 스크립트 줄을 찾으려고 할 때 또는 어떤 코드가 실행 되고 있는지 알기 위해 콘솔을 사용하면 시간을 크게 절약 할 수 있다. &lt;/p&gt;
&lt;p&gt;콘솔이 없으면 코드가 손상 될 수 있다.&lt;br&gt;오류가 발생하지 않도록 콘솔이 없는 경우 Fake 콘솔 객체 및 메소드로 대체 하자.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;var console = window.console || {};
console.log = console.log || function(){};
console.warn = console.warn || function(){};
console.error = console.error || function(){};
console.info = console.info || function(){};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 코드는 실제 사용될 코드 에서는 필요 하지 않다.&lt;br&gt;이 코드가 빌드 프로세스에 내장 될 수 있기 때문에, 압축 및 완성된 제품 으로 배포 하기 전에 로깅 코드는 제거 되야 한다&lt;br&gt;정규식 으로 콘솔에 대한 모든 문자를 색출할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;^\s*console\.(log|warn|error|info)\(.+\);\s*$&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Visual Event 는 DOM 요소에 첨부된 이벤트에 대한 디버깅 정보를 제공 하는 bookmarklet 같은 건데, 이벤트를 호출 하는 시점의 코드를 찾으려고 할 때 시간을 크게 절약 할 수 있다.&lt;br&gt;(&lt;a href=&quot;https://chrome.google.com/webstore/detail/visual-event/pbmmieigblcbldgdokdjpioljjninaim/related?utm_source=chrome-app-launcher-info-dialog&quot;&gt;크롬 확장프로그램&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;개발 코드는 개발자용 이며 생산 코드는 기계용 이다. 그러므로 생산을 위한 코드를 최소화 하고 최적화 해라. 이후 빌드 프로세스를 사용하여 코드 파일을 최소화, 최적화 및 결합 하는 방식으로 하라.&lt;/p&gt;
&lt;h1&gt;어떻게 작동 하는지, 어떻게 보여지지 않는지&lt;/h1&gt;
&lt;p&gt;JavaScript를 사용하여 스타일 정보를 추가 하지 말고 CSS 클래스를 조작 하여 스타일 정보를 추가 하자.&lt;/p&gt;
&lt;p&gt;일관된 구조에 의존하면 안된다. 즉 동일한 응용 프로그램 에서 다른 개발자가 사용할 수 있도록 하기 위해서, UI 제한을 최대한 적게 두어야 한다.&lt;br&gt;DOM 트리를 탐색 할 때 DOM 요소가 당신이 생각 하는 페이지의 유일한 ID 같은 것으로 구성하면 안된다. 요소의 css 클래스를 사용 할 수 있도록 하고, 기능에 영향을 주지 않고 UI를 유지하고 변경할 수 있는 유연성을 제공 하도록 하자.&lt;/p&gt;
&lt;h1&gt;풍부한 옵션&lt;/h1&gt;
&lt;p&gt;여기에는 Labels, CSS 클래스, CSS 네임 스페이스, ID 등이 포함 된다. 객체를 옵션으로 설정할 수 있도록 프로그래밍 하는 것은 유지 관리 작업을 간편하게 수행 할 수 있도록 도와준다.&lt;br&gt;또한 맞춤 설정을 통해서 많은 기회를 제공해 줄 수 있게 된다.&lt;/p&gt;
&lt;h1&gt;최적화&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;코드를 최적화 하자. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;작성된 기능을 변경하기 위해서, 가장 단순한 솔루션을 찾기가 매우 어렵기 때문에, 코드를 수정 하면 제거 되거나 영향 받을 수 있는 대상을 찾을 수 있도록, 아주 단순하고 간결하게 작성하는 습관을 들여야만 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;순회문을 통해서 DOM 요소를 만들 수 있지만 DOM 요소를 DOM 에 직접 삽입하면 안된다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DOM 변경 사항을 최소화 하자. 제작된 제품은 디버깅이 매우 어렵 기 때문에, JavaScript 에서 HTML 생성을 최소화 해야 한다.&lt;br&gt;미리 작성된 템플릿을 사용하고 유지 관리가 쉬운 장소에 따로 템플릿을 보관하고, 꺼내 쓰는 방식으로 해야 한다. (예를 들어 &lt;a href=&quot;https://mustache.github.io/&quot;&gt;Mustach&lt;/a&gt; 같은 라이브러리를 사용하는 것도 방법이다.)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;해킹을 피하고 문제를 분석하고 신뢰할 수있는 솔루션을 찾아 보자. &lt;/li&gt;
&lt;li&gt;사용자 데이터를 신뢰하지 말고, 최대한 예외처리 하자.&lt;/li&gt;
&lt;li&gt;중요하거나 중요한 데이터를 보호하기 위해 JavaScript를 사용하지 말아야 한다. 쉽게 사용할 수 있다는 것은 쉽게 깨지기도 쉽다는 의미 이다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>자바스크립트</category>
      <author>richready2011</author>
      <guid isPermaLink="true">https://diff-frontend.tistory.com/16</guid>
      <comments>https://diff-frontend.tistory.com/16#entry16comment</comments>
      <pubDate>Thu, 25 Aug 2022 14:13:30 +0900</pubDate>
    </item>
    <item>
      <title>웹에서의 폰트</title>
      <link>https://diff-frontend.tistory.com/15</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;@refer:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B8%80%EA%BC%B4&quot;&gt;컴퓨터 글꼴&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opentutorials.org/course/2418/13362&quot;&gt;서체&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3schools.com/css/css_font.asp&quot;&gt;CSS Fonts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.fontreach.com/#top&quot;&gt;폰트랭킹&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lifewire.com/web-safe-font-stacks-3467429&quot;&gt;Web Safe Font Stacks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹디자이너가 디자인 한 것을 웹에 옮기려면 웹디자이너가 원하는 것을 구현할 수 있는 기술을 알고 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자이너 마다 성향이 달라서 어떤 디자이너는 폰트를 중요하게 보고, 어떤 디자이너는 비쥬얼을 중요하게 보고... 하는거 같은데, 디자인에 대해선 전혀 모르기 때문에, 어떤게 중요한지는 모르겠고, 일반인의 눈으로 보는 웹디자인은 전체를 보게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적으로 봤을때 이쁘면 이쁘다. 어색하면 어색하다 정도의 주관적 의견이 있을뿐이다.&lt;br /&gt;이렇게 주관적 일수 밖에 없는 이유는 학문적 뒷받침이 없기 때문에, 왜 어색하고, 왜 이쁜지를 설명할 수가 없다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;컴퓨터 글꼴&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터에게 글꼴은 3가지가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비트맵 방식의 글꼴&lt;/li&gt;
&lt;li&gt;외곽선 방식의 글꼴(벡터)&lt;/li&gt;
&lt;li&gt;스트로트 글꼴&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비트맵은 수많은 점을 찍어서 하는 방식이다. 컴퓨터가 연산해야할 부분이 적기 때문에 속도가 빠르지만, 확대하면 계단현상같은 부분이 보인다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/-11M_Mxm6rPQ/XCiYZh1E2NI/AAAAAAAAVeU/8GZCh6sLHBsaWEZpyVS0diO3Uzk1BQ0AwCHMYCw/I/15461643257558.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외곽선 방식은 실제로 선을 그리는 방식으로, 표현하기 위한 정보와 컴퓨터 연산이 더 많다. 계단현상이 없지만 정보와 연산이 더 들어가기 때문에 느리다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/-UbgKBbUyrdo/XCiYmURcjjI/AAAAAAAAVec/FYLKLvwMFo0N6MpI9D5QhdKPftS34JT1ACHMYCw/I/15461643772161.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스트로크 글꼴은 &lt;code&gt;지정된 선+부가정보&lt;/code&gt; 를 사용해서 &lt;code&gt;크기+모양&lt;/code&gt; 을 결정한다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/-5xFoz5h4dMA/XCiYQwIALcI/AAAAAAAAVeQ/FobFouAIl4cIlGWnGcNwbMOBmE7qygtLQCHMYCw/I/15461642911154.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;글꼴 형식&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타입1, 타입3 글꼴 : 어도브사가 개발한 방식으로 &lt;code&gt;베지에곡선&lt;/code&gt; 의 외곽선 글꼴.&lt;/li&gt;
&lt;li&gt;오픈타입 글꼴 : 마이크로소프트가 설계한 스마트폰트다(?). 트루타입+타입1&lt;/li&gt;
&lt;li&gt;트루타입 글꼴 : 애플이 개발한 글꼴로 타입1을 대체할 목적으로 만들어졌고, &lt;code&gt;베지에 곡선&lt;/code&gt; 으로 그린다. 대부분의 운영체제에 적용되고 있다.&lt;/li&gt;
&lt;li&gt;메타폰트 : 백터 글꼴을 정의하는데 사용되는 하나의 언어로, 주어진 점을 선분과 &lt;code&gt;베지어 곡선&lt;/code&gt; 의 교점으로 정의하는 공식(?)&lt;/li&gt;
&lt;li&gt;웹폰트 : 동적 폰트의 일종으로 사용자 컴퓨터에 설치되지 않아도 사용할 수 있도록 고안된 개념이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;글꼴 확장자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 형식에 따라 글꼴 확장자가 다르다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EOT (Embedded OpenType) - 윈도우개발, IE9 이전버전은 이 포맷만 인식한다.&lt;/li&gt;
&lt;li&gt;TTF (TrueTypeFont) - Chrome 4+, Firefox 3.5, Opera 10+, Sarafi 3+&lt;/li&gt;
&lt;li&gt;OTF (OpenTypeFont) - Chrome 4+, Firefox 3.5, Opera 10+, Sarafi 3+&lt;/li&gt;
&lt;li&gt;WOFF (Web Open Font Format) - 불법복제 문제로 모질라와 여러단체가 웹에 사용할 목적으로 개발했고, 라이센스명시가 메타정보로 들어가 있다.&lt;/li&gt;
&lt;li&gt;SVG (Scalable Vector Graphics) - Chrome, Safari, Opera 최근버전 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 인터넷익스플로어가 자사개발 브라우저엔진을 포기하고, 웹킷엔진을 기반으로 버전업을 하기로 발표가 났다. 즉, WOFF 웹폰트는 브라우저에 상관없이 적용할 수 있게 됬다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;고정폭과 가변폭&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글꼴은 고정폭과 가변폭으로 나뉘어 지는데, 어떤 폰트를 쓰면 폰트에 표현되는 너비가 균일한데 반해, 어떤 폰트는 글자마다 너비가 다르다. 이것이 고정폭과 가변폭의 차이다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/-36Vax9wYWuM/XCib36jLvqI/AAAAAAAAVe0/mlUrWyL-Z-QksKo5UzY7dJmWTha5CBxeACHMYCw/I/15461652138145.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/-yuNGf7C_cNc/XCib582keSI/AAAAAAAAVe4/QcHXtbuq-10PQYJZNf9HMPYFid7l14KlwCHMYCw/I/15461652223874.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Serif 와 Sans Serif&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두가지 종류의 폰트의 가장 큰 차이점은 삐침이 있는가 없는가 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Serif&lt;/code&gt; 는 삐침이 있다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/-rlnFRMOiDuU/XCidVZHPG-I/AAAAAAAAVfE/xAowkk0HDCUfMQ5JxfX3x_kvdl6hJwwKwCHMYCw/I/15461655877641.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Sans serif&lt;/code&gt; 는 삐침이 없다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/-oMOK0X-xJ3s/XCida6GGpSI/AAAAAAAAVfI/17QUGvAHEn4LAAAvgxL4QHJnMv14TBRfgCHMYCw/I/15461656103626.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구별은 삐침이 있다 없다 정도로 구분하는것이 좋아보인다. 왜냐하면, 폰트를 디자인한 디자이너들은 삐침이 있기도 하고 없기도 하고, 끝이 둥글기도 하고 안둥글기도 해서, &lt;code&gt;전체가 삐침이 있다 없다&lt;/code&gt; 정도만 구분하는게 정신건강(?)에 좋다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/-YVuD2NkmZxQ/XCieaFiEKII/AAAAAAAAVfU/qa-885gPZUcgWw1xJjRoCdN7MRlWQo53gCHMYCw/I/15461658638816.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;font-family 의 Serif, Sans Serif&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저에서 사용해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSS 에는 추상적 글꼴 지정법이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;font-family: Serif&lt;/code&gt; : 삐침글꼴 자동선택&lt;/li&gt;
&lt;li&gt;&lt;code&gt;font-family: Sans-serif&lt;/code&gt; : 삐침아닌거 자동선택&lt;/li&gt;
&lt;li&gt;&lt;code&gt;font-family: Monospace&lt;/code&gt; : 고정폭폰트 자동선택&lt;/li&gt;
&lt;li&gt;&lt;code&gt;font-family: Cursive&lt;/code&gt; : 필기체 자동선택&lt;/li&gt;
&lt;li&gt;&lt;code&gt;font-family: Fantasy&lt;/code&gt; : 약간의 그림등이 포함될 수도 있는 폰트 자동선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;끝이 삐쳐있는 글꼴이 많은데, 어떤걸 선택해서 보여주는 걸까? 가장 명확한 것은 폰트를 명시하는 것이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`font-family: Dotum'&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맥 에서 &lt;code&gt;Serif&lt;/code&gt; 와 &lt;code&gt;Sans-serif&lt;/code&gt; 와 &lt;code&gt;Monospace&lt;/code&gt; 를 테스트 해보면&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;style&amp;gt;
.a { font-family:Serif; }
.b { font-family:Sans-serif; }
.c { font-family:Monospace; }
.d { font-family:Cursive; }
.e { font-family:Fantasy; }
&amp;lt;/style&amp;gt;

&amp;lt;p class=&quot;a&quot;&amp;gt;우리나라 좋은나라. Aa Bb Cc Kk Ii Zz&amp;lt;/p&amp;gt; &amp;lt;!-- AppleMyungjo --&amp;gt;
&amp;lt;p class=&quot;b&quot;&amp;gt;우리나라 좋은나라. Aa Bb Cc Kk Ii Zz&amp;lt;/p&amp;gt; &amp;lt;!-- Apple SD Gothic Neo --&amp;gt;
&amp;lt;p class=&quot;c&quot;&amp;gt;우리나라 좋은나라. Aa Bb Cc Kk Ii Zz&amp;lt;/p&amp;gt; &amp;lt;!-- Courier --&amp;gt;
&amp;lt;p class=&quot;d&quot;&amp;gt;우리나라 좋은나라. Aa Bb Cc Kk Ii Zz&amp;lt;/p&amp;gt; &amp;lt;!-- Apple Chancery --&amp;gt;
&amp;lt;p class=&quot;e&quot;&amp;gt;우리나라 좋은나라. Aa Bb Cc Kk Ii Zz&amp;lt;/p&amp;gt; &amp;lt;!-- Papyrus --&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/-5RGm5zYpXek/XCi0urowMWI/AAAAAAAAVfs/O2uMsb0lcwA10D9oDB_o_aJDwv3P8DMzACHMYCw/I/15461715770115.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 컴퓨터 맘대로 설정됐다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;style&amp;gt;
.a { font-family:Dotum, Serif; }
&amp;lt;/style&amp;gt;

&amp;lt;p class=&quot;a&quot;&amp;gt;우리나라 좋은나라. Aa Bb Cc Kk Ii Zz&amp;lt;/p&amp;gt; &amp;lt;!-- AppleMyungjo --&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맥은 돋움이 없기 때문에 물론 애플명조로 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우7/10 테스트해 보면&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;style&amp;gt;
.a { font-family:Serif; }
.b { font-family:Sans-serif; }
.c { font-family:Monospace; }
.d { font-family:Cursive; }
.e { font-family:Fantasy; }
&amp;lt;/style&amp;gt;

&amp;lt;p class=&quot;a&quot;&amp;gt;우리나라 좋은나라. Aa Bb Cc Kk Ii Zz&amp;lt;/p&amp;gt; &amp;lt;!-- Batang --&amp;gt;
&amp;lt;p class=&quot;b&quot;&amp;gt;우리나라 좋은나라. Aa Bb Cc Kk Ii Zz&amp;lt;/p&amp;gt; &amp;lt;!-- Malgun Gothic --&amp;gt;
&amp;lt;p class=&quot;c&quot;&amp;gt;우리나라 좋은나라. Aa Bb Cc Kk Ii Zz&amp;lt;/p&amp;gt; &amp;lt;!-- GulimChe --&amp;gt;
&amp;lt;p class=&quot;d&quot;&amp;gt;우리나라 좋은나라. Aa Bb Cc Kk Ii Zz&amp;lt;/p&amp;gt; &amp;lt;!-- Gungsuh --&amp;gt;
&amp;lt;p class=&quot;e&quot;&amp;gt;우리나라 좋은나라. Aa Bb Cc Kk Ii Zz&amp;lt;/p&amp;gt; &amp;lt;!-- Impact --&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시스템마다 지원하는 브라우저 폰트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폰트는 거의 명시한 상태로 디자인이 나오기 떄문에, 스타일 코드상 으로는 고민의 여지가 없다. 그냥 정한 폰트를 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 구별할 필요가 있는게, 스타일 개발자도 &lt;code&gt;시스템 지원폰트&lt;/code&gt; 를 헷갈리기 쉽고, 웹디자이너 또한 헷갈릴수 있기 때문에, 정리한게 도움이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 &lt;code&gt;WEB Safe Font&lt;/code&gt; 로 불린다. 모든 브라우저와 모든 디바이스 에서 &lt;code&gt;정상적으로 동작하는 폰트&lt;/code&gt; 라는 의미이다. 이외에 폰트는 웹폰트를 써야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/Style/Examples/007/fonts&quot;&gt;W3C 지정폰트&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cssfontstack.com/Web-Fonts&quot;&gt;cssfontstack 정리&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영문폰트에 한해서 일반적으로 선언되는 &lt;code&gt;font-family&lt;/code&gt; 들을 조사해 봤는데,&lt;/p&gt;
&lt;pre class=&quot;scss&quot;&gt;&lt;code&gt;font-family: Arial, Helvetica, sans-serif;
font-family: 'Arial Black', Gadget, sans-serif;
font-family: Impact, Charcoal, sans-serif;
font-family: 'MS Sans Serif', Geneva, sans-serif;
font-family: Tahoma, Geneva, sans-serif;
font-family: 'Trebuchet MS', Helvetica, sans-serif;
font-family: Verdana, Geneva, sans-serif; 

font-family: 'Book Antiqua', 'Palatino Linotype', Palatino, serif;
font-family: Bookman, serif;
font-family: Georgia, serif;
font-family: 'MS Serif', 'New York', serif;
font-family: 'Times New Roman', Times, serif;

font-family: Courier, monospace;
font-family: 'Courier New', Courier, monospace;
font-family: 'Lucida Console', Monaco, monospace; 

font-family: 'Comic Sans MS', cursive; 

font-family: Impact, Charcoal, fantasy; 

font-family: Symbol;
font-family: Webdings;
font-family: Wingdings, 'Zapf Dingbats'; &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등이라고 한다. 한글폰트 대상으로 &lt;code&gt;WEB Safe Font&lt;/code&gt; 라는 타이틀의 정리본은 없고, OS 에서 지원하는 폰트를 그대로 따라가기에, OS별 지원폰트를 보는게 도움이 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_typefaces_included_with_Microsoft_Windows&quot;&gt;윈도우&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_typefaces_included_with_macOS&quot;&gt;맥계열&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wiki.mobileread.com/wiki/List_of_fonts_included_with_each_device&quot;&gt;디바이스&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.granneman.com/webdev/coding/css/fonts-and-formatting/default-fonts&quot;&gt;디바이스&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 안드로이드는 이전에는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;normal (Droid Sans)&lt;/li&gt;
&lt;li&gt;serif (Droid Serif),&lt;/li&gt;
&lt;li&gt;monospace (Droid Sans Mono)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;였으나, 아이스크림 샌드위치 버전(after android4) 이후에는 &lt;code&gt;Roboto&lt;/code&gt; 로 교체했다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;웹폰트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹의 안전한 폰트가 있지만, 다른 폰트를 사용하고 싶을 때, 웹폰트를 지정해서 사용할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본사용법은 이렇다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;@font-face {
        font-family: Elena;
        src: url(elena-regular.woff);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글꼴이름을 지정하고, 대상 폰트의 경로는 &lt;code&gt;src&lt;/code&gt;에 넣어주면 설정은 끝난다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;p {
    font-family: Elena, serif;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 폰트에 대해서 다른설정을 하고 싶을때, 특정조건을 지정해 두면 구분할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;@font-face {
    font-family: Elena;
    src: url(elena-regular.woff);
    font-weight: normal;
}

@font-face {
    font-family: Elena;
    src: url(elena-bold.woff);
    font-weight: bold;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;p {
    font-family: Elena, serif;
}

p strong {
    font-weight: bold;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건은 다양하게 사용할 수 있다. 예를 들어 &lt;code&gt;font-sytle&lt;/code&gt; 을 조합한다던지, &lt;code&gt;font-stretch&lt;/code&gt; 를 조합해 둔다던지 해서, 특정 폰트를 적용할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;@font-face {
    font-family: Elena;
    src: url(elena-regular.woff);
    font-style: italic;
}

@font-face {
    font-family: Elena;
    src: url(elena-bold.woff);
    font-weight: bold;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;p {
    font-family: Elena;
    font-style: italic;
}

p strong {
    font-weight: bold;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight#Fallback_weights&quot;&gt;font-weight 조건참조&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src 속성은 &lt;code&gt;콤마(,)&lt;/code&gt; 로 다중선언을 할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;@font-face {
    font-family: Elena;
    src: url(elena-regular.woff2) format(&quot;woff2&quot;),
        url(elena-regular.woff) format(&quot;woff&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저는 &lt;code&gt;format&lt;/code&gt; 을 보고, 자신이 가장 잘 표현할 수 있는 폰트를 선택 후 렌더링 한다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;@font-face {
    font-family: Elena;
    src: url(elena.eot?#iefix) format(&quot;embedded-opentype&quot;),
         url(elena.woff2) format(&quot;woff2&quot;),
         url(elena.woff) format(&quot;woff&quot;),
         url(elena.otf) format(&quot;opentype&quot;),
         url(elena.svg#elena) format(&quot;svg&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ie8 은 오래된 브라우저이고 &lt;code&gt;eot&lt;/code&gt; 만 지원하기 때문에, &lt;code&gt;#iefix&lt;/code&gt; 라는 식별자를 붙이면 &lt;code&gt;ie9&lt;/code&gt; 이전 버전 빼고는 인식하지 않는다. (정확히는 다른 브라우저는 &lt;code&gt;eot&lt;/code&gt;를 지원안하기 때문에 무시)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또다른 옵션으로 &lt;code&gt;local&lt;/code&gt; 속성이 있다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;@font-face {
    font-family: Elena;
    src: local(&quot;Elena&quot;),
         url(elena-regular.woff2) format(&quot;woff2&quot;),
         url(elena-regular.woff) format(&quot;woff&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 시스템폰트에 해당이름의 글꼴이 설치되어 있다면 다운로드 하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 &lt;code&gt;unicode-range&lt;/code&gt; 속성이 있는데, 이는 &lt;code&gt;유니코드 범위지정&lt;/code&gt; 을 통해서 좀더 세분화 하는 것이다. 이를 활용해서 각 나라별로 폰트를 재지정할 수가 있다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;@font-face {
  font-family: 'Awesome Font';
  font-style: normal;
  font-weight: 400;
  src: local('Awesome Font'),
       url('/fonts/awesome-l.woff2') format('woff2'), 
       url('/fonts/awesome-l.woff') format('woff'),
       url('/fonts/awesome-l.ttf') format('truetype'),
       url('/fonts/awesome-l.eot') format('embedded-opentype');
  unicode-range: U+000-5FF; /* Latin glyphs */
}

@font-face {
  font-family: 'Awesome Font';
  font-style: normal;
  font-weight: 400;
  src: local('Awesome Font'),
       url('/fonts/awesome-jp.woff2') format('woff2'), 
       url('/fonts/awesome-jp.woff') format('woff'),
       url('/fonts/awesome-jp.ttf') format('truetype'),
       url('/fonts/awesome-jp.eot') format('embedded-opentype');
  unicode-range: U+3000-9FFF, U+ff??; /* Japanese glyphs */
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 범위를 지정해서 &lt;code&gt;OS&lt;/code&gt; 나라를 자동으로 구별해서 다운로드 하는 것이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최적화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폰트 로딩의 알고리즘은 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/-ZpCpI4wC67g/XCjG9pTOq1I/AAAAAAAAVf8/1VaH5pJ25tcXOxZ9TV9thhBa_IA0-QbYQCHMYCw/I/15461762429445.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저가 HTML 문서 요청&lt;/li&gt;
&lt;li&gt;브라우저가 HTML 응답 파싱 및 DOM 생성 작업을 시작&lt;/li&gt;
&lt;li&gt;브라우저가 CSS, JS 및 기타 리소스를 발견하고 요청을 발송&lt;/li&gt;
&lt;li&gt;모든 CSS 콘텐츠가 수신된 후 브라우저가 CSSOM을 생성하고 이를 DOM 트리와 결합하여 렌더링 트리를 생성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;렌더링 트리가 페이지에 지정된 텍스트를 렌더링하는 데 필요한 글꼴 버전이 무엇인지 나타내면 글꼴 요청이 발송&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;브라우저가 레이아웃을 수행하고 콘텐츠를 화면에 페인팅
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;글꼴을 아직 사용할 수 없으면, 브라우저가 텍스트 픽셀을 렌더링할 수 없음&lt;/li&gt;
&lt;li&gt;글꼴을 사용할 수 있게 되면, 브라우저가 텍스트 픽셀을 페인팅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 다운로드 되는 웹의 폰트를 사용하면 3가지 현상이 생긴다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;Flash of Invisible Text - FOIT&lt;/code&gt; 현상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹폰트가 로딩될 동안 텍스트가 아예 안보인다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;Flash of Unstyled Text - FOUT&lt;/code&gt; 현상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹폰트가 로딩되기 전에 깨진듯한 화면을 봐야 한다. 로딩된 후에는 폰트렌더링을 다시 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;Flash of Faux Text - FOFT&lt;/code&gt; 현상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폰트 적용전에 &lt;code&gt;Regular&lt;/code&gt; 였다가 &lt;code&gt;Bold&lt;/code&gt;로 바뀌는 현상 (폰트다운로드 타이밍 문제로 발생)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘중 하나의 현상이 생기고, 크롬&amp;amp;파이어폭스는 &lt;code&gt;FOIT&lt;/code&gt; 그 외는 &lt;code&gt;FOUT&lt;/code&gt; 가 재현되고, &lt;code&gt;FOFT&lt;/code&gt;는 브라우저 상관없이 발생한다. 어떤 브라우저가 됐든 이 현상이 눈에 거슬리기는 매한가지 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;피할수 있는 완벽한 방법은 없고, 몇가지 대안방법인데, 대안방법인 만큼 웹폰트는 안쓰는게 최고다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Font Loading API 로 최적화&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://dev.w3.org/csswg/css-font-loading/&quot;&gt;Font Loading API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://caniuse.com/#feat=font-loading&quot;&gt;호환성&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;qml&quot;&gt;&lt;code&gt;var font = new FontFace(&quot;Awesome Font&quot;, &quot;url(/fonts/awesome.woff2)&quot;, {
  style: 'normal', unicodeRange: 'U+000-5FF', weight: '400'
});

font.load(); // don't wait for the render tree, initiate an immediate fetch!

font.ready().then(function() {
  // apply the font (which may re-render text and cause a page reflow)
  // after the font has finished downloading
  document.fonts.add(font);
  document.body.style.fontFamily = &quot;Awesome Font, serif&quot;;

  // OR... by default the content is hidden, 
  // and it's rendered after the font is available
  var content = document.getElementById(&quot;content&quot;);
  content.style.visibility = &quot;visible&quot;;

  // OR... apply your own render strategy here... 
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호환성 문제가 있기 때문에 사용하기는 좀 기달려야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Google Webfont Loader&lt;/h4&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;https://ajax.googleapis.com/ajax/libs/webfont/1.6.16/webfont.js&quot;&amp;gt;https://ajax.googleapis.com/ajax/libs/webfont/1.6.16/webfont.js&amp;lt;/a&amp;gt;

WebFont.load({
  custom: {
    families: ['NanumSquare'], // @font-face에 선언한 폰트 패밀리명
    urls: ['../css/NanumSquare.css'], // @font-face가 선언된 css 경로
  }
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 스크립트는 웹폰트가 정상적으로 다운로드 되었을 때, 화면에 동적으로 붙여준다. 이미지의 &lt;code&gt;preloading&lt;/code&gt; 같은 원리이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;data-uri&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;img src=&quot;base64.ddhlskhdflkhsdlkhf&quot;&lt;/code&gt; 이런식의 실제 이미지를 사용하지 않고, 바이너리 코드를 직접 삽입하는 방법이 있는데, 폰트도 이와같이 다운로드가 아니라 실제코드를 집어넣을 수 있다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;@font-face {
  font-family: NanumSquare;
  src: url(data:application/font-woff;base64,d09GRgABAAAAADEFFFFFEDCrgAAA...);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;preload&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태그의 속성을 이용해서 폰트를 지정하면 상황을 보고 브라우저가 리소스를 다운받을지 안받을지 판단한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://caniuse.com/#search=preload&quot;&gt;호환성&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;head&amp;gt;
  &amp;lt;link rel=&quot;preload&quot; href=&quot;../webfont/NanumSquare/NanumSquare.woff&quot; as=&quot;font&quot; crossorigin&amp;gt;
&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호환성 문제가 있어서 이것도 보류.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;서브셋 으로 폰트 줄이기&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://opentype.jp/subsetfontmk.htm&quot;&gt;서브셋 제너레이터&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;갂, 갅&lt;/code&gt; 등의 문자를 줄여준다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;폰트압축&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;폰트 압축 : 압축해주는 사이트가 있는데, 호환성이 좋지 못하다. 서버의 &lt;code&gt;GZIP&lt;/code&gt; 을 통해서 압축할 수 있다.&lt;/li&gt;
&lt;li&gt;Zopfli 압축 : 약 5% 절감할 수 있다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>스타일/font</category>
      <category>Font</category>
      <category>safe font</category>
      <category>폰트</category>
      <author>richready2011</author>
      <guid isPermaLink="true">https://diff-frontend.tistory.com/15</guid>
      <comments>https://diff-frontend.tistory.com/15#entry15comment</comments>
      <pubDate>Thu, 25 Aug 2022 14:09:18 +0900</pubDate>
    </item>
    <item>
      <title>Vue 컴포넌트 데이터 v-model 연동하기</title>
      <link>https://diff-frontend.tistory.com/14</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트 작성 시 자식컴포넌트와 부모컴포넌트의 &lt;code&gt;데이터를 양방향으로 구성&lt;/code&gt; 하는 경우가 종종 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법은 몇가지 있지만, 원리는 같으며, &lt;code&gt;v-model&lt;/code&gt; 속성을 연동하는 방법에 대한 &lt;code&gt;팁&lt;/code&gt; 으로 보면 좋을 거 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 예제는 &lt;code&gt;vue 2.x&lt;/code&gt; 에 적용된다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;app&quot;&amp;gt;

      부모의 데이터: &amp;lt;input type=&quot;text&quot; v-model=&quot;doggie&quot; /&amp;gt;

      &amp;lt;dog-component v-model=&quot;doggie&quot;&amp;gt;&amp;lt;/dog-component&amp;gt;

    &amp;lt;/div&amp;gt;

    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.6.0&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;style&amp;gt;
    &amp;lt;/style&amp;gt;

    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

      const dogComponent = {
        template: `
          &amp;lt;div&amp;gt;
            자식의 데이터: &amp;lt;input type=&quot;text&quot; v-model=&quot;왈왈&quot; /&amp;gt;
          &amp;lt;/div&amp;gt;
        `,
        props: ['value'],
        computed: {

          '왈왈': {

            get() {
              return this.value;
            },

            set(val) {
              this.$emit('input', val);
            }

          }

        }
      };

      new Vue({
        el: '#app',
        components: {
          'dog-component': dogComponent
        },

        data() {

          return {
            doggie: '안녕하세요? 도지입니다.'
          }

        }
      })
    &amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같이 &lt;code&gt;왈왈&lt;/code&gt; 속성을 &lt;code&gt;computed 와 get, set&lt;/code&gt; 을 통해서, &lt;code&gt;input&lt;/code&gt; 이벤트 때에 부모에게 값을 전달해 주는 형태 이다.&lt;/p&gt;</description>
      <category>프레임워크.라이브러리/vue</category>
      <category>v-model</category>
      <category>Vue</category>
      <category>vue2</category>
      <author>richready2011</author>
      <guid isPermaLink="true">https://diff-frontend.tistory.com/14</guid>
      <comments>https://diff-frontend.tistory.com/14#entry14comment</comments>
      <pubDate>Thu, 25 Aug 2022 14:00:08 +0900</pubDate>
    </item>
    <item>
      <title>Vue 컴포넌트 데이터 연동 정리</title>
      <link>https://diff-frontend.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;SPA (Single Page Application)&lt;/code&gt; 프로젝트 에서 컴포넌트로 구조화 하는 방법은 핵심 장점으로 알려져 있고, 코드 재사용을 위해서 대체적으로 사용하는 추세이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;SPA (Single Page Application)&lt;/code&gt; 프로젝트라 하더라도, 반드시 컴포넌트 구조로 개발 해야하는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 &lt;code&gt;SSR(Server Side Rendering)&lt;/code&gt; 때의 방식처럼, 현재 페이지에 모든데이터를 한번에 전달해서 처리하는 방법으로 해도 상관없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단지 &lt;code&gt;Restful API&lt;/code&gt; 작성함에 &lt;code&gt;Server Less&lt;/code&gt; 방식과 맞지 않고, 다양한 &lt;code&gt;frontend framework&lt;/code&gt; 들이 컴포넌트 단위에 작성방식을 요구하고, 전수하다 보니, 현재 상황은 컴포넌트 단위로 개발하는 것이 정착 되어진 듯 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 &lt;code&gt;MSA(Micro Service Architecture)&lt;/code&gt; 방법론 과도 호환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤게 먼저 시작되었는지는 모르겠다. 잡소리 였다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Vue 컴포넌트 데이터 연동 정리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 단방향&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vue 는 컴포넌트 간 데이터 전달이 단방향이다. 즉 한쪽 으로만 흐른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 컴포넌트에서 자식 컴포넌트로 전달되는 단방향이 기본값 이다.&lt;/p&gt;
&lt;pre class=&quot;django&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;app&quot;&amp;gt;

      &amp;lt;child-component :text=&quot;sendData&quot;&amp;gt;&amp;lt;/child-component&amp;gt;

      &amp;lt;p&amp;gt;부모데이터 : {{ sendData }}&amp;lt;/p&amp;gt;

    &amp;lt;/div&amp;gt;

    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.6.0&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;style&amp;gt;
    &amp;lt;/style&amp;gt;

    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

      const ChildComponent = {
        template: `
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;자식데이터: {{ text }}&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        `,
        props: ['text'],
      }

      new Vue({
        el: '#app',
        components: { ChildComponent },
        mounted() {
          console.log( '구동되었다.' );
        },
        data() {

          return {
            sendData: '안녕?'
          }


        }

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

  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;ChildComponent 의 props&lt;/code&gt; 로 &lt;code&gt;text&lt;/code&gt; 변수를 받고, &lt;code&gt;text&lt;/code&gt; 는 부모의 &lt;code&gt;data 속성인 sendData&lt;/code&gt; 로 연결되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 &lt;code&gt;자식컴포넌트&lt;/code&gt; 에서 전달받은 &lt;code&gt;text&lt;/code&gt; 속성을 변경해 보자.&lt;/p&gt;
&lt;pre class=&quot;django&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;app&quot;&amp;gt;

      &amp;lt;child-component :text=&quot;sendData&quot;&amp;gt;&amp;lt;/child-component&amp;gt;

      &amp;lt;p&amp;gt;부모데이터 : {{ sendData }}&amp;lt;/p&amp;gt;

    &amp;lt;/div&amp;gt;

    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.6.0&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;style&amp;gt;
    &amp;lt;/style&amp;gt;

    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

      const ChildComponent = {
        template: `
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;자식데이터: {{ text }}&amp;lt;/p&amp;gt;
                &amp;lt;button type=&quot;button&quot; @click=&quot;changeTextProp&quot;&amp;gt;text 속성바꾸기&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
        `,
        props: ['text'],
        methods: {
            changeTextProp() {

                this.text = &quot;자식이 text 속성 바꾸다.&quot;;

            }
        }
      }

      new Vue({
        el: '#app',
        components: { ChildComponent },
        mounted() {
          console.log( '구동되었다.' );
        },
        data() {

          return {
            sendData: '안녕?'
          }


        }

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

  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼을 누르게 되면, 자식의 &lt;code&gt;text&lt;/code&gt; 값이 변경 되지만, 참조처럼 전달될 거 같은 &lt;code&gt;sendData&lt;/code&gt; 의 값은 변하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 바로 단방향의 증거다! 부모에게 흐르지 않는다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위에 코드에는 Vue 가 권고하지 않는 코드가 있다. 전달 받은 &lt;code&gt;text&lt;/code&gt; 속성의 값을 직접 변경하지 말아라 라는 규칙이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 에러는 나지 않고, 경고문구가 콘솔에 출력될 수는 있지만, 되도록이면 &lt;code&gt;props&lt;/code&gt; 로 전달받은 변수를 직접 바꾸지 않는 것이 국롤 이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이벤트 $emit 발생&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이 값을 변경하려면, &lt;code&gt;$emit&lt;/code&gt; 메소드를 이용해서, 부모의 이벤트를 발생시키고, 발생된 이벤트에 연결된 함수가 내부 데이터를 변경하는 방식으로 해야만 한다.&lt;/p&gt;
&lt;pre class=&quot;django&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;app&quot;&amp;gt;

      &amp;lt;child-component :text=&quot;sendData&quot; @call-parent-function=&quot;eatChildCall&quot;&amp;gt;&amp;lt;/child-component&amp;gt;

      &amp;lt;p&amp;gt;부모데이터 : {{ sendData }}&amp;lt;/p&amp;gt;

    &amp;lt;/div&amp;gt;

    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.6.0&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;style&amp;gt;
    &amp;lt;/style&amp;gt;

    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

      const ChildComponent = {
        template: `
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;자식데이터: {{ text }}&amp;lt;/p&amp;gt;
                &amp;lt;button type=&quot;button&quot; @click=&quot;changeTextProp&quot;&amp;gt;text 속성바꾸기&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
        `,
        props: ['text'],
        methods: {
            changeTextProp() {

                // this.text = &quot;자식이 text 속성 바꾸다.&quot;;
                this.$emit('call-parent-function', &quot;자식이 text 속성 바꾸다.&quot;);

            }
        }
      }

      new Vue({
        el: '#app',
        components: { ChildComponent },
        mounted() {
          console.log( '구동되었다.' );
        },
        data() {

          return {
            sendData: '안녕?'
          }


        },
        methods: {

            eatChildCall( val ) {

                this.sendData = val;

            }

        }

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

  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 &lt;code&gt;this.$emit&lt;/code&gt; 으로 부모의 이벤트 이름을 넣으면, &lt;code&gt;부모의 이벤트와 연결된 함수 eatChildCall&lt;/code&gt; 이 호출되어, 전달인자로 값을 받고, 부모 내부에서 &lt;code&gt;sendData&lt;/code&gt; 값을 바꾸는 구조로 하면, 변경된 값이 자식에게로 다시 흘러 들어가게 되므로, 자식 컴포넌트의 &lt;code&gt;text&lt;/code&gt; 가 변경된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 권장하는 데이터 전달 방식이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.sync&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 &lt;code&gt;update&lt;/code&gt; 를 담당하는 함수를 여러번 호출해 가며, 사용하는 것은 비효율적 이라고 생각해서 였을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vue 는 &lt;code&gt;.sync&lt;/code&gt; 라는 것을 지원한다. 이것은 위와 같이 이벤트 전달방식을 줄여 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기되어야 하는 속성에 &lt;code&gt;.sync&lt;/code&gt; 가 추가되고, 업데이트를 담당하던 &lt;code&gt;@call-parent-function=&quot;eatChildCall&quot;&lt;/code&gt; 부분은 삭제된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;code&gt;$emit&lt;/code&gt; 에 규칙이 추가 된다.&lt;/p&gt;
&lt;pre class=&quot;django&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;app&quot;&amp;gt;

      &amp;lt;child-component :text.sync=&quot;sendData&quot;&amp;gt;&amp;lt;/child-component&amp;gt;

      &amp;lt;p&amp;gt;부모데이터 : {{ sendData }}&amp;lt;/p&amp;gt;

    &amp;lt;/div&amp;gt;

    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.6.0&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;style&amp;gt;
    &amp;lt;/style&amp;gt;

    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

      const ChildComponent = {
        template: `
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;자식데이터: {{ text }}&amp;lt;/p&amp;gt;
                &amp;lt;button type=&quot;button&quot; @click=&quot;changeTextProp&quot;&amp;gt;text 속성바꾸기&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
        `,
        props: ['text'],
        methods: {
            changeTextProp() {

                // this.text = &quot;자식이 text 속성 바꾸다.&quot;;
                // this.$emit('call-parent-function', &quot;자식이 text 속성 바꾸다.&quot;);
                this.$emit('update:text', &quot;자식이 text 속성 바꾸다.&quot;);

            }
        }
      }

      new Vue({
        el: '#app',
        components: { ChildComponent },
        mounted() {
          console.log( '구동되었다.' );
        },
        data() {

          return {
            sendData: '안녕?'
          }


        },
        methods: {

        }

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

  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;this.$emit('update:text', &quot;자식이 text 속성 바꾸다.&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 &lt;code&gt;update:&lt;/code&gt; 접두어가 붙어 있다는 것을 기억하자. &lt;code&gt;.sync&lt;/code&gt; 와 짝꿍이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 부모의 속성과, 자식의 속성이 연동이 필요할 때만 유효한 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값 동기화 하는 것 외에 다른처리도 같이 해야 한다면, 이 방법은 쓸모가 없다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;v-model&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폼요소의 &lt;code&gt;v-model&lt;/code&gt; 경우에는 어떨까? 왠지 될거 같지 않아?&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;app&quot;&amp;gt;

      &amp;lt;child-component :text=&quot;sendData&quot;&amp;gt;&amp;lt;/child-component&amp;gt;

      &amp;lt;p&amp;gt;부모데이터 : &amp;lt;input type=&quot;text&quot; v-model=&quot;sendData&quot; /&amp;gt;&amp;lt;/p&amp;gt;

    &amp;lt;/div&amp;gt;

    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.6.0&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;style&amp;gt;
    &amp;lt;/style&amp;gt;

    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

      const ChildComponent = {
        template: `
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;자식데이터: {{ text }}&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        `,
        props: ['text'],
        methods: {
        }
      }

      new Vue({
        el: '#app',
        components: { ChildComponent },
        mounted() {
          console.log( '구동되었다.' );
        },
        data() {

          return {
            sendData: '안녕?'
          }


        },
        methods: {

        }

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

  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에는 이상한 점이 없다. &lt;code&gt;input&lt;/code&gt; 의 값은 부모의 &lt;code&gt;sendData&lt;/code&gt; 이기 때문에, 변경되면 즉시 자식에게 흐른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 자식의 &lt;code&gt;v-model&lt;/code&gt; 값은 연동될까?&lt;/p&gt;
&lt;pre class=&quot;django&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;app&quot;&amp;gt;

      &amp;lt;child-component :text=&quot;sendData&quot;&amp;gt;&amp;lt;/child-component&amp;gt;

      &amp;lt;p&amp;gt;부모데이터 : {{ sendData }}&amp;lt;/p&amp;gt;

    &amp;lt;/div&amp;gt;

    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.6.0&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;style&amp;gt;
    &amp;lt;/style&amp;gt;

    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

      const ChildComponent = {
        template: `
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;자식데이터: &amp;lt;input type=&quot;text&quot; v-model=&quot;text&quot; /&amp;gt;&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        `,
        props: ['text'],
        methods: {
        }
      }

      new Vue({
        el: '#app',
        components: { ChildComponent },
        mounted() {
          console.log( '구동되었다.' );
        },
        data() {

          return {
            sendData: '안녕?'
          }


        },
        methods: {

        }

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

  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응 안돼~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAQ3BSIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD5UooooAKKKKACiiigAooooAKKKKACiiigAoop1ADaKXFJQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUopKKAFNJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFL60lABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRS+lACUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAvrSUvrSUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFL6UlL6UAJRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU6kxQAlKOtHFHQ0ALSHrRmg0AJRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAKKSiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKX8aMUAJRS4pKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo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AooooAKKKKACiiigAooooAKKKKACiiigAooooAKUUlKKAFyaXcQOp/OkpMUrDuLuPqfzo3H3/OkIoxTEBJpKXFJQAUUUUAFFFFABRRRQA6im0UAKKWm0UDuOpD1pKKBBRRRQAUUUUALmnBuKZS0AnYduOOppN59TTaKVh3H7iepNNNJRTC4UUUUCCiiigAooooAXFGKSlpgLSfjSUUgCiiigAooooAKcGIGASKbRQA/e3qfzo3H+8fzplFFh3FyfU/nRmkpe1AgHWkoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKXtSUAFFFFABSikooAdRRRQMOKTFLRQAcUHGKTNGaBCUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUopKdQAUUUUAFFFIaAFpD1ozSUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUvakooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAFFB60Cg9aAEooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAF7UlL2pKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBRQetJRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAC9qSiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoopR1oAMUHrS0h60AJRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAooPWgUHrQAlFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACig9aKKAEooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAClFFFAAaSiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9k=&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꽉 막혔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모와 자식간에는 &lt;code&gt;v-model&lt;/code&gt; 만으로는 부족하다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;자식컴포넌트 v-model 값 부모에게 보내기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 컴포넌트의 값을 부모 &lt;code&gt;v-model&lt;/code&gt; 로 전파되게 하는 방법은 &lt;code&gt;emit('input')&lt;/code&gt; 을 이용하면 된다.&lt;/p&gt;
&lt;pre class=&quot;django&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;app&quot;&amp;gt;

      &amp;lt;child-component v-model=&quot;sendData&quot;&amp;gt;&amp;lt;/child-component&amp;gt;

      &amp;lt;p&amp;gt;부모데이터 : {{ sendData }}&amp;lt;/p&amp;gt;

    &amp;lt;/div&amp;gt;

    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.6.0&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;style&amp;gt;
    &amp;lt;/style&amp;gt;

    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

      const ChildComponent = {
        template: `
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;자식데이터: &amp;lt;input type=&quot;text&quot; v-model=&quot;value&quot; /&amp;gt;&amp;lt;/p&amp;gt;
                &amp;lt;button type=&quot;button&quot; @click=&quot;changeTextProp&quot;&amp;gt;바꿔줘&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
        `,
        props: ['value'],
        methods: {
            changeTextProp() {

                this.$emit('input', this.value);

            }
        }
      }

      new Vue({
        el: '#app',
        components: { ChildComponent },
        mounted() {
          console.log( '구동되었다.' );
        },
        data() {

          return {
            sendData: '안녕?'
          }


        },
        methods: {

        }

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

  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모에서 자식 컴포넌트를 불러올 때, &lt;code&gt;v-model&lt;/code&gt; 에 값을 대입해 두었는데, 이렇게 &lt;code&gt;v-model&lt;/code&gt; 을 이용해서 전달되는 값은, 자식 컴포넌트의 &lt;code&gt;props: 'value'&lt;/code&gt; 에 대입된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약속이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 자식 컴포넌트에서 &lt;code&gt;&amp;lt;input type=&quot;text&quot; v-model=&quot;value&quot; /&amp;gt;&lt;/code&gt; 이렇게 할당해 두더라도, 입력값에 따라, 부모컴포넌트에 값이 전달되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 컴포넌트의 &lt;code&gt;v-model&lt;/code&gt; 로 값을 전달하기 위해서는 &lt;code&gt;this.$emit('input', this.value);&lt;/code&gt; 이렇게 &lt;code&gt;input&lt;/code&gt; 이라는 이벤트를 발생시켜야만 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 양방향 느낌으로, 입력하자마자 바뀌었으면 좋겠어서, &lt;code&gt;input 태그&lt;/code&gt; 에 &lt;code&gt;@input&lt;/code&gt; 이벤트로 연결해 보자.&lt;/p&gt;
&lt;pre class=&quot;django&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;app&quot;&amp;gt;

      &amp;lt;child-component v-model=&quot;sendData&quot;&amp;gt;&amp;lt;/child-component&amp;gt;

      &amp;lt;p&amp;gt;부모데이터 : {{ sendData }}&amp;lt;/p&amp;gt;

    &amp;lt;/div&amp;gt;

    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.6.0&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;style&amp;gt;
    &amp;lt;/style&amp;gt;

    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

      const ChildComponent = {
        template: `
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;자식데이터: &amp;lt;input type=&quot;text&quot; v-model=&quot;value&quot; @input=&quot;changeTextProp&quot; /&amp;gt;&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        `,
        props: ['value'],
        methods: {
            changeTextProp() {

                this.$emit('input', this.value);

            }
        }
      }

      new Vue({
        el: '#app',
        components: { ChildComponent },
        mounted() {
          console.log( '구동되었다.' );
        },
        data() {

          return {
            sendData: '안녕?'
          }


        },
        methods: {

        }

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

  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭔가 뚝뚝 끊기는 느낌이다. &lt;code&gt;v-model&lt;/code&gt; 의 방식이 입력이 끝난 후 데이터에 반영하기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 다른 방법으로는 &lt;code&gt;computed&lt;/code&gt; 에 연결하는 것이다.&lt;/p&gt;
&lt;pre class=&quot;django&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;app&quot;&amp;gt;

      &amp;lt;child-component v-model=&quot;sendData&quot;&amp;gt;&amp;lt;/child-component&amp;gt;

      &amp;lt;p&amp;gt;부모데이터 : {{ sendData }}&amp;lt;/p&amp;gt;

    &amp;lt;/div&amp;gt;

    &amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.6.0&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;style&amp;gt;
    &amp;lt;/style&amp;gt;

    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

      const ChildComponent = {
        template: `
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;자식데이터: &amp;lt;input type=&quot;text&quot; v-model=&quot;childModel&quot; /&amp;gt;&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        `,
        props: ['value'],
        computed: {
            'childModel': {

                get() {
                    return this.value;
                },

                set( val ) {
                    this.$emit('input', val);
                }

            }
        },
        methods: {
        }
      }

      new Vue({
        el: '#app',
        components: { ChildComponent },
        mounted() {
          console.log( '구동되었다.' );
        },
        data() {

          return {
            sendData: '안녕?'
          }


        },
        methods: {

        }

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

  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;get, set&lt;/code&gt; 을 응용하여 할 수 있다.&lt;br /&gt;(prop 에 받은 value 를 computed 에서 중복사용 할 수 없기 때문에, &lt;code&gt;childModel&lt;/code&gt; 을 새로 만들었다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부모 v-model 은 자식 컴포넌트의 props: 'value' 에 대입된다.&lt;/li&gt;
&lt;li&gt;자식 컴포넌트에서 부모 v-model 에 값을 전파하기 위해서 $emit('input') 이벤트를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또다른 결론&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웬만하면 단방향 흐름 으로 작성하자.&lt;/li&gt;
&lt;li&gt;v-model 은 만능키가 아니다.&lt;/li&gt;
&lt;li&gt;props 로 받은 변수명을 엥간하면 내부에서 조작 하지 말자.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</description>
      <category>프레임워크.라이브러리/vue</category>
      <category>Vue</category>
      <category>vue2</category>
      <category>데이터단방향</category>
      <category>데이터양방향</category>
      <author>richready2011</author>
      <guid isPermaLink="true">https://diff-frontend.tistory.com/13</guid>
      <comments>https://diff-frontend.tistory.com/13#entry13comment</comments>
      <pubDate>Thu, 25 Aug 2022 13:54:51 +0900</pubDate>
    </item>
    <item>
      <title>Nuxt + Capacitorjs 환경 구축</title>
      <link>https://diff-frontend.tistory.com/12</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://serversideup.net/using-nuxtjs-to-build-an-ios-and-android-app/&quot;&gt;Using NuxtJS to Build an iOS and Android App - Server Side Up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://capacitorjs.com/&quot;&gt;Capacitor - build cross platform apps with the web&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서두&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSR 기반의 웹소스에 APP 빌드 까지 하고 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 소스로 다양한 배포를 하고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접근은 &lt;code&gt;Vue 기반&lt;/code&gt; 으로 시작했고, &lt;code&gt;nuxt&lt;/code&gt; 프레임워크가 &lt;code&gt;SSR&lt;/code&gt; 빌드를 지원하기 때문에, &lt;code&gt;nuxt&lt;/code&gt; 로 정했고, &lt;code&gt;APP&lt;/code&gt; 빌드를 위해 검색해서 찾은 것은, &lt;code&gt;CapacitorJS&lt;/code&gt; 였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이오닉 기반으로 동작하는데, 차이점이라고 따져보자면, 아이오닉은 자바스크립트로 &lt;code&gt;Native App&lt;/code&gt; 크로스플랫폼 앱빌드가 목표라고 한다면, &lt;code&gt;CapacitorJS&lt;/code&gt; 는 &lt;code&gt;웹 우선구축 후 앱빌드&lt;/code&gt; 가 목표라고 되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목표가 다르니, 설명하는 문서의 형태가 다를 것이고, 괜찮다고 생각하여 테스트 해보았다.&lt;br /&gt;(구글한글번역 또한 거의 훌륭하게 번역되어, 문서보는 데에는 어려움이 없었다.)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱빌드 부분에서 Android 는 &lt;code&gt;안드로이드 SDK&lt;/code&gt; 가 설치되는 환경 이여야 하고, ios 는 &lt;code&gt;XCODE&lt;/code&gt; 가 설치가능한 환경 이여야 한다.&lt;br /&gt;(맥에서 안드로이드 sdk를 설치하는 방법이 있고, 윈도우 에서도 xcode 설치하는 방법이 있었다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맥북이 없고, 윈도우 기반에서 작업하고 있으므로, 안드로이드 환경부터 시작해 보았다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;안드로이드 앱빌드 환경 구축&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Capacitor 사이트의 가이드&lt;/code&gt; 는 환경설치 방법에 대해서 간략하게 되어 있는데, 안드로이드 스튜디오를 설치하고, 스튜디오 도구에서 SDK 를 설치하면 됩니다. 정도이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설명이 부족한게, 샘플로 생성되는 환경은 gradle 설치가 되어 있는 상태여야 했고, 안드로이드 스튜디오 SDK 가 동작하기 위해서 Java 설치가 되어 있어야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 그 과정에서 오류나는 부분들 해결은 본인의 몫이였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 부분들이 &lt;code&gt;Docker&lt;/code&gt; 의 위대함을 증명해 주는 것이지 않을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(윈도우 환경변수 설정 및 기타 의존성 프로그램 등등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서대로 정리를 해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 각 도구들의 버전으로 호환성 문제가 있을수도 있으니, 버전을 기록해 둔다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;capacitor v3&lt;/li&gt;
&lt;li&gt;gradle 7.3.1&lt;/li&gt;
&lt;li&gt;java sdk 1.8&lt;/li&gt;
&lt;li&gt;Android sdk v 11.0&lt;/li&gt;
&lt;li&gt;Android Virtual Device Manager &amp;gt; Pixel 2 API 30&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;JAVA 설치&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱빌드시 JAVA 는 최신버전 에서는 문제가 있었고, 8 버전 설치했을 때, 앱빌드 문제가 없었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JAVA Version: 8&lt;/li&gt;
&lt;li&gt;Operating System: Windows&lt;/li&gt;
&lt;li&gt;ARCHITECTURE: x86 x64bit&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.openlogic.com/openjdk-downloads?field_java_parent_version_target_id=416&amp;amp;field_operating_system_target_id=436&amp;amp;field_architecture_target_id=391&amp;amp;field_java_package_target_id=All&quot;&gt;OpenJDK Downloads | Download Java JDK 8 &amp;amp; 11 | OpenLogic&lt;/a&gt; -&amp;gt; 8u262-b10 버전 msi 설치패키지로 다운로드 후 설치&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marobiana.tistory.com/163&quot;&gt;windows에서 JAVA 환경변수 설정하기&lt;/a&gt; -&amp;gt; 환경변수 설정&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;gradle 설치&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;gradle&lt;/code&gt; 은 빌드도구 이다. 안드로이드앱 빌드에 사용된다.&lt;br /&gt;&lt;code&gt;maven&lt;/code&gt; 과 비교되는 도구인데, 안드로이드 앱빌드 공식도구로 &lt;code&gt;gradle&lt;/code&gt; 이 채택되어 있다고 한다.&lt;br /&gt;(maven 도 되지 않을까? 하는 호기심은 재빨리 접었다.)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://gradle.org/releases/&quot;&gt;Gradle | Releases&lt;/a&gt; -&amp;gt; 최신버전 설치&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://itbellstone.tistory.com/101&quot;&gt;Gradle, Windows에 설치부터 실행까지!&lt;/a&gt; -&amp;gt; 환경변수 설정&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hyojun123.github.io/2019/04/18/gradleAndMaven/&quot;&gt;Maven과 Gradle의 차이&lt;/a&gt; -&amp;gt; 참고&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;안드로이드 스튜디오 설치&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.android.com/studio/install?hl=ko&quot;&gt;https://developer.android.com/studio/install?hl=ko&lt;/a&gt; -&amp;gt; 스튜디오 설치&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://haruple.tistory.com/154&quot;&gt;안드로이드 스튜디오 SDK 환경변수 설정하는 방법 (SDK 폴더 경로) :: 하루플스토리&lt;/a&gt; -&amp;gt; 환경변수 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;환경설정 정리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 해당 환경변수 들이 등록되어 있으면, 빌드 시 문제가 없었다.&lt;/p&gt;
&lt;h5&gt;환경변수 &amp;gt; 시스템변수&lt;/h5&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GRADLE_HOME
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C:\gradle\gradle-7.3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;JAVA_HOME
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C:\Program Files\OpenJDK\jdk-8.0.262.10-hotspot&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ANDROID_SDK_ROOT
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C:\Users\[username]\AppData\Local\Android\Sdk&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Path
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;%JAVA_HOME%\bin&lt;/li&gt;
&lt;li&gt;%ANDROID_SDK_ROOT%\bin&lt;/li&gt;
&lt;li&gt;%ANDROID_SDK_ROOT%\tools&lt;/li&gt;
&lt;li&gt;%ANDROID_SDK_ROOT%\platform-tools&lt;/li&gt;
&lt;li&gt;%GRADLE_HOME%\bin&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로젝트 환경 구축하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사전설치가 끝났다면 이제 설치다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;nuxt 프로젝트 환경 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npx 는 &lt;code&gt;node&lt;/code&gt; 설치 시에 &lt;code&gt;npm&lt;/code&gt; 과 같이 설치되는 응용프로그램이다.&lt;br /&gt;&lt;code&gt;Node Package Executor&lt;/code&gt; 로 패키지를 설치하지 않고도 실행할 수 있도록 하는 명령어 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확한 동작원리는 모르겠는데, 현재폴더의 &lt;code&gt;node_modules&lt;/code&gt; 조회 후 없으면, &lt;code&gt;global 설치&lt;/code&gt; 된 부분 조회하고, 그래도 없으면 &lt;code&gt;NPM 사이트&lt;/code&gt; 조회 후 실행하는 것으로 추정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nuxt 프로젝트 기본환경설치를 위해서 npx를 이용한다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;$ npx create-nuxt-app &amp;lt;project-name&amp;gt;
? Project name: &amp;lt;project-name&amp;gt;
? Programming language: JavaScript
? Package manager: Npm
? UI framework: Vuetify.js
? Nuxt.js modules: Axios - Promise based HTTP client, Progressive Web App (PWA)
? Linting tools: ESLint
? Testing framework: None
? Rendering mode: Universal (SSR / SSG)
? Deployment target: Server (Node.js hosting)
? Development tools: jsconfig.json (Recommended for VS Code if you're not using typescript)
? Continuous integration: None
? Version control system: Git&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(powershell 로 설치하면 키보드 커서로 해당옵션을 선택할 수 있다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 프로젝트 폴더로 이동 후에 &lt;code&gt;nuxt.config.js&lt;/code&gt; 파일을 열고, &lt;code&gt;build&lt;/code&gt; 옵션의 &lt;code&gt;publicPath&lt;/code&gt; 를 수정한다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;  // Build Configuration: https://go.nuxtjs.dev/config-build
  build: {
    publicPath: '/nuxt/',
    /*
     ** You can extend webpack config here
     */
    extend(config, ctx) {}
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹팩버전은 4버전으로 맞춘다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;project-name$ npm uninstall webpack
project-name$ npm install --save-dev webpack@4.46.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sass 사용자라면 sass 추가해 준다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;project-name$ npm install --save-dev node-sass sass-loader&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 빌드를 실행해 보자&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;project-name$ npm run build
&amp;gt; projectname@1.0.0 build
&amp;gt; nuxt build

i Production build                                                                            18:22:29
i Bundling for server and client side                                                         18:22:29
i Target: server                                                                              18:22:29
i Using components loader to optimize imports                                                 18:22:29
i Discovered Components: .nuxt/components/readme.md                                           18:22:29
&amp;radic; Builder initialized                                                                         18:22:29
&amp;radic; Nuxt files generated                                                                        18:22:30

&amp;radic; Client
  Compiled successfully in 13.39s

&amp;radic; Server
  Compiled successfully in 4.93s


Hash: 9d157b303b96a691ec50
Version: webpack 4.46.0
Time: 13388ms
Built at: 2021. 12. 05. 오후 6:22:44
                         Asset       Size   Chunks                                Chunk Names
../server/client.manifest.json   17.6 KiB           [emitted]
                    0b3816a.js    489 KiB        9  [emitted] [immutable]  [big]  vendors/app
                    10a2076.js   6.58 KiB        4  [emitted] [immutable]         components/tutorial
                    173abfd.js   5.13 KiB       10  [emitted] [immutable]
                    7fa868a.js    215 KiB        2  [emitted] [immutable]         commons/app
                    8fe1c4a.js  644 bytes        7  [emitted] [immutable]         pages/inspire
                    9c30163.js   12.6 KiB        0  [emitted] [immutable]         vendors/pages/index/pa
ges/inspire
                      LICENSES  407 bytes           [emitted]
                    a9e266d.js   2.36 KiB        8  [emitted] [immutable]         runtime
                    b7013cb.js   1.85 KiB        3  [emitted] [immutable]         components/nuxt-logo
                    bca6f50.js   55.9 KiB        1  [emitted] [immutable]         app
                    cc290d9.js  946 bytes        5  [emitted] [immutable]         components/vuetify-log
o
                    ea69820.js   22.3 KiB  6, 3, 5  [emitted] [immutable]         pages/index
 + 2 hidden assets
Entrypoint app = a9e266d.js 7fa868a.js 0b3816a.js bca6f50.js

WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).
This can impact web performance.
Assets:
  0b3816a.js (489 KiB)

Hash: 175a7a8548a8947c0f4d
Version: webpack 4.46.0
Time: 4933ms
Built at: 2021. 12. 05. 오후 6:22:49
                     Asset       Size   Chunks             Chunk Names
   components/nuxt-logo.js   6.36 KiB        1  [emitted]  components/nuxt-logo
    components/tutorial.js   7.21 KiB        2  [emitted]  components/tutorial
components/vuetify-logo.js   5.45 KiB        3  [emitted]  components/vuetify-logo
            pages/index.js   55.3 KiB  4, 1, 3  [emitted]  pages/index
          pages/inspire.js   18.8 KiB        5  [emitted]  pages/inspire
                 server.js    674 KiB        0  [emitted]  app
      server.manifest.json  667 bytes           [emitted]
 + 6 hidden assets
Entrypoint app = server.js server.js.map
i Ready to run nuxt start         &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹팩빌드가 정상적으로 넘어가면 설정이 잘 된것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러가 발생한다면 에러조치 이후 다음단계로 넘어가야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CapacitorJS 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 프로젝트 폴더로 이동 후에 패키지를 추가해 준다.&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;project-name$ npm install --save-dev @capacitor/core @capacitor/cli @capacitor/ios @capacitor/android&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CapacitorJS 초기화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Capacitor 초기화를 진행한다. 여기서 &lt;code&gt;Package ID&lt;/code&gt; 는 구글스토어플레이 와 맥 앱스토어에 등록되는 ID로 중복이 불가하기 때문에, 유일한 값으로 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등록할 때 변경이 가능하다고 하니, 대충 등록하고 이후 수정하기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Web asset directory 는 &lt;code&gt;dist&lt;/code&gt; 로 설정한다.&lt;/p&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;project-name$ npx cap init
&amp;radic; Package ID ... &amp;lt;Package ID&amp;gt;
[?] What is the web asset directory for your app?
    This directory should contain the final index.html of your app.
&amp;radic; Web asset directory ... dist
&amp;radic; Creating capacitor.config.ts in &amp;lt;Project Folder&amp;gt; in 4.42ms
[success] capacitor.config.ts created!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성공 후 &lt;code&gt;capacitor.config.ts&lt;/code&gt; 생성이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일의 &lt;code&gt;webDir&lt;/code&gt; 은 nuxt 빌드 시 생성되는 폴더와 일치해야 한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import { CapacitorConfig } from '@capacitor/cli';

const config: CapacitorConfig = {
  appId: 'package id',
  appName: 'project name',
  webDir: 'dist',
  bundledWebRuntime: false
};

export default config;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;ios, android&lt;/code&gt; 플랫폼을 추가한다&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;project-name$ npx cap add ios
project-name$ npx cap add android&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;code&gt;gradle&lt;/code&gt; 연관설정 들을 생성하기 위해서 &lt;code&gt;sync&lt;/code&gt; 를 진행한다.&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;project-name$ npx cap sync android&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 &lt;code&gt;generate&lt;/code&gt; 명령어로 &lt;code&gt;dist&lt;/code&gt; 폴더에 빌드파일을 생성한다.&lt;/p&gt;
&lt;pre class=&quot;verilog&quot;&gt;&lt;code&gt;project-name$ npm run generate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;dist&lt;/code&gt; 폴더가 생성되면 이제 웹에 작성된 웹자원 들을 디바이스로 복사 해야 한다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;project-name$ npx cap copy&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행하면 적절한 위치에 [andoid || ios] 에 복사한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 단계이다. 안드로이드 스튜디오에서 프로젝트를 열어보자&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;project-name$ npx cap open android&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 스튜디오 프로그램이 열리고, &lt;code&gt;자동으로 gradle 빌드 성공&lt;/code&gt; 후에 &lt;code&gt;avd 로 디바이스&lt;/code&gt; 를 실행 시켰을 때, 문제없이 실행된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;앱빌드 정리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱을 빌드하기 위한 최종 워크플로는 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;npm run generate&lt;/code&gt; &lt;code&gt;dist&lt;/code&gt; 에 소스 빌드&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npx cap copy&lt;/code&gt; 빌드된 앱을 iOS 및 Android 작업 공간에 복사&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npx cap open ios&lt;/code&gt;또는 &lt;code&gt;npx cap open android&lt;/code&gt;플랫폼용 기본 IDE에서 앱을 열고 디버그&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 &lt;code&gt;adb 로 디바이스 추가하고 실행하는법&lt;/code&gt; 이나, &lt;code&gt;자신의 스마트폰으로 디버깅&lt;/code&gt; 하는 방법들이 추가로 필요했는데, 이 부분은 링크로 대체한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.android.com/studio/run/device?hl=ko&quot;&gt;하드웨어 기기에서 앱 실행&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kibua20.tistory.com/165&quot;&gt;https://kibua20.tistory.com/165&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>환경</category>
      <category>Capacitorjs</category>
      <category>env</category>
      <category>nuxt</category>
      <author>richready2011</author>
      <guid isPermaLink="true">https://diff-frontend.tistory.com/12</guid>
      <comments>https://diff-frontend.tistory.com/12#entry12comment</comments>
      <pubDate>Wed, 24 Aug 2022 17:07:13 +0900</pubDate>
    </item>
    <item>
      <title>Promise 패턴</title>
      <link>https://diff-frontend.tistory.com/11</link>
      <description>&lt;p&gt;@refer: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/web/fundamentals/primers/promises?hl=ko&quot;&gt;자바스크립트 프라미스: 소개&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise&quot;&gt;MDN Promise&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;개요&lt;/h2&gt;
&lt;p&gt;일반적으로 프로그래밍은 하나의 실행업무가 종료되기 전까지 다른 업무를 하지 않는다.&lt;br&gt;예를 들어, 글쓰기폼 에서 글쓰기를 전송하기 위해 &lt;code&gt;Form&lt;/code&gt; 전송을 하면, 서버통신이 완료되기 전까지 다른 업무를 하지 않는다.&lt;br&gt;(강제로 페이지를 이동하기 전에는)&lt;/p&gt;
&lt;p&gt;대부분의 프로그래밍이 이런 &lt;code&gt;동기방식&lt;/code&gt; 으로 작동한다.&lt;/p&gt;
&lt;p&gt;하지만 자바스크립트의 &lt;code&gt;ajax&lt;/code&gt; 통신같은 &lt;code&gt;비동기방식&lt;/code&gt; 은 결과가 나올때 까지 모든것을 중지하지 않는다.&lt;/p&gt;
&lt;p&gt;선행된 &lt;code&gt;비동기방식 업무&lt;/code&gt; 가 완료됐을때 완료됐다는 &lt;code&gt;callback&lt;/code&gt; 을 주게 되면 반응하는 구조로 되어 있다.&lt;/p&gt;
&lt;p&gt;사용자가 페이지에 접속해서 우측상단에 있는 로그인박스에 계정정보를 넣고 로그인버튼을 누른 후에, 사용자는 로그인이 완료될 때까지 현재페이지에서 스크롤을 움직여가며, 나머지 컨텐츠 들을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;동기방식&lt;/code&gt; 이라면 &lt;code&gt;로그인박스의 로그인버튼을 누를 경우&lt;/code&gt; 다른행위를 할 수 없게 된다. 모든 다른 행위가 중지되기 때문이다.&lt;/p&gt;
&lt;p&gt;이것이 &lt;code&gt;비동기방식&lt;/code&gt; 이 인기를 얻게된 이유 중 하나이다.&lt;/p&gt;
&lt;h2&gt;콜백방식&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;비동기방식&lt;/code&gt; 에서 하나의 프로세스가 끝난 후에 다른 프로세스를 실행해야 할 경우에 일반적으로 &lt;code&gt;callback&lt;/code&gt; 을 함수에 준다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function aProcess(callback1) {

    if(callback1) {

        setTimeout(function() {

            // 어떤 작업을 끝낸 후 callback함수를 호출
            callback1();

        },1000);

    }

}

aProcess( function() { console.log(&amp;#39;callback1 run&amp;#39;) } );&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그렇다면 &lt;code&gt;aProcess -&amp;gt; callback -&amp;gt; callback2&lt;/code&gt; 은 어떻게 해야할까?&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function aProcess(callback1, callback2) {

    if(callback1) {

        setTimeout(function() {
            callback1();

            if(callback2) {

                setTimeout(function() {
                    callback2();
                }, 1000);

            }

        }, 1000);

    }

}

aProcess( function() {
    console.log(&amp;#39;callback1 run&amp;#39;);
}, function() {
    console.log(&amp;#39;callback2 run&amp;#39;);
} );&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이런 비슷한 형태가 될 것이다.&lt;/p&gt;
&lt;p&gt;물론 4단계가 필요한 경우가 흔하지는 않지만, 이런 callback 단계가 깊어질수록 효율적 코드관리가 어려워 지기 때문에 &lt;code&gt;콜백지옥&lt;/code&gt; 이라는 표현을 종종 사용한다.&lt;/p&gt;
&lt;p&gt;이런 &lt;code&gt;A -&amp;gt; B -&amp;gt; C&lt;/code&gt; 단계를 수행해야 할 때, 효율적 코드관리를 위해서 &lt;code&gt;Promise&lt;/code&gt; 명세가 나왔다.&lt;/p&gt;
&lt;p&gt;명세는 설명서 같은 것이고, &lt;code&gt;브라우저 벤더사&lt;/code&gt; 혹은 &lt;code&gt;라이브러리&amp;amp;프레임워크 개발자&lt;/code&gt; 들이 참고해서 뭔가를 만들어 낸다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ecma-international.org/ecma-262/6.0/#sec-promise-objects&quot;&gt;Promise 명세&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Promise&lt;/h2&gt;
&lt;p&gt;Promise 는 어느날 갑자기 생긴 것은 아니고, 이전에 일정부분 구현이 되어 있었다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kriskowal/q&quot;&gt;Q&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cujojs/when&quot;&gt;when&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/previous-versions/windows/apps/br211867(v=win.10)&quot;&gt;WinJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tildeio/rsvp.js&quot;&gt;RSVP.js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이렇게 사용하던 것이 &lt;code&gt;ecma 인터네셔널&lt;/code&gt; 에 정식채택이 되면서, 브라우저에도 탑재되기 시작했다.&lt;/p&gt;
&lt;p&gt;최신브라우저 에서는 지원하는거 같은데, 일부 지원하지 않는 브라우저를 위해서 &lt;code&gt;polyfill library&lt;/code&gt; 를 붙여 사용하는 것을 권장한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/taylorhakes/promise-polyfill&quot;&gt;Promise Polyfill&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;기본적인 사용&lt;/h3&gt;
&lt;p&gt;위의 콜백형태를 프로미스 형태로 변경하면 아래와 같다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function aProcess(callback1, callback2) {

    if(callback1) {

        setTimeout(function() {
            callback1();

            if(callback2) {

                setTimeout(function() {
                    callback2();
                }, 1000);

            }

        }, 1000);

    }

}

aProcess( function() {
    console.log(&amp;#39;callback1 run&amp;#39;);
}, function() {
    console.log(&amp;#39;callback2 run&amp;#39;);
} );&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 예제는&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function aProcess(callback1, callback2) {

    new Promise(function(resolve, reject) {

        setTimeout(function() {
            callback1();
            resolve();
        }, 1000);

    }).then(function() {

        setTimeout(function() {
            callback2();
        }, 1000);

    });
}

aProcess( function() {
    console.log(&amp;#39;callback1 run&amp;#39;);
}, function() {
    console.log(&amp;#39;callback2 run&amp;#39;);
} );&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이런 형태로 변경이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;new Promise&lt;/code&gt; 를 선언하고 안에 &lt;code&gt;resolve, reject&lt;/code&gt; 인자를 가진 함수를 지정하면, 내부함수에서 &lt;code&gt;resolve()&lt;/code&gt; 를 수행하기 전에는 그 다음에 체인으로 연결되어 있는 &lt;code&gt;.then&lt;/code&gt; 단계로 넘어가지 않는다. &lt;/p&gt;
&lt;p&gt;즉 &lt;code&gt;aProcess -&amp;gt; callback1 -&amp;gt; callback2&lt;/code&gt; 가 가능해 진다.&lt;/p&gt;
&lt;p&gt;위에 2단계로는 뚜렷하게 다른점이 보이지 않는다. 5단계 정도까지 확장을 하면,&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function aProcess(callback1, callback2) {

    new Promise(function(resolve, reject) {

        setTimeout(function() {
            callback1();
            resolve();
        }, 1000);

    }).then(function() {

        setTimeout(function() {
            callback2();
        }, 1000);

    }).then(function() {

        setTimeout(function() {
            console.log(&amp;#39;callback3 run&amp;#39;);
        }, 1000);

    }).then(function() {

        setTimeout(function() {
            console.log(&amp;#39;callback4 run&amp;#39;);
        }, 1000);

    }).then(function() {

        setTimeout(function() {
            console.log(&amp;#39;callback5 run&amp;#39;);
        }, 1000);

    })
}

aProcess( function() {
    console.log(&amp;#39;callback1 run&amp;#39;);
}, function() {
    console.log(&amp;#39;callback2 run&amp;#39;);
} );&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같은 나열이 예상된다. 처음 예제처럼 &lt;code&gt;callback&lt;/code&gt; 안의 &lt;code&gt;callback&lt;/code&gt; 을 호출하는 형태는 코드 자체가 무한하게 가로로 확장되는 구조를 가질 수 밖에 없다. (물론 코드의 indent 를 좀 정리하면 되지 않겠는가 라고 반문할 수도 있겠다.)&lt;/p&gt;
&lt;p&gt;위에 코드를 조금 정리하면&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function callback1() {
    console.log(&amp;#39;callback1 run&amp;#39;);
}

function callback2() {
    console.log(&amp;#39;callback2 run&amp;#39;);
}

function callback3() {
    console.log(&amp;#39;callback3 run&amp;#39;);
}

function callback4() {
    console.log(&amp;#39;callback4 run&amp;#39;);
}

function callback5() {
    console.log(&amp;#39;callback5 run&amp;#39;);
}


function aProcess() {

    new Promise(function(resolve, reject) {

        setTimeout(function() {
            callback1();
            resolve();
        }, 1000);

    }).then(function() {

        setTimeout(function() {
            callback2();
        }, 1000);

    })
    .then(callback3)
    .then(callback4)
    .then(callback5)

}

aProcess();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;좀더 정리된 느낌의 코드가 된다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Promise&lt;/code&gt; 메소드 들은 &lt;code&gt;Promise 객체&lt;/code&gt; 를 리턴해 주는데, 이것을 이용하면 다른 형태로도 코드를 만들 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function callback1() {
    console.log(&amp;#39;callback1 run&amp;#39;);
}

function callback2() {
    console.log(&amp;#39;callback2 run&amp;#39;);
}

function callback3() {
    console.log(&amp;#39;callback3 run&amp;#39;);
}

function callback4() {
    console.log(&amp;#39;callback4 run&amp;#39;);
}

function callback5() {
    console.log(&amp;#39;callback5 run&amp;#39;);
}

function aProcess() {

    return new Promise(function(resolve, reject) {

        setTimeout(function() {
            callback1();
            resolve();
        }, 1000);

    });

}

aProcess()
    .then(function() {

        setTimeout(function() {
            callback2();
        }, 1000);

    })
    .then( callback3 )
    .then( callback4 )
    .then( callback5 )&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Promise&lt;/code&gt; 함수가 나 자신인 &lt;code&gt;Promise&lt;/code&gt; 를 return 해 준다는 것은 &lt;code&gt;Promise&lt;/code&gt; 객체의 기능들을 체인처럼 연결해서 사용할 수 있다는 것을 의미하는데, 조금 추상적일 수도 있어서, 체이닝패턴에 대해 간략히 보고 가도록 하자.&lt;/p&gt;
&lt;h4&gt;갑자기 체이닝패턴&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function bitCoin() {
    console.log(&amp;quot;constructor running&amp;quot;);
}

bitCoin.prototype.sell = function() {
    console.log(&amp;quot;절대 못팔아&amp;quot;);
}

bitCoin.prototype.buy = function() {
    console.log(&amp;quot;사기 무서워&amp;quot;);
}

bitCoin.prototype.decision = function() {
    console.log(&amp;quot;사기도 팔기도 무서워&amp;quot;);
}

var inheritMethod = new bitCoin();
inheritMethod.sell();
inheritMethod.buy();
inheritMethod.decision();
// inheritMethod.sell().buy(); // Uncaught TypeError: Cannot read property &amp;#39;buy&amp;#39; of undefined&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같이 &lt;code&gt;prototype&lt;/code&gt; 으로 메소드가 있는 함수를 &lt;code&gt;new&lt;/code&gt; 연산자를 통해 대입하게 되면 &lt;code&gt;inheritMethod&lt;/code&gt; 는 &lt;code&gt;bintCoin.__proto__&lt;/code&gt; 에 대한 접근권한을 얻게 되고, 이 연결을 통해 &lt;code&gt;inheritMethod.sell()&lt;/code&gt; 이 가능해 진다. 물론 &lt;code&gt;inheritMethod.__proto__.sell = null&lt;/code&gt; 이런 코드로 &lt;code&gt;bitCoin.sell = null&lt;/code&gt; 같은 위험도 동반된다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.nextree.co.kr/p7323/&quot;&gt;프로토타입 이해하기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이런 여러가지 것들에 대한 이야기 보다 마지막 줄에 있는 &lt;code&gt;inheritMethod.sell().buy()&lt;/code&gt; 이렇게 연결형으로 함수를 실행할 수 있게 만드는 것을 &lt;code&gt;체이닝 패턴&lt;/code&gt; 이라고 하는데, 대표적인 예로 &lt;code&gt;jQuery&lt;/code&gt; 가 &lt;code&gt;$(selector).addClass(&amp;#39;test&amp;#39;).find(&amp;#39;div&amp;#39;)&lt;/code&gt; 같이 연결형으로 메소드를 실행할 수 있는 것은 이런 &lt;code&gt;체이닝 패턴&lt;/code&gt; 을 가지고 있기 때문이다.&lt;/p&gt;
&lt;p&gt;위의 예시에서 &lt;code&gt;inheritMethod.sell().buy()&lt;/code&gt; 가 가능하게 만드는 것은 의외로 쉽다. &lt;code&gt;return this&lt;/code&gt; 를 해주면 된다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function bitCoin() {
    console.log(&amp;quot;constructor running&amp;quot;);
}

bitCoin.prototype.sell = function() {
    console.log(&amp;quot;절대 못팔아&amp;quot;);
    return this;
}

bitCoin.prototype.buy = function() {
    console.log(&amp;quot;사기 무서워&amp;quot;);
    return this;
}

bitCoin.prototype.decision = function() {
    console.log(&amp;quot;사기도 팔기도 무서워&amp;quot;);
    return this;
}

var inheritMethod = new bitCoin();
inheritMethod.sell().buy().decision(); // OK&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이렇게 자신을 &lt;code&gt;return&lt;/code&gt; 해주면 &lt;code&gt;체이닝패턴&lt;/code&gt; 이 가능해진다. &lt;/p&gt;
&lt;p&gt;&lt;code&gt;var inheritMethod = new bitCoin().buy&lt;/code&gt; 이런 코드를 썼을때 &lt;code&gt;inheritMethod&lt;/code&gt; 는 &lt;code&gt;bitCoin.prototype.buy&lt;/code&gt; 와 동일해 진다.&lt;/p&gt;
&lt;p&gt;이렇듯 &lt;code&gt;Promise&lt;/code&gt; 도 &lt;code&gt;체이닝패턴&lt;/code&gt; 으로 되어 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function aProcess() {

    new Promise(function(resolve, reject) {
        resolve();
    });

}

aProcess().then(function() { console.log(&amp;#39;yahoo&amp;#39;) }); // Uncaught TypeError: Cannot read property &amp;#39;then&amp;#39; of undefined&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같이 &lt;code&gt;aProcess()&lt;/code&gt; 를 실행하고 나면 &lt;code&gt;return&lt;/code&gt; 값이 없기 때문에, &lt;code&gt;aProcess().then&lt;/code&gt; 은 사용할 수 없다. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function aProcess() {

    var inheritMethod = new Promise(function(resolve, reject) {
        resolve();
    });

    return inheritMethod;
}

aProcess().then(function() { console.log(&amp;#39;yahoo&amp;#39;) }); // yahoo&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;new Promise&lt;/code&gt; 는 &lt;code&gt;Promise&lt;/code&gt; 를 &lt;code&gt;return&lt;/code&gt; 해주게 되고, 그것이 &lt;code&gt;inheritMethod&lt;/code&gt; 에 할당되며, 그리고 나서 &lt;code&gt;return inheritMethod&lt;/code&gt; 을 해주기 때문에, &lt;code&gt;aProcess()&lt;/code&gt; 는 &lt;code&gt;Promise&lt;/code&gt; 객체를 다시 return 받게 된다. 그럼 &lt;code&gt;Promise&lt;/code&gt; 가 가지고 있는 메소드를 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;위에 코드는 아래와도 동일하게 작동한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function aProcess() {

    return new Promise(function(resolve, reject) {
        resolve();
    });
}

aProcess().then(function() { console.log(&amp;#39;yahoo&amp;#39;) }); // yahoo&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같은 코드가 일반적으로 사용되는 듯 하다. 다시 &lt;code&gt;Promise 예제코드&lt;/code&gt; 로 돌아오면&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function callback1() {
    console.log(&amp;#39;callback1 run&amp;#39;);
}

function callback2() {
    console.log(&amp;#39;callback2 run&amp;#39;);
}

function callback3() {
    console.log(&amp;#39;callback3 run&amp;#39;);
}

function callback4() {
    console.log(&amp;#39;callback4 run&amp;#39;);
}

function callback5() {
    console.log(&amp;#39;callback5 run&amp;#39;);
}

function aProcess() {

    return new Promise(function(resolve, reject) { // `new Promise() 를 return`

        setTimeout(function() {
            callback1();
            resolve();
        }, 1000);

    });

}

aProcess()
    .then(function() {

        setTimeout(function() {
            callback2();
        }, 1000);

    })
    .then(callback3)
    .then(callback4)
    .then(callback5)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위에 코드가 어떻게 체이닝 패턴으로 사용할 수 있는지 설명이 된거 같다.&lt;br&gt;하지만 위에 코드에는 &lt;code&gt;의도와 다른 결과&lt;/code&gt; 가 출력이 되는데, 잠시 접고 가자.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;callback2 함수가 제일 나중에 출력이 되는 현상. &lt;ul&gt;
&lt;li&gt;의도대로 라면 &lt;code&gt;10초후 -&amp;gt; callback1 -&amp;gt; 10초후 -&amp;gt; callback2 -&amp;gt; callback3 -&amp;gt; callback4 -&amp;gt; callbak5&lt;/code&gt; 여야 하지만, 위에 코드 결과는 &lt;code&gt;10초후 -&amp;gt; callback1 -&amp;gt; 10초후 -&amp;gt; callback3 -&amp;gt; callback4 -&amp;gt; callbak5 -&amp;gt; callback2&lt;/code&gt; 로 나옴&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Promise 메소드 와 사용 예시&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Promise&lt;/code&gt; 가 어떻게 돌아가는지 정확히 이해하지 못하더라도, 형태를 외우고 사용하는 데에는 큰 어려움은 없을 것이다.&lt;/p&gt;
&lt;p&gt;간단히 실무에서 사용해 볼 만한 예시를 통해서 활용법을 보자.&lt;/p&gt;
&lt;p&gt;검색을 해보면 대부분이 &lt;code&gt;비동기 통신&lt;/code&gt; 에 관한 예제인 것을 확인할 수 있는데, 나 같은 경우에는 화면 동작과 관련해서 알아보고 싶었다.&lt;/p&gt;
&lt;p&gt;가령 왼쪽에 있던 사각형이 우측으로 이동한 후, 이동이 끝나면 하단으로 이동하고, 끝나면 제자리로 가는 것을 해보면서, 단계별로 동작하는 Promise 에 대해서 알아보고자 한다.&lt;/p&gt;
&lt;h4&gt;Promise 의 resolve, reject&lt;/h4&gt;
&lt;p&gt;프로그래밍 할 때, 위와 같이 어떻게 돌아간다는 것을 모두 이해하지 않더라도, Promise를 사용할 때의 형태는 아래의 코드가 전부이기 때문에, 형태만 익숙해 져도 사용할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function rect() {
    return new Promise(function(resolve, reject) {
        if(true) {
            resolve();
        } else {
            reject();
        }
    });
}

rect()
    .then(function() {
        console.log(&amp;#39;then 1&amp;#39;);
    }).then(function() {
        console.log(&amp;#39;then 2&amp;#39;);
    }).catch(function() {
        console.log(&amp;#39;error!&amp;#39;);
    });&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같이 &lt;code&gt;new Promise&lt;/code&gt; 를 &lt;code&gt;return&lt;/code&gt; 해주고, 실제 사용할 때에 &lt;code&gt;then 체이닝&lt;/code&gt; 으로 실행할 구문이 들어가 있다.&lt;br&gt;여기서 &lt;code&gt;catch&lt;/code&gt; 구문이 추가되어 있는데, 이 블럭이 실행되는 조건은 두가지 이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rect() 함수에서 reject()&lt;/code&gt; 가 실행 되었을 경우&lt;/li&gt;
&lt;li&gt;&lt;code&gt;then 체인 실행 도중에 에러가 날 경우&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 조건중에 하나가 걸리면 &lt;code&gt;catch&lt;/code&gt; 블럭이 실행 된다는 것을 기억하면 된다.&lt;/p&gt;
&lt;h4&gt;로직구현&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;기능&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;제자리에 있던 사각형이 우측으로 이동&lt;/li&gt;
&lt;li&gt;이동이 끝나면 하단으로 이동 &lt;/li&gt;
&lt;li&gt;끝나면 제자리로 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;circle&amp;quot; style=&amp;quot;position:absolute; top:100px; left:100px; width:100px; height:100px; background:greenyellow; border-radius:50%&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;

function moveRight() {
    console.log(&amp;#39;우측으로 이동&amp;#39;);
}

function moveBottom() {
    console.log(&amp;#39;아래로 이동&amp;#39;);
}

function moveOriginal() {
    console.log(&amp;#39;원래자리로 이동&amp;#39;);
}

function init(status) {

    return new Promise(function(resolve, reject) {
        if(status) {
            console.log(&amp;#39;초기화가 되었습니다.&amp;#39;);
            resolve();
        } else {
            reject();
        }

    });

}

init(true)
    .then(moveRight)
    .then(moveBottom)
    .then(moveOriginal)
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;기본설계는 이렇게 될거 같다.&lt;/p&gt;
&lt;p&gt;여기서 애니메이션을 넣어보자.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;circle&amp;quot; style=&amp;quot;position:absolute; top:100px; left:100px; width:100px; height:100px; background:greenyellow; border-radius:50%&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;

var circleObject;

function moveRight() {

    var start = 100,
        end = 200,
        moveTimer;

    moveTimer = setInterval(function() {

        if(start == end) clearInterval(moveTimer);
        circleObject.style.left = start + &amp;quot;px&amp;quot;;
        start = start + 10;

    }, 500);
}

function moveBottom() {
    console.log(&amp;#39;아래로 이동&amp;#39;);
}

function moveOriginal() {
    console.log(&amp;#39;원래자리로 이동&amp;#39;);
}

function init(status) {

    circleObject = document.getElementById(&amp;#39;circle&amp;#39;);

    return new Promise(function(resolve, reject) {
        if(status) {
            console.log(&amp;#39;초기화가 되었습니다.&amp;#39;);
            resolve();
        } else {
            reject();
        }

    });

}

init( true )
    .then( moveRight )
    .then( moveBottom )
    .then( moveOriginal )
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;우선 오른쪽으로 가는 애니메이션을 작성하고.. 같은 방식으로 &lt;code&gt;bottom 함수&lt;/code&gt; 도 구현하자.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;circle&amp;quot; style=&amp;quot;position:absolute; top:100px; left:100px; width:100px; height:100px; background:greenyellow; border-radius:50%&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;

var circleObject;

function moveRight() {

    var start = 100,
        end = 200,
        moveTimer;

    moveTimer = setInterval(function() {

        if(start == end) clearInterval(moveTimer);
        circleObject.style.left = start + &amp;quot;px&amp;quot;;
        start = start + 10;

    }, 500);
}

function moveBottom() {
    var start = 100,
        end = 200,
        moveTimer;

    moveTimer = setInterval(function() {

        if(start == end) clearInterval(moveTimer);
        circleObject.style.top = start + &amp;quot;px&amp;quot;;
        start = start + 10;

    }, 500);
}

function moveOriginal() {
    console.log(&amp;#39;원래자리로 이동&amp;#39;);
}

function init(status) {

    circleObject = document.getElementById(&amp;#39;circle&amp;#39;);

    return new Promise(function(resolve, reject) {
        if(status) {
            console.log(&amp;#39;초기화가 되었습니다.&amp;#39;);
            resolve();
        } else {
            reject();
        }

    });

}

init( true )
    .then( moveRight )
    .then( moveBottom )
    .then( moveOriginal )
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같이 실행할 경우 &lt;code&gt;우측으로 이동 + 아래로 이동&lt;/code&gt; 이 한번에 작동하게 되는데, &lt;code&gt;.then&lt;/code&gt; 에 연결된 함수가 실행되는 것이기 때문에, 자연스러운 현상이다. 하지만 의도한 것은 &lt;code&gt;우측으로 이동 후 아래로 이동&lt;/code&gt; 이다.&lt;/p&gt;
&lt;p&gt;의도한 바 대로 &lt;code&gt;우측으로 이동이 끝날때까지 그다음 수행하는 .then&lt;/code&gt; 을 잡아두려면 &lt;code&gt;.then&lt;/code&gt; 에서 실행하는 함수가 &lt;code&gt;Promise&lt;/code&gt; 객체를 넘겨주면 된다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;circle&amp;quot; style=&amp;quot;position:absolute; top:100px; left:100px; width:100px; height:100px; background:greenyellow; border-radius:50%&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;

var circleObject;

function moveRight() {

    return new Promise(function(resolve, reject) {

        var start = 100,
            end = 200,
            moveTimer;

        moveTimer = setInterval(function() {

            if(start == end) {
                clearInterval(moveTimer);
                resolve(); // Promise 종료
            }
            circleObject.style.left = start + &amp;quot;px&amp;quot;;
            start = start + 10;

        }, 500);

    });
}

function moveBottom() {
    var start = 100,
        end = 200,
        moveTimer;

    moveTimer = setInterval(function() {

        if(start == end) clearInterval(moveTimer);
        circleObject.style.top = start + &amp;quot;px&amp;quot;;
        start = start + 10;

    }, 500);
}

function moveOriginal() {
    console.log(&amp;#39;원래자리로 이동&amp;#39;);
}

function init(status) {

    circleObject = document.getElementById(&amp;#39;circle&amp;#39;);

    return new Promise(function(resolve, reject) {
        if(status) {
            console.log(&amp;#39;초기화가 되었습니다.&amp;#39;);
            resolve();
        } else {
            reject();
        }

    });

}

init( true )
    .then( moveRight )
    .then( moveBottom )
    .then( moveOriginal )
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이렇게 소스를 변경하면 의도한 대로 &lt;code&gt;moveRight 수행 후에 moveBottom&lt;/code&gt; 이 실행된다. 이와 같은 원리로 &lt;code&gt;moveOriginal&lt;/code&gt; 까지 작성한 코드는 아래와 같다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;circle&amp;quot; style=&amp;quot;position:absolute; top:100px; left:100px; width:100px; height:100px; background:greenyellow; border-radius:50%&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;

var circleObject;

function moveRight() {

    return new Promise(function(resolve, reject) {

        var start = 100,
            end = 200,
            moveTimer;

        moveTimer = setInterval(function() {

            if(start == end) {
                clearInterval(moveTimer);
                resolve(); // Promise 종료
            }
            circleObject.style.left = start + &amp;quot;px&amp;quot;;
            start = start + 10;

        }, 500);

    });
}

function moveBottom() {

    return new Promise(function(resolve, reject) {

        var start = 100,
            end = 200,
            moveTimer;

        moveTimer = setInterval(function() {

            if(start == end) {
                clearInterval(moveTimer);
                resolve();
            }
            circleObject.style.top = start + &amp;quot;px&amp;quot;;
            start = start + 10;

        }, 500);

    });    

}

function moveOriginal() {

    var start = 200,
        end = 100,
        moveTimer;

    moveTimer = setInterval(function() {

        if(start == end) {
            clearInterval(moveTimer);
            console.log(&amp;quot;종료&amp;quot;);
        }
        circleObject.style.top = start + &amp;quot;px&amp;quot;;
        circleObject.style.left = start + &amp;quot;px&amp;quot;;
        start = start - 10;

    }, 500);
}

function init(status) {

    circleObject = document.getElementById(&amp;#39;circle&amp;#39;);

    return new Promise(function(resolve, reject) {
        if(status) {
            console.log(&amp;#39;초기화가 되었습니다.&amp;#39;);
            resolve();
        } else {
            reject();
        }

    });

}

init( true )
    .then( moveRight )
    .then( moveBottom )
    .then( moveOriginal )
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이제 &lt;code&gt;우측으로 이동 -&amp;gt; 아래로 이동 -&amp;gt; 처음자리로 이동&lt;/code&gt; 스텝이 단계마다 끝나고 다음단계가 진행되는 방식으로 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;이렇게 &lt;code&gt;Promise&lt;/code&gt;는 &lt;code&gt;대기상태를 제어해야 할때나, 내가 원하는 정확한 타이밍을 제어하고 싶을때, 혹은 ajax로 어떤 데이터를 받고 나서 그 다음에 어떤것을 수행하고자 할때&lt;/code&gt; 등에 사용 하기에 적합하다.&lt;/p&gt;</description>
      <category>자바스크립트</category>
      <category>Promise</category>
      <author>richready2011</author>
      <guid isPermaLink="true">https://diff-frontend.tistory.com/11</guid>
      <comments>https://diff-frontend.tistory.com/11#entry11comment</comments>
      <pubDate>Wed, 24 Aug 2022 15:37:18 +0900</pubDate>
    </item>
  </channel>
</rss>