<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>dev_yyy</title>
    <link>https://yangseon.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 19 Jul 2026 16:59:03 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>yangseon</managingEditor>
    <item>
      <title>[GitHub] 한 레포에 여러 프로젝트를 넣는 방법</title>
      <link>https://yangseon.tistory.com/81</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;⚡️&amp;nbsp;프로젝트에서 backend api를 clone 받고 frontend 프로젝트를 시작할 때 &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하나의 레포에 합치는 방법&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 폴더 생성&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. VS code 실행&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. 생성된 폴더에서 터미널을 실행&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4. git init&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;5.&amp;nbsp;레포지토리 생성 (README.ms 포함해서 생성)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;1180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KLu3p/btrVYi5hzbo/8D6S3jActIpLJpwvFfYeX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KLu3p/btrVYi5hzbo/8D6S3jActIpLJpwvFfYeX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KLu3p/btrVYi5hzbo/8D6S3jActIpLJpwvFfYeX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKLu3p%2FbtrVYi5hzbo%2F8D6S3jActIpLJpwvFfYeX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1316&quot; height=&quot;1180&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;1180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;6. git clone 레포주소&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;51&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5Vh14/btrVUjEoZLO/jGTHmj0r0P7cV7lT05z361/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5Vh14/btrVUjEoZLO/jGTHmj0r0P7cV7lT05z361/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5Vh14/btrVUjEoZLO/jGTHmj0r0P7cV7lT05z361/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5Vh14%2FbtrVUjEoZLO%2FjGTHmj0r0P7cV7lT05z361%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1070&quot; height=&quot;51&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;51&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;7. 클론해준 부모레포의 디렉토리로 이동&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oPqcv/btrVZ7hwX2r/p5KfELhB4YApLtQI1vAeGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oPqcv/btrVZ7hwX2r/p5KfELhB4YApLtQI1vAeGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oPqcv/btrVZ7hwX2r/p5KfELhB4YApLtQI1vAeGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoPqcv%2FbtrVZ7hwX2r%2Fp5KfELhB4YApLtQI1vAeGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;65&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;8. git create-react-app frontend(폴더이름)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kCxXx/btrVWzfcENl/bu6jFLDv8a7tXQE47wbLbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kCxXx/btrVWzfcENl/bu6jFLDv8a7tXQE47wbLbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kCxXx/btrVWzfcENl/bu6jFLDv8a7tXQE47wbLbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkCxXx%2FbtrVWzfcENl%2Fbu6jFLDv8a7tXQE47wbLbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;351&quot; height=&quot;111&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;9. 다른 프로젝트 클론 받아오기 ( &lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;자식 레포를 &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;i&gt;remot&lt;/i&gt;e &lt;/span&gt;로 등록 )&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;⓵ git remote add [remote name] [child git 주소]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;⓶ remote name : 원하는 이름 ( 의미없음 )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;⓷ child git 주소 : 클론 받아올 레포주소&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1496&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mUpK8/btrV0rUJi8U/EtwT2LGv2NszQE2ci5avz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mUpK8/btrV0rUJi8U/EtwT2LGv2NszQE2ci5avz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mUpK8/btrV0rUJi8U/EtwT2LGv2NszQE2ci5avz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmUpK8%2FbtrV0rUJi8U%2FEtwT2LGv2NszQE2ci5avz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1496&quot; height=&quot;76&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1496&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;10. &lt;i&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;subtree&lt;/span&gt; &lt;/i&gt;명령어로 등록&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;git subtree add --prefix=[parent 레포지토리에 저장할&amp;nbsp;폴더명] [child의 remote 이름] [원격 branch name]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;22&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqBwcM/btrVZM6cThU/8YERVKxMRc4Y3zK1IIfDt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqBwcM/btrVZM6cThU/8YERVKxMRc4Y3zK1IIfDt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqBwcM/btrVZM6cThU/8YERVKxMRc4Y3zK1IIfDt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqBwcM%2FbtrVZM6cThU%2F8YERVKxMRc4Y3zK1IIfDt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1113&quot; height=&quot;22&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;22&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;11. git clone 다른레포 주소&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m4ZpZ/btrVVQO1MLR/wOPByKyEPUFI6xEx2IdvN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m4ZpZ/btrVVQO1MLR/wOPByKyEPUFI6xEx2IdvN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m4ZpZ/btrVVQO1MLR/wOPByKyEPUFI6xEx2IdvN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm4ZpZ%2FbtrVVQO1MLR%2FwOPByKyEPUFI6xEx2IdvN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;349&quot; height=&quot;136&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;11. 끝&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;backend / frontend 각각의 폴더에서 push&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMaqpB/btrV0Rez7sP/aeluCf973WUZlrWc28Poyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMaqpB/btrV0Rez7sP/aeluCf973WUZlrWc28Poyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMaqpB/btrV0Rez7sP/aeluCf973WUZlrWc28Poyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMaqpB%2FbtrV0Rez7sP%2FaeluCf973WUZlrWc28Poyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1614&quot; height=&quot;294&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Git Github</category>
      <author>yangseon</author>
      <guid isPermaLink="true">https://yangseon.tistory.com/81</guid>
      <comments>https://yangseon.tistory.com/81#entry81comment</comments>
      <pubDate>Wed, 11 Jan 2023 14:57:50 +0900</pubDate>
    </item>
    <item>
      <title>[ETC] SPA vs MPA와 SSR vs CSR</title>
      <link>https://yangseon.tistory.com/80</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; font-size: 1.44em; letter-spacing: -1px;&quot;&gt;⚡️ SPA vs MPA&lt;/span&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SPA(Single Page Application)는 한 개(Single)의 Page로 구성된 Application이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #006dd7;&quot;&gt;MPA(Multiple Page Application)는 여러 개(Single)의 Page로 구성된 Application이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #006dd7;&quot;&gt;MPA는 새로운 페이지를 요청할 때마다 정적 리소스가 다운로드된다. 매번 전체 페이지가 다시 렌더링 된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;반면 SPA는 웹 에플리케이션에 필요한 모든 정적 리소스를 최초 한 번에 다운로드한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그 이후 새로운 페이지 요청이 있을 때, 페이지 갱신에 필요한 데이터만 전달 받아서 페이지를 갱신한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그래서 SPA를 CSR(Client Side Rendering) 방식으로 렌더링한다고 말한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #006dd7;&quot;&gt;그래서 MPA를 SSR(Server Side Rendering) 방식으로 렌더링한다고 말한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️ &lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;MPA(Multiple Page Application)&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;여러 개(Single)의 Page로 구성된 Application이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;MPA는 SSR(Server Side Application) 방식으로 렌더링한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;새로운 페이지를 요청할 때마다 서버에서 렌더링된 정적 리소스(HTML, CSS, JavaScript)가 다운로드된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;페이지 이동하거나 새로고침하면 전체 페이지를 다시 렌더링한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;MPA 장점&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1. SEO(검색엔진 최적화) 관점에서 유리하다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;MPA는 완성된 형태의 HTML 파일을 서버로부터 전달받는다.&lt;br /&gt;따라서 검색엔진이 페이지를 크롤링하기에 적합하다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2. 첫 로딩 매우 짧다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;서버에서 이미 렌더링해 가져오기 때문이다.&lt;br /&gt;그러나 클라이언트가 JS 파일을 모두 다운로드하고 적용하기전 까지는 각각의 기능은 동작하지않는다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;MPA 단점&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1. 새로운 페이지를 이동하면 &amp;lsquo;깜빡&amp;rsquo;인다. (UX)&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;매 페이지 요청마다 리로딩(새로고침) 발생.&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;새로운 페이지를 요청할 때마다 전체 페이지를 다시 렌더링하기 때문이다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 페이지 이동시 불필요한 템플릿도 중복해서 로딩 (성능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 서버 렌더링에 따른 부하&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 모바일 앱 개발시 추가적인 백엔드 작업 필요 (생산성)개발이 복잡해질 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️ &lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SPA(Single Page Application)&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;한 개(Single)의 Page로 구성된 Application이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SPA는 CSR(Client Side Rendering) 방식으로 렌더링한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;단 한 번만 리소스(HTML, CSS, JavaScript)를 로딩한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그 후에는 데이터를 받아올 때만 서버와 통신한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;즉, 첫 요청시 딱 한 페이지만 불러오고 페이지 이동 시 기존 페이지의 내부를 수정해서 보여주는 방식이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이를 클라이언트 관점에서 말하자면 최초 페이지를 로딩한 시점부터는 페이지 리로딩 없이 필요한 부분만 서버로 부터 받아서 화면을 갱신하는 것이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;필요한 부분만 갱신하기 때문에 네이티브 앱에 가까운 자연스러운 페이지 이동과 사용자 경험(UX)을 제공할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Angular, React, Vue 등 프론트엔드 기술들이 나오면서 크게 유행하고 있다.&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그런데 CSR 방식으로 만든 SPA 앱은 검색엔진최적화(SEO)가 어렵다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;일반적인 SPA 앱을 검색로봇 입장에서 보면 모든 페이지의 소스가 아래와 같이 보이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;검색엔진이 색인을 할 만한 컨텐츠가 존재하지 않는 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️&lt;span&gt; S&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;PA 장점&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1. 자연스러운 사용자 경험 (UX)&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;전체 페이지를 업데이트 할 필요가 없기 때문에 빠르고 &amp;lsquo;깜빡&amp;rsquo; 거림이 없다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2. 필요한 리소스만 부분적으로 로딩 (성능)&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;SPA의 Application은 서버에게 정적리소스를 한 번만 요청한다.그리고 받은 데이터는 전부 저장해놓는다. (캐시=Cache)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;3. 서버의 템플릿 연산을 클라이언트로 분산 (성능)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;4. 컴포넌트별 개발 용이 (생산성)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;5. 모바일 앱 개발을 염두에 둔다면 동일한 API를 사용하도록 설계 가능 (생산성)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;S&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;PA 단점&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;JavaScript 파일을 번들링해서 한 번에 받기 때문에 초기 구동 속도가 느리다. (Webpack의 code splitting으로 해결 가능)&lt;/li&gt;
&lt;li&gt;검색엔진최적화(SEO)가 어려움 (SSR로 해결 가능)&lt;/li&gt;
&lt;li&gt;보안 이슈 (프론트엔드에 비즈니스 로직 최소화)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;SSR에서는 사용자에 대한 정보를 서버측에서 세션으로 관리를 하지만 &lt;br /&gt;CSR 방식에서는 클라이언트측의 쿠키말고는 사용자에 대한 정보를 저장할 공간이 마땅치 않다.&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️ &lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SSR이 렌더링하는 방식&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;MPA는 페이지를 이동할 때마다 새로운 페이지를 요청한다.&lt;/li&gt;
&lt;li&gt;모든 템플릿은 서버 연산을 통해서 렌더링하고 완성된 페이지 형태로 응답한다.&lt;/li&gt;
&lt;li&gt;이 과정을 서버 사이드 렌더링(SSR)이라고 부른다.&lt;/li&gt;
&lt;li&gt;서버 사이드 렌더링의 장점은 SEO이다.&lt;/li&gt;
&lt;li&gt;전통적인 MPA의 경우 브라우저에서 JavaScript 코드가 동작하기 전에도 완성된 형태의 템플릿 (HTML에 데이터가 삽입된 상태)을 서버로 부터 전달받는다.&lt;/li&gt;
&lt;li&gt;이 때문에 검색로봇이 페이지를 크롤링하기에 매우 적합하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️ &lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;CSR이 렌더링하는 방식&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;최초에 한번 서버에서 전체 페이지를 로딩하여 보여주고&lt;/li&gt;
&lt;li&gt;이후에는 사용자의 요청이 올 때마다, 리소스를 서버에서 제공한 후 클라이언트가 해석하고 렌더링하는 방식이다.&lt;/li&gt;
&lt;li&gt;SEO가 어렵다는 큰 단점이 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
      <category>ETC</category>
      <author>yangseon</author>
      <guid isPermaLink="true">https://yangseon.tistory.com/80</guid>
      <comments>https://yangseon.tistory.com/80#entry80comment</comments>
      <pubDate>Thu, 5 Jan 2023 23:30:54 +0900</pubDate>
    </item>
    <item>
      <title>[React] Mock Data</title>
      <link>https://yangseon.tistory.com/79</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️ &lt;/span&gt;Mock Data 란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드 개발을 진행하다 보면, UI 구성에 필요한 백엔드 API가 완성되지 않은 상황에서 개발을 진행해야 할 수도 있습니다. 이러한 경우Mock Data를 만들어 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mock Data란 실제 API에서 받아온 데이터가 아닌&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;프론트엔드 개발자가 필요에 의해 샘플로 만든 데이터&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Mock Data 를 사용하는 이유&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 백엔드 API가 미완성인 상태에서도 작업에 차질 없이 개발할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 백엔드 API의 구성을 미리 맞춰볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 실제로 API 통신을 진행할 때 원활하게 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Mock Data 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Mock Data는 실제 서버에서 보내주는 데이터의 형식과 동일하게 만들어야 하기 때문에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;.json&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;확장자 파일로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/JSON&quot;&gt;JSON&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;형식의 데이터를 생성합니다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 상품 리스트&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;추천리스트.png&quot; data-origin-width=&quot;1786&quot; data-origin-height=&quot;812&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWeqii/btrVo3A1uli/GkcpDtanth5VgKXtRi7EH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWeqii/btrVo3A1uli/GkcpDtanth5VgKXtRi7EH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWeqii/btrVo3A1uli/GkcpDtanth5VgKXtRi7EH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWeqii%2FbtrVo3A1uli%2FGkcpDtanth5VgKXtRi7EH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1786&quot; height=&quot;812&quot; data-filename=&quot;추천리스트.png&quot; data-origin-width=&quot;1786&quot; data-origin-height=&quot;812&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동일한 형태의 상품 컴포넌트가 &lt;span style=&quot;color: #ee2323;&quot;&gt;리스트로 나열되어있는 형태&lt;/span&gt;이기 때문에 &lt;span style=&quot;color: #ee2323;&quot;&gt;배열&lt;/span&gt;로 각 상품의 데이터를 관리할 수 있도록 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672846446170&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// public/data/recommendData.json

[
  {
    &quot;id&quot;: 1,
    &quot;name&quot;: &quot;[돈마루] 한돈 삼겹살 2종 (냉장)&quot;,
    &quot;discount_rate&quot;: 5,
    &quot;discounted_price&quot;: 12967,
    &quot;original_price&quot;: 13650,
    &quot;is_sold_out&quot;: false
  },
  {
    &quot;id&quot;: 2,
    &quot;name&quot;: &quot;엔다이브 2~3입&quot;,
     ...
  },
 ...
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 상품 상세페이지&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;상세페이지.png&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;1248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBOAk4/btrVmXunOC0/c5NscVA3tEiu2NyHoY3cD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBOAk4/btrVmXunOC0/c5NscVA3tEiu2NyHoY3cD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBOAk4/btrVmXunOC0/c5NscVA3tEiu2NyHoY3cD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBOAk4%2FbtrVmXunOC0%2Fc5NscVA3tEiu2NyHoY3cD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1404&quot; height=&quot;1248&quot; data-filename=&quot;상세페이지.png&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;1248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;상품 상세 페이지의 경우 동일한 형태의 여러 데이터가 나열되는 것이 아닌 &lt;span style=&quot;color: #ee2323;&quot;&gt;한 상품의 데이터&lt;/span&gt;이기 때문에, &lt;span style=&quot;color: #ee2323;&quot;&gt;객체&lt;/span&gt;로 해당 상품의 데이터를 관리합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672846717940&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// public/data/productData.json

{
  &quot;id&quot;: 3,
  &quot;image_url&quot;: &quot;https://img-cf.kurly.com/shop/data/goods/1648203571907l0.jpg&quot;,
  &quot;name&quot;: &quot;[콜린스그린] 더 오렌지 1000mL&quot;,
  &quot;short_description&quot;: &quot;물 한방울 넣지 않고 순수한 오렌지 과육을 짜낸 100% 착즙 오렌지 주스&quot;,
  &quot;discounted_price&quot;: 14080,
  &quot;discount_rate&quot;: 20,
  &quot;original_price&quot;: 17600,
  &quot;unit_text&quot;: &quot;1병&quot;,
  &quot;weight&quot;: &quot;1000ml&quot;,
  &quot;delivery_type&quot;: [
    { &quot;id&quot;: 0, &quot;text&quot;: &quot;샛별배송&quot; },
    { &quot;id&quot;: 1, &quot;text&quot;: &quot;택배배송&quot; }
  ],
...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Mock Data 위치&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;public &lt;br /&gt;└── data &lt;br /&gt;├── recommendData.json &lt;br /&gt;├── productData.json &lt;br /&gt;└── ...&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Mock Data 사용&lt;/h3&gt;
&lt;pre id=&quot;code_1672846916012&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// RecommendList.js

import React, { useState, useEffect } from 'react';
import ProductCard from './ProductCard/ProductCard';
import './RecommendList.scss';

const RecommendList = () =&amp;gt; {
  const [productList, setProductList] = useState([]);

  useEffect(() =&amp;gt; {
    fetch('/data/recommendData.json', {
      method: 'GET'
    })
      .then(res =&amp;gt; res.json())
      .then(data =&amp;gt; {
        setProductList(data);
      });
  },[]);

  return (
    &amp;lt;div className=&quot;recommendList&quot;&amp;gt;
      &amp;lt;h1&amp;gt;이 상품 어때요?&amp;lt;/h1&amp;gt;
      &amp;lt;div className=&quot;listWrapper&quot;&amp;gt;
        {productList.map(product =&amp;gt; {
          return (
            &amp;lt;ProductCard
              key={product.id}
              product={product}
            /&amp;gt;
          );
        })}
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default RecommendList;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️ &lt;span&gt;&lt;/span&gt;&lt;/span&gt;Summary&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Mock Data는 실제 API에서 받아온 데이터가 아닌 프론트엔드 개발자가 필요에 의해 샘플로 만든&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;모조 데이터&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li&gt;Mock Data를 활용하면 백엔드의 API가 미완성인 상태에서도 차질없이 개발을 진행할 수 있고, 백엔드와 API 구성을 미리 맞춰볼 수 있기 때문에 실제 API 통신을 원활하게 할 수 있습니다.&lt;/li&gt;
&lt;li&gt;Mock Data는 public 폴더 하위의 data 폴더에서 관리합니다.&lt;/li&gt;
&lt;li&gt;실제 데이터를 불러오는 시점에 fetch 메서드를 통해 Mock Data를 받아올 수 있도록 합니다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>React</category>
      <author>yangseon</author>
      <guid isPermaLink="true">https://yangseon.tistory.com/79</guid>
      <comments>https://yangseon.tistory.com/79#entry79comment</comments>
      <pubDate>Thu, 5 Jan 2023 00:44:11 +0900</pubDate>
    </item>
    <item>
      <title>[React] 상수 데이터</title>
      <link>https://yangseon.tistory.com/78</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️ 상수 데이터란?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;페이지를 구성하다 보면 UI 구성에 필요하지만 동적으로 변하지 않아서 백엔드 API 등을 통해 가져올 필요가 없는 데이터들이 있습니다. 이런 데이터들을 상수 데이터로 만들어 UI를 구성할 수 있습니다. 즉&lt;b&gt; 상수 데이터란&lt;/b&gt; 이름 그대로 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;변하지 않는&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;정적인 데이터&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;를 의미&lt;/span&gt;&lt;/b&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️ 상수 데이터를 사용하는 이유?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;반복되는 UI를 하드코딩&lt;/span&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;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Array.map()&amp;nbsp;메서드와 조합해서 반복되는 UI를 보다 간결하게 표현&lt;/span&gt;할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 수정이 필요한 경우 레이아웃은 map 메서드에서 return하는 JSX 부분만,&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️ 상수 데이터 활용 전&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1672844798775&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from 'react';

const Footer = () =&amp;gt; {
  return (
    &amp;lt;footer&amp;gt;
      {/* 생략 */}
      &amp;lt;ul&amp;gt;
        &amp;lt;li&amp;gt;
          &amp;lt;a href=&quot;https://github.com/terms&quot;&amp;gt;Terms&amp;lt;/a&amp;gt;
        &amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;
          &amp;lt;a href=&quot;https://github.com/privacy&quot;&amp;gt;Privacy&amp;lt;/a&amp;gt;
        &amp;lt;/li&amp;gt;
        ...
        &amp;lt;li&amp;gt;
          &amp;lt;a href=&quot;https://github.com/about&quot;&amp;gt;About&amp;lt;/a&amp;gt;
        &amp;lt;/li&amp;gt;
      &amp;lt;/ul&amp;gt;
    &amp;lt;/footer&amp;gt;
  );
};

export default Footer;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️ 상수 데이터 활용&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;1. &lt;span style=&quot;color: #000000;&quot;&gt;선언한 상수 데이터와 map 메서드를 활용해 실제 코드에 적용&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672844884597&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Footer.js

import React from 'react';

const Footer = () =&amp;gt; {
  return (
    &amp;lt;footer&amp;gt;
      {/* 생략 */}
      &amp;lt;ul&amp;gt;
        {FOOTER_INFO_LIST.map((info) =&amp;gt; (
          &amp;lt;li key={info.id}&amp;gt;
            &amp;lt;a href={info.link}&amp;gt;{info.text}&amp;lt;/a&amp;gt;
          &amp;lt;/li&amp;gt;
        ))}
      &amp;lt;/ul&amp;gt;
    &amp;lt;/footer&amp;gt;
  );
};

export default Footer;

const FOOTER_INFO_LIST = [
  { id: 1, link: 'https://github.com/terms', text: 'Terms' },
  { id: 2, link: 'https://github.com/privacy', text: 'Privacy' },
  ...
  { id: 11, link: 'https://github.com/about', text: 'About' },
];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;color: #000000;&quot;&gt;map 메서드에서 return하는 javascript를 컴포넌트화하고, props로 넘겨주는 방식으로도 활용&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672845010747&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Footer.js

import React from 'react';

const Footer = () =&amp;gt; {
  return (
    &amp;lt;footer&amp;gt;
      {/* 생략 */}
      &amp;lt;ul&amp;gt;
        {FOOTER_INFO_LIST.map((info) =&amp;gt; (
          &amp;lt;FooterInfo key={info.id} link={info.link} text={info.text} /&amp;gt;
        ))}
      &amp;lt;/ul&amp;gt;
    &amp;lt;/footer&amp;gt;
  );
};

export default Footer;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️ 선언 위치&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;1. &lt;/span&gt;컴포넌트 파일 내부에서 선언&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;⓵ 상수 데이터가 해당 컴포넌트 내에서만 사용되고 가독성을 해치지 않는다면, 컴포넌트 파일 내부에서 상수 데이터를 선언해 사용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;⓶ 컴포넌트의 state나 props 등, 컴포넌트 리렌더링 시 변하는 값을 포함하는 상수 데이터는 컴포넌트 내부에서 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;⓷ 컴포넌트가 리렌더링 될 때마다 새로 선언되고 할당될 필요가 없는 상수 데이터는 컴포넌트 외부에서 작성&lt;/p&gt;
&lt;pre id=&quot;code_1672845491747&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Footer.js

import React from 'react';

const Footer = () =&amp;gt; {
  return (
    &amp;lt;footer&amp;gt;
      {/* 생략 */}
      &amp;lt;ul&amp;gt;
        {FOOTER_INFO_LIST.map((info) =&amp;gt; (
          &amp;lt;FooterInfo key={info.id} link={info.link} text={info.text} /&amp;gt;
        ))}
      &amp;lt;/ul&amp;gt;
    &amp;lt;/footer&amp;gt;
  );
};

export default Footer;

const FOOTER_INFO_LIST = [
  { id: 1, link: 'https://github.com/terms', text: 'Terms' },
  { id: 2, link: 'https://github.com/privacy', text: 'Privacy' },
  ...
  { id: 11, link: 'https://github.com/about', text: 'About' },
];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 별도 파일로 분리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; ⓵ 상수 데이터가 해당 컴포넌트 뿐만 아니라 다른 컴포넌트에서도 공통적으로 사용되는 경우&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; ⓶ 상수 데이터의 길이가 너무 길어서 가독성을 해치는 경우&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672845597997&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// data.js

export const FOOTER_INFO_LIST = [
  { id: 1, link: 'https://github.com/terms', text: 'Terms' },
  { id: 2, link: 'https://github.com/privacy', text: 'Privacy' },
  ...
  { id: 11, link: 'https://github.com/about', text: 'About' },
];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 경우, 해당 파일에서 export한 상수 데이터를 사용할 컴포넌트에서 import하여 사용&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672845625939&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Footer.js

import React from 'react';
import { FOOTER_INFO_LIST } from './data';

const Footer = () =&amp;gt; {
  return (
    &amp;lt;footer&amp;gt;
      {/* 생략 */}
      &amp;lt;ul&amp;gt;
        {FOOTER_INFO_LIST.map((info) =&amp;gt; (
          &amp;lt;li key={info.id}&amp;gt;
            &amp;lt;a href={info.link}&amp;gt;{info.text}&amp;lt;/a&amp;gt;
          &amp;lt;/li&amp;gt;
        ))}
      &amp;lt;/ul&amp;gt;
    &amp;lt;/footer&amp;gt;
  );
};

export default Footer;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️ &lt;/span&gt;Summary&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;상수 데이터란 UI 구성에 필요하지만 동적으로 변하지 않아서 백엔드 API 등을 통해서 가져올 필요가 없는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;정적인 데이터&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li&gt;반복되는 UI 구조는 상수 데이터와 map 메서드를 활용해 간결하게 표현할 수 있습니다.&lt;/li&gt;
&lt;li&gt;상수 데이터를 활용하면 UI를 효율적으로, 확장성 있게 구성할 수 있으며 유지보수가 용이합니다.&lt;/li&gt;
&lt;li&gt;상수 데이터는 컴포넌트 파일 내부에서 선언하거나, 별도의 파일로 분리해서 사용할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>React</category>
      <author>yangseon</author>
      <guid isPermaLink="true">https://yangseon.tistory.com/78</guid>
      <comments>https://yangseon.tistory.com/78#entry78comment</comments>
      <pubDate>Thu, 5 Jan 2023 00:22:42 +0900</pubDate>
    </item>
    <item>
      <title>[CSS] Sass &amp;amp; Scss ( Syntactically Awesome Style Sheets )</title>
      <link>https://yangseon.tistory.com/77</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Sass 와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Scss&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;차이점&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1672841484893&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// .sass

nav
  ul
    margin: 0
    padding: 0
    list-style: none

  li
    display: inline-block

  a
    display: block
    padding: 6px 12px
    text-decoration: none&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1672841500331&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// .scss

nav {
  ul {
    margin: 0;
    padding: 0;
    list-style: none;
  }

  li { display: inline-block; }

  a {
    display: block;
    padding: 6px 12px;
    text-decoration: none;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;⓵ &lt;/span&gt;&amp;nbsp;sass 문법을 활용한 방법 ⓶ scss 문법을 활용한 방법&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;sass보다&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;scss 문법을 사용하는 것을 권장&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하고 있습니다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;왜냐하면 sass의 문법 개선을 통해 나온 것이 scss이기도 하고,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;scss가 더 넓은 범용성과 CSS의 호환성&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;등의 장점이 있기 때문입니다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CSS Preprocessor&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹 페이지를 만들면서 CSS를 이용해 다양한 스타일을 적용하고 관리할 수 있고, 다양한 기능들을 적용할 수 있지만 문법이 불편해서 막상 적용하기 힘든 부분들이 있습니다. 이러한 불편함을 개선하고자 나온 기술이 CSS Preprocessor 즉,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;CSS 전처리기&lt;span style=&quot;color: #000000;&quot;&gt;입니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;CSS 전처리기가 하는 일&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여러 가지 기능들을 문법적으로 편리하게 작성할 수 있도록 제공하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;전처리기의 양식에 맞게 파일을 미리 작성&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해두면, 그걸 최종적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;실제 실행 전에 처리&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 해줘서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;브라우저가 읽을 수 있는 CSS 파일로 변환&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해 주는 일을 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️ &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Scss&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;설치&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1672840513045&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ npm install sass&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;라이브러리 설치 방법은 위와 같습니다. 터미널에서 프로젝트 폴더로 이동한 뒤 위와 같은 명령어를 작성하면 설치가 가능합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672840564109&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// package.json

{
  &quot;name&quot;: &quot;westagram-react&quot;,
  &quot;version&quot;: &quot;0.1.0&quot;,
  &quot;private&quot;: true,
  &quot;dependencies&quot;: {
    &quot;@testing-library/jest-dom&quot;: &quot;^4.2.4&quot;,
    &quot;@testing-library/react&quot;: &quot;^9.3.2&quot;,
    &quot;@testing-library/user-event&quot;: &quot;^7.1.2&quot;,
    &quot;sass&quot;: &quot;^4.14.1&quot;,
    &quot;react&quot;: &quot;^18.0.0&quot;,
    &quot;react-dom&quot;: &quot;^18.0.0&quot;,
    &quot;react-scripts&quot;: &quot;3.4.3&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;설치가 완료되었다면, 위처럼&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;package.json&lt;span style=&quot;color: #000000;&quot;&gt;의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;dependencies&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;항목에서 해당 패키지 명과 버전이 추가되었는지 확인해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️ &lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Scss의 활용&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. Nesting&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컴포넌트 간 CSS가 겹치지 않도록 설정하는 방법으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;className&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;을 전부 다르게 적용&lt;/b&gt;하거나,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;자손결합자&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;기능을 활용해 설정&lt;/b&gt;할 수 있지만, 여러 문제점과 불편한 점이 있다고 언급했습니다. 이러한 부분을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Sass&lt;span style=&quot;color: #000000;&quot;&gt;에서 사용하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;nesting&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;방식을 통해 해결&lt;/b&gt;할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672842389034&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nav {
  ul {
    margin: 0;
    padding: 0;
    list-style: none;
  }

  li {
    display: inline-block;
  }

  a {
    display: block;
    padding: 6px 12px;
    text-decoration: none;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2.&amp;nbsp; 변수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CSS 스타일을 작성하다 보면 동일한 스타일 속성인데,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여러 곳에서 사용되거나 오타가 나기 쉬운 속성&lt;/b&gt;&lt;b&gt;들을 변수&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로 만들어 그 변수를 원하는 곳에 넣어서 사용하는 기능이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;(&amp;nbsp;rgb로 컬러를 구현하거나, HEX 코드로 컬러를 구현할 때 )&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672842664541&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Sass 변수 활용 예시

$primary-color: #333;

body {
  border: 1px solid black;
  color: $primary-color;
}

.inverse {
  background-color: $primary-color;
  color: white;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3.&amp;nbsp; &amp;amp; 선택자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Nesting 내부에서 &amp;amp; 선택자는 부모 선택자로 치환됩니다. 예를 들어, button 태그에 스타일을 부여하고, 해당 버튼에 hover 효과도 부여하고 싶다면 아래와 같이 구현할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672842761521&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Sass &amp;amp; 선택자 활용 예시

button {
  width: 200px;
  height: 50px;

  &amp;amp;:hover {
    width: 400px;
    height: 100px;
  }
}

/* Compile to CSS */

button {
  width: 200px;
  height: 50px;
}

button:hover {
  width: 400px;
  height: 100px;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. &lt;span&gt;&lt;/span&gt;mixin&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mixin&lt;span style=&quot;color: #000000;&quot;&gt;은 앞선 변수 기능과 마찬가지로 중복되는 스타일 속성이 있을 때 사용하는 방법인데,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중복되는 스타일 속성이 여러 개가 있을 때 한 번에 묶어서&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;사용하기 좋은 방법입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672842863341&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//variables.scss

@mixin flex($justify: center, $align: center, $direction: row) {
  display: flex;
  flex-direction: $direction;
  align-items: $align;
  justify-content: $justify;
}

@mixin font($size: 16px, $height: 1, $spacing: normal, $weight: 500) {
  font-size: $size;
  font-weight: $weight;
  letter-spacing: $spacing;
  line-height: $height;
}
 
$primary-color: #5655a5;
$subPrimary-color: #8887c0;
$background-color: #f0f3fa;
$white-color: #fff;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1672843002182&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@import '../../../../styles/variables.scss';

.errorChartPresenter {
  @include flex(space-between, center, column);
  width: 60.6771vw;
  height: 41.4583vw;

  .lineBarChartBox {
    @include flex(center, center, 'null');
    width: 100%;
    height: 19.2708vw;
    background: $white-color;
    border-radius: 0.7813vw;
   }
  }&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Summary&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Sass는 CSS 문법을 조금 더 편하게 작성할 수 있다.&lt;/li&gt;
&lt;li&gt;scss 문법으로 작성한 파일을 실행 전에 처리를 해줘서 브라우저가 읽을 수 있는 CSS 파일로 변환해 주는&lt;span&gt;&amp;nbsp;&lt;/span&gt;CSS 전처리기입니다.&lt;/li&gt;
&lt;li&gt;기존 CSS 파일의 확장자를 scss로 변경하면 scss 문법이 사용 가능해 집니다.&lt;/li&gt;
&lt;li&gt;Sass의&lt;span&gt;&amp;nbsp;&lt;/span&gt;nesting,&lt;span&gt;&amp;nbsp;&lt;/span&gt;mixin&lt;span&gt;&amp;nbsp;&lt;/span&gt;등 다양한 기능을 활용해서 문법적으로 조금 더 편하게 스타일을 작성할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>HTML CSS</category>
      <author>yangseon</author>
      <guid isPermaLink="true">https://yangseon.tistory.com/77</guid>
      <comments>https://yangseon.tistory.com/77#entry77comment</comments>
      <pubDate>Wed, 4 Jan 2023 23:41:10 +0900</pubDate>
    </item>
    <item>
      <title>[TypeScript] 조건문으로 타입만들기 &amp;amp; infer</title>
      <link>https://yangseon.tistory.com/75</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️삼항연산자&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자바스크립트 기본 문법 중에 삼항연산자라는게 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;if가 들어갈 수 없는 곳들에 간략하게 if문을 넣을 수 있는 방법입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;조건문 ? 참일때실행할코드 : 거짓일때실행할코드
3 &amp;gt; 1 ? console.log('맞아요') : console.log('아님')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️조건부로 타입만들기&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;type Age&amp;lt;T&amp;gt; = T;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러면 이제 Age&amp;lt;number&amp;gt; 이렇게 쓰면 그 자리에 number가 남습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(타입변수에도 타입파라미터 넣기 가능)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;if문을 사용하여 만약 T가 string이면 string, 그게 아니면 unknown 를 남기도록 하고싶다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럴때 &lt;span style=&quot;color: #000000;&quot;&gt;타입 조건식은 주로&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;b&gt;extends 키워드와 삼항연산자를&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;extends는 왼쪽이 오른쪽의 성질을 가지고 있냐&quot; 라는 뜻으로 사용할 수 있기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;조건식 용도로 사용가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;type Age&amp;lt;T&amp;gt; = T extends string ? string : unknown;
let age : Age&amp;lt;string&amp;gt; //age는 string 타입
let age2 : Age&amp;lt;number&amp;gt; //age는 unknown 타입
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. &quot;T라는 파라미터가 string 성질 가지고 있냐? 그러면 string 남기고 아니면 unknown 남겨라&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. &amp;lt;string&amp;gt; 넣으면 string, &amp;lt;number&amp;gt; 넣으면 unknown을 남겨줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 이게 if문 쓰는 방법입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 아직 타입이 확실하지 않은 &amp;lt;타입파라미터&amp;gt; 다룰 때 많이 사용합니다.&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️infer 키워드&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;조건문에 사용할 수 있는 특별한 infer 키워드가 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;infer 키워드는 지금 입력한 타입을 변수로 만들어주는 키워드입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;평상시에 사용하지 않지만 나오면 읽을 줄은 알아야하니 간단히 이해만 하길...&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;fsharp&quot;&gt;&lt;code&gt;type Person&amp;lt;T&amp;gt; = T extends infer R ? R : unknown; 
type 새타입 = Person&amp;lt;string&amp;gt; // 새타입은 string 타입입니다 &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. infer 키워드는 조건문 안에서만 사용가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. infer 우측에 자유롭게 작명해주면 타입을 T에서 유추해서 R이라는 변수에 집어넣어라~ 라는 뜻입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 그래서 위의 예제에서 &amp;lt;string&amp;gt; 이렇게 타입파라미터자리에 string 집어넣으면 R은 string이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. R을 조건식 안에서 맘대로 사용가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이런 식으로&amp;nbsp;&lt;b&gt;타입파라미터에서 타입을 추출해서&lt;/b&gt;&amp;nbsp;쓰고싶을 때 쓰는 키워드라고 보시면 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️infer 키워드 사용 용도&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. array 안에 있던 타입이 어떤 타입인지 뽑아서 변수로 만들어 때&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;type 타입추출&amp;lt;T&amp;gt; = T extends (infer R)[] ? R : unknown; 
type NewType = 타입추출&amp;lt; boolean[] &amp;gt; // NewType 은 boolean 타입입니다 &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(infer R)[] 이렇게 하면 array가 가지고 있던 타입부분만 쏙 뽑아서 R 변수에 할당할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 함수의 return 타입이 어떤 타입인지 뽑아서 변수로 만들어 때&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;type 타입추출&amp;lt;T&amp;gt; = T extends ( ()=&amp;gt; infer R ) ? R : unknown; 
type NewType = 타입추출&amp;lt; () =&amp;gt; number &amp;gt; // NewType은 number 타입입니다 &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;타입파라미터에 &amp;lt;함수&amp;gt;를 집어넣었습니다. 그 타입파라미터에 있는 return 타입을 뽑아서 R이라는 변수에 담는 코드입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일정한 규칙이 있다기 보다 그냥 타입을 추출하는 식으로 이해하면 되겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(문제1) 타입 파라미터로&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. array 타입을 입력하면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. array의 첫 자료가 string이면 string 타입을 그대로 남겨주고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. array의 첫 자료가 string이 아니면 unknown 을 남겨주려면 어떻게 타입을 만들어놔야할까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(동작예시)&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;let age1 :Age&amp;lt;[string, number]&amp;gt;;
let age2 :Age&amp;lt;[boolean, number]&amp;gt;; &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러면 age1의 타입은 string, age2의 타입은 unknown이 되어야합니다. (array나 tuple이나 그게 그거임)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이걸 만족하는&amp;nbsp;&lt;b&gt;type Age를 만들어봅시다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(정답)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;type Age&amp;lt;T&amp;gt; = T extends [string, ...any] ? T[0] : unknown;
let age1 :Age&amp;lt;[string, number]&amp;gt;;
let age2 :Age&amp;lt;[boolean, number]&amp;gt;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러면 정말 age1은 string, age2는 unknown이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(문제2) 함수의 파라미터의 타입을 뽑아주는 기계를 만들어보십시오.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;타입뽑기&amp;lt;(x :number) =&amp;gt; void&amp;gt; //이러면 number가 이 자리에 남음
타입뽑기&amp;lt;(x :string) =&amp;gt; void&amp;gt; //이러면 string이 이 자리에 남음&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아무튼 함수의 파라미터타입이 남아야합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(정답)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;type 타입뽑기&amp;lt;T&amp;gt; = T extends (x: infer R) =&amp;gt; any ? R : any;
type a = 타입뽑기&amp;lt;(x :number) =&amp;gt; void&amp;gt; &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러면 a라는 타입이 number로 잘 남습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;참고로 함수만 들어올 수 있게 제한을 두고 싶으면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;언제나 T 라는 함수 파라미터 만들 때 extends로 제한을 두면 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>TypeScript</category>
      <author>yangseon</author>
      <guid isPermaLink="true">https://yangseon.tistory.com/75</guid>
      <comments>https://yangseon.tistory.com/75#entry75comment</comments>
      <pubDate>Mon, 2 Jan 2023 17:15:49 +0900</pubDate>
    </item>
    <item>
      <title>[TypeScript] object 타입 변환기 만들기</title>
      <link>https://yangseon.tistory.com/74</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️object를 다른 타입으로 변환하고 싶을 때&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모든 속성들에 문자가 들어오는 타입을 갑자기 숫자가 들어오도록 바꾸고 싶을 때&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;처음부터 타입을 다시 작성하는 것이 아니라 mapping을 이용하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️keyof 연산자&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;keyof 연산자는 object 타입에 사용하면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;object 타입이 가지고 있는 모든 key값을 union type으로 합쳐서 내보내줍니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;object의 key를 뽑아서 새로운 타입을 만들고 싶을 때 사용하는 연산자입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;interface Person {
  age: number;
  name: string;
}
type PersonKeys = keyof Person;   //&quot;age&quot; | &quot;name&quot; 타입됩니다
let a :PersonKeys = 'age'; //가능
let b :PersonKeys = 'ageeee'; //불가능&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Person 타입은 age, name 이라는 key를 가지고 있었기 때문에&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이제 PersonKeys는 정말 'age' | 'name' 타입이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;literal type이네요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;interface Person {
  [key :string]: number;
}
type PersonKeys = keyof Person;   //string | number 타입됩니다
let a :PersonKeys = 'age'; //가능
let b :PersonKeys = 'ageeee'; //가능&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Person 타입은 모든 문자 key를 가질 수 있기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;keyof Person 이렇게 하면&amp;nbsp;&lt;b&gt;string&lt;/b&gt;&amp;nbsp;타입이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실은&lt;b&gt;&amp;nbsp;string | number&lt;/b&gt;&amp;nbsp;타입이 됩니다. object key값에 숫자 넣어도 문자로 치환되어서 그렇습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[key :number] 이렇게 숫자만 들어올 수 있게 해놓고 keyof Person 을 하면&amp;nbsp;&lt;b&gt;number&lt;/b&gt;&amp;nbsp;타입이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(참고) 자바스크립트는 .keys() 이런거 붙이면 key값을 array자료로 담아줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️&lt;b&gt;Mapped Types&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;object안에 있는 속성들을 다른 타입으로 한번에 변환하고 싶을 때&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; 타입변환기&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;type Car = {
  color: boolean,
  model : boolean,
  price : boolean | number,
}; &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;type Car의 모든 속성을 string 타입으로 바꿔야 될 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;속성이 3개면 직접 다시 만들어도 되겠지만 100개면 어쩌죠? 매우 귀찮습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;type Car = {
  color: boolean,
  model : boolean,
  price : boolean | number,
};

type TypeChanger &amp;lt;MyType&amp;gt; = {
  [key in keyof MyType]: string;
};

type 새로운타입 = TypeChanger&amp;lt;Car&amp;gt;;

let obj :새로운타입 = {
  color: 'red',
  model : 'kia',
  price : '300',
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. TypeChanger 처럼 생긴 타입을 만들고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2.&amp;nbsp;&lt;b&gt;[ 자유작명 in keyof 타입파라미터 ] : 원하는 타입&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 이렇게 입력하시면 object 타입을 입력했을 때 속성명은 그대로지만 다른 타입으로 변환해주는 변환기를 만들 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. in 키워드는 왼쪽이 오른쪽에 들어있냐라는 뜻이고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. keyof는 오브젝트 타입에서 key값만 union type으로 뽑아주는 역할입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(결과) 새로운타입은 color, model, price 속성을 가지고 있으며 전부 string 타입이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;key 값이 100개 있는 object 타입을 변경할 일이 있으면 쓰도록 합시다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(문제1) 다음 타입을 변환기를 돌려보십시오.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;type Bus = {
  color : string,
  model : boolean,
  price : number
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;type Bus의 color, model, price 속성을 전부&amp;nbsp;&lt;b&gt;string 또는 number 타입&lt;/b&gt;으로 바꿔주세요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 변환기 하나 만드시고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 기존 Bus 타입을 변환기 돌려서 위 조건을 충족하는 새로운 타입을 하나 만들어보십시오.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(정답)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;type Bus = {
  color : string,
  model : boolean,
  price : number
}

type TypeChanger &amp;lt;MyType&amp;gt; = {
  [key in keyof MyType]: string|number;
};

type NewBus = TypeChanger&amp;lt;Bus&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(문제2) 이런 변환기는 어떻게 만들어야할까요?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;object안에 들어있는 모든 속성을 string, number 이렇게 고정된 타입으로 변환해주는게 아니라&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내가 원하는 타입을 입력하면 그걸로 변환해주는 범용성 좋은 변환기를 만들어보십시오.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(정답)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;type Bus = {
  color : string,
  model : boolean,
  price : number
}

type TypeChanger &amp;lt;MyType, T&amp;gt; = {
  [key in keyof MyType]: T;
};

type NewBus = TypeChanger&amp;lt;Bus, boolean&amp;gt;;
type NewBus2 = TypeChanger&amp;lt;Bus, string[]&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. TypeChanger 쓸 때마다 타입파라미터를 T 자리에 하나 더 입력할 수 있게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 그러면 이제 오브젝트 모든 속성은 T로 바뀜&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. NewBus 살펴보시면 모든 속성이 boolean으로 바뀌어있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. NewBus2 살펴보시면 모든 속성이 string[] 으로 바뀌어있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <author>yangseon</author>
      <guid isPermaLink="true">https://yangseon.tistory.com/74</guid>
      <comments>https://yangseon.tistory.com/74#entry74comment</comments>
      <pubDate>Mon, 2 Jan 2023 13:32:11 +0900</pubDate>
    </item>
    <item>
      <title>[TypeScript] object index signatures</title>
      <link>https://yangseon.tistory.com/73</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️object 자료에 타입을 미리 만들어주고 싶은 경우&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. object 자료에 어떤 속성들이 들어올 수 있는지 아직 모르는 경우&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 타입지정할 속성이 너무 많은 경우&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;index signatures 를 사용하면 편리합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️index signatures&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;object 용 타입을 하나 만들고 싶습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;근데 아직 어떤 속성이 들어올지 모르는 경우 index signatures 사용&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;interface StringOnly {
  [key: string]: string
}

let obj :StringOnly = {
  name : 'kim',
  age : '20',
  location : 'seoul'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. StringOnly 라는 interface를 하나 만들었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 근데 안에 타입을 적을 때 [어쩌구 : string] : string 이렇게 적으면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 모든 string으로 들어오는 key값에 할당되는 value는 string 이어야합니다~ 라는 타입이 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;쉽게 말하면 { 모든속성 : string }&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이라는 뜻과 동일합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. 이제 이 object에 들어오는 모든 속성은 우측에 string을 가져야합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6. 코드 한 줄로 모든 속성 타입지정이 가능해서 편리할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;interface StringOnly {
  age : number,   ///에러남 ㅅㄱ
  [key: string]: string,
}

interface StringOnly {
  age : string,   ///가능  
  [key: string]: string,
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[ ] 이 문법은 다른 속성과 함께 사용할 수 있지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;{ 모든 속성 : string, age : number } 이건 뭔가 논리적으로 말이 되지 않아 금지시킵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;interface StringOnly {
  age : number,   ///가능
  [key: string]: string | number,
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이건 가능합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;{ 모든속성 : string | number, age : number } 이렇게 해주면 논리적으로 말이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️array 형태도 가능&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자바스크립트에서 array와 object는 크게 다를게 없는 같은 자료형입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;let obj = {
  0 : 'kim'
  1 : '20',
  2 : 'seoul'
}
console.log(obj[2]) //이러면 'seoul' 출력됨  &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 위 코드를 보면 array랑 똑같이 사용가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 아무튼 object로도 array 처럼 사용가능&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(object 자료도 대괄호쳐서 안에 있는 데이터 뽑을 수 있습니다)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;interface StringOnly {
  [key: number]: string,
}

let obj :StringOnly = {
  0 : 'kim'
  1 : '20',
  2 : 'seoul'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. [ ] 여기 안에 key값의 타입을 number 로 지정할 수도 있습니다. (대괄호 안엔 string 또는 number만 가능)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 그럼 이제 object의 키값이 숫자로 들어오는 경우 value로 string을 가져야한다는 타입입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; 쉽게 말하면 { 모든숫자속성 : string }&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;이라는 뜻과 동일합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 그래서 array처럼 쓰고싶은 object가 있으면 저렇게 타입지정도 가능하다는 소리입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. 숫자 key만 넣을거면 그냥 array + tuple 타입 쓰는게 더 직관적일 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️Recursive Index Signatures&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(방법1)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;interface MyType {
  'font-size' : {
    'font-size' : {
      'font-size' : number
    }
  }
}

let obj = {
  'font-size' : {
    'font-size' : {
      'font-size' : 14
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. object 안에 object 안에 object가 들어있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 직접 interface 안에 {} 이걸 3번 중첩되게 만드셔도 되긴 하지만&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 귀찮을 경우 이런 테크닉을 사용할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(방법2)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sml&quot;&gt;&lt;code&gt;interface MyType {
  'font-size': MyType | number
}


let obj :MyType = {
  'font-size' : {
    'font-size' : {
      'font-size' : 14
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 'font-size' 속성은 MyType 이거랑 똑같이 생겼다고 타입을 만들었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 그리고 object자료가 4중첩 5중첩 X중첩되어도 대응가능&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(문제1) 다음 자료의 타입을 지정해보십시오.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;let obj = {
  model : 'k5',
  brand : 'kia',
  price : 6000,
  year : 2030,
  date : '6월',
  percent : '5%',
  dealer : '김차장',
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(정답)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;type Car = {
  [key :string] : number | string
}

let obj :Car = {
  model : 'k5',
  brand : 'kia',
  price : 6000,
  year : 2030,
  date : '6월',
  percent : '5%',
  dealer : '김차장',
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;유연한 타입지정이 가능하지만 엄격하지 않아서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;버그를 잡아준다는 장점은 없어질 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(문제2) 다음 object 자료의 타입을 interface 써서 만들어보십시오.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;let obj = {
  'font-size' : 10,
  'secondary' : {
    'font-size' : 12,
    'third' : {
      'font-size' : 14
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(정답)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;interface MyType {
  'font-size' : number,
  [key :string] : number | MyType,
}

let obj = {
  'font-size' : 10,
  'secondary' : {
    'font-size' : 12,
    'third' : {
      'font-size' : 14
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. MyType을 만들었는데 여기 안엔 'font-size' 속성, 그리고 모든 문자 속성이 들어갈 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 모든 문자 속성이 들어오면 number | MyType을 가져야한다고 타입지정해놨습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. object 안에 object를 집어넣어도 MyType 타입과 비슷하게 생기면 통과시켜줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <author>yangseon</author>
      <guid isPermaLink="true">https://yangseon.tistory.com/73</guid>
      <comments>https://yangseon.tistory.com/73#entry73comment</comments>
      <pubDate>Mon, 2 Jan 2023 13:05:28 +0900</pubDate>
    </item>
    <item>
      <title>[TypeScript] implements 키워드</title>
      <link>https://yangseon.tistory.com/72</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;⚡️&lt;/span&gt;implements 키워드&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;interface는 object 타입지정할 때 사용합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;class 타입을 확인하고 싶을 때도 interface 문법을 사용할 수 있습니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;( 근데 implements 키워드도 필요함&amp;nbsp; )&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;class Car {
  model : string;
  price : number = 1000;
  constructor(a :string){
    this.model = a
  }
}
let 붕붕이 = new Car('morning'); &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. class Car 로부터 생산되는 object들은 model과 price 속성을 가지게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 근데 class가 model, price 속성을 가지고 있는지 타입으로 확인하고 싶을 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사용방법 -&amp;nbsp; interface + implements 키워드로 확인&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;interface CarType {
  model : string,
  price : number
}

class Car implements CarType {
  model : string;
  price : number = 1000;
  constructor(a :string){
    this.model = a
  }
}
let 붕붕이 = new Car('morning');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. class 이름 우측에 implements를 쓰고 interface 이름을 쓰면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. &quot;이 class가 이 interface에 있는 속성을 다 들고있냐&quot;&amp;nbsp;라고 확인이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 속성을 다 갖고 있으면 실행이 되고 빠진 속성이 있으면 에러로 알려줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️implements는 타입지정문법이 아닙니다&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;implements라는건 interface에 들어있는 속성을 가지고 있는지 확인만하라는 뜻입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;class에다가 타입을 할당하고 변형시키는 키워드는 아닙니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;interface CarType {
  model : string,
  tax : (price :number) =&amp;gt; number;
}

class Car implements CarType {
  model;   ///any 타입됨
  tax (a){   ///a 파라미터는 any 타입됨 
    return a * 0.1
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. CarType에 있던 model : string 이런게 반영되는건 아닙니다. class 안에서의 model은 any 타입입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. class 함수도 마찬가지로 함수에 있던 number 타입이 전혀 반영되지 않습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;( 결론 )&lt;/span&gt; &lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;implements는 class의 타입을 체크하는 용도지 할당하는게 아님을 명심합시다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;</description>
      <category>TypeScript</category>
      <author>yangseon</author>
      <guid isPermaLink="true">https://yangseon.tistory.com/72</guid>
      <comments>https://yangseon.tistory.com/72#entry72comment</comments>
      <pubDate>Mon, 2 Jan 2023 12:39:08 +0900</pubDate>
    </item>
    <item>
      <title>[TypeScript] d.ts 파일 이용하기</title>
      <link>https://yangseon.tistory.com/71</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️d.ts&amp;nbsp;파일&amp;nbsp;이용하기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;d.ts 파일은 타입만 저장할 수 있는 파일형식입니다. ( definition의 약자인 d가 들어감 )&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 타입정의만 따로 저장해놓고 import 해서 쓸 때 사용&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 프로젝트에서 사용하는 타입을 쭉 정리해놓을 레퍼런스용으로 사용&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️타입만 따로 d.ts에 모아놓으려면&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;export type Age = number;
export type multiply = (x :number ,y :number) =&amp;gt; number
export interface Person { name : string }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 파일이름.d.ts 라고 작성하신 파일은&amp;nbsp;&lt;b&gt;타입 정의만&lt;/b&gt;&amp;nbsp;넣을 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;( type 키워드, interface 키워드 이런식으로 정의 )&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 함수의 경우 함수에 { } 중괄호 붙이기는 불가능합니다. 파라미터 &amp;amp; return 타입만 지정가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 정의해둔 타입은 export 해서 써야합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. d.ts 파일은 ts 파일이 아니기 때문에 그냥 써도 ambient module이 되지 않습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. 그래서 export를 추가해줘야 다른 ts 파일에서 가져다쓸 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6. 한 번에 많은 타입을 export 하고 싶은 경우 namespace에 담든가&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7. 아니면 자바스크립트 배운 사람처럼&amp;nbsp;&lt;b&gt;import * as 어쩌구&lt;/b&gt;&amp;nbsp;문법을 쓰십시오.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️d.ts 파일을 레퍼런스용으로 쓰려면&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ts파일마다 d.ts 파일을 자동생성하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;clojure&quot;&gt;&lt;code&gt;(tsconfig.json)

{
    &quot;compilerOptions&quot;: {
        &quot;target&quot;: &quot;es5&quot;,
        &quot;module&quot;: &quot;es6&quot;,
        &quot;declaration&quot;: true,
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. tsconfig에다가&lt;/span&gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;declaration 옵션을 true&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로 바꿔주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 그럼 저장시 자동으로 ts파일마다 d.ts 파일이 옆에 생성됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;(index.ts)

let 이름 :string = 'kim';
let 나이 = 20;
interface Person { name : string } 
let 사람 :Person = { name : 'park' }&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;(index.d.ts)

declare let 이름: string;
declare let 나이: number;
interface Person {
    name: string;
}
declare let 사람: Person;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 이런 파일이 생성됩니다. (안생기면 import 문법 다 지워보세요)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2.&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; 어쩌구.d.ts&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;라는 파일엔&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;어쩌구.ts&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;파일에 있는 모든 변수와 함수 타입정의가 들어있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 자동생성의 경우 따로 수정하거나 그럴 순 없어서 그냥 레퍼런스용으로 사용하거나 하시면 됩니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(수정해도 어쩌구.ts 저장시 자동생성이라 의미없음)&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️export 없이 d.ts 파일을 글로벌 모듈 만들기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;원래 d.ts 파일은 import export 없어도 로컬모듈입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 다른 ts파일에서 import를 해서 쓸 수 밖에 없는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이게 귀찮으면 d.ts를 글로벌 모듈로 만들어보십시오.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;파일이 많아지면 섞이기 때문에 굳이 왜 하나 싶지만&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로젝트 내에 types/common 이런 폴더 두개를 만드시고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;tsconfig.json 파일에&amp;nbsp;&lt;b&gt;&quot;typeRoots&quot;: [&quot;./types&quot;]&amp;nbsp;&lt;/b&gt;이런 옵션을 추가해주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러면 ts 파일 작성할 때 타입없으면 자동으로 여기서 타입 찾아서 적용해줌&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 다만 이걸 쓸 경우 파일명.d.ts 자동생성 기능은 끄는게 좋을 듯 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- d.ts 파일명은 기존 ts 파일명과 안겹치게 작성하는게 좋습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 하지만 이런거 쓰다가 로컬 타입과 저런 글로벌 타입이 겹치면 불안전 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;- 결론)&amp;nbsp; import export가 안전합니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;⚡️유명한 JS 라이브러리들은 d.ts 파일을 제공&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. &amp;nbsp;라이브러리 모아놓은 github repository&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/DefinitelyTyped/DefinitelyTyped&quot;&gt;Definitely Typed&lt;/a&gt;&lt;span&gt; &lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;github repository에 대부분 라이브러리의 타입정의 파일을 찾을 수 있을 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2.타입정의된 npm 패키지&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.typescriptlang.org/dt/search?search=&quot;&gt;TypeSearch&lt;/a&gt;&amp;nbsp; &lt;span style=&quot;color: #000000;&quot;&gt;여기 들어가면 npm으로 라이브러리 설치시 타입스크립트 타입정의된 버전을 따로 찾아서 설치하실 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;타입이 정의된 라이브러리를 npm으로 설치하면 node_modules/@types 이런 경로에 타입이 설치됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 타입스크립트 컴파일러는 자동으로 여기 있는 타입 파일을 참고해서 타입을 가져오게 되어있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(참고) &quot;typeRoots&quot; 옵션이 있을 경우 node_modules/@types 폴더를 추가해야합니다. 아니면 그냥 &quot;typeRoots&quot; 옵션을 제거합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;혹은 따로 타입부분만 설치할 수도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를 들어 타입파일이 제공되지 않는 jQuery 같은 경우&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;npm install --save @types/jquery&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이렇게 강제로 설치하시면 이제 jQuery 문법 사용할 때 타입정의 안하셔도 됩니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>TypeScript</category>
      <author>yangseon</author>
      <guid isPermaLink="true">https://yangseon.tistory.com/71</guid>
      <comments>https://yangseon.tistory.com/71#entry71comment</comments>
      <pubDate>Mon, 2 Jan 2023 12:28:57 +0900</pubDate>
    </item>
  </channel>
</rss>