<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>@Devme</title>
    <link>https://recoderr.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 27 Aug 2026 12:28:54 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>****7****</managingEditor>
    <image>
      <title>@Devme</title>
      <url>https://tistory1.daumcdn.net/tistory/3830851/attach/c908a162b4e7404ca5bc695995b0a426</url>
      <link>https://recoderr.tistory.com</link>
    </image>
    <item>
      <title>TypeScript에서 string key로 객체에 접근하기</title>
      <link>https://recoderr.tistory.com/114</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;항해플러스 FE 2기 참여해서 사전스터디로 자바스크립트와 타입스크립트 기초 강의를 받았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;타입스크립트 2주차 강의에서 pure javascript의 배열 내장함수를 사용하면 하드코딩하지 않아도 될 부분이 있어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;평소 하던대로 작성해보았는데 타입 에러가 발생했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;기능&amp;nbsp; : Student 타입의 객체인 학생의 각 과목 접수를 합산해서 평균을 내는 함수&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;▼강의 내 정답 함수 코드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1723860699440&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface Student {
  name: string;
  age: number;
  scores: {
    korean: number;
    math: number;
    society: number;
    science: number;
    english: number;
  };
}

function calculateAverage(student: Student): number {
  const sum = student.scores.korean + student.scores.math + student.scores.society + student.scores.science + student.scores.english;
  const average = sum / 5;
  return average;
}&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;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;▼ 내가 작성한 코드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1723860925663&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function calculateAverage(student: Student): number {
  const keys = Object.keys(student.scores);
  let sum = 0;

  keys.forEach((e) =&amp;gt; {
    sum += student.scores[e];  // 이 부분에서 error 발생
  });

  return sum / keys.length;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;▼ compile error 내용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;text-align: start;&quot;&gt;Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ korean: number; math: number; society: number; science: number; english: number; }'.&lt;br /&gt;No index signature with a parameter of type 'string' was found on type '{ korean: number; math: number; society: number; science: number; english: number; }'.&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;ts(7053)&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;sum&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;student&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;scores&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;];&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pure javascript를 사용했을 때 아무런 문제가 없던 부분인데&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt; 왜 타입스크립트에서는 타입 불일치 에러가 발생했을까?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;문제는 바로! 인터페이스로 선언한 Student 타입에서 key 값에 대한 타입 선언을 하지 않았기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;객체의 key에 대해 타입 선언을 하지 않는다면 String literal 타입으로 String 타입보다 좁은 의미의 타입으로 선언된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;예를 들면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1723861682948&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type obj = {
    name : string
    age : 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;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;위와 같이 obj 라는 타입은 name, age를 key로 가지고 있는데&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;해당 key의 각각의 타입 또한 name, age 로 String literal 타입이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;문자열의 형태를 가지고 있다고 해서 string 타입이 아니고 값까지 타입 결정의 일부가 되는 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;이와 같이 string literal 타입이 아닌 string 타입으로 해석하고 싶다면, &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;index signature&lt;/span&gt;&lt;/b&gt;를 사용하면 된다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1723861854896&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type obj = {
  [index: string]: string
  name: string
  age: string
}&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;size14&quot;&gt;index signature 란 타입의 속성(키, 프로퍼티) - 값 페어의 타입을 선언해두는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;key의 타입이 다른 index signature는 여럿 선언할 수 있지만, index signature의 value type은 모두 일치해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1723862221370&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface Student {
  name: string;
  age: number;
  scores: {
    [key: string]: number;
    korean: number;
    math: number;
    society: number;
    science: number;
    english: number;
  };
}

function calculateAverage(student: Student): number {
  const keys = Object.keys(student.scores);
  let sum = 0;

  keys.forEach((e) =&amp;gt; {
    sum += student.scores[e];  // ok
  });

  return sum / keys.length;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이렇게 index signature를 사용하면 동적으로 key를 변경하여 객체 내의 값의 가져올 때 타입 불일치 에러를 피할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;참고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://soopdop.github.io/2020/12/01/index-signatures-in-typescript/#index-signature-%EC%84%A0%EC%96%B8%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://soopdop.github.io/2020/12/01/index-signatures-in-typescript/#index-signature-%EC%84%A0%EC%96%B8%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/p&gt;</description>
      <category>Programming/JavaScript</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/114</guid>
      <comments>https://recoderr.tistory.com/114#entry114comment</comments>
      <pubDate>Sat, 17 Aug 2024 11:38:46 +0900</pubDate>
    </item>
    <item>
      <title>Python pip 명령어 사용 안될때 버전 업그레이드도 안될때</title>
      <link>https://recoderr.tistory.com/94</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv0gtc/btrIyYGkgWe/iDWYh2nPIBic5IMMdUgcRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv0gtc/btrIyYGkgWe/iDWYh2nPIBic5IMMdUgcRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv0gtc/btrIyYGkgWe/iDWYh2nPIBic5IMMdUgcRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv0gtc%2FbtrIyYGkgWe%2FiDWYh2nPIBic5IMMdUgcRK%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;869&quot; height=&quot;193&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 101에서 파이썬으로 자동매매봇 만들기 클래스를 수강하며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode에 첫 python 명령어(라이브러리 인스톨)을 입력했더니&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전이 맞지 않아 1차 에러가 발생되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. error 내용&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WARNING: Failed to write executable - trying to use .deleteme logic &lt;br /&gt;ERROR:&amp;nbsp;Could&amp;nbsp;not&amp;nbsp;install&amp;nbsp;packages&amp;nbsp;due&amp;nbsp;to&amp;nbsp;an&lt;br /&gt;EnvironmentError: [WinError 2] 지정된 파일을 찾을 수 없습니다: 'c:\\경로\\Scripts\\normal &lt;br /&gt;WARNING:&amp;nbsp;You&amp;nbsp;are&amp;nbsp;using&amp;nbsp;pip&amp;nbsp;version&amp;nbsp;20.2.3;&amp;nbsp;however,&amp;nbsp;version&amp;nbsp;22.2.1&amp;nbsp;is&amp;nbsp;available. &lt;br /&gt;You&amp;nbsp;should&amp;nbsp;consider&amp;nbsp;upgrading&amp;nbsp;via&amp;nbsp;the&amp;nbsp;'c:\경로\python.exe&amp;nbsp;-m&amp;nbsp;pip&amp;nbsp;install&amp;nbsp;--upgrade&amp;nbsp;pip'&amp;nbsp;command.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 인스톨 하고자하는 라이브러리는 pip 22.2.1 버전을 요구 하고 있었고 현재 적용되어있는 pip version은 20.2.3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JN5jJ/btrICOWu4OW/9FKHsLIq5NfKsow7mNPh80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JN5jJ/btrICOWu4OW/9FKHsLIq5NfKsow7mNPh80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JN5jJ/btrICOWu4OW/9FKHsLIq5NfKsow7mNPh80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJN5jJ%2FbtrICOWu4OW%2F9FKHsLIq5NfKsow7mNPh80%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;1001&quot; height=&quot;536&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;536&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;2. 친절하게 제시된 '-m pip install --upgrade pip' 을 사용했지만 권한 때문에 안되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 그래서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2-1. 사용권한을 변경하거나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2-2. -m pip install --upgrade pip --user 로 명령하면 사용 업그레이드가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;f2py.exe.deleteme 파일 자체가 권한을 요구하고 있으므로 일반 명령어를 실행했을때&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ERROR:&amp;nbsp;Could&amp;nbsp;not&amp;nbsp;install&amp;nbsp;packages&amp;nbsp;due&amp;nbsp;to&amp;nbsp;an&amp;nbsp;OSError:&amp;nbsp;[WinError&amp;nbsp;2]&amp;nbsp;지정된&amp;nbsp;파일을&amp;nbsp;찾을&amp;nbsp;수&amp;nbsp;없습니다:&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경로/ ~~~~ f2py.exe.deleteme&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가 등장한다면 명령어 뒤에 --user를 붙여서 권한을 주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/njzzz/btrIA1iyX7D/wvePeIpia0aeTWluZLzv9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/njzzz/btrIA1iyX7D/wvePeIpia0aeTWluZLzv9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/njzzz/btrIA1iyX7D/wvePeIpia0aeTWluZLzv9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnjzzz%2FbtrIA1iyX7D%2FwvePeIpia0aeTWluZLzv9K%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;200&quot; height=&quot;133&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;133&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Devme/ErrorNote</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/94</guid>
      <comments>https://recoderr.tistory.com/94#entry94comment</comments>
      <pubDate>Sun, 31 Jul 2022 21:18:56 +0900</pubDate>
    </item>
    <item>
      <title>[패스트캠퍼스 챌린지 최종 미션] 한번에끝내는React의모든것초격차패키지Online. 강의 후기</title>
      <link>https://recoderr.tistory.com/87</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cm4Pdv/btrnjhr7wxj/FlKqrSKwJs5H6TtwjBBwn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cm4Pdv/btrnjhr7wxj/FlKqrSKwJs5H6TtwjBBwn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cm4Pdv/btrnjhr7wxj/FlKqrSKwJs5H6TtwjBBwn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcm4Pdv%2Fbtrnjhr7wxj%2FFlKqrSKwJs5H6TtwjBBwn1%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;내가 패스트캠퍼스 환급챌린지를 하게 된 이유&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;귀차니즘과 게으름의 끝판왕이라 정말 강제성이 없으면 공부를 거의 못하는 편이라&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;우연찮게 보게된 광고 덕에 패스트캠퍼스 환급챌린지를 참여하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;정말 개발이라는게 남의 코드 복사붙여넣기 하는게 아니라 이해하고 써먹고 활용할 줄 알아야 코더가 아닌 진짜 개발자라고 생각해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;끊임없이 공부해야된다고 생각은 한다. 생각은...&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;생각만큼 실행에 옮기기란 정말 힘들더라, 공부해야겠다 싶어서 회사 책장에 있는 리액트 책 한권, 노드 책 한권,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;자리에 두고 한번도 펼쳐보지 못했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;진짜 책을 읽으면서 따라 쳐보고 이해가 안되면 콘솔도 찍어보고 디버깅도 하고 그러면 이해가 더 잘되는거 알고&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;몰라서 구글에 검색해보면 나오는 내용이 모두 책 속에 있는거 다 알고 있는데 안하니까 온라인 강의 결제했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;처음엔 인프런, 정말 무료 강의도 좋은거 많고 커리큘럼 보면 탐나는 강의도 많아서 결제도 좀 했는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;완강한 강의는 이전에 리액트 스터디 진행하면서 클론코딩했던 강의 세개가 끝이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그나마 스터디도 벌금제도가 있어서 했지 없었으면 이렇게까지 할 수 있었을까싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;다시 스터디를 진행하게 된다하더라도 벌금제도 있는, 참가비가 있는, 동기부여형, 강제형 스터디에 참여해야만 진짜 공부를 할 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이런 우유부단함, 귀찮니즘, 게으름, 그리고 강제성 때문에 환급챌린지를 성공할 수 있었던거 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;초반에 실패했다면 강의를 그 때 이후로 강의를 듣지 않고 있을 수도...&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(자랑은 아니지만 11/30일 마지막 일일 포스팅 이후 아직 한번도 강의를 안들었다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그렇기 때문에 나같은 성향을 가진 사람이라면 환급챌린지나 챌린저스, 강제성이 부여된 스터디를 통해서 공부하는 것을 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;사실 이것도 어느정도 의지가 있고 포기하지 않아야 끝까지 할수 있지만 말이다. (포기하지 말고 같이 공부합시다!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgvyTU/btrneZlpPb9/VKKCffY1XA70hKwswxW30K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgvyTU/btrneZlpPb9/VKKCffY1XA70hKwswxW30K/img.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgvyTU/btrneZlpPb9/VKKCffY1XA70hKwswxW30K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgvyTU%2FbtrneZlpPb9%2FVKKCffY1XA70hKwswxW30K%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;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bosPgd/btrndrQiCdy/ymMztc0mtsHNRpKbqQefPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bosPgd/btrndrQiCdy/ymMztc0mtsHNRpKbqQefPK/img.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bosPgd/btrndrQiCdy/ymMztc0mtsHNRpKbqQefPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbosPgd%2FbtrndrQiCdy%2FymMztc0mtsHNRpKbqQefPK%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;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NqAwV/btrngQBNVR1/gRyPJ0igbT4oniaaTsq4yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NqAwV/btrngQBNVR1/gRyPJ0igbT4oniaaTsq4yk/img.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NqAwV/btrngQBNVR1/gRyPJ0igbT4oniaaTsq4yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNqAwV%2FbtrngQBNVR1%2FgRyPJ0igbT4oniaaTsq4yk%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;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ThMxY/btrniUqnaoa/AVoiomcpZXVe2KVK3U0R6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ThMxY/btrniUqnaoa/AVoiomcpZXVe2KVK3U0R6K/img.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ThMxY/btrniUqnaoa/AVoiomcpZXVe2KVK3U0R6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FThMxY%2FbtrniUqnaoa%2FAVoiomcpZXVe2KVK3U0R6K%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;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그래서&lt;span&gt;&amp;nbsp;&lt;/span&gt;한번에 끝내는 React의 모든것 초격차패키지 Online. 어떠한가&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;사실 우리 회사에서 온라인 강의를 결제해둔게 있다. (프론트엔드 관련 강의)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그런데도 &lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;한번에 끝내는 React의 모든것 초격차패키지 Online. &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;을 수강하게 된 이유는 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;내 계정으로 접속에 구애받지 않고 자유롭게 강의를 수강하고 싶은 마음도 있었고, 커리큘럼이 마음에 들었기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;강의를 수강하기 전에(결제 전에) 커리큘럼을 꼼꼼하게 보는 편이라 한번에 끝낸다고 하고 기초만 알려주거나&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;투두리스트 클론코딩 한두개 하는 거라면 결제하지 않았을거다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;일단 내 경우는 인프런에서 무료 클론코딩을 하면서 조금 나온지 된 강의라 트렌드나 코드를 따라 치면서 에러가 발생하는 상황이 많긴했지만 그래도 모르는 부분, 그 당시에는 리액트의 모든 것들을 잘 몰랐기 때문에 하나하나 검색해보고 공식문서도 봤고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;벨로퍼트(김민준)님의 기초 강의도 듣고, 회사에서 프로젝트를 진행하면서 막히는 부분도 많이 찾아보고 고민해봤기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(프로젝는 결국 빠그라졌지만..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;리액트 기초 개념은 나름대로 이해를 하고 알고있다고 생각했다. 그래서 강의에 대한 기대치가 좀 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그런데...&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;part1. React 기초 부분&lt;/b&gt;&lt;/span&gt;은 chapter 01. React 맛보기 부터 chapter 02. React 공식문서로 디테일잡기(초급), chapter 03. React 공식문서로 디테일잡기(고급) 까지 모두 공식문서를 바탕으로 정말 기초를 알아본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;여기서 내가 공부한다가 아닌 알아본다라고 한 이유는, 정말 공식문서를 읽는게 아닌가 하는 정도의 수준이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;가끔 부가적으로 설명하긴 하는데, 옛날 초등학교 땐가 중학교 땐가 내가 싫어하던 영어 선생님의 수업이 생각나는 정도였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그냥 교과서 읽는 수준...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;하지만 강의를 스킵하지 않고 꾸준히 들은 것을 후회하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;왜냐하면 나는 그동안 리액트를 공부한다고 해놓고 공식문서를 전부 읽어본 적이 없기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;국비지원 교육(학원)을 거쳐 지금 첫 회사에 입사해서 일하는 동안 어떤 라이브러리나 언어에 대해 자세히 나와있는 공식문서를 처음부터 끝까지 읽어본적도 없었고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;여태 보아왔던 공식문서 중에 제일 깔끔하고 명확하게 제공되고 있는 공식문서가 리액트라고 생각한다.&amp;nbsp;(겪은 바에 의하면 말이다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그래서 오히려 공식문서를 환급챌린지 포스팅을 위해서라도 정독하게 해준 강의에 감사를 표한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;강의를 듣고, 공식문서를 읽으면서&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;와.... 내가 궁금했던 내용들, 구글링해서 본 글들에서 이해하지 못했던 내용들이 여기에 다있네&lt;/b&gt;&lt;/span&gt; 라는 생각을 끊임없이 했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;만약 패스트캠퍼스 환급챌린지 최종 후기 글을 검색해서 보는 리액트 입문자들은 정말 꼭! 공식문서 읽었음 좋겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;두 번, 세 번도 필요없다. 진짜 한 번만 읽으면 나중에 필요할 때 다시 확인할 때 이해가 쏙쏙 될 거다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;part2. React 라이브러리&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;는 아직 듣고 있는중이다. (사실상 중단 중이지만 ㅋㅋ)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;chapter 01. 라이브러리 기초, chapter 02. 스타일링 라이브러리, chapter 03. UI 라이브러리 까지 완강했는데,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;여기서 좋았던 점은 프론트엔드는 트렌드에 굉장히 밀접하달까?? &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;사용하는 기술의 변화가 굉장히 빨라서 개발시작전에 어떤 라이브러리를 선택해서 사용해야되는지를 결정하는 것이 중요하다고 생각하고 있었기 때문에 다양한 라이브러리를 겪어볼수 있었다는 점이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;단지 그 뿐....&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;솔직히 국비지원 학원을 수료했기 때문에.. 음 내가 java 웹개발 과정을 수료했기 때문에 코드스테이츠나 위코드 등 프론트엔드 부트캠프에 비해 커뮤니티나 트렌드를 읽을수 있는 정보를 얻을 수 있는데 굉장히 제한적이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;(인사이트가 좁기 때문에 검색을 해도 내가 보이는 범위만 보인다는 뜻이지, 국비지원과정을 수료한 모든 이가 그렇다는 것이 아니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그렇기 때문에 리액트 뿐만 아니라 자바스크립트로 작성된 라이브러리에 대한 정보가 적었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;어떤 라이브러리가 유명하고, 많이 사용하고, 트렌드한지 비교할 수 있는 곳을 몰랐다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;하지만, 역시 리드 개발자?? 셔서 그런지 도입부에 &lt;a href=&quot;https://www.npmtrends.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.npmtrends.com/&lt;/a&gt; 을 언급하여 비교하는 방법을 알려주었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이외에는 기본적으로 공식문서를 볼 줄 알고 공식문서에 나와있는 예제를 이해할 수 있을 정도면 강의를 듣지않고 혼자해봐도 무관하더라&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;간단하게 라이브러리 인트로 하고(공식문서 소개에 나와있는 내용의 한국어 패치인 줄 알았다).&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;예제를 따라 치는게 강의의 대부분이다, 공식문서에 나와있는 예제 외에 응용부분은 전무하다고 보면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;사실 내 경우는 지금까지 학습했던 부분에 대해서는 거의 기대하지 않았기 때문에 현재까지의 강의 만족도는 쏘쏘, 보통이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;빠그라진 프로젝트에서 적용하느라 고생했던 상태관리 라이브러리 부분을 제일 기대 많이하고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;상태관리 라이브러리는 redux, mobx, recoil, zustand 네 개인데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;redux와 mobx 같은 경우, 공식문서가 부실하달까?? 내가 부족한거였겠지만.... 적용하는데 고생을 많이 했었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;redux의 경우 redux, redux-saga, redux-toolkit 또 뭐였더라... 여튼 redux 기반의 상태관리 라이브러리가 엄청 많기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;사실 어떤 라이브러리로 강의가 진행되었는지도 궁금하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;(현재 들어가있는 오픈카톡방에서 redux-toolkit이 제일 진보?? 활용하기 쉽다고 해서 내심 redux-toolkit 이길 기대하고 있다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;회사 다른 프로젝트 코드를 보니 recoil도 조금 사용한 것 같아서&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;상태관리 라이브러리의 조합해서 사용하는 방향이라던가 상태관리 외의 다른 목적으로 사용 가능한지 등 응용방법에 대해 기대가 크다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;데이터 모킹이나 데이터 패칭은 처음 들어보지만 swr의 경우 axios 대체제로, redux 등 상태관리 라이브러리 대체로 많은 포스팅이 있더라&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;프론트엔드 개발자들 사이에서도 굉장히 핫하기에 경험을 제대로 할 수 있었으면 좋겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;제대로 된 프로젝트를 진행해 본 적이 없어서(리액트 프로젝트) 유행하는 라이브러리를 사용해본 경험도 적기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Next.js, GraphQL 등 최신 기술을 경험해 볼 수 있다는데에서 앞으로 예정된 삽질을 조금 줄 일 수 있겠구나싶다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;원래 계획대로라면 이번달 안에 한번에 끝내는 React의 모든 것 초격차 패키지 Online. 강의를 완강해야되는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;챌린지 기간이 끝났다고 강의도 안듣고 있는 판국이라 언제할 지 모르겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;챌린지 끝나고 공부한 내용 포스팅으로 정리하려고 맘먹었었는데 플젝하면서 쌓아둔 임시저장글 숫자도 안늘고 아예 정체된 상태...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qygtK/btrnmNR4sY3/htX5xZzqSuKoh8frk3zjlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qygtK/btrnmNR4sY3/htX5xZzqSuKoh8frk3zjlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qygtK/btrnmNR4sY3/htX5xZzqSuKoh8frk3zjlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqygtK%2FbtrnmNR4sY3%2FhtX5xZzqSuKoh8frk3zjlk%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;485&quot; height=&quot;307&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;그나마 다행이라고 생각하는건 최종 오픈 일정이 계속 미뤄지고 있다는 것 ㅋㅋ&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;내가 들을 강의가 아직 다 오픈되지 않아서 뭔가 부채가 덜 한것 같은 느낌적인 느낌이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;최종오픈이 1월 7일이긴한데 느낌은 몇 번 더 미뤄질 것 같다. 그전에 꼭 다시 듣기 시작해야지..ㅋㅋㅋ&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;완강이 목표가 아닌 다시 듣기가 목표!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caWJuG/btrnpOo0Zcm/3ehAiJsplDBW3x0x7K19BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caWJuG/btrnpOo0Zcm/3ehAiJsplDBW3x0x7K19BK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caWJuG/btrnpOo0Zcm/3ehAiJsplDBW3x0x7K19BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaWJuG%2FbtrnpOo0Zcm%2F3ehAiJsplDBW3x0x7K19BK%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;371&quot; height=&quot;57&quot; data-origin-width=&quot;371&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;리액트 강의 커리큘럼의 50%도 수강하지 않았지만, 결론은 혼자하기 어려운 사람이라면 결제해볼만 하다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;독학은 정말 독한 사람만이 가능하다는걸 알고 있기 때문에 절대 안하는데, (독학하더라도 나는 정독파기 때문에 엄청 오래걸린다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;온라인 강의는 강사가 코스를 안내해주기 때문에 헤메이지 않고 내가 필요한 부분을 습득할수 있기 때문에,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;저렴한 비용으로 최고의 효율을 뽑아낼 수 있는 장점이 있다. 물론, 꾸준히 제대로 공부한다면 말이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;프론트엔드 스택 관련 과정은 국비지원과정으로 개설되어있는게 없기 때문에 &lt;span&gt;패스트캠퍼스 초기나 인프런 초기에는 강의가 많이 없어서&lt;/span&gt; 부트캠프밖에 답이 없나 싶었는데, 커리큘럼이 많이 탄탄해져있어서 괜찮은 것 같다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;이정도면 부트캠프에 비해 금액도 저렴한 편이고!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;맨날 패스트 캠퍼스 강의 소개페이지를 보면 나오는게 있다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;&quot;&gt;강의 비용 비교! 진짜 동일한 스킬셋을 배운다고 봤을때 단순 가격비교만하면 패스트 캠퍼스가 가장 저렴한 것은 맞는거 같다.&lt;/span&gt;&lt;span style=&quot;&quot;&gt;그러나 모두가 알고 있듯이 수강생에게 맞는 강사가 다 다르기 때문에 꼭 샘플 강의를 들어보고 결제했으면 좋겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;물론 나는 그렇게 하지 않았다. 왜그랬을까..?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;나름 꼼꼼하게 소개페이지를 읽고 커리큘럼까지 다 보고 강사 강의스타일이랑 맞는지 체크를 안하다니...&lt;/span&gt;&lt;span style=&quot;&quot;&gt;그냥 까먹은거 같기도 하고 커리큘럼이 너무 맘에 들었던거 같기도하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;게으름 타파하고 아마 새해목표로 리액트 강의 완강이 들어갈거같긴한데,&lt;/span&gt;&lt;span style=&quot;&quot;&gt;얼른 완강해서 개인 프로젝트 진행해보고싶다. 하고 싶은 주제는 있는데 언제 다 들을런지... 허허&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;gt;&amp;gt; 패스트캠퍼스 환급챌린리 다시하라고하면?? 한다!!! 근데 4000자는 좀 힘들다 ㅜㅜ&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1638876444434&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eXgGi/hyMB3JoCPi/C7hCVVpAqc6KVsdIuu1dj0/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eXgGi/hyMB3JoCPi/C7hCVVpAqc6KVsdIuu1dj0/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.강의&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.강의</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/87</guid>
      <comments>https://recoderr.tistory.com/87#entry87comment</comments>
      <pubDate>Wed, 8 Dec 2021 15:42:09 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 30일차 - 리액트 UI라이브러리 (Tailwind CSS)</title>
      <link>https://recoderr.tistory.com/86</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kGNNq/btrmAJWJ5N4/Nfryskw1BmThNyukJGnkZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kGNNq/btrmAJWJ5N4/Nfryskw1BmThNyukJGnkZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kGNNq/btrmAJWJ5N4/Nfryskw1BmThNyukJGnkZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkGNNq%2FbtrmAJWJ5N4%2FNfryskw1BmThNyukJGnkZk%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l3Nwo/btrmzjKOIaT/peznokIv22RhzVCYtjDQQk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l3Nwo/btrmzjKOIaT/peznokIv22RhzVCYtjDQQk/img.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-filename=&quot;photo6136513556309454669.jpg&quot; style=&quot;width: 40.5986%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l3Nwo/btrmzjKOIaT/peznokIv22RhzVCYtjDQQk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl3Nwo%2FbtrmzjKOIaT%2FpeznokIv22RhzVCYtjDQQk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/699P2/btrmtfwj4Wq/lZv5yYcRMwkYX2qieE0a81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/699P2/btrmtfwj4Wq/lZv5yYcRMwkYX2qieE0a81/img.png&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;458&quot; style=&quot;width: 58.2386%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/699P2/btrmtfwj4Wq/lZv5yYcRMwkYX2qieE0a81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F699P2%2Fbtrmtfwj4Wq%2FlZv5yYcRMwkYX2qieE0a81%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;876&quot; height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Tailwind&amp;nbsp;CSS&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;인라인 스타일을 사용하는 것만큼 쉽고 빠르게 스타일링 할 수 있으면서 일괄된 디자인을 가능하도록 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;부트스트랩의 css 클래스 네이밍과 매우 유사하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;클래스 네임으로 스타일링을 미리 다 구현했기 때문에 빠른 스타일링을 위해 익히고 있으면 효율은 배가 될수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1638244600222&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 설치하기
npm install -D tailwindcss@latest postcss@latest autoprefixer@latest&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;PostCSS&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CSS 전처리기이며, CSS 작성을 더 편하게 만들어주는 javascript 도구들(Plugins)이다. javascript를 이용해서, CSS를 변경한다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1638244827711&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// postcss.config.js

module.exports = {
    parser: 'postcss-scss', // 파서 옵션을 설정하고 싶다면 여기에서
    plugins: {
    	tailwindcss: { config: './tailwindcss-config.js' },
        &amp;lt;플러그인&amp;gt;: {},
        ...
    },
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;다양한 플러그인을 사용하여 css를 편하게 변경할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(위에서부터 아래로 실행하기 때문에 플러그인 실행순서가 중요하다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Tailwind css에서는 PostCSS와 함께 autoprefixer를 설치하여 모든 브라우저에 일괄된 css를 적용할수 있도록 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CqoEe/btrmyEBoTY6/xKB35fFihuV4TLBdfO2aL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CqoEe/btrmyEBoTY6/xKB35fFihuV4TLBdfO2aL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CqoEe/btrmyEBoTY6/xKB35fFihuV4TLBdfO2aL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCqoEe%2FbtrmyEBoTY6%2FxKB35fFihuV4TLBdfO2aL1%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;768&quot; height=&quot;432&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;432&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;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;vscode extention -&amp;nbsp;Intelli Sense&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;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;미리보기, 자동완성, 신택스 하이라이팅, 린팅을 지원&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #4b5563;&quot;&gt;하기 때문에 조금만 익숙해지면 금방 문서 없이 개발할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPeFJz/btrmxGmdyUh/b4NqcbvpGTPGFP7ZG2olUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPeFJz/btrmxGmdyUh/b4NqcbvpGTPGFP7ZG2olUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPeFJz/btrmxGmdyUh/b4NqcbvpGTPGFP7ZG2olUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPeFJz%2FbtrmxGmdyUh%2Fb4NqcbvpGTPGFP7ZG2olUk%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;829&quot; height=&quot;594&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;creating-your-configuration-file&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Creating your configuration file&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;다크모드, 디바이스 설정에 따른 테마 전환, css 적용 등 설정파일을 작성해서 쉽게 설정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;purge 옵션을 통해 프로덕션 빌드시 설정된 파일에서 사용되지 않는 모든 클래스를 제거하여 파일 크기를 최소화해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baG2ch/btrmxlijBfV/HXAU0QKlYmbtS8ihZyuzw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baG2ch/btrmxlijBfV/HXAU0QKlYmbtS8ihZyuzw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baG2ch/btrmxlijBfV/HXAU0QKlYmbtS8ihZyuzw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaG2ch%2FbtrmxlijBfV%2FHXAU0QKlYmbtS8ihZyuzw0%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;789&quot; height=&quot;501&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;501&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #111827;&quot;&gt;Utility-First&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #4b5563;&quot;&gt;버튼이나 사이드바 메뉴 등 동일한 스타일을 여러 번 사용하게 되는 경우 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #4b5563;&quot;&gt;@apply 하여 유틸리티 클래스를 추가로 만들어서 사용할 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1638243765890&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgj0E4/hyMxv58p1d/wFAKHRAFx2ubLp5loBurc0/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgj0E4/hyMxv58p1d/wFAKHRAFx2ubLp5loBurc0/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/86</guid>
      <comments>https://recoderr.tistory.com/86#entry86comment</comments>
      <pubDate>Tue, 30 Nov 2021 13:14:59 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 29일차 - 리액트 UI라이브러리 (Material UI)</title>
      <link>https://recoderr.tistory.com/85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AaMQc/btrmrn7pf1S/9RDbKto1Qelan9vyRVsGn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AaMQc/btrmrn7pf1S/9RDbKto1Qelan9vyRVsGn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AaMQc/btrmrn7pf1S/9RDbKto1Qelan9vyRVsGn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAaMQc%2Fbtrmrn7pf1S%2F9RDbKto1Qelan9vyRVsGn1%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GQAno/btrmlYHCHnk/Hewk7qnSoJGBqrHjwXshVk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GQAno/btrmlYHCHnk/Hewk7qnSoJGBqrHjwXshVk/img.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-filename=&quot;photo6134268065802726962.jpg&quot; style=&quot;width: 25.6352%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GQAno/btrmlYHCHnk/Hewk7qnSoJGBqrHjwXshVk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGQAno%2FbtrmlYHCHnk%2FHewk7qnSoJGBqrHjwXshVk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/StsZq/btrmrvrajK3/AVuckjBUBo25lLgmwKfPD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/StsZq/btrmrvrajK3/AVuckjBUBo25lLgmwKfPD1/img.png&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;456&quot; style=&quot;width: 36.3868%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/StsZq/btrmrvrajK3/AVuckjBUBo25lLgmwKfPD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FStsZq%2FbtrmrvrajK3%2FAVuckjBUBo25lLgmwKfPD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;863&quot; height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bejYTS/btrmkqYGKfa/7P5YJMhWTcC60hPqmZRXU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bejYTS/btrmkqYGKfa/7P5YJMhWTcC60hPqmZRXU0/img.png&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;460&quot; style=&quot;width: 35.6524%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bejYTS/btrmkqYGKfa/7P5YJMhWTcC60hPqmZRXU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbejYTS%2FbtrmkqYGKfa%2F7P5YJMhWTcC60hPqmZRXU0%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;853&quot; height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;/div&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;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Material&amp;nbsp;UI&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;구글에서 안드로이드 스마트폰에 적용하면서 알려진 UI 라이브러리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;현재 Antd와 더불어 가장 많이 사용되고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1638195220782&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 설치하기 (emotion)
npm install @mui/material @emotion/react @emotion/styled

// 설치하기(styled-components)
npm install @mui/material @mui/styled-engine-sc styled-components&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;size14&quot;&gt;Material UI에서 제공하는 아이콘을 사용하고 싶다면&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;npm install @mui/icons-material&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;를 함께 인스톨해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Material UI는 다른 라이브러리와 다르게 css 파일을 따로 import하지 않고 emotion 또는 styled-components을 지원한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;따라서 프로젝트 생성시 함께 설치해주면 바로 스타일이 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lbjNd/btrmxlWuSsD/FrwIJd0hiXkMBRmU4ML1rK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lbjNd/btrmxlWuSsD/FrwIJd0hiXkMBRmU4ML1rK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lbjNd/btrmxlWuSsD/FrwIJd0hiXkMBRmU4ML1rK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlbjNd%2FbtrmxlWuSsD%2FFrwIJd0hiXkMBRmU4ML1rK%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;732&quot; height=&quot;555&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;컴포넌트에 대한 예제코드 뿐 아니라 무료 템플릿도 git으로 제공하고 있어 다른 UI라이브러리보다 쉽게 접근할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;유료 템플릿이 아닌데도 기본적으로 많이 사용하는 페이지들이 구현되어있다. (예 : &lt;a href=&quot;https://material-ui.com/store/previews/minimal-dashboard-free/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;대시보드&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Material UI 스타일링&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1.&amp;nbsp;CssBaseline 컴포넌트&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 브라우저 종류에 상관없이 일괄적인 스타일 적용을 위해 css를 전역에서 정규화시켜주기 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; App.js에 &amp;lt;CssBaseline /&amp;gt; 컴포넌트를 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;2.&amp;nbsp;makeStyles Hook&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; Material UI에서 직관적으로 사용자 정의 스타일을 적용할수 있도록 제공하는 React hook이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 커스텀 스타일 객체를 인자로 받기 때문에 &lt;span style=&quot;background-color: #ffffff; color: #1b2e46;&quot;&gt;커스텀 스타일 객체의 클래스 이름을 키로 갖고 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1b2e46;&quot;&gt;&amp;nbsp; 해당 클래스의 CSS 속성을 정의한 객체를 값으로 갖는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1638194953100&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/YQMHx/hyMv2wLcvD/MrWKO7fVQqFtJE8UBhVnl0/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/YQMHx/hyMv2wLcvD/MrWKO7fVQqFtJE8UBhVnl0/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1638156253415&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TEfCk/hyMuIZQ6YG/y1wk9jgVgj3DjKYFmaebf0/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/85</guid>
      <comments>https://recoderr.tistory.com/85#entry85comment</comments>
      <pubDate>Mon, 29 Nov 2021 23:52:00 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 28일차 - 리액트 UI라이브러리 (React BootStrap)</title>
      <link>https://recoderr.tistory.com/84</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU7pNo/btrmhYuftyc/vnVkamdcG9YTwDnhcI7mF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU7pNo/btrmhYuftyc/vnVkamdcG9YTwDnhcI7mF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU7pNo/btrmhYuftyc/vnVkamdcG9YTwDnhcI7mF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU7pNo%2FbtrmhYuftyc%2FvnVkamdcG9YTwDnhcI7mF0%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPOaRi/btrmhIZJ0t4/shGVDpfCziWFHEt4MglNm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPOaRi/btrmhIZJ0t4/shGVDpfCziWFHEt4MglNm1/img.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; style=&quot;width: 36.2018%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPOaRi/btrmhIZJ0t4/shGVDpfCziWFHEt4MglNm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPOaRi%2FbtrmhIZJ0t4%2FshGVDpfCziWFHEt4MglNm1%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;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IuUjc/btrmpvEkUmj/CyPhp4TF4ejaIoxk53vhM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IuUjc/btrmpvEkUmj/CyPhp4TF4ejaIoxk53vhM0/img.png&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;290&quot; style=&quot;width: 62.6354%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IuUjc/btrmpvEkUmj/CyPhp4TF4ejaIoxk53vhM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIuUjc%2FbtrmpvEkUmj%2FCyPhp4TF4ejaIoxk53vhM0%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;669&quot; height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;React&amp;nbsp;BootStrap&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;부트스트랩은 바닐라JS에서도 흔히 사용되었던 라이브러리? 툴킷이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;국비지원학원 팀프로젝트 때 부트스트랩을 적용할까 하는 의견이 나와 둘러보았던 경험이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그 당시엔 css를 공부할 겸 부트스트랩을 적용하지 않고 대부분의 css를 직접 코드했었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;(일부 팀원이 작성한 부분에서 부트스트랩을 사용하긴 했었다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1638095237345&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 설치하기
npm install react-bootstrap bootstrap@5.1.3

// css 적용하기
import 'bootstrap/dist/css/bootstrap.min.css';

// sass로 css 설정시 import
@import &quot;~bootstrap/scss/bootstrap&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;부트스트랩도 다른 ui라이브러리와 마찬가지로 scr/index.js 나 App.js에 css를 import 해주어야 적용이된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Sass로도 작성되어있어서 메인 Sass/scss 파일에 import 하여 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;부트스트랩 테마와 변수들도 customize 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Mjw9/btrmhJxEUnz/OnFMv557lFdAPHMCgwGbF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Mjw9/btrmhJxEUnz/OnFMv557lFdAPHMCgwGbF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Mjw9/btrmhJxEUnz/OnFMv557lFdAPHMCgwGbF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Mjw9%2FbtrmhJxEUnz%2FOnFMv557lFdAPHMCgwGbF0%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;726&quot; height=&quot;230&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;as-prop-api&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&quot;as&quot; Prop API&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;'as' prop을 이용하여 작성한 컴포넌트를 렌더링시 다른 컴포넌트나 html태그로 수정할수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vAK2k/btrmiECBXcx/qch0C3GastvcKvCHif0uk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vAK2k/btrmiECBXcx/qch0C3GastvcKvCHif0uk0/img.png&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;273&quot; style=&quot;width: 35.3531%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vAK2k/btrmiECBXcx/qch0C3GastvcKvCHif0uk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvAK2k%2FbtrmiECBXcx%2Fqch0C3GastvcKvCHif0uk0%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;699&quot; height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UBthL/btrmiDXZO3a/f4KsrOccvnViUtgptiO8K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UBthL/btrmiDXZO3a/f4KsrOccvnViUtgptiO8K1/img.png&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;92&quot; style=&quot;width: 63.4841%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UBthL/btrmiDXZO3a/f4KsrOccvnViUtgptiO8K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUBthL%2FbtrmiDXZO3a%2Ff4KsrOccvnViUtgptiO8K1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;423&quot; height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;RTL 지원&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Set&lt;span&gt;&amp;nbsp;&lt;/span&gt;dir=&quot;rtl&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;on the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;html&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;element.&lt;/li&gt;
&lt;li&gt;Add an appropriate lang attribute, like&lt;span&gt;&amp;nbsp;&lt;/span&gt;lang=&quot;ar&quot;, on the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;html&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;element.&lt;/li&gt;
&lt;li&gt;Include the RTL version of the CSS&lt;span&gt;&amp;nbsp;&lt;/span&gt;bootstrap.rtl.min.css&lt;span&gt;&amp;nbsp;&lt;/span&gt;in your project.&lt;/li&gt;
&lt;li&gt;Set&lt;span&gt;&amp;nbsp;&lt;/span&gt;dir=&quot;rtl&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;in a&lt;span&gt;&amp;nbsp;&lt;/span&gt;ThemeProvider:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9hVlK/btrmidSLmXe/vvINkjfkyyRkDikKvgadLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9hVlK/btrmidSLmXe/vvINkjfkyyRkDikKvgadLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9hVlK/btrmidSLmXe/vvINkjfkyyRkDikKvgadLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9hVlK%2FbtrmidSLmXe%2FvvINkjfkyyRkDikKvgadLK%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;671&quot; height=&quot;297&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1638091808111&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TEfCk/hyMuIZQ6YG/y1wk9jgVgj3DjKYFmaebf0/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/TEfCk/hyMuIZQ6YG/y1wk9jgVgj3DjKYFmaebf0/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/84</guid>
      <comments>https://recoderr.tistory.com/84#entry84comment</comments>
      <pubDate>Sun, 28 Nov 2021 19:44:10 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 27일차 - 리액트 UI라이브러리 (React Semantic UI)</title>
      <link>https://recoderr.tistory.com/83</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PaZQi/btrmhhHAOH6/vwKEjzQbJNYpHVkJCLcRR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PaZQi/btrmhhHAOH6/vwKEjzQbJNYpHVkJCLcRR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PaZQi/btrmhhHAOH6/vwKEjzQbJNYpHVkJCLcRR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPaZQi%2FbtrmhhHAOH6%2FvwKEjzQbJNYpHVkJCLcRR1%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2LsgA/btrmhZTUKdt/PVo9HP1oT54Scmu20vCHi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2LsgA/btrmhZTUKdt/PVo9HP1oT54Scmu20vCHi1/img.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; style=&quot;width: 40.7826%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2LsgA/btrmhZTUKdt/PVo9HP1oT54Scmu20vCHi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2LsgA%2FbtrmhZTUKdt%2FPVo9HP1oT54Scmu20vCHi1%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;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnBU9W/btrmhKv0748/U76q6RE8UZjYpPDCOfZ08k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnBU9W/btrmhKv0748/U76q6RE8UZjYpPDCOfZ08k/img.png&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;353&quot; style=&quot;width: 58.0546%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnBU9W/btrmhKv0748/U76q6RE8UZjYpPDCOfZ08k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnBU9W%2FbtrmhKv0748%2FU76q6RE8UZjYpPDCOfZ08k%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;670&quot; height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/div&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;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;React&amp;nbsp;Semantic&amp;nbsp;UI&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;size14&quot;&gt;semantic web이란, 기계가 사람을 대신해서 웹페이지의 정보를 이해하고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;우리에게 필요한 정보만 보여주거나 정보를 우리가 필요로 하는 형태로 가공해주는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;리액트 시맨틱 UI는 시맨틱 웹의 의미와 유사하게 웹 접근성을 좋게 만든 UI이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(웹 접근성을 확인하기 위해서는 스크린리더를 통해 웹페이지를 읽어보면 알 수 있다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;처음에 Jquery 기반으로 만들어진 Semantic UI가 React용으로 제공된 라이브러리다.&lt;/p&gt;
&lt;pre id=&quot;code_1638021826872&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 설치하기
npm install semantic-ui-react semantic-ui-css

// CSS FILE IMPORT
import 'semantic-ui-css/semantic.min.css'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;다른 UI 라이브러리와 마찬가지로 설치 후 CSS 파일을 import 해주어야 css가 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9BX5A/btrmgSg3SL7/o3JeDjAUQQYDimql5D9st0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9BX5A/btrmgSg3SL7/o3JeDjAUQQYDimql5D9st0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9BX5A/btrmgSg3SL7/o3JeDjAUQQYDimql5D9st0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9BX5A%2FbtrmgSg3SL7%2Fo3JeDjAUQQYDimql5D9st0%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;726&quot; height=&quot;315&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;315&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;size14&quot;&gt;semantic ui 공식문서에서는 다른 라이브러리와 다르게 Try it으로 예제 코드를 복사하는 것 뿐 아니라&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;해당 예시 내용을 바로 수정해서 확인 할 수 있도록 playground를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHVnUq/btrmlXgA3V8/kvLoXykdcgvFuCiB9hXC2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHVnUq/btrmlXgA3V8/kvLoXykdcgvFuCiB9hXC2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHVnUq/btrmlXgA3V8/kvLoXykdcgvFuCiB9hXC2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHVnUq%2FbtrmlXgA3V8%2FkvLoXykdcgvFuCiB9hXC2K%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;968&quot; height=&quot;171&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;171&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 id=&quot;declarative-api&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Declarative API&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; 선언적 프로그래밍하여 prop으로 전달된 내용을 자동적으로 Dom 요소로 변환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lSpij/btrmg4g8FXD/Lf3ZoMCoPd7UetS7xvK0W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lSpij/btrmg4g8FXD/Lf3ZoMCoPd7UetS7xvK0W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lSpij/btrmg4g8FXD/Lf3ZoMCoPd7UetS7xvK0W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlSpij%2Fbtrmg4g8FXD%2FLf3ZoMCoPd7UetS7xvK0W0%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;966&quot; height=&quot;129&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;129&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 id=&quot;augmentation&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Augmentation&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; 'as' prop을 이용하여 원래의 컴포넌트 요소가 아닌 as prop으로 기재된 요소로 변경하여 리턴한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kBFxT/btrmhgvgbql/lT7qJrGoKKEnGBb4kvXET0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kBFxT/btrmhgvgbql/lT7qJrGoKKEnGBb4kvXET0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kBFxT/btrmhgvgbql/lT7qJrGoKKEnGBb4kvXET0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkBFxT%2Fbtrmhgvgbql%2FlT7qJrGoKKEnGBb4kvXET0%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;964&quot; height=&quot;129&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;shorthand-props&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Shorthand Props&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; 아이콘이나 이미지 등을 컴포넌트에서 prop으로 정의하면 로드 될때 child로 자동 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;auto-controlled-state&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Auto Controlled State&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; 자동으로 state 관리를 해주기 때문에 onChange 없이 내부적으로 값을 저장할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1638013807906&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cOmZfz/hyMvS0rLkM/EC76uYBB20MlaWJSZkIv40/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cOmZfz/hyMvS0rLkM/EC76uYBB20MlaWJSZkIv40/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/83</guid>
      <comments>https://recoderr.tistory.com/83#entry83comment</comments>
      <pubDate>Sat, 27 Nov 2021 23:21:55 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 26일차 - 리액트 UI라이브러리 (Ant Design)</title>
      <link>https://recoderr.tistory.com/82</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G9E13/btrmhIRRQGz/VYKRqHq1xaZ4Uy8AdsN8i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G9E13/btrmhIRRQGz/VYKRqHq1xaZ4Uy8AdsN8i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G9E13/btrmhIRRQGz/VYKRqHq1xaZ4Uy8AdsN8i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG9E13%2FbtrmhIRRQGz%2FVYKRqHq1xaZ4Uy8AdsN8i1%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9ppie/btrmhuzmUNM/rvUNknZbuwaOw1vIo5TbLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9ppie/btrmhuzmUNM/rvUNknZbuwaOw1vIo5TbLk/img.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; width=&quot;569&quot; height=&quot;427&quot; style=&quot;width: 41.0708%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9ppie/btrmhuzmUNM/rvUNknZbuwaOw1vIo5TbLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9ppie%2FbtrmhuzmUNM%2FrvUNknZbuwaOw1vIo5TbLk%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;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgKMUG/btrmjbsdAMy/lEq7v0wPGjGVaIPvJDrO51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgKMUG/btrmjbsdAMy/lEq7v0wPGjGVaIPvJDrO51/img.png&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;361&quot; style=&quot;width: 57.7664%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgKMUG/btrmjbsdAMy/lEq7v0wPGjGVaIPvJDrO51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgKMUG%2FbtrmjbsdAMy%2FlEq7v0wPGjGVaIPvJDrO51%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;677&quot; height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;/div&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;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Ant Design (antd)&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;size14&quot;&gt;이번 강의에서 소개된 라이브러리는 중국 ant그룹에서 사용하기 위해 만든 Ant Design이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;사실 이 라이브러리는 전에 클론코딩을 하면서 사용한 적이 있는데 거의 복붙 수준의 기본기능 구현 위주의 강의라&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;깊게 다뤄보지 않았는데 이번 기회에 공식문서를 자세하게 볼수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Antd는 OnsenUI와 다르게 React base의 라이브러리이다. 그래서인지 document의 예제도 리액트로 코드를 제공하고 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1637934531824&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install antd

@import '~antd/dist/antd.css';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;antd에서 제공하는 디자인을 적용하기 위해서 App.css (또는 대표적으로 사용하고 있는 css 파일)에 antd.css를 import 해주어야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;antd는 앞서 배웠던 sass와 다른 css 전처리기 less 기반으로 작성되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(less&amp;nbsp;&lt;span&gt;variables를 이용하여 커스텀을 좀더 쉽게할수 있다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJV17r/btrmgFhh0qC/WHmPdypkmBQH4sNRmC9FAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJV17r/btrmgFhh0qC/WHmPdypkmBQH4sNRmC9FAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJV17r/btrmgFhh0qC/WHmPdypkmBQH4sNRmC9FAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJV17r%2FbtrmgFhh0qC%2FWHmPdypkmBQH4sNRmC9FAk%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;560&quot; height=&quot;151&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;기존에 Moment.js를 기반으로 적용되었던 컴포넌트들을 dayjs 와 date-fns도 지원한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;따라서 프로젝트에 Moment.js를 사용하지 않더라도 dayjs와 date-fns 라이브러리를 사용하면 날짜관련 디자인에 아무런 영향을 주지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfuM4W/btrmiewd81t/HsB22HvnlNI584av2q5tA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfuM4W/btrmiewd81t/HsB22HvnlNI584av2q5tA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfuM4W/btrmiewd81t/HsB22HvnlNI584av2q5tA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfuM4W%2Fbtrmiewd81t%2FHsB22HvnlNI584av2q5tA0%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;797&quot; height=&quot;568&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;디자인된 컴포넌트 뿐만 아니라 다른 UI라이브러리에서는 제공하지 않는 antd의 디자인 철학에 관해서도 자세히 설명되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;색의 팔레트라던지 폰트 크기를 어떻게 정하게 되었다던지 아이콘을 어떻게 만들었는지 상세하게 담겨있어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;디자인 관점에서도 배울점이 있는 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1637933431319&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/w27hT/hyMuGl4d8h/eDUEfVam4RiCjZPV2yXzu1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/w27hT/hyMuGl4d8h/eDUEfVam4RiCjZPV2yXzu1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/82</guid>
      <comments>https://recoderr.tistory.com/82#entry82comment</comments>
      <pubDate>Fri, 26 Nov 2021 23:09:28 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 25일차 - 리액트 UI라이브러리 (Onsen UI)</title>
      <link>https://recoderr.tistory.com/81</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2T2A4/btrl5v56FQk/AXt21h8UCT8UMKvJFOcrrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2T2A4/btrl5v56FQk/AXt21h8UCT8UMKvJFOcrrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2T2A4/btrl5v56FQk/AXt21h8UCT8UMKvJFOcrrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2T2A4%2Fbtrl5v56FQk%2FAXt21h8UCT8UMKvJFOcrrk%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;OnsenUI&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;하이브리드앱과 모바일에 특화된 UI 라이브러리이다. (JS, 앵귤러, 뷰, 리액트 모두 지원한다.)&lt;/p&gt;
&lt;pre id=&quot;code_1637796295443&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install onsenui react-onsenui --save&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;OnsenUI도 스타일링 라이브러리처럼 install 후에 모듈을 import하여 사용하면 되지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;UI를 적용하려면 index.html에 css를 import 해주어야한다. (사용될 컴포넌트에 import, 또는 전역에서 사용한다면 App.js에 import)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Onsen 뿐 아니라 UI 라이브러리는 대부분 css파일이 따로 있어서 import 해주어야된다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1637796479640&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Page, Toolbar, Button } from 'react-onsenui'; // Only import the necessary components
// import * as Ons from 'react-onsenui'; // Import everything and use it as 'Ons.Page', 'Ons.Button'

// Webpack CSS import
import 'onsenui/css/onsenui.css';
import 'onsenui/css/onsen-css-components.css';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yN0Fl/btrl55FZ1jj/T7WUDV8GxJEiy3XIRm9d81/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yN0Fl/btrl55FZ1jj/T7WUDV8GxJEiy3XIRm9d81/img.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-filename=&quot;photo6122931946301533540.jpg&quot; style=&quot;width: 38.694%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yN0Fl/btrl55FZ1jj/T7WUDV8GxJEiy3XIRm9d81/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyN0Fl%2Fbtrl55FZ1jj%2FT7WUDV8GxJEiy3XIRm9d81%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ljaue/btrl8nlXT1h/cPm6BrVriW2ty2dTMPNFk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ljaue/btrl8nlXT1h/cPm6BrVriW2ty2dTMPNFk1/img.png&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;645&quot; style=&quot;width: 39.8638%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ljaue/btrl8nlXT1h/cPm6BrVriW2ty2dTMPNFk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLjaue%2Fbtrl8nlXT1h%2FcPm6BrVriW2ty2dTMPNFk1%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;886&quot; height=&quot;645&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRyUhY/btrl4MApgp6/0m9LmgCk7Xr81JTaUTgkU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRyUhY/btrl4MApgp6/0m9LmgCk7Xr81JTaUTgkU0/img.png&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;882&quot; style=&quot;width: 19.1167%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRyUhY/btrl4MApgp6/0m9LmgCk7Xr81JTaUTgkU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRyUhY%2Fbtrl4MApgp6%2F0m9LmgCk7Xr81JTaUTgkU0%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;581&quot; height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;OnsenUI의 기본 형태는 Page 컴포넌트에 모든 UI 컴포넌트가 감싸져 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;각 컴포넌트마다 required(필수) prop과 optional(선택) prop이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;강의에서는 OnsenUI documents에 나와있는대로 css가 적용되어 나왔는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;실습해보니 React.&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;StrictMode가 적용되면서&amp;nbsp;&lt;/span&gt;findDOMNode 사용이 불가능해져 일부 적용이 안되는 현상이&amp;nbsp; 발생했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;Page&amp;gt; 바깥으로 ui컴포넌트를 빼내어보기도 하고 &amp;lt;&amp;gt;&amp;lt;/&amp;gt;로 감싸보기도 했지만 css를 적용할 수 없었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;공식문서에도 이에 대한 대처나 방안이 따로 마련되어 있지 않아보였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpg2bL/btrl4zOV9mj/xIkfz3gnYw92r4VUVWyC40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpg2bL/btrl4zOV9mj/xIkfz3gnYw92r4VUVWyC40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpg2bL/btrl4zOV9mj/xIkfz3gnYw92r4VUVWyC40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpg2bL%2Fbtrl4zOV9mj%2FxIkfz3gnYw92r4VUVWyC40%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;850&quot; height=&quot;453&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;453&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;size14&quot;&gt;OnsenUI 강의가 총 3개(약 50분)인데 첫강의에서 react에 적용안되는 것을 보고&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;다른 라이브러리에서 반응형이나 모바일에 대응이 쉽다면 절대 안쓸것 같다고 생각이 들었고, 나머지 두 강의는 스킵했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1637796169424&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b4Q4fE/hyMtyVRL8g/KHORyxz0IxE7ORn9i1Yjk0/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b4Q4fE/hyMtyVRL8g/KHORyxz0IxE7ORn9i1Yjk0/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/81</guid>
      <comments>https://recoderr.tistory.com/81#entry81comment</comments>
      <pubDate>Thu, 25 Nov 2021 09:34:18 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 24일차 - 리액트 스타일링하기 Sass(Scss)</title>
      <link>https://recoderr.tistory.com/80</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOWMV8/btrl01wYghI/ZbotcPsRW1jHGorzgRA5S1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOWMV8/btrl01wYghI/ZbotcPsRW1jHGorzgRA5S1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOWMV8/btrl01wYghI/ZbotcPsRW1jHGorzgRA5S1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOWMV8%2Fbtrl01wYghI%2FZbotcPsRW1jHGorzgRA5S1%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wGsyj/btrlZutq6Fl/5Dvk58KITicnL8KkHq4jF1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wGsyj/btrlZutq6Fl/5Dvk58KITicnL8KkHq4jF1/img.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-filename=&quot;photo6120785119783529857.jpg&quot; style=&quot;width: 34.4955%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wGsyj/btrlZutq6Fl/5Dvk58KITicnL8KkHq4jF1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwGsyj%2FbtrlZutq6Fl%2F5Dvk58KITicnL8KkHq4jF1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDXxL4/btrlY4vpGi3/VKmxkeWprBXblnGHqMH0f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDXxL4/btrlY4vpGi3/VKmxkeWprBXblnGHqMH0f0/img.png&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;345&quot; style=&quot;width: 64.3417%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDXxL4/btrlY4vpGi3/VKmxkeWprBXblnGHqMH0f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDXxL4%2FbtrlY4vpGi3%2FVKmxkeWprBXblnGHqMH0f0%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;858&quot; height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Sass(Syntactically Awesome Style Sheets)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1637739899937&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#sass 설치하기
npm install sass&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Sass는 css의 확장을 도와주는 전처리기이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;때문에 공식문서의 가이드를 보면 Sass를 사용 후 애플리케이션이 실행될때 css로 치환된 내용도 함께 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vtM4h/btrl4yPoR7L/Ckgkm68oXtyCSKrkSMBDyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vtM4h/btrl4yPoR7L/Ckgkm68oXtyCSKrkSMBDyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vtM4h/btrl4yPoR7L/Ckgkm68oXtyCSKrkSMBDyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvtM4h%2Fbtrl4yPoR7L%2FCkgkm68oXtyCSKrkSMBDyk%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;989&quot; height=&quot;235&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;235&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;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;DRY(Don't Repeat Yourself)&lt;/b&gt;&lt;/span&gt;하지 않은 css를 sass로 작성하면 반복하여 작성해야되는 코드를 확 줄일수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Sass 공식문서를 보면 SCSS도 같이 나와있고 심지어 SCSS를 default 값으로 코드를 보여준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Sass와 SCSS는 동일한 기능을 제공하지만 SCSS에서 CSS를 사용하던 방식과 유사하게 중괄호와 세미콜론을 이용하여 보기 쉽고,&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Sass는 좀더 간결하게 작성되어있다. (강사님은 SCSS 기준으로 강의를 진행하셨고 나도 SCSS가 보기 편하다)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;본 포스팅에서는 Sass는 SCSS 문법을 사용하는 것을 의미한다. (확장자도 .scss)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의에서 컴파일러 소개는 하지 않았지만 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Sass로 작성한 코드가 내가 원하는대로 css 적용되었는지 &lt;a href=&quot;https://www.sassmeister.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SassMeister&lt;/a&gt;에서 컴파일 테스트를 할 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1637740680768&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;SassMeister | The Sass Playground!&quot; data-og-description=&quot;SassMeister: The sassiest way to play with Sass, Compass, &amp;amp; LibSass! Loading...&quot; data-og-host=&quot;www.sassmeister.com&quot; data-og-source-url=&quot;https://www.sassmeister.com/&quot; data-og-url=&quot;https://www.sassmeister.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.sassmeister.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.sassmeister.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;SassMeister | The Sass Playground!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SassMeister: The sassiest way to play with Sass, Compass, &amp;amp; LibSass! Loading...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.sassmeister.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;993&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRlkOO/btrl44UBzGh/IGQMb1hHn1nCW9FSl6BQN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRlkOO/btrl44UBzGh/IGQMb1hHn1nCW9FSl6BQN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRlkOO/btrl44UBzGh/IGQMb1hHn1nCW9FSl6BQN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRlkOO%2Fbtrl44UBzGh%2FIGQMb1hHn1nCW9FSl6BQN1%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;993&quot; height=&quot;439&quot; data-origin-width=&quot;993&quot; data-origin-height=&quot;439&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;size14&quot;&gt;javascript처럼 변수를 선언할수 있고, 함수도 만들수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;심지어 모듈처럼 다른 파일을 @use나 @import하여 해당 파일에서 선언한 변수를 가져와서 사용할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;889&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9mZ7a/btrl1WXC6IY/9JDKU7sMeFG3n2717HkkXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9mZ7a/btrl1WXC6IY/9JDKU7sMeFG3n2717HkkXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9mZ7a/btrl1WXC6IY/9JDKU7sMeFG3n2717HkkXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9mZ7a%2Fbtrl1WXC6IY%2F9JDKU7sMeFG3n2717HkkXk%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;1010&quot; height=&quot;889&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;889&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그래서인지 size가 다른 라이브러리에 비해 큰데도 다운로드가 1위이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;각 라이브러리마다 장단점이 있기 때문에 상황에 맞는 라이브러리 선택이 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;강사님의 경우,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;반응형 웹을 대응하기 위해 media query를 많이 쓰고&amp;nbsp;design system이 없는 곳에서는 sass를,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;개발 편의성 면에서는 CSS in JS를 적용한 emotion을 사용할 것 같다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;웹 최적화(성능)면에서 사용한 라이브러리(번들)의 사이즈가 점점 중요해지는 시점이기에 개발자 입장에서는 emotion을 선택하는게 맞을 것 같지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;아직 공식문서에서 안내된 예제만으로는 스타일링하는데 어떤 라이브러리를 사용하는게 좋은지 잘 모르겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;강의를 다 듣고 나서 여러가지 실험을 해봐야될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1637711655377&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8bjXp/hyMtw4m1ph/b6sfSAPoRQyuUf6Dcxfam1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8bjXp/hyMtw4m1ph/b6sfSAPoRQyuUf6Dcxfam1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/80</guid>
      <comments>https://recoderr.tistory.com/80#entry80comment</comments>
      <pubDate>Wed, 24 Nov 2021 17:32:57 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 23일차 - 리액트 라이브러리 emotion</title>
      <link>https://recoderr.tistory.com/79</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9R85w/btrlSwLAEYW/kOY4htosHKSStqU37r0NQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9R85w/btrlSwLAEYW/kOY4htosHKSStqU37r0NQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9R85w/btrlSwLAEYW/kOY4htosHKSStqU37r0NQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9R85w%2FbtrlSwLAEYW%2FkOY4htosHKSStqU37r0NQK%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7kn84/btrlTjZr2Rs/ZyN8E5iwFDu2TEpHlW2Sx1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7kn84/btrlTjZr2Rs/ZyN8E5iwFDu2TEpHlW2Sx1/img.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-filename=&quot;photo6118570969653161977.jpg&quot; width=&quot;541&quot; height=&quot;406&quot; style=&quot;width: 41.8319%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7kn84/btrlTjZr2Rs/ZyN8E5iwFDu2TEpHlW2Sx1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7kn84%2FbtrlTjZr2Rs%2FZyN8E5iwFDu2TEpHlW2Sx1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wvo5n/btrlV1X33nQ/ojjdsgDkb1pEcDcusiF9ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wvo5n/btrlV1X33nQ/ojjdsgDkb1pEcDcusiF9ik/img.png&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;448&quot; style=&quot;width: 57.0053%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wvo5n/btrlV1X33nQ/ojjdsgDkb1pEcDcusiF9ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwvo5n%2FbtrlV1X33nQ%2FojjdsgDkb1pEcDcusiF9ik%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;814&quot; height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;emotion&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;emotion은 styled-components보다 조금 늦게 배포된 라이브러리다 보니&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;처음 구현할때 참조한 라이브러리에 styled-components도 포함되어있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;현재 emotion과 styled-components 두 라이브러리는 거의 유사한 형태를 띄고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgPjV9/btrlUNMxIgd/tVXlKadyzT4Qxkk6Gsh0JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgPjV9/btrlUNMxIgd/tVXlKadyzT4Qxkk6Gsh0JK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgPjV9/btrlUNMxIgd/tVXlKadyzT4Qxkk6Gsh0JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgPjV9%2FbtrlUNMxIgd%2FtVXlKadyzT4Qxkk6Gsh0JK%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;951&quot; height=&quot;631&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;631&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://github.com/jsjoeio/styled-components-vs-emotion&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;emotion과 styled-components 비교한 글&lt;/a&gt;에 따르면 지원하는 기능은 거의 유사하고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;git repogitory star 수는 styled-components가 더 많지만 번들 size나 속도는 emotion이 더 퍼포먼스가 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;790&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mvsi9/btrlUOLtiZv/CzmiKevKgczovspONgT8Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mvsi9/btrlUOLtiZv/CzmiKevKgczovspONgT8Lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mvsi9/btrlUOLtiZv/CzmiKevKgczovspONgT8Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMvsi9%2FbtrlUOLtiZv%2FCzmiKevKgczovspONgT8Lk%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;1340&quot; height=&quot;790&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;790&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;npm trends로 비교해보아도 emotion이 우세한 것으로 확인된다.&lt;/p&gt;
&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;font-family: 'Noto Serif KR';&quot;&gt;emotion 설치하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1637639818996&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i @emotion/styled @emotion/react&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnpvWT/btrlTWQCoID/9NTYwIibPIKxPMG73kwFbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnpvWT/btrlTWQCoID/9NTYwIibPIKxPMG73kwFbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnpvWT/btrlTWQCoID/9NTYwIibPIKxPMG73kwFbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnpvWT%2FbtrlTWQCoID%2F9NTYwIibPIKxPMG73kwFbK%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;732&quot; height=&quot;409&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;409&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;전체적인 사용 방법도 styled-components와 비슷하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;emotion의 css를 styled-components가 벤치마킹, styled-components의 styled를 emotion에서 벤치마킹했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbb5nW/btrlQZU8xag/TJzzr0ePA9Pfc9RSXXzHj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbb5nW/btrlQZU8xag/TJzzr0ePA9Pfc9RSXXzHj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbb5nW/btrlQZU8xag/TJzzr0ePA9Pfc9RSXXzHj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbb5nW%2FbtrlQZU8xag%2FTJzzr0ePA9Pfc9RSXXzHj0%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;591&quot; height=&quot;282&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;emotion도 styled-components와 마찬가지로 uniq한 class명을 자동으로 명명해주기 때문에 코드의 재사용에 편리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/epv3sm/btrlS00igFg/xk8kGfM7ynhkwgodZUtUn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/epv3sm/btrlS00igFg/xk8kGfM7ynhkwgodZUtUn1/img.png&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;424&quot; style=&quot;width: 75.6346%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/epv3sm/btrlS00igFg/xk8kGfM7ynhkwgodZUtUn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fepv3sm%2FbtrlS00igFg%2Fxk8kGfM7ynhkwgodZUtUn1%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;729&quot; height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FhnI5/btrlThULLCL/Nz8CXK05296eJuIvvL8Sgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FhnI5/btrlThULLCL/Nz8CXK05296eJuIvvL8Sgk/img.png&quot; data-origin-width=&quot;221&quot; data-origin-height=&quot;419&quot; style=&quot;width: 23.2026%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FhnI5/btrlThULLCL/Nz8CXK05296eJuIvvL8Sgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFhnI5%2FbtrlThULLCL%2FNz8CXK05296eJuIvvL8Sgk%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;221&quot; height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;emotion도 css In JS지만 css 특징상 global하게 적용해야되는 부분이 있기 때문에 Global 하게 적용할수 있는 패키지를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1637622531633&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hJUgH/hyMq3XsAJ1/QhWDzYJdY37PWerPv9GqNk/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hJUgH/hyMq3XsAJ1/QhWDzYJdY37PWerPv9GqNk/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;본&amp;nbsp;포스팅은&amp;nbsp;패스트캠퍼스&amp;nbsp;환급&amp;nbsp;챌린지&amp;nbsp;참여를&amp;nbsp;위해&amp;nbsp;작성되었습니다&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;#패스트캠퍼스&amp;nbsp;#패캠챌린지&amp;nbsp;#직장인인강&amp;nbsp;#직장인자기계발&amp;nbsp;#패스트캠퍼스후기&amp;nbsp;#한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/79</guid>
      <comments>https://recoderr.tistory.com/79#entry79comment</comments>
      <pubDate>Tue, 23 Nov 2021 13:27:37 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 22일차 - 리액트 라이브러리 styled-component (2)</title>
      <link>https://recoderr.tistory.com/78</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clbNut/btrlEtPoiwj/gwyNk2gJz9GkuJwtxu2iY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clbNut/btrlEtPoiwj/gwyNk2gJz9GkuJwtxu2iY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clbNut/btrlEtPoiwj/gwyNk2gJz9GkuJwtxu2iY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclbNut%2FbtrlEtPoiwj%2FgwyNk2gJz9GkuJwtxu2iY1%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xRmIv/btrlUPC8ucD/gnLrKEHj5DEEWvl1O0ngU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xRmIv/btrlUPC8ucD/gnLrKEHj5DEEWvl1O0ngU0/img.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; width=&quot;471&quot; height=&quot;353&quot; style=&quot;width: 49.9107%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xRmIv/btrlUPC8ucD/gnLrKEHj5DEEWvl1O0ngU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxRmIv%2FbtrlUPC8ucD%2FgnLrKEHj5DEEWvl1O0ngU0%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;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xHumQ/btrlSwEAhqw/AlOJsvcvnpFdroelggUCKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xHumQ/btrlSwEAhqw/AlOJsvcvnpFdroelggUCKK/img.png&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;710&quot; style=&quot;width: 48.9265%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xHumQ/btrlSwEAhqw/AlOJsvcvnpFdroelggUCKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxHumQ%2FbtrlSwEAhqw%2FAlOJsvcvnpFdroelggUCKK%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;928&quot; height=&quot;710&quot;/&gt;&lt;/span&gt;&lt;/div&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;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #53585f;&quot;&gt;어제 들은 내용에 이어서 스타일드 컴포넌트의 Motivation을 예제로 다시 살펴보았다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #53585f;&quot;&gt;1. 스타일드 컴포넌트(styled-components) 설치하기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #53585f;&quot;&gt;#&amp;nbsp;with&amp;nbsp;npm &lt;br /&gt;npm&amp;nbsp;install&amp;nbsp;--save&amp;nbsp;styled-components &lt;br /&gt;&lt;br /&gt;#&amp;nbsp;with&amp;nbsp;yarn &lt;br /&gt;yarn&amp;nbsp;add&amp;nbsp;styled-components&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUn1qM/btrlTVp6caH/1x4xv8MRInWL0GvlzEfCm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUn1qM/btrlTVp6caH/1x4xv8MRInWL0GvlzEfCm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUn1qM/btrlTVp6caH/1x4xv8MRInWL0GvlzEfCm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUn1qM%2FbtrlTVp6caH%2F1x4xv8MRInWL0GvlzEfCm0%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;884&quot; height=&quot;592&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #53585f;&quot;&gt;2. 스타일드 컴포넌트 사용법&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #53585f;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #53585f;&quot;&gt;1) styled.{element}``&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #53585f;&quot;&gt;styled를 import하고 사용할 요소, 그리고 JS 리터럴 문법을 사용하여 css를 정의한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #53585f;&quot;&gt;이렇게 정의한 element를 리액트 컴포넌트와 동일한 방식으로 사용하면 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U5o97/btrlU5Ton6V/iImSqBYHlwAP1RCfpRvLpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U5o97/btrlU5Ton6V/iImSqBYHlwAP1RCfpRvLpk/img.png&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;506&quot; style=&quot;width: 49.7632%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U5o97/btrlU5Ton6V/iImSqBYHlwAP1RCfpRvLpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU5o97%2FbtrlU5Ton6V%2FiImSqBYHlwAP1RCfpRvLpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;718&quot; height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cp35ZY/btrlOVLFQ8O/fDSU59Y3IiYGRot2ZK2Srk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cp35ZY/btrlOVLFQ8O/fDSU59Y3IiYGRot2ZK2Srk/img.png&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;591&quot; style=&quot;width: 49.0741%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cp35ZY/btrlOVLFQ8O/fDSU59Y3IiYGRot2ZK2Srk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcp35ZY%2FbtrlOVLFQ8O%2FfDSU59Y3IiYGRot2ZK2Srk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;827&quot; height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #53585f;&quot;&gt;2) 기본 사용법에서 리터럴 안에 props의 값에 따라 다른 css를 적용할 수 있게 자바스크립트 문법을 사용할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;3) Extending Styles(스타일을 상속할 수 있다.) &lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;styled(Button) ~~&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;4) styled-component 라이브러리로 정의한 리액트 컴포넌트에 as를 이용하여 div를 button으로 button을 a로 요소의 역할을 지정하여 구현할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;5) css prop을 따로 지정할 수도 있고, css에서 가상선택자를 정의할수 있듯이 styled-component에서도 똑같이 구현할수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;6)&amp;nbsp;&lt;span&gt;Attributes 삽입하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;7) animation을 구현할때는 라이브러리에서 제공하는 keyframe을 사용하여 적용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d05GSw/btrlNcfSb9a/WMRcJGP1dU7K2lyETpUWm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d05GSw/btrlNcfSb9a/WMRcJGP1dU7K2lyETpUWm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d05GSw/btrlNcfSb9a/WMRcJGP1dU7K2lyETpUWm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd05GSw%2FbtrlNcfSb9a%2FWMRcJGP1dU7K2lyETpUWm1%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;688&quot; height=&quot;372&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;document가 잘 정리되어있어서 적용하기 어렵지 않을 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;특징은 css in JS로 js 문법으로 css를 적용하기 때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;prop이나 삼항연산자 등 js문법을 이용하여 다이나믹한 css를 적용가능하고 코드의 재사용도 용이하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1637537193950&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ec7gww/hyMq3oKnCm/5rmZ7EpyqPjnhuKoZUJKKK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ec7gww/hyMq3oKnCm/5rmZ7EpyqPjnhuKoZUJKKK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;본&amp;nbsp;포스팅은&amp;nbsp;패스트캠퍼스&amp;nbsp;환급&amp;nbsp;챌린지&amp;nbsp;참여를&amp;nbsp;위해&amp;nbsp;작성되었습니다&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;#패스트캠퍼스&amp;nbsp;#패캠챌린지&amp;nbsp;#직장인인강&amp;nbsp;#직장인자기계발&amp;nbsp;#패스트캠퍼스후기&amp;nbsp;#한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/78</guid>
      <comments>https://recoderr.tistory.com/78#entry78comment</comments>
      <pubDate>Mon, 22 Nov 2021 22:25:44 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 21일차 - 리액트 라이브러리 styled-component (1)</title>
      <link>https://recoderr.tistory.com/77</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCeNui/btrlGIrCODe/JL0a2C3BL6dOdynYVVZr4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCeNui/btrlGIrCODe/JL0a2C3BL6dOdynYVVZr4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCeNui/btrlGIrCODe/JL0a2C3BL6dOdynYVVZr4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCeNui%2FbtrlGIrCODe%2FJL0a2C3BL6dOdynYVVZr4k%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;CSS in JS&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;리액트에서 css를 사용하면서 발견된 문제들을 해결하기 위한 개념을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(JS 안에서 CSS를 작성하는 것)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://speakerdeck.com/vjeux/react-css-in-js&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;페이스북에서 일하는 프론트엔드 팀에서 만든 발표자료&lt;/a&gt; &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;를 보면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tt9WK/btrlGIynlNN/g4pGZcilPLDUdeCW8Lb5T0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tt9WK/btrlGIynlNN/g4pGZcilPLDUdeCW8Lb5T0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tt9WK/btrlGIynlNN/g4pGZcilPLDUdeCW8Lb5T0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftt9WK%2FbtrlGIynlNN%2Fg4pGZcilPLDUdeCW8Lb5T0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;533&quot; height=&quot;400&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;리액트를 사용하면서 발견되는 css의 문제점&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;- Global namespace&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 자바스크립트는 글로벌 변수를 지양해야하는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; css의 경우 import된 곳에서는 전부 적용되는 부분이 있어 작은 의미의 글로벌로 사용된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;- Dependencies&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; css 간의 의존 관계를 서비스가 커질수록 관리하기가 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;- Dead Code Elimination&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 컴포넌트나 코드의 경우 사용안할시 삭제 등으로 관리하게되는데 css는 사용하는 건지 확인하기가 어렵다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;- Minification&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 클래스 이름을 유의미하게 최소화하는 작업을 할수가 없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;- Sharing Constatns&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; JS의 코드와 값을 공유하기가 쉽지 않다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;- Non deterministic Resolution&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; css 파일이 여러개일 때 어떤 파일을 먼저 로드했느냐에 따라 스타일이 덮어씌워지는 경우가 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;- Isolation&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 스타일과 컴포넌트 파일을 따로 관리할수 없음, 재사용시 스타일 적용 문제로 인해서 css 파일까지 재사용해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbD222/btrlOViVXGc/SBaTXkPgf9QTO35buK5UjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbD222/btrlOViVXGc/SBaTXkPgf9QTO35buK5UjK/img.png&quot; data-alt=&quot;styled-component의 특징&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbD222/btrlOViVXGc/SBaTXkPgf9QTO35buK5UjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbD222%2FbtrlOViVXGc%2FSBaTXkPgf9QTO35buK5UjK%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;928&quot; height=&quot;710&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;710&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;styled-component의 특징&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;리액트에서 css를 사용하면서 느끼는 문제점을 해결하기 위해 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;css in js 개념을 적용한 대표적인 라이브러리 중 하나가 styled-component이다.&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;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #53585f;&quot;&gt;스타일드 컴포넌트(styled-components)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #222426;&quot;&gt;styled components는 우리에게 친숙한 자바스크립트로 css를 사용하게 해준다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;styled-component 설치&lt;/p&gt;
&lt;pre id=&quot;code_1637492332749&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# with npm
npm install --save styled-components

# with yarn
yarn add styled-components&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://styled-components.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;styled-component 공식문서&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1637487895195&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ieMKT/hyMo3pIhGW/A0yoY1e1omTePjrqNaCbwK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ieMKT/hyMo3pIhGW/A0yoY1e1omTePjrqNaCbwK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;본&amp;nbsp;포스팅은&amp;nbsp;패스트캠퍼스&amp;nbsp;환급&amp;nbsp;챌린지&amp;nbsp;참여를&amp;nbsp;위해&amp;nbsp;작성되었습니다&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;#패스트캠퍼스&amp;nbsp;#패캠챌린지&amp;nbsp;#직장인인강&amp;nbsp;#직장인자기계발&amp;nbsp;#패스트캠퍼스후기&amp;nbsp;#한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/77</guid>
      <comments>https://recoderr.tistory.com/77#entry77comment</comments>
      <pubDate>Sun, 21 Nov 2021 19:59:28 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 20일차 - 라이브러리 고르는 법</title>
      <link>https://recoderr.tistory.com/76</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpxv1f/btrlEJqtRTv/II5LlK8PQYk96Rk0a0meZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpxv1f/btrlEJqtRTv/II5LlK8PQYk96Rk0a0meZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpxv1f/btrlEJqtRTv/II5LlK8PQYk96Rk0a0meZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcpxv1f%2FbtrlEJqtRTv%2FII5LlK8PQYk96Rk0a0meZK%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kO2qd/btrlEJYmNZI/AIYxBEHl0pVsvpD3lZSkn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kO2qd/btrlEJYmNZI/AIYxBEHl0pVsvpD3lZSkn1/img.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1440&quot; width=&quot;403&quot; height=&quot;403&quot; style=&quot;width: 31.3557%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kO2qd/btrlEJYmNZI/AIYxBEHl0pVsvpD3lZSkn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkO2qd%2FbtrlEJYmNZI%2FAIYxBEHl0pVsvpD3lZSkn1%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;1440&quot; height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o971p/btrlDVZiPKq/Eqkj5iRd0fNxjfhU2TOju0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o971p/btrlDVZiPKq/Eqkj5iRd0fNxjfhU2TOju0/img.png&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;447&quot; style=&quot;width: 67.4815%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o971p/btrlDVZiPKq/Eqkj5iRd0fNxjfhU2TOju0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo971p%2FbtrlDVZiPKq%2FEqkj5iRd0fNxjfhU2TOju0%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;962&quot; height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;라이브러리 고르는 법&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;프론트엔드 개발을 하려면 라이브러리가 굉장히 많아서 회사에서 주로 쓰거나 학원에서 배우면서 알게된 라이브러리만 쓰게되는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그렇게 누가 알려준 라이브러리를 그냥 사용할 때엔 몰랐던&amp;nbsp;라이브러리 후보군을 고르고 선택하는 방법에 대한 강의였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;오늘은 약속이 있어서 핸드폰으로 강의를 수강해야되었던 터라 따라쳐보면서 익히는 강의는 피하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이론적인 강의로 골라서 들어봤다.(사실 순서에도 맞았다. 더 듣지 못했을 뿐)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;지난 시간에 날짜(date) 관련 라이브러리의 사용법과 해당 라이브러리를 비교했었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이번에는 그에 대한 복습을 진행하고 라이브러리를 선택하는데 도움이 되는 사이트들을 알아보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;643&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8tbcv/btrlDc1wt6f/2d5WKlnmIiAaSrk8dDKuE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8tbcv/btrlDc1wt6f/2d5WKlnmIiAaSrk8dDKuE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8tbcv/btrlDc1wt6f/2d5WKlnmIiAaSrk8dDKuE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8tbcv%2FbtrlDc1wt6f%2F2d5WKlnmIiAaSrk8dDKuE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;904&quot; height=&quot;643&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;643&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;먼저 npm으로 설치가능한 패키지(라이브러리)를 검색하거나&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;package.json 파일을 올리면 해당 패키지의 상세가 나온다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1741&quot; data-origin-height=&quot;690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8gH86/btrlDgbuTsk/LXKuyf99bi5kCCdU8DdcBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8gH86/btrlDgbuTsk/LXKuyf99bi5kCCdU8DdcBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8gH86/btrlDgbuTsk/LXKuyf99bi5kCCdU8DdcBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8gH86%2FbtrlDgbuTsk%2FLXKuyf99bi5kCCdU8DdcBK%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;1741&quot; height=&quot;690&quot; data-origin-width=&quot;1741&quot; data-origin-height=&quot;690&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVIE61/btrlDBsVvI5/0bABXz8mPxWv2SHkrPHgj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVIE61/btrlDBsVvI5/0bABXz8mPxWv2SHkrPHgj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVIE61/btrlDBsVvI5/0bABXz8mPxWv2SHkrPHgj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVIE61%2FbtrlDBsVvI5%2F0bABXz8mPxWv2SHkrPHgj0%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;1440&quot; height=&quot;532&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;moment.js 를 검색했더니 번들 사이즈가 289.7KB 이고, 비슷한 패키지로 LUXON, dayjs, date-fns 가 나왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이는 지난 번에 moment팀에서 추천한 라이브러리와 일치했다(많이 사용하는 라이브러리가 나오는거 같다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;해당 라이브러리의 사이즈와 검색한 라이브러리와 사이즈를 비교해주기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;어플리케이션에 사용된 라이브러리의 사이즈는 어플리케이션의 성능과도 직결되어있는 추세이기 때문에 매우 유용하게 사용할 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;801&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vz7IO/btrlIlIT1zY/NHXDPYEVbJRSfkVqyKgFN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vz7IO/btrlIlIT1zY/NHXDPYEVbJRSfkVqyKgFN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vz7IO/btrlIlIT1zY/NHXDPYEVbJRSfkVqyKgFN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVz7IO%2FbtrlIlIT1zY%2FNHXDPYEVbJRSfkVqyKgFN0%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;1342&quot; height=&quot;801&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;801&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;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;npm trend는 npm에서 제공하는 서비스이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그래서 비슷한 라이브러리끼리 npm으로 다운로드(인스톨)한 수를 비교해볼수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1637389017616&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/KvRyK/hyMqR1D0bO/DadwZO8BzY5BQwK78L4Fl1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/KvRyK/hyMqR1D0bO/DadwZO8BzY5BQwK78L4Fl1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;본&amp;nbsp;포스팅은&amp;nbsp;패스트캠퍼스&amp;nbsp;환급&amp;nbsp;챌린지&amp;nbsp;참여를&amp;nbsp;위해&amp;nbsp;작성되었습니다&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;#패스트캠퍼스&amp;nbsp;#패캠챌린지&amp;nbsp;#직장인인강&amp;nbsp;#직장인자기계발&amp;nbsp;#패스트캠퍼스후기&amp;nbsp;#한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/76</guid>
      <comments>https://recoderr.tistory.com/76#entry76comment</comments>
      <pubDate>Sat, 20 Nov 2021 15:36:44 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 19일차 - 리액트 Date 라이브러리 비교(Day.js / date-fns / moment.js)</title>
      <link>https://recoderr.tistory.com/75</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWjn6A/btrlqB8ppRP/fNlYRQwFzsEP8favsw3UY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWjn6A/btrlqB8ppRP/fNlYRQwFzsEP8favsw3UY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWjn6A/btrlqB8ppRP/fNlYRQwFzsEP8favsw3UY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWjn6A%2FbtrlqB8ppRP%2FfNlYRQwFzsEP8favsw3UY0%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;787&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdFSYT/btrly7YLDVN/MvPoK14hYr5cBW09NaH4uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdFSYT/btrly7YLDVN/MvPoK14hYr5cBW09NaH4uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdFSYT/btrly7YLDVN/MvPoK14hYr5cBW09NaH4uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdFSYT%2Fbtrly7YLDVN%2FMvPoK14hYr5cBW09NaH4uk%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;1320&quot; height=&quot;787&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;787&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;size14&quot;&gt;어제 들었던 강의 부분에 이어서 moment.js에서 더이상 업데이트를 안하기로 선언하고 이를 대체할 라이브러리를 배워보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(moment.js 에서 추천한 LUXON, Day.js, date-fns,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;js-Joda 중에서 가장 많이 사용하는 Day.js 와 date-fns를 실습했다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mkatW/btrlvAO9wgU/otZjb5MU1cL1zJRMvRVe21/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mkatW/btrlvAO9wgU/otZjb5MU1cL1zJRMvRVe21/img.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-filename=&quot;photo6102642082708565845.jpg&quot; style=&quot;width: 36.2443%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mkatW/btrlvAO9wgU/otZjb5MU1cL1zJRMvRVe21/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmkatW%2FbtrlvAO9wgU%2FotZjb5MU1cL1zJRMvRVe21%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba3GUH/btrlvA2GQO2/dL7jdkNKZcvn28PK9anScK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba3GUH/btrlvA2GQO2/dL7jdkNKZcvn28PK9anScK/img.png&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;380&quot; style=&quot;width: 62.5929%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba3GUH/btrlvA2GQO2/dL7jdkNKZcvn28PK9anScK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba3GUH%2FbtrlvA2GQO2%2FdL7jdkNKZcvn28PK9anScK%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;875&quot; height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Day.js&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Day.js는 moment.js와 다르게 2KB의 작은 size를 갖는다. (모멘트는 200KB가 넘음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;여러 기능을 플러그인으로 분류해놔서인지 기본 용량이 작다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(import되는 라이브러리의 size는 vscode extension &lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Import Cost&lt;/b&gt;&lt;/span&gt; 로 확인 가능하다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;moment.js와 사용법이 거의 똑같기 때문에 대체하기가 쉽고, Immutable 하지만 Tree shaking은 지원하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jim3E/btrlCNMehik/79jpP1iwO8R3g8cFT8OnPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jim3E/btrlCNMehik/79jpP1iwO8R3g8cFT8OnPk/img.png&quot; data-alt=&quot;date-fns&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jim3E/btrlCNMehik/79jpP1iwO8R3g8cFT8OnPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJim3E%2FbtrlCNMehik%2F79jpP1iwO8R3g8cFT8OnPk%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;850&quot; height=&quot;386&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;date-fns&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;date-fns&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;누군가가 &lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://github.com/you-dont-need/You-Dont-Need-Momentjs/blob/master/README.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;moment.js 와 후발주자 date-fns, day.js, Luxon의 주요기능을 비교&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;해 둔 내용을 보면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;date-fns가 가장 커버리지가 높은 것으로 나타난다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;moment.js 보다 지원하는 Locale 수는 절반으로 적지만 이는 추후 추가될 수도 있는 부분이고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;function-per-file 스타일로 작성되어 모듈번들러인 webpack, Browserify, Rollup에 적용하기 편하고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; Tree-shaking을 지원한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://github.com/you-dont-need/You-Dont-Need-Momentjs/blob/master/README.md#parse&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&amp;gt;&amp;gt; 사용예제는 여기를 클릭하세요 &amp;lt;&amp;lt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1637293652953&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;마이페이지 | 패스트캠퍼스&quot; data-og-description=&quot;성인 교육 서비스 기업, 패스트캠퍼스는 개인과 조직의 실질적인 '업(業)'의 성장을 돕고자 모든 종류의 교육 콘텐츠 서비스를 제공하는 대한민국 No. 1 교육 서비스 회사입니다.&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/me/course&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/y2lSc/hyMo5F8IX6/upQXt9k9ClPP9kAkmg75dk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/y2lSc/hyMo5F8IX6/upQXt9k9ClPP9kAkmg75dk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;마이페이지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;성인 교육 서비스 기업, 패스트캠퍼스는 개인과 조직의 실질적인 '업(業)'의 성장을 돕고자 모든 종류의 교육 콘텐츠 서비스를 제공하는 대한민국 No. 1 교육 서비스 회사입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/75</guid>
      <comments>https://recoderr.tistory.com/75#entry75comment</comments>
      <pubDate>Fri, 19 Nov 2021 13:33:20 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 18일차 - 리액트 라이브러리 intro, Moment.js</title>
      <link>https://recoderr.tistory.com/74</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9k435/btrlpc0yByb/Q4wqtPr6uDr3IQSgbJGDA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9k435/btrlpc0yByb/Q4wqtPr6uDr3IQSgbJGDA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9k435/btrlpc0yByb/Q4wqtPr6uDr3IQSgbJGDA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9k435%2Fbtrlpc0yByb%2FQ4wqtPr6uDr3IQSgbJGDA0%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCgdgP/btrlr6ehImP/kTHWALcCYYkLLcXycjfqak/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCgdgP/btrlr6ehImP/kTHWALcCYYkLLcXycjfqak/img.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-filename=&quot;photo6100544223112703485.jpg&quot; style=&quot;width: 37.4159%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCgdgP/btrlr6ehImP/kTHWALcCYYkLLcXycjfqak/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCgdgP%2Fbtrlr6ehImP%2FkTHWALcCYYkLLcXycjfqak%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bidbcV/btrloTzV5qx/Km0Okwt3hZTIHSa0Ir1C00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bidbcV/btrloTzV5qx/Km0Okwt3hZTIHSa0Ir1C00/img.png&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;392&quot; style=&quot;width: 61.4213%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bidbcV/btrloTzV5qx/Km0Okwt3hZTIHSa0Ir1C00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbidbcV%2FbtrloTzV5qx%2FKm0Okwt3hZTIHSa0Ir1C00%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;858&quot; height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/div&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;size14&quot;&gt;오늘은 리액트를 사용하면서 JSX, 컴포넌트의 상태관리, 렌더링 최적화, 성능 확인 외에 직접 구현해야될 기능들을&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;리액트 생태계에서 잘만들어둔 라이브러리를 찾아 적용하는 과정에 대해 배웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;라이브러리 적용 과정&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;사용 목적 &amp;gt; 검색 &amp;gt; 사용법 파악 &amp;gt; 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; 리액트를 많이 사용해보진 않았지만 동일한 기능을 제공하는 라이브러리가 굉장히 많은 것을 뼈저리게 느꼈던 적이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;만들어져 있는 UI를 구매해서 사용한 적이 있는데 form 컴포넌트 폴더이름이 redux-form 과 다른 것으로 두가지가 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;처음엔 상태관리 라이브러리 redux를 사용하는 컴포넌트인 줄 알았는데 그게 아니라 라이브러리를 의미하는 것이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;해당 라이브러리를 구글링했을때 정보가 거의 없고 공식문서의 예제를 보고 할때도 리액트 개념자체가 부족한 상황이었어서인지 쉽지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;그때 초보자가 동일한 기능에 대한 라이브러리를 선택할때는 많은 사람들이 사용하고 있는 라이브러리를 우선적으로 선택해야겠다고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;github / npm trends / 프론트엔트 커뮤니티 / 기술 블로그&lt;/b&gt; &lt;/span&gt;등을 통해&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;기능, 성능, 라이브러리 사이즈, 인기, 최신 트렌드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;가 반영되었는지 등을 비교하고 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mJZ8d/btrloRIUlzL/W2ngKpGZoyNG1N6tkZh2dK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mJZ8d/btrloRIUlzL/W2ngKpGZoyNG1N6tkZh2dK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mJZ8d/btrloRIUlzL/W2ngKpGZoyNG1N6tkZh2dK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmJZ8d%2FbtrloRIUlzL%2FW2ngKpGZoyNG1N6tkZh2dK%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;844&quot; height=&quot;393&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;393&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Moment.js&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;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Date 라이브러리로 유명한 Moment.js 로 간단한 실습을 몇가지 진행하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;사용법은 간단했으나, 모멘트팀에서 새로운 자바스크립트의 흐름에 맞지 않아 더이상 업데이트를 안하기로 선언하며,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;몇가지 다른 라이브러리들을 추천했다. (Luxon, Day.js, date-fns, js-Joda)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그래서 깊게 다루지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Moment.js가 더이상 업데이트 하지 않는 이유&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1. tree shaking 알고리즘이 제대로 작동하지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2. mutable한 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;3. 라이브러리의 size (기능이 많아서 엄청난 size)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1637190964111&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vjGYr/hyMokRlJE3/ylTSRRoWeX5ZcVDwkveY01/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vjGYr/hyMokRlJE3/ylTSRRoWeX5ZcVDwkveY01/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>번에끝내는React의모든것초격차패키지Online.</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/74</guid>
      <comments>https://recoderr.tistory.com/74#entry74comment</comments>
      <pubDate>Thu, 18 Nov 2021 12:30:36 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 17일차 - 리액트 PropTypes 로 타입 검사하기</title>
      <link>https://recoderr.tistory.com/73</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQgp3R/btrlfsvUcQq/adtIcofwzkk8Vh9VCddKZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQgp3R/btrlfsvUcQq/adtIcofwzkk8Vh9VCddKZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQgp3R/btrlfsvUcQq/adtIcofwzkk8Vh9VCddKZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQgp3R%2FbtrlfsvUcQq%2FadtIcofwzkk8Vh9VCddKZ1%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/THihB/btrlfzos3sv/qNNRTo8xDoWKC2hhXThoK1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/THihB/btrlfzos3sv/qNNRTo8xDoWKC2hhXThoK1/img.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-filename=&quot;photo6098115728344460761.jpg&quot; style=&quot;width: 38.1548%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/THihB/btrlfzos3sv/qNNRTo8xDoWKC2hhXThoK1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTHihB%2Fbtrlfzos3sv%2FqNNRTo8xDoWKC2hhXThoK1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkXq5a/btrlmoeVLo2/QJg5Xcf09jYv3DZnLyZtA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkXq5a/btrlmoeVLo2/QJg5Xcf09jYv3DZnLyZtA0/img.png&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;423&quot; style=&quot;width: 60.6824%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkXq5a/btrlmoeVLo2/QJg5Xcf09jYv3DZnLyZtA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkXq5a%2FbtrlmoeVLo2%2FQJg5Xcf09jYv3DZnLyZtA0%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;897&quot; height=&quot;423&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;PropTypes - 타입 검사&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;&quot;&gt;버그 발생 확률을 낮추기 위해 애플리케이션의 타입 검사를 javascript extensions(Flow, TypeScript 등)을 사용할 수 있지만, React에서는 타입 검사 기능을 내장하고 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bspabJ/btrlfYO8GIs/kKsLCrEi4Xmb1BmKT8dmG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bspabJ/btrlfYO8GIs/kKsLCrEi4Xmb1BmKT8dmG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bspabJ/btrlfYO8GIs/kKsLCrEi4Xmb1BmKT8dmG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbspabJ%2FbtrlfYO8GIs%2FkKsLCrEi4Xmb1BmKT8dmG1%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;560&quot; height=&quot;280&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;280&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;size14&quot;&gt;PropType는 클래스, 함수형, 고차 컴포넌트 모두에서 사용가능하다.&lt;/p&gt;
&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;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;PropTypes의 &lt;span style=&quot;color: #000000;&quot;&gt;Validator&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;pre class=&quot;javascript&quot;&gt;&lt;code&gt;import PropTypes from 'prop-types';

MyComponent.propTypes = {
  // prop가 특정 JS 형식임을 선언할 수 있습니다.
  // 이것들은 기본적으로 모두 선택 사항입니다.
  optionalArray: PropTypes.array,
  optionalBool: PropTypes.bool,
  optionalFunc: PropTypes.func,
  optionalNumber: PropTypes.number,
  optionalObject: PropTypes.object,
  optionalString: PropTypes.string,
  optionalSymbol: PropTypes.symbol,

  // 랜더링 될 수 있는 것들은 다음과 같습니다.
  // 숫자(numbers), 문자(strings), 엘리먼트(elements), 또는 이러한 타입들(types)을 포함하고 있는 배열(array) (혹은 배열의 fragment)
  optionalNode: PropTypes.node,

  // React 엘리먼트.
  optionalElement: PropTypes.element,

  // React 엘리먼트 타입 (ie. MyComponent)
  optionalElementType: PropTypes.elementType,

  // prop가 클래스의 인스턴스임을 선언할 수 있습니다.
  // 이 경우 JavaScript의 instanceof 연산자를 사용합니다.
  optionalMessage: PropTypes.instanceOf(Message),

  // 열거형(enum)으로 처리하여 prop가 특정 값들로 제한되도록 할 수 있습니다.
  optionalEnum: PropTypes.oneOf(['News', 'Photos']),

  // 여러 종류중 하나의 종류가 될 수 있는 객체
  optionalUnion: PropTypes.oneOfType([
    PropTypes.string,
    PropTypes.number,
    PropTypes.instanceOf(Message)
  ]),

  // 특정 타입의 행렬
  optionalArrayOf: PropTypes.arrayOf(PropTypes.number),

  // 특정 타입의 프로퍼티 값들을 갖는 객체
  optionalObjectOf: PropTypes.objectOf(PropTypes.number),

  // 특정 형태를 갖는 객체
  optionalObjectWithShape: PropTypes.shape({
    color: PropTypes.string,
    fontSize: PropTypes.number
  }),

  // 추가 프로퍼티에 대한 경고가 있는 객체
  optionalObjectWithStrictShape: PropTypes.exact({
    name: PropTypes.string,
    quantity: PropTypes.number
  }),

  // 위에 있는 것 모두 `isRequired`와 연결하여 prop가 제공되지 않았을 때
  // 경고가 보이도록 할 수 있습니다.
  requiredFunc: PropTypes.func.isRequired,

  // 모든 데이터 타입이 가능한 필수값
  requiredAny: PropTypes.any.isRequired,

  // 사용자 정의 유효성 검사기를 지정할 수도 있습니다.
  // 검사 실패 시에는 에러(Error) 객체를 반환해야 합니다.
  // `oneOfType`안에서는 작동하지 않으므로 `console.warn` 혹은 throw 하지 마세요.
  customProp: function(props, propName, componentName) {
    if (!/matchme/.test(props[propName])) {
      return new Error(
        'Invalid prop `' + propName + '` supplied to' +
        ' `' + componentName + '`. Validation failed.'
      );
    }
  },

  // `arrayOf` 와 `objectOf 에 사용자 정의 유효성 검사기를 적용할 수 있습니다.
  // 검사 실패 시에는 에러(Error) 객체를 반환해야 합니다.
  // 유효성 검사기는 배열(array) 혹은 객체의 각 키(key)에 대하여 호출될 것입니다.
  // 유효성 검사기의 첫 두 개의 변수는 배열 혹은 객체 자신과 현재 아이템의 키입니다.

  customArrayProp: PropTypes.arrayOf(function(propValue, key, componentName, location, propFullName) {
    if (!/matchme/.test(propValue[key])) {
      return new Error(
        'Invalid prop `' + propFullName + '` supplied to' +
        ' `' + componentName + '`. Validation failed.'
      );
    }
  })
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Proptypes 특징&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1. PropTypes.element를 이용하여 컴포넌트에 전달되는 children의 갯수를 제한 할 수 있다. (원래는 제한이 없음)&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const children = this.props.children;

MyComponent.propTypes = {
  children: PropTypes.element.isRequired
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2. 컴포넌트에 defaultProps properties를 할당하여 props의 초깃값을 정의할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; (전달된 props의 값이 없을때 적용된다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; defaultProps에도 propTypes의 타입검사가 적용되기 때문에 propTypes를 정의하기 전에 선언해야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1637120435412&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// props의 초깃값을 정의합니다.
Greeting.defaultProps = {
  name: 'Stranger'
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;3. 함수형 컴포넌트에 propTypes를 적용하기 위해서는 바로 export default function Component 블라블라 하면 안되고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;별도의 함수로 컴포넌트를 선언한 뒤에 &lt;span style=&quot;color: #000000;&quot;&gt;PropTypes를 추가해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;오늘 part1을 완강했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이전 프로젝트에서 급해서 닥쳐서 사용했던 개념들이 공식문서에 자세하게 설명되어있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(보통의 공식문서는 불친절한데 리액트팀은 매우 친절한 것 같다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;eslint와 같이 사용하면 좀더 체계적으로 코드를 작성할 수 있을거 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이전엔 매우 고생했는데 다시 한다면 고생을 반정도만 할거 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1637102839341&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/VMwkA/hyMnm98ytw/qMfxxtyIir1gBQCQ3j3oD1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/VMwkA/hyMnm98ytw/qMfxxtyIir1gBQCQ3j3oD1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/73</guid>
      <comments>https://recoderr.tistory.com/73#entry73comment</comments>
      <pubDate>Wed, 17 Nov 2021 12:53:30 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 16일차 - 리액트 Context</title>
      <link>https://recoderr.tistory.com/72</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cS7oz3/btrkZLKpqwJ/ErVBmjTkSdAWEKMoqk6CBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cS7oz3/btrkZLKpqwJ/ErVBmjTkSdAWEKMoqk6CBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cS7oz3/btrkZLKpqwJ/ErVBmjTkSdAWEKMoqk6CBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcS7oz3%2FbtrkZLKpqwJ%2FErVBmjTkSdAWEKMoqk6CBK%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba9lK7/btrk6jlYBiv/ceJIonYJFQnSBSVcOCBbr1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba9lK7/btrk6jlYBiv/ceJIonYJFQnSBSVcOCBbr1/img.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-filename=&quot;photo6095863928530775759.jpg&quot; style=&quot;width: 45.0514%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba9lK7/btrk6jlYBiv/ceJIonYJFQnSBSVcOCBbr1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba9lK7%2Fbtrk6jlYBiv%2FceJIonYJFQnSBSVcOCBbr1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba1KV7/btrlbDKjUBy/iK6wwCCjflpO9KAckg4fw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba1KV7/btrlbDKjUBy/iK6wwCCjflpO9KAckg4fw1/img.png&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;196&quot; style=&quot;width: 53.7858%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba1KV7/btrlbDKjUBy/iK6wwCCjflpO9KAckg4fw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba1KV7%2FbtrlbDKjUBy%2FiK6wwCCjflpO9KAckg4fw1%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;312&quot; height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/div&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;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Context&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;size14&quot;&gt;&amp;nbsp; - context를 이용하면 props drilling을 거치지 않고도 컴포넌트 트리 전체에 데이터를 제공할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHdeJH/btrlbDDAuWB/xB6ePWqCHmLnfeK7QMAfZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHdeJH/btrlbDDAuWB/xB6ePWqCHmLnfeK7QMAfZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHdeJH/btrlbDDAuWB/xB6ePWqCHmLnfeK7QMAfZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHdeJH%2FbtrlbDDAuWB%2FxB6ePWqCHmLnfeK7QMAfZ0%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;645&quot; height=&quot;751&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;751&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;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Context 사용법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1. const ThemeContext = React.createContext('light');&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- 기본값을 가진 context를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; (defaultValue로 light를 설정했으나 React 트리에서 가장 가까운 Provider에서 값을 지정하는 경우 해당값으로 변경된다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2. &amp;lt;ThemeContext.Provider&amp;gt; &amp;lt;/ThemeContext.Provider&amp;gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- 값을 전달할 하위 컴포넌트를 Provider로 감싸준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- Provider를 통해 전달된 값이 하위 컴포넌트에 적용되므로 컴포넌트 트리에 각각 props로 전달할 필요가 없어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;3. &lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;ThemedButton.contextType = ThemeContext;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp;- 적용할 컴포넌트에서 contextType 을 지정하여 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;**&amp;nbsp;context를 사용하면 컴포넌트를 재사용하기가 어려워진다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;** Provider 하위에서 context를 구독하는 모든 컴포넌트는 Provider의&amp;nbsp;value&amp;nbsp;prop가 바뀔 때마다 재렌더링된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&amp;gt;&amp;gt; 이를 방지하기 위해 부모의 state로 끌어올린다.&amp;nbsp; &lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;Context.Provider value={ this.state. ~~~ } &amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;73&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhvB4j/btrlep6f1ZS/9qrgINNKGq5oHzOgrvZVSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhvB4j/btrlep6f1ZS/9qrgINNKGq5oHzOgrvZVSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhvB4j/btrlep6f1ZS/9qrgINNKGq5oHzOgrvZVSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhvB4j%2Fbtrlep6f1ZS%2F9qrgINNKGq5oHzOgrvZVSk%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;390&quot; height=&quot;73&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;73&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Context.Consumer&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;size14&quot;&gt;Context.Consumer 컴포넌트의 자식은 함수여야하며,&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;이 함수는 context의 현재값을 받고 React 노드를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DHwpn/btrk8kdCozJ/FW9tYmPRs6Q971fXQpNlz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DHwpn/btrk8kdCozJ/FW9tYmPRs6Q971fXQpNlz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DHwpn/btrk8kdCozJ/FW9tYmPRs6Q971fXQpNlz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDHwpn%2Fbtrk8kdCozJ%2FFW9tYmPRs6Q971fXQpNlz0%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;561&quot; height=&quot;121&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;contextdisplayname&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Context.displayName&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Context 객체는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;displayName&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;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;React 개발자 도구는 이 문자열을 사용해서 context를 보여준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCedY6/btrk6fcDTNC/xitK3ER3ejYfDzSfX5Pgp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCedY6/btrk6fcDTNC/xitK3ER3ejYfDzSfX5Pgp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCedY6/btrk6fcDTNC/xitK3ER3ejYfDzSfX5Pgp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCedY6%2Fbtrk6fcDTNC%2FxitK3ER3ejYfDzSfX5Pgp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;880&quot; height=&quot;485&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1637019428487&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ds3F8D/hyMnpdtSKa/77TtOiOKL7ZRFhW9cAnwuK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ds3F8D/hyMnpdtSKa/77TtOiOKL7ZRFhW9cAnwuK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/72</guid>
      <comments>https://recoderr.tistory.com/72#entry72comment</comments>
      <pubDate>Tue, 16 Nov 2021 13:33:25 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 15일차 - 리액트 Memoization</title>
      <link>https://recoderr.tistory.com/71</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bprciK/btrkWPdTq9a/t08dQRnqmqkXoKWKZF0XTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bprciK/btrkWPdTq9a/t08dQRnqmqkXoKWKZF0XTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bprciK/btrkWPdTq9a/t08dQRnqmqkXoKWKZF0XTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbprciK%2FbtrkWPdTq9a%2Ft08dQRnqmqkXoKWKZF0XTk%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rijRY/btrk7uUpfLs/oX5WX91w7EwI44HkOqqbWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rijRY/btrk7uUpfLs/oX5WX91w7EwI44HkOqqbWk/img.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; style=&quot;width: 39.8396%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rijRY/btrk7uUpfLs/oX5WX91w7EwI44HkOqqbWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrijRY%2Fbtrk7uUpfLs%2FoX5WX91w7EwI44HkOqqbWk%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;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IyrCu/btrk8OZeDxI/eVhBzPBAH8yfEsnggNXG31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IyrCu/btrk8OZeDxI/eVhBzPBAH8yfEsnggNXG31/img.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;353&quot; style=&quot;width: 58.9976%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IyrCu/btrk8OZeDxI/eVhBzPBAH8yfEsnggNXG31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIyrCu%2Fbtrk8OZeDxI%2FeVhBzPBAH8yfEsnggNXG31%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;697&quot; height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Memoization&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Memoization은 컴퓨터 프로그램이 동일한 계산을 반복해야 할 때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게하는 기술이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(출처 : 위키피디아)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;React 에서는 고차컴포넌트(HOC)와 Hooks를 통해 Memoization 기능을 제공하고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lSGDF/btrk7uGRmKn/iguDAKAOJBFfPPLXzuv1ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lSGDF/btrk7uGRmKn/iguDAKAOJBFfPPLXzuv1ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lSGDF/btrk7uGRmKn/iguDAKAOJBFfPPLXzuv1ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlSGDF%2Fbtrk7uGRmKn%2FiguDAKAOJBFfPPLXzuv1ck%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;679&quot; height=&quot;190&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;React.memo&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;React.memo는 고차 컴포넌트로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;컴포넌트가 동일한 props로 동일한 결과의 컴포넌트를 렌더링할 경우 React.memo를 호출하여 결과를 메모이징하여 성능향상에 도움을 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(컴포넌트를 바로 렌더링 하지 않고 메모이징한 이전 컴포넌트와 props를 비교하여 변화가 있을시 재렌더링 한다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bczUAH/btrk6NmognR/FsAnNUPTh3ViwYRaMgU2P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bczUAH/btrk6NmognR/FsAnNUPTh3ViwYRaMgU2P0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bczUAH/btrk6NmognR/FsAnNUPTh3ViwYRaMgU2P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbczUAH%2Fbtrk6NmognR%2FFsAnNUPTh3ViwYRaMgU2P0%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;364&quot; height=&quot;140&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;useCallback&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;useCallback은 콜백 함수를 메모이징하여 콜백의 의존성이 변경되었을 때에만 변경되도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;useMemo와 달리 Memoization된 콜백을 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;** 의존성 값의 배열이 콜백에 인자로 전달되지 않기 때문에 콜백 안에서 참조되는 모든 값은 의존성 값의 배열에 표기해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSQESs/btrk6OengDe/8KxpklcPKe5nPV9elT70Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSQESs/btrk6OengDe/8KxpklcPKe5nPV9elT70Bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSQESs/btrk6OengDe/8KxpklcPKe5nPV9elT70Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSQESs%2Fbtrk6OengDe%2F8KxpklcPKe5nPV9elT70Bk%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;625&quot; height=&quot;44&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;44&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #000000; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;useMemo&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Memoization된 값을 반환한다. (변수)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;useMemo로 전달된 함수는 렌더링 중에 실행되기 때문에 렌더링 중에 실행되지 않아야하는 내용은 포함하면 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;useMemo도 useCallback과 마찬가지로 의존성 값의 배열이 인자로 전달되지 않기 때문에,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;배열이 없는 경우 매 렌더링마다 값을 계산하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(useMemo는 의존성이 변경되었을 때에만 메모이제이션된 값을 다시 계산할 것이다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;** Memoization과 같은 성능 최적화 방법을 활용해야하는 부분을 식별하기 위해&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;React에서는 애플리케이션이 렌더링하는 빈도와 렌더링 비용을 측정하는 &lt;a href=&quot;https://ko.reactjs.org/docs/profiler.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Profiler API를 제공&lt;/a&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636950009354&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bL0zRn/hyMlmWxKbF/6NFqn9Tp11JB8UqoT66yuK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bL0zRn/hyMlmWxKbF/6NFqn9Tp11JB8UqoT66yuK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/71</guid>
      <comments>https://recoderr.tistory.com/71#entry71comment</comments>
      <pubDate>Mon, 15 Nov 2021 21:53:12 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 14일차 - 리액트 고차 컴포넌트(HOC)</title>
      <link>https://recoderr.tistory.com/70</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9pHqU/btrkZK3BLXY/KPxKUv6hnOgrQb5fiJcuB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9pHqU/btrkZK3BLXY/KPxKUv6hnOgrQb5fiJcuB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9pHqU/btrkZK3BLXY/KPxKUv6hnOgrQb5fiJcuB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9pHqU%2FbtrkZK3BLXY%2FKPxKUv6hnOgrQb5fiJcuB1%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzmQpm/btrkIQSodOv/BinVhk7gTCCRGZRHwJ0fAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzmQpm/btrkIQSodOv/BinVhk7gTCCRGZRHwJ0fAK/img.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; style=&quot;width: 28.84%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzmQpm/btrkIQSodOv/BinVhk7gTCCRGZRHwJ0fAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzmQpm%2FbtrkIQSodOv%2FBinVhk7gTCCRGZRHwJ0fAK%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;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNQ6SN/btrkK8x48Gn/iDa1beQOjjQIymL38JIiek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNQ6SN/btrkK8x48Gn/iDa1beQOjjQIymL38JIiek/img.png&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;216&quot; style=&quot;width: 69.9972%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNQ6SN/btrkK8x48Gn/iDa1beQOjjQIymL38JIiek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNQ6SN%2FbtrkK8x48Gn%2FiDa1beQOjjQIymL38JIiek%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;699&quot; height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;고차컴포넌트(HOC)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; 고차 컴포넌트는 컴포넌트를 파라미터로 받아와 새로운 컴포넌트를 반환하는 함수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;const EnhancedComponent = higherOrderComponent(WrappedComponent);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;일반 컴포넌트의 경우 props를 UI로 변환하여 return하지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;고차 컴포넌트는 props로 컴포넌트를 전달받아 새로운 컴포넌트로 return 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;고차 컴포넌트의 형태는 Redux, Mobx, Relay, Material UI 등 여러 라이브러리에서도 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;공통 관심사(Cross-Cutting Concerns)에 고차 컴포넌트 사용하기&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;size14&quot;&gt;리액트에서 컴포넌트는 코드 재사용의 기본 단위이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;따라서 컴포넌트가 완전히 동일하지 않다면 재사용이 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;예를 들어 동일한 로직이 반복적으로 발생한다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 로직을 한 곳에서 정의하고 많은 컴포넌트에서 로직을 공유할 수 있게 하는 추상화가 필요하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이러한 경우 고차컴포넌트를 이용하면 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; 고차 컴포넌트는 입력된 컴포넌트를 수정하지 않으며, 상속을 사용하여 동작을 복사하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;단지 원본 컴포넌트를 랩핑하여 조합(compose)한다. (사이드이펙트가 전혀 없는 순수함수)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; 순수함수(일반함수)이기 때문에 파라미터를 원하는대로 추가할수 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;조금 더 반환되는 컴포넌트가 독립적일 수 있도록 prop 이름을 설정할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8hQ7Q/btrkQkxY7qa/U4MQy016WN6CYXMU9zh8y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8hQ7Q/btrkQkxY7qa/U4MQy016WN6CYXMU9zh8y1/img.png&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;246&quot; style=&quot;width: 53.8829%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8hQ7Q/btrkQkxY7qa/U4MQy016WN6CYXMU9zh8y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8hQ7Q%2FbtrkQkxY7qa%2FU4MQy016WN6CYXMU9zh8y1%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;627&quot; height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V1lvS/btrkOjF5aaQ/BkFWCRobmdfDlIJksJJLbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V1lvS/btrkOjF5aaQ/BkFWCRobmdfDlIJksJJLbk/img.png&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;261&quot; style=&quot;width: 44.9543%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V1lvS/btrkOjF5aaQ/BkFWCRobmdfDlIJksJJLbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV1lvS%2FbtrkOjF5aaQ%2FBkFWCRobmdfDlIJksJJLbk%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;555&quot; height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;원본 컴포넌트를 변경하지 않고 조합(Composition)하라&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;size14&quot;&gt;&amp;nbsp;- 파라미터로 전달받은 원본컴포넌트를 prototype.componentDidUpdate로 직접 변경하여 반환하면 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;반환된 컴포넌트에 다른 HOC를 적용하면 첫번째 HOC의 기능은 무시되고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;HOC는 생명주기가 없는 함수 컴포넌트에서도 작동하지 않는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; - 단, 새로운 컴포넌트를 반환하며 해당 컴포넌트에 componentDidUpdate 함수를 사용하면 원본 컴포넌트는 변경하지 않고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 클래스, 함수 컴포넌트 모두에서 사용할수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgP1lx/btrkWO6mv8j/8NKXM4ANVJgaysipLoKpO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgP1lx/btrkWO6mv8j/8NKXM4ANVJgaysipLoKpO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgP1lx/btrkWO6mv8j/8NKXM4ANVJgaysipLoKpO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgP1lx%2FbtrkWO6mv8j%2F8NKXM4ANVJgaysipLoKpO0%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;649&quot; height=&quot;320&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;convention-pass-unrelated-props-through-to-the-wrapped-component&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;컨벤션: 래핑된 컴포넌트를 통해 관련없는 Props 전달하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; 고차 컴포넌트는 특정 관심사와 관련이 없는 props를 활용해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; 고차 컴포넌트에서 반환된 컴포넌트는 래핑된 컴포넌트와 비슷한 인터페이스가 있어야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;convention-maximizing-composability&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;컨벤션: 조합 가능성(Composability) 끌어올리기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8yx9F/btrkWOSPeB2/lbiD8njnFlGmeWCmiZXY6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8yx9F/btrkWOSPeB2/lbiD8njnFlGmeWCmiZXY6K/img.png&quot; data-alt=&quot;컨벤션: 간단한 디버깅을 위한 디스플레이 네임 작성 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8yx9F/btrkWOSPeB2/lbiD8njnFlGmeWCmiZXY6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8yx9F%2FbtrkWOSPeB2%2FlbiD8njnFlGmeWCmiZXY6K%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;730&quot; height=&quot;197&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;컨벤션: 간단한 디버깅을 위한 디스플레이 네임 작성 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;convention-wrap-the-display-name-for-easy-debugging&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFUsk3/btrkK8LDeEm/oLqBqALFS43ToskWLX7l1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFUsk3/btrkK8LDeEm/oLqBqALFS43ToskWLX7l1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFUsk3/btrkK8LDeEm/oLqBqALFS43ToskWLX7l1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFUsk3%2FbtrkK8LDeEm%2FoLqBqALFS43ToskWLX7l1K%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;605&quot; height=&quot;156&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;** render 메서드 안에서는 고차 컴포넌트 사용하지 않아야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;마운트 해제 후 다시 마운트 되고 컴포넌트의 state와 하위 항목들이 손실된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJecx/btrkJ6AyxXT/UmP81Kie7KkK1AjaDjAwkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJecx/btrkJ6AyxXT/UmP81Kie7KkK1AjaDjAwkK/img.png&quot; data-alt=&quot;** 정적 메소드는 따로 복사하거나, 분리하여 export 한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJecx/btrkJ6AyxXT/UmP81Kie7KkK1AjaDjAwkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJecx%2FbtrkJ6AyxXT%2FUmP81Kie7KkK1AjaDjAwkK%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;547&quot; height=&quot;191&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;191&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;** 정적 메소드는 따로 복사하거나, 분리하여 export 한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;** 정적 메소드는 따로 복사하거나, 분리하여 export 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;** ref는 전달되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;컴포넌트가 HOC의 결과인 엘리먼트에 ref를 추가하는 경우, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;ref는 래핑된 컴포넌트가 아닌 가장 바깥쪽 컨테이너 컴포넌트의 인스턴스를 나타낸다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&amp;gt;&amp;gt; React.forwardRef&amp;nbsp;API를 사용하여 해결 가능하다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636881514373&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xPJYS/hyMlrJjPkM/TxPHtNA2XYhyq5FquPoYdK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xPJYS/hyMlrJjPkM/TxPHtNA2XYhyq5FquPoYdK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/70</guid>
      <comments>https://recoderr.tistory.com/70#entry70comment</comments>
      <pubDate>Sun, 14 Nov 2021 20:43:33 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 13일차 - 리액트 합성 (Composition)</title>
      <link>https://recoderr.tistory.com/69</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdjQOb/btrkPILEX5Y/loxwuALADeeu7XuP0iKjA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdjQOb/btrkPILEX5Y/loxwuALADeeu7XuP0iKjA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdjQOb/btrkPILEX5Y/loxwuALADeeu7XuP0iKjA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdjQOb%2FbtrkPILEX5Y%2FloxwuALADeeu7XuP0iKjA1%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkVKEC/btrkQlbZSrw/FV1ks2YK5434s3hkDtK9RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkVKEC/btrkQlbZSrw/FV1ks2YK5434s3hkDtK9RK/img.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; style=&quot;width: 29.8224%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkVKEC/btrkQlbZSrw/FV1ks2YK5434s3hkDtK9RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkVKEC%2FbtrkQlbZSrw%2FFV1ks2YK5434s3hkDtK9RK%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;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dn3b7q/btrkHExmBXQ/uGaxLdvoJRaoIk8HEzaFxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dn3b7q/btrkHExmBXQ/uGaxLdvoJRaoIk8HEzaFxk/img.png&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;222&quot; style=&quot;width: 69.0148%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dn3b7q/btrkHExmBXQ/uGaxLdvoJRaoIk8HEzaFxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdn3b7q%2FbtrkHExmBXQ%2FuGaxLdvoJRaoIk8HEzaFxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;685&quot; height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;합성 (Composition)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; - 코드를 재사용할때 리액트에서는 상속대신 합성을 사용하는 것이 더 좋다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; (합성과 상속은 객체지향에서 기능의 재사용을 하기 위해 사용하는 대표적인 기법이다. 리액트는 합성모델을 사용)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; -&amp;nbsp;&lt;/span&gt;&lt;span data-token-index=&quot;0&quot;&gt;여러 레벨에 걸쳐 props 넘기는 걸 대체하는 데에 context보다 컴포넌트 합성이 더 간단한 해결책일 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;js,result&quot; data-slug-hash=&quot;ozqNOV&quot; data-user=&quot;gaearon&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/gaearon/pen/ozqNOV&quot;&gt; Untitled&lt;/a&gt; by Dan Abramov (&lt;a href=&quot;https://codepen.io/gaearon&quot;&gt;@gaearon&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&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;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1) 컴포넌트에서 자식 엘리먼트를 예상할 수 없을때, children prop을 사용하여 자식 엘리먼트를 그대로 전달한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;html 태그를 열고 닫는 것 처럼 컴포넌트의 close 부분을 분리하여 children props을 전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;(JSX에 children이 내장되어있다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxWdqn/btrkIhPvzrS/o9PHiNesdL7lvXQXx7fPkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxWdqn/btrkIhPvzrS/o9PHiNesdL7lvXQXx7fPkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxWdqn/btrkIhPvzrS/o9PHiNesdL7lvXQXx7fPkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxWdqn%2FbtrkIhPvzrS%2Fo9PHiNesdL7lvXQXx7fPkk%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;1346&quot; height=&quot;288&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;props.children은 배열의 형태로 전달되어 props.children[0] 의 형태와도 같이 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;js,result&quot; data-slug-hash=&quot;gwZOJp&quot; data-user=&quot;gaearon&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;js,result&quot; data-slug-hash=&quot;gwZOJp&quot; data-user=&quot;gaearon&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/gaearon/pen/gwZOJp&quot;&gt; Untitled&lt;/a&gt; by Dan Abramov (&lt;a href=&quot;https://codepen.io/gaearon&quot;&gt;@gaearon&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2) prop으로 children 대신 컴포넌트를 전달한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;리액트 엘리먼트(컴포넌트)는 객체이기 때문에 prop으로 전달 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;(리액트에서 prop으로 전달할 수 있는 것에는 제한이 없다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1636801615707&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function Page(props) {
  const user = props.user;
  const userLink = ( // props를 넣은 컴포넌트로 합성해서 통째로 넘김
    &amp;lt;Link href={user.permalink}&amp;gt;
      &amp;lt;Avatar user={user} size={props.avatarSize} /&amp;gt;
    &amp;lt;/Link&amp;gt;
  );
  return &amp;lt;PageLayout userLink={userLink} /&amp;gt;;
}

// 이제 이렇게 쓸 수 있습니다.
&amp;lt;Page user={user} avatarSize={avatarSize} /&amp;gt;
// ... 그 아래에 ...
&amp;lt;PageLayout userLink={...} /&amp;gt;
// ... 그 아래에 ...
&amp;lt;NavigationBar userLink={...} /&amp;gt;
// ... 그 아래에 ...
{props.userLink}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;더 구체적인 컴포넌트가 일반적인 컴포넌트를 렌더링하고 props를 통해 내용을 구성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;더 구체적인 component인 Page에서 PageLayout &amp;gt; userLink &amp;gt; Link &amp;gt; Avatar로 props를 전달하여 활용할수 있게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636778839645&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bSeM8t/hyMkxbjedR/Qs2FKVNr1b0I7IPA5Kk3EK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bSeM8t/hyMkxbjedR/Qs2FKVNr1b0I7IPA5Kk3EK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/69</guid>
      <comments>https://recoderr.tistory.com/69#entry69comment</comments>
      <pubDate>Sat, 13 Nov 2021 20:21:07 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 12일차 - 리액트 Hooks Deep하게 알아보기</title>
      <link>https://recoderr.tistory.com/68</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpH64y/btrkBEX1cN2/1wWK2u1fljxEE7SPJ8pxIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpH64y/btrkBEX1cN2/1wWK2u1fljxEE7SPJ8pxIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpH64y/btrkBEX1cN2/1wWK2u1fljxEE7SPJ8pxIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpH64y%2FbtrkBEX1cN2%2F1wWK2u1fljxEE7SPJ8pxIk%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;850&quot; height=&quot;461&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QTpaV/btrkyQ6uMOf/OvkmVnkQxfkIXqYEHKPayK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QTpaV/btrkyQ6uMOf/OvkmVnkQxfkIXqYEHKPayK/img.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-filename=&quot;photo6084496047746428506.jpg&quot; style=&quot;width: 66.9508%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QTpaV/btrkyQ6uMOf/OvkmVnkQxfkIXqYEHKPayK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQTpaV%2FbtrkyQ6uMOf%2FOvkmVnkQxfkIXqYEHKPayK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crFMWJ/btrkFNzGmB9/Q3PZwJNlgWiO5KGPiAQdU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crFMWJ/btrkFNzGmB9/Q3PZwJNlgWiO5KGPiAQdU1/img.png&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;474&quot; style=&quot;width: 31.8864%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crFMWJ/btrkFNzGmB9/Q3PZwJNlgWiO5KGPiAQdU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrFMWJ%2FbtrkFNzGmB9%2FQ3PZwJNlgWiO5KGPiAQdU1%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;301&quot; height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;/div&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;size14&quot;&gt;맛보기 강의에서 잠시 hooks를 간단히 알아봤었는데(hook의 일부, useState, useEffect, 컴포넌트 생명주기와의 연관성),&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이번 강의에서는 좀더 자세하게 리액트 공식문서에 따로 카테고리가 분리되어있는 hooks를 다뤘다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Hook&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;만들어진 배경&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; 컴포넌트 간에 상태공유를 위해 기초 뼈대를 개선 (기존에는 render props 나 고차컴포넌트(HOC)를 이용하여 해결)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; 생애주기에 따른 이벤트 로직 분배의 애매함으로 코드가 복잡해지는 것을 간결화&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; 클래스 생성과 사용에 대한 이해에 어려움 (그러나 Class Component를 제거하진 않을 것)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;hook?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; 함수 컴포넌트에서 React state와 생명주기의 특성을 연동(연관되 부분끼리 로직을 함께 구성) 할 수 있도록 하는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(클래스에서는 동작하지 않는다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1) State Hook&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; useState는 현재의 state값과 이 값을 업데이트 하는 함수를 쌍으로 리턴하는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; 제공되는 setState함수는 class의 this.setState와 유사하지만 기존의 state와 새로운 state 합치지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(그렇기 때문에 state는 이전 값을 가지고 있다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2) Effect Hook&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; useEffect는 함수 컴포넌트 내에서 side effects를 수행할 수 있도록하는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; componentDidMount&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;componentDidUpdate&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;componentWillUnmount 에서의 로직을 한곳에 구현할수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;rules-of-hooks&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Hook 사용 규칙&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; 컴포넌트 내 최상위에서만 호출해야한다. (반복문, 조건문, 중첩된 함수 내에서 호출하면 안된다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; React 함수 컴포넌트 내에서만 호출 가능하다(클래스 컴포넌트, 일반 javascript 함수에서는 불가)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Custom Hook&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; -&amp;nbsp; custom hook의 이름은 use로 시작하고 함수 내에서 다른 hook을 호출하면 커스텀 훅이라고 부를수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://ko.reactjs.org/docs/hooks-reference.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;hook 좀 더 알아보기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636687918348&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bSeM8t/hyMkxbjedR/Qs2FKVNr1b0I7IPA5Kk3EK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bSeM8t/hyMkxbjedR/Qs2FKVNr1b0I7IPA5Kk3EK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/68</guid>
      <comments>https://recoderr.tistory.com/68#entry68comment</comments>
      <pubDate>Fri, 12 Nov 2021 13:39:29 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 11일차 - 리액트 List 와 Form 다루기</title>
      <link>https://recoderr.tistory.com/67</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OEVkN/btrkuHtKiHF/fvemg5e0DX1YfnDmISgJS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OEVkN/btrkuHtKiHF/fvemg5e0DX1YfnDmISgJS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OEVkN/btrkuHtKiHF/fvemg5e0DX1YfnDmISgJS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOEVkN%2FbtrkuHtKiHF%2Ffvemg5e0DX1YfnDmISgJS0%2Fimg.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgYEfi/btrkupgejO0/oJAY9CE8auLxu8g7EAPy3K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgYEfi/btrkupgejO0/oJAY9CE8auLxu8g7EAPy3K/img.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-filename=&quot;photo6080281310439518548.jpg&quot; style=&quot;width: 40.516%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgYEfi/btrkupgejO0/oJAY9CE8auLxu8g7EAPy3K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgYEfi%2FbtrkupgejO0%2FoJAY9CE8auLxu8g7EAPy3K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmEAXM/btrkz4g7ogW/KgHsYz9ZLtZukyFAqvgJ01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmEAXM/btrkz4g7ogW/KgHsYz9ZLtZukyFAqvgJ01/img.png&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;446&quot; style=&quot;width: 58.3212%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmEAXM/btrkz4g7ogW/KgHsYz9ZLtZukyFAqvgJ01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmEAXM%2Fbtrkz4g7ogW%2FKgHsYz9ZLtZukyFAqvgJ01%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;856&quot; height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/div&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;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;List&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;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;자바스크립트와 동일하게 리액트에서도 배열이나 리스트를 이용하여 반복적으로 내용이 다른 컴포넌트를 생성할 때 Array.protoType.map() 을 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;Array.protoType.map() 알고가기 ▼&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;[사용 형식]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span data-key=&quot;d4ee9f2b20364e7c96162c791c573c2b&quot;&gt;&lt;span data-offset-key=&quot;d4ee9f2b20364e7c96162c791c573c2b:0&quot;&gt;var new_array=arr.map(function callback(currentValue[, index[, array]]{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span data-key=&quot;3b4e137d94b94e32852327eb20f8bd6c&quot;&gt;&lt;span data-offset-key=&quot;3b4e137d94b94e32852327eb20f8bd6c:0&quot;&gt;&amp;nbsp;// new_array 의 새 요소 반환&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span data-key=&quot;b3a7b71c3a8f44e4a00fc28a205eb817&quot;&gt;&lt;span data-offset-key=&quot;b3a7b71c3a8f44e4a00fc28a205eb817:0&quot;&gt;}[,thisArg])&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span data-offset-key=&quot;d1d5e74de31040bab103a789fbf6dc36:0&quot;&gt;배열 내의 모든 요소 각각에 대하여 제공된 함수(callback)를 호출하고, 그 결과를 모아서 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #ef5369;&quot;&gt;&lt;b&gt;새로운 배열을 반환한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;.map()을 사용하지 않는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span data-i18n=&quot;d29da11741aedeb06334853fb2ad5887e5a5d3da&quot; data-i18n-hash=&quot;0a&quot; data-original-title=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1. you're not using the array it returns; and/or&amp;nbsp; (리턴되는 배열을 사용하지 않을 경우)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span data-i18n=&quot;caa49b02b9218eda8a86147876fe295b32b0d77f&quot; data-i18n-hash=&quot;a8&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2. you're not returning a value from the callback. (콜백함수가 리턴값이 없을때)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;js,result&quot; data-slug-hash=&quot;ZXeOGM&quot; data-user=&quot;gaearon&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/gaearon/pen/ZXeOGM&quot;&gt; Correct Key Example&lt;/a&gt; by Dan Abramov (&lt;a href=&quot;https://codepen.io/gaearon&quot;&gt;@gaearon&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;리스트와 Key&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Key는 형제요소들끼리 고유성을 갖기 때문에 React가 어떤 항목을 변경, 추가 또는 삭제할지 식별하는데 도움을 주기때문에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;엘리먼트 리스트를 반환하는 컴포넌트를 실행할 때 각 엘리먼트에 Key 속성을 부여하지 않으면 경고가 발생된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Key는 컴포넌트에 부여하는 것이 아니라 컴포넌트 내부 리스트(배열)에 속성으로 부여해야하고, (키값은 문자열로 주는것이 좋다고 한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;각기 다른 컴포넌트 내에 동일한 키값을 주었을 경우에도 문제없이 식별할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(이로 인해 리액트는 리턴되는 요소값을 체크 할때 컴포넌트 별로 체크한다는 것을 간접적으로 알수 있었다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;또한 키는 식별에 도움을 주기 위해 사용하지만 컴포넌트로 전달하지 않아서 props로 호출할 수 없다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;472&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWLHJS/btrkupN8ht0/yqjkyAuKUXVHndOLcgceg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWLHJS/btrkupN8ht0/yqjkyAuKUXVHndOLcgceg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWLHJS/btrkupN8ht0/yqjkyAuKUXVHndOLcgceg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWLHJS%2FbtrkupN8ht0%2FyqjkyAuKUXVHndOLcgceg1%2Fimg.png&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;472&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Form&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;폼은 다른 리액트 DOM 엘리먼트와 다르게 동작한다 (기본 동작값이 있다. submit 이라던가 ...)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;제출되는 formData를 관리하기 위해 리액트에서는 두가지 방법을 제시했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;js,result&quot; data-slug-hash=&quot;VmmPgp&quot; data-user=&quot;gaearon&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/gaearon/pen/VmmPgp&quot;&gt; Controlled Text Example&lt;/a&gt; by Dan Abramov (&lt;a href=&quot;https://codepen.io/gaearon&quot;&gt;@gaearon&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; background-color: #ffc1c8;&quot;&gt;1) Controller Component&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;[state, setState] 로 컴포넌트 내부에 상태를 form 내부의 요소의 value 속성에 주입하여,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;컴포넌트에서 값을 컨트롤 할수 있게 한다. (변경은 onChange 이벤트를 이용하여 setState 로 상태값을 변경)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;gt;&amp;gt; input type=&quot;file&quot; 의 경우 읽기 전용이기 때문에 컨트롤이 불가하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;gt;&amp;gt; value 속성을 prop으로 지정하면 사용자가 별도로 이벤트를 지정하지 않는 한 value가 변경되지 않는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;value 값을 undefined&lt;span style=&quot;color: #000000;&quot;&gt;나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;null로 설정하면 입력이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; background-color: #ffc1c8;&quot;&gt;2) Uncontroller Component&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #6d6d6d;&quot;&gt;비제어 컴포넌트는 DOM 자체에서 폼 데이터를 다룬다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #6d6d6d;&quot;&gt;이는 컨트롤 컴포넌트에서 state와 이벤트 핸들러를 통해 데이터를 핸들링 했던 것을,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #6d6d6d;&quot;&gt;ref를 사용하여 DOM에서 폼 값을 가져올 수 있다.&lt;/span&gt;&lt;span style=&quot;color: #6d6d6d;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #6d6d6d;&quot;&gt;&amp;gt;&amp;gt; 비제어 컴포넌트는 value를 prop으로 사용하지 않기 때문에 기본값을 주려면 defaultValue를 지정해서 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636585782785&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bi36WB/hyMjC49jGn/bAcPVzKei6J3Y6b0cvI8Q1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bi36WB/hyMjC49jGn/bAcPVzKei6J3Y6b0cvI8Q1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;공감&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/67</guid>
      <comments>https://recoderr.tistory.com/67#entry67comment</comments>
      <pubDate>Thu, 11 Nov 2021 13:15:21 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 10일차 - 리액트 이벤트 처리 이해하기</title>
      <link>https://recoderr.tistory.com/66</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z2wHK/btrkpOAWL1y/yHzGCCKIevfBn7Tf24dDz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z2wHK/btrkpOAWL1y/yHzGCCKIevfBn7Tf24dDz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z2wHK/btrkpOAWL1y/yHzGCCKIevfBn7Tf24dDz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz2wHK%2FbtrkpOAWL1y%2FyHzGCCKIevfBn7Tf24dDz1%2Fimg.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dszqfA/btrkwdrXYxi/on9D2YqediKiaOE8TqYlH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dszqfA/btrkwdrXYxi/on9D2YqediKiaOE8TqYlH1/img.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; style=&quot;width: 36.5153%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dszqfA/btrkwdrXYxi/on9D2YqediKiaOE8TqYlH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdszqfA%2FbtrkwdrXYxi%2Fon9D2YqediKiaOE8TqYlH1%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;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KHJHv/btrkw4BxamP/P7kqXA3oHhWHuaGVk6IeJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KHJHv/btrkw4BxamP/P7kqXA3oHhWHuaGVk6IeJ0/img.png&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;312&quot; style=&quot;width: 62.3219%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KHJHv/btrkw4BxamP/P7kqXA3oHhWHuaGVk6IeJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKHJHv%2Fbtrkw4BxamP%2FP7kqXA3oHhWHuaGVk6IeJ0%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;710&quot; height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이벤트&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;리액트에서 이벤트를 처리하는 방식은 DOM 엘리먼트에서 이벤트를 처리하는 방식과 매우 유사하지만 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1. React의 이벤트는 소문자가 아닌 camelCase 명명법을 적용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2. JSX를 사용하여 문자열이 아닌 함수로 이벤트 핸들러를 전달한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;html : &amp;lt;button onclick=&quot;activeOn()&quot;&amp;gt; ActiveState &amp;lt;/button&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;React : &amp;lt;button onClick={activeOn}&amp;gt; ActiveState &amp;lt;/button&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;3. React에서는 이벤트 핸들러의 return값으로 false를 전달해도 이벤트의 기본 동작을 방지할수 없어,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;반드시 preventDefault를 명시적으로 호출해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;함수에 전달된 파라미터 e는 합성이벤트이며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;브라우저마다 조금씩 다른 이벤트 효과를 w3c명세에 따라 정의하여 동일한 이벤트에서 동일한 사용자 경험을 할 수 있도록 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6;&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;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;xEmzGg&quot; data-user=&quot;gaearon&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/gaearon/pen/xEmzGg&quot;&gt; Toggle&lt;/a&gt; by Dan Abramov (&lt;a href=&quot;https://codepen.io/gaearon&quot;&gt;@gaearon&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;클래스 컴포넌트 내에서 함수를 정의해도 constructor 내부에서 바인딩 해주지 않으면 인식하지하지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이를 방지하기 위해 함수 정의시 화살표 함수로 사용하거나, 이벤트에 주입시 화살표 함수로 주입하여 해결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;** 화살표 함수를 사용하여 바인딩 해줄 경우 컴포넌트가 리렌더링시 다른 콜백함수가 생성되어,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;콜백이 하위 컴포넌트에 props로 전달된다면 매렌더링마다 하위컴포넌트도 리렌더링 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1636551241807&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  1.
  handleClick = () =&amp;gt; {
    console.log('this is:', this);
  }
  
  2.
  handleClick() {
    console.log('this is:', this);
  }
  
  render() {
    // 이 문법은 `this`가 handleClick 내에서 바인딩되도록 합니다.
    return (
      &amp;lt;button onClick={() =&amp;gt; this.handleClick()}&amp;gt;
        Click me
      &amp;lt;/button&amp;gt;
    );
   }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;합성&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이벤트(&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SyntheticEvent)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;React의 이벤트 핸들러는 모든 브라우저에서 이벤트를 동일하게 처리하기 위해 이벤트 래퍼 SyntheticEvent 객체를 전달받는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;모든 브라우저에서 동일하게 동작하지만 브라우저의 고유 이벤트와 동작이 일치하지 않기 때문에,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;브라우저의 고유 이벤트가 필요하다면 nativeEvent 속성을 참고해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;319&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnEy5A/btrkr3RUWQu/3YijcezQRBLFNO8KGufHn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnEy5A/btrkr3RUWQu/3YijcezQRBLFNO8KGufHn0/img.png&quot; data-alt=&quot;합성 이벤트 객체가 가지는 속성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnEy5A/btrkr3RUWQu/3YijcezQRBLFNO8KGufHn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnEy5A%2Fbtrkr3RUWQu%2F3YijcezQRBLFNO8KGufHn0%2Fimg.png&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;319&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;합성 이벤트 객체가 가지는 속성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;React가 지원하는 이벤트들은 이벤트 버블링 단계에서 호출된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;캡처 단계에서 이벤트 핸들러가 작동하길 원한다면 이벤트 이름 뒤에 Capture를 붙여서 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://ko.javascript.info/bubbling-and-capturing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;** 버블링과 캡처링 알아보기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636549312463&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b8RewC/hyMgwyF5HO/aAlNmZXKD5xtyvupK4OAHK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b8RewC/hyMgwyF5HO/aAlNmZXKD5xtyvupK4OAHK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/66</guid>
      <comments>https://recoderr.tistory.com/66#entry66comment</comments>
      <pubDate>Wed, 10 Nov 2021 22:50:52 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 9일차 - 리액트 컴포넌트 생명주기</title>
      <link>https://recoderr.tistory.com/65</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MkIof/btrkjXdmWDJ/MbZ8Dfq3wjqM2EJcNgKvX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MkIof/btrkjXdmWDJ/MbZ8Dfq3wjqM2EJcNgKvX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MkIof/btrkjXdmWDJ/MbZ8Dfq3wjqM2EJcNgKvX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMkIof%2FbtrkjXdmWDJ%2FMbZ8Dfq3wjqM2EJcNgKvX0%2Fimg.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k8fiG/btrkobhsheo/MdVTw1UMF1Gdq7voixS1F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k8fiG/btrkobhsheo/MdVTw1UMF1Gdq7voixS1F1/img.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; width=&quot;617&quot; height=&quot;463&quot; style=&quot;width: 38.9557%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k8fiG/btrkobhsheo/MdVTw1UMF1Gdq7voixS1F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk8fiG%2Fbtrkobhsheo%2FMdVTw1UMF1Gdq7voixS1F1%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;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tCV7U/btrkqsCx8j1/Z0XsSkbS1QPPGy8kYwbhBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tCV7U/btrkqsCx8j1/Z0XsSkbS1QPPGy8kYwbhBk/img.png&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;565&quot; style=&quot;width: 59.8815%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tCV7U/btrkqsCx8j1/Z0XsSkbS1QPPGy8kYwbhBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtCV7U%2FbtrkqsCx8j1%2FZ0XsSkbS1QPPGy8kYwbhBk%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;1158&quot; height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;/div&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;size14&quot;&gt;리액트의 컴포넌트 생명주기는 굉장히 유명한 도표로 한눈에 알수있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 도표는 클래스 컴포넌트에 맞게 표기되어있고 강의 또한 리액트 공식문서에 나와있는대로 클래스 컴포넌트를 기준으로 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;817&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O7WDx/btrkqH0KgY1/CDCRbOSVju6itJ2LM7Ciu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O7WDx/btrkqH0KgY1/CDCRbOSVju6itJ2LM7Ciu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O7WDx/btrkqH0KgY1/CDCRbOSVju6itJ2LM7Ciu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO7WDx%2FbtrkqH0KgY1%2FCDCRbOSVju6itJ2LM7Ciu1%2Fimg.png&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;817&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;요즘 강의를 들으면서 vscode 세팅이 귀찮을거 같아서(CRA를 이용한 세팅) repl.it을 이용하고 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;클래스 컴포넌트의 this에 대한 특이점을 설명해 주었는데, 그것을 좀더 쉽게 arrow-function을 이용하면 binding을 따로 하지 않아도 해당 클래스 내의 함수인 것을 인지한다는 내용의 코드를 적용했더니&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;@babel/plugin-proposal-class-properties 를 install 해야된다는 에러가 떠서 install 했는데 제대로 작동하지 않아 강의로 의미만 설명듣고 넘겨버렸다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;repl.it는 webpack 대신 vite를 이용해서 번들링 하고 있는데 vite 관련 내용은 구글에 별로 나오지 않더라&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;추후 Go로 만들어진 번들러 vite와 Go언어에 대해서도 공부해봐야겠다. 언제 할 수 있을지 장담할 수는 없지만....&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(repl.it 은 원래 번들러로 webpack을 사용했는데 vite로 바꾸었다고 한다. 속도도 빠르고 간편하다고....)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;384&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w8XkA/btrkqHfnOb2/04BTibCk5EbZlSNf0rKF30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w8XkA/btrkqHfnOb2/04BTibCk5EbZlSNf0rKF30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w8XkA/btrkqHfnOb2/04BTibCk5EbZlSNf0rKF30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw8XkA%2FbtrkqHfnOb2%2F04BTibCk5EbZlSNf0rKF30%2Fimg.png&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;384&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;컴포넌트&amp;nbsp;생명주기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;클래스 컴포넌트는 도표대로 constructor &amp;gt;&amp;gt; render &amp;gt;&amp;gt; componentDidMount 하여 렌터링되고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;업데이트는 componentDidUpdate&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;컴포넌트가 해제될 때는 componentWillUnmount 가 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;지난 강의에서 클래스 컴포넌트의 생명주기 메소드는 functional component에서 어떻게 대체되고 있는지 설명해주었는데 이번강 의에서도 조금 언급되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;constructor에서 state 초기화되는 부분은 useState 훅으로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;메소드(함수) 바인딩은 arrow - function으로(클래스 컴포넌트 내에서 생성자에서 바인딩을 직접하지 않고 간편하게 처리할 수 있는 방법),&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;함수형 컴포넌트 내에서는 함수를 선언에도 잘 인식한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;componentDidMount는 useEffect 훅으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;componentWillUnmount는 useEffect의 return(clean Up)으로 구현이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636456335133&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b8RewC/hyMgwyF5HO/aAlNmZXKD5xtyvupK4OAHK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b8RewC/hyMgwyF5HO/aAlNmZXKD5xtyvupK4OAHK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/65</guid>
      <comments>https://recoderr.tistory.com/65#entry65comment</comments>
      <pubDate>Tue, 9 Nov 2021 21:36:07 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 8일차 - 리액트 Props, State</title>
      <link>https://recoderr.tistory.com/64</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AGxYY/btrkhoBpG5v/YLLKo39lH9CjLbDFEq4LA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AGxYY/btrkhoBpG5v/YLLKo39lH9CjLbDFEq4LA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AGxYY/btrkhoBpG5v/YLLKo39lH9CjLbDFEq4LA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAGxYY%2FbtrkhoBpG5v%2FYLLKo39lH9CjLbDFEq4LA1%2Fimg.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; width=&quot;620&quot; height=&quot;465&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbIJr8/btrkaOA7OyL/UM1yZaRkud5KFDfTGXeo6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbIJr8/btrkaOA7OyL/UM1yZaRkud5KFDfTGXeo6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbIJr8/btrkaOA7OyL/UM1yZaRkud5KFDfTGXeo6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbIJr8%2FbtrkaOA7OyL%2FUM1yZaRkud5KFDfTGXeo6k%2Fimg.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; width=&quot;620&quot; height=&quot;465&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p 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;font-family: 'Noto Serif KR';&quot;&gt;Props&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이번 강의에서는 Props의 정의라기보다는 사용방법, 컴포넌트를 추출해서 활용하는 이유(재사용성) 등을 강조했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- Props는 속성, Property의 약자이다. 이는 jsx를 사용하여 커스텀 컴포넌트가 다른 컴포넌터에서 사용되는 구조를 보면 왜 Property라고 명명했는지 쉽게 알수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;lt;Component name=&quot;Props&quot; hobby=&quot;props2&quot; /&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;위와 같은 표현법을 사용하고 있는데 그냥 한눈에 봐도 html 태그와 유사하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;컴포넌트는 React 엘리먼트를 return 함으로 props는 자식요소들에 영향을 미친다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;span style=&quot;&quot;&gt;&lt;b&gt;props 이름은 컴포넌트 관점에서 명명하는 것을 권장한다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이는 props를 name, age, hobby로 명명하는 것이 아닌 user로 유의미하게 짓는 것을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;컴포넌트를 추출할 때 어떤한 의미를 가지고 있는 것이 개별적으로 재사용할 수 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(UI 일부가 여러번 사용되거나, 일부가 자체적으로 복잡한 경우 별도의 컴포넌트로 분리하는 것이 좋다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;props는 읽기전용으로 react 컴포넌트는 반드시 자신의 props를 다룰때 순수함수처럼 동작해야한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(순수함수 : 항상 동일한 입력값에 대해 동일한 결과를 반환하며, 입력된 값 자체를 변경하려 하지 않는다. )&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqACGn/btrkkXJmIXV/YfKnBKmq50bfpmki7JJOw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqACGn/btrkkXJmIXV/YfKnBKmq50bfpmki7JJOw0/img.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;489&quot; style=&quot;width: 70.6085%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqACGn/btrkkXJmIXV/YfKnBKmq50bfpmki7JJOw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqACGn%2FbtrkkXJmIXV%2FYfKnBKmq50bfpmki7JJOw0%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;903&quot; height=&quot;489&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMqNIC/btrkcsED7Hk/OhBRbXDGWyiUkYbHO487h1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMqNIC/btrkcsED7Hk/OhBRbXDGWyiUkYbHO487h1/img.png&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;703&quot; style=&quot;width: 28.2287%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMqNIC/btrkcsED7Hk/OhBRbXDGWyiUkYbHO487h1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMqNIC%2FbtrkcsED7Hk%2FOhBRbXDGWyiUkYbHO487h1%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;519&quot; height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;/div&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;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;State&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;&quot;&gt;목차는 state지만 ClassComponent와 FunctionalComponent로 같은 기능 구현하는 내용이었다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;&quot;&gt;클래스 컴포넌트&amp;nbsp; vs 함수 컴포넌트&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;&quot;&gt;1. 상태관리&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;클래스 :&amp;nbsp; constructor(props) 생성자로 state 초기값을 설정해주고, (항상 props로 기본 생성자(super)를 호출해야한다.)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;별도 함수를 통해 this.setState() 를 호출하여 react가 state 변경된 것을 인지시킨다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;함수 : useState 훅을 통해&lt;/span&gt; &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;state 초기값을 설정하고 setState로 state값을 변경한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;&quot;&gt;2. 컴포넌트 마운트, 언마운트시 핸들링&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;클래스 : componentDidMount()&amp;nbsp; - 컴포넌트가 마운트(작동)되어있는 동안 실행될 코드 (컴포넌트가 dom에 렌더링된 후 실행)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;componentWillUnmount() - 컴포넌트가 마운트 해제될때 실행될 코드&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; 함수 : useEffect 훅으로 마운트되었을때 실행될 코드를 감싸준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; useEffect CleanUp(마운트 해제시 실행되는 코드)시 실행될 코드를 return 문 안에 작성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;state 올바르게 사용하기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1. 직접적으로 state 수정하지 않기&lt;/span&gt;&lt;span style=&quot;background-color: #ffc1c8;&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;61&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eSHhOo/btrkinoIDcK/gKJsc2OIqc9wMlIlSsaYY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eSHhOo/btrkinoIDcK/gKJsc2OIqc9wMlIlSsaYY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eSHhOo/btrkinoIDcK/gKJsc2OIqc9wMlIlSsaYY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeSHhOo%2FbtrkinoIDcK%2FgKJsc2OIqc9wMlIlSsaYY0%2Fimg.png&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;61&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2. state 업데이트는 비동기적일 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;비동기적으로 업데이트되어 setState 바로 다음에 해당값을 사용하기 어려울수 있으니,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;기본적으로 기억하고 있는 이전 state 값을 사용해라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; - 이 내용은 이전 프로젝트 때 경험해보았던 내용이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; setState 후에 반영이되지 않아 알아보니 모든 setState를 모아 한번에 처리한다는 내용을 보았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 즉 바로 반영되지 않으므로 이전 값을 이용하여야만 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636373085063&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cf8oax/hyMe76zMVl/VGNKx2Gwtb2Sbgdtht0VB1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cf8oax/hyMe76zMVl/VGNKx2Gwtb2Sbgdtht0VB1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/64</guid>
      <comments>https://recoderr.tistory.com/64#entry64comment</comments>
      <pubDate>Mon, 8 Nov 2021 22:54:38 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 7일차 - 리액트 JSX 알아보기</title>
      <link>https://recoderr.tistory.com/63</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdOxOn/btrj5eelENn/lLl2xRkjlt4rozXnVgGjsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdOxOn/btrj5eelENn/lLl2xRkjlt4rozXnVgGjsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdOxOn/btrj5eelENn/lLl2xRkjlt4rozXnVgGjsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdOxOn%2Fbtrj5eelENn%2FlLl2xRkjlt4rozXnVgGjsK%2Fimg.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WWYTx/btrj88E2y0Y/rpDe67aVGekvgNwxm3InvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WWYTx/btrj88E2y0Y/rpDe67aVGekvgNwxm3InvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WWYTx/btrj88E2y0Y/rpDe67aVGekvgNwxm3InvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWWYTx%2Fbtrj88E2y0Y%2FrpDe67aVGekvgNwxm3InvK%2Fimg.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p 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;font-family: 'Noto Serif KR';&quot;&gt;JSX 없이 사용하는 React&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;React는 자바스크립트 라이브러리로 JSX 를 사용하지 않아도 모든 것을 자바스크립트로 구현할수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그러나 리액트를 사용하면서 자바스크립트보다 JSX를 선호하는 이유는,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;기존에 자바스크립트로 구현할수 있음에도 JQuery를 많이 사용했던 이유 중 하나,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;자바스크립트로 작성된 코드가 JSX로 작성한 코드보다 길고 복잡하기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1636285694218&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* JSX */
class Hello extends React.Component {
  render() {
    return &amp;lt;div&amp;gt;Hello {this.props.toWhat}&amp;lt;/div&amp;gt;;
  }
}

ReactDOM.render(
  &amp;lt;Hello toWhat=&quot;World&quot; /&amp;gt;,
  document.getElementById('root')
);

/* JAVASCRIPT */
class Hello extends React.Component {
  render() {
    return React.createElement('div', null, `Hello ${this.props.toWhat}`);
  }
}

ReactDOM.render(
  React.createElement(Hello, {toWhat: 'World'}, null),
  document.getElementById('root')
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://babeljs.io/repl/#?presets=react&amp;amp;code_lz=GYVwdgxgLglg9mABACwKYBt1wBQEpEDeAUIogE6pQhlIA8AJjAG4B8AEhlogO5xnr0AhLQD0jVgG4iAXyJA&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;더 많은 예시보기&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;JSX 알아보기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- JSX는 자바스크립트를 확장한 문법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1636286184137&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function formatName(user) {
  return user.firstName + ' ' + user.lastName;
}

const user = {
  firstName: 'Harper',
  lastName: 'Perez'
};

const element = (
  &amp;lt;h1&amp;gt;
    Hello, {formatName(user)}!
  &amp;lt;/h1&amp;gt;
);

ReactDOM.render(
  element,
  document.getElementById('root')
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- JSX의 중괄호 안에 유효한 모든 Javascript 표현식을 넣을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; JSX도 표현식이기 때문에 컴파일이 끝나면 JSX 표현식이 Javascript 함수를 호출하고 &lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;javascript 객체로 인식&lt;/b&gt;&lt;/span&gt;되기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; (즉, 변수, 파라미터, 반환값 등으로 사용가능하다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- JSX는 HTML의 형식을 띄고 있어 Attribute를 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; Attribute에 값을 넣을때 따옴표(문자열 리터럴)를 이용해서 리터럴을 직접 입력하거나&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 중괄호를 사용해서 javascript 표현식을 넣어 간접적으로 값을 넣을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 둘은 다른 형식이기 때문에 하나의 Attribute에 동시 사용은 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- JSX는 html보다 javascript에 가깝기 때문에 &lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;attribute를 명명할때 camelCase&lt;/span&gt;&lt;/b&gt;&lt;/span&gt; 명명 규칙을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;- JSX는 XSS 공격을 방지한다(보안)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; ReactDOM에서 JSX에 삽입된 모든 값을 렌더링하기 전에 이스케이프하여 모든 항목은 렌더링 전에 문자열로 변환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636280885510&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cf8oax/hyMe76zMVl/VGNKx2Gwtb2Sbgdtht0VB1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cf8oax/hyMe76zMVl/VGNKx2Gwtb2Sbgdtht0VB1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1636280862653&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tLc5y/hyMfkxCBVo/UD275yGHp5boUeqdKmBDYK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/63</guid>
      <comments>https://recoderr.tistory.com/63#entry63comment</comments>
      <pubDate>Sun, 7 Nov 2021 21:08:32 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 6일차 - 리액트 상태 끌어올리기, 데이터 fetch하기</title>
      <link>https://recoderr.tistory.com/62</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PdYsd/btrj2zjEnwV/SSOFPhWeKhfVamN6Ai0qhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PdYsd/btrj2zjEnwV/SSOFPhWeKhfVamN6Ai0qhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PdYsd/btrj2zjEnwV/SSOFPhWeKhfVamN6Ai0qhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPdYsd%2Fbtrj2zjEnwV%2FSSOFPhWeKhfVamN6Ai0qhk%2Fimg.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oldsq/btrj6dMYe6m/VTxsLS9VGmDfcdDQPkS8Ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oldsq/btrj6dMYe6m/VTxsLS9VGmDfcdDQPkS8Ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oldsq/btrj6dMYe6m/VTxsLS9VGmDfcdDQPkS8Ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foldsq%2Fbtrj6dMYe6m%2FVTxsLS9VGmDfcdDQPkS8Ck%2Fimg.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;js,result&quot; data-slug-hash=&quot;wvqmJQb&quot; data-user=&quot;beginnerww&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/beginnerww/pen/wvqmJQb&quot;&gt; state lifting&lt;/a&gt; by BEGINNERWW (&lt;a href=&quot;https://codepen.io/beginnerww&quot;&gt;@beginnerww&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&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;font-family: 'Noto Serif KR';&quot;&gt;State 끌어올리기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;형제컴포넌트가 존재하고 어떠한 액션을 취할때 형제컴포넌트의 state(값, 데이터 등)이 필요할 때,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;해당 상태값을 각각의 컴포넌트 내에서 관리하는 것이 아닌 부모컴포넌트로 lifting up 하여 관리하는 것을 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;단순한 구조(연관된 컴포넌트가 몇 되지 않을때)일 경우 lifting up(상태를 부모가 관리), Props drilling(props를 자식 컴포넌트로 하달)을 함에 있어 큰 문제가 되지 않으나,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;과도할 경우 어디서 전달되어온 값인지 추적하기가 어려워져 유지보수에 문제가 생긴다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이를 보완하기 위해 Context Api나 상태관리 라이브러리(redux, mobx 등)을 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;js,result&quot; data-slug-hash=&quot;abyYWWY&quot; data-user=&quot;beginnerww&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/beginnerww/pen/abyYWWY&quot;&gt; data fetch&lt;/a&gt; by BEGINNERWW (&lt;a href=&quot;https://codepen.io/beginnerww&quot;&gt;@beginnerww&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;데이터 Fetch 해보기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;api를 통해 데이터를 가져올 경우 기본적으로 제공되는 web API 중 fetch api를 사용해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(기본적으로 제공되는 fetch 외에 ajax나 axios 등으로 네트워크 통신이 가능하다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;상황별 핸들링&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1. 로딩 - 마운트되고 데이터는 아직 받지 못한 상태&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2. 데이터 - 정상적으로 통신 완료되어 데이터를 리턴받은 상태&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;3. 에러 - 네트워크 통신 중 서버 혹은 클라이언트에서 문제 발생으로 인해 데이터를 제대로 얻지 못한 상태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 리액트를 공부하면서 fetch 나 axios는 promise 구조로 이루어져있다(?!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;promise는 자바스크립트 비동기 처리에 사용되는 객체로 주로 데이터를 받아와 화면에 표시할 때 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNRbqx/btrj2UnjQUK/acEkSU2u3RlkeNmudGaAr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNRbqx/btrj2UnjQUK/acEkSU2u3RlkeNmudGaAr1/img.png&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;686&quot; style=&quot;width: 51.9%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNRbqx/btrj2UnjQUK/acEkSU2u3RlkeNmudGaAr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNRbqx%2Fbtrj2UnjQUK%2FacEkSU2u3RlkeNmudGaAr1%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;1079&quot; height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4xFO1/btrj2zD1EUW/EK2kEoZtKbCwmOdD5vyQb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4xFO1/btrj2zD1EUW/EK2kEoZtKbCwmOdD5vyQb1/img.png&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;516&quot; style=&quot;width: 46.9372%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4xFO1/btrj2zD1EUW/EK2kEoZtKbCwmOdD5vyQb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4xFO1%2Fbtrj2zD1EUW%2FEK2kEoZtKbCwmOdD5vyQb1%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;734&quot; height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;강의 중 편집되어 설명없이 툭 튀어나온 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;** 강의 중 fetch로 데이터를 가져와 state에 담기 전에는 정상적으로 작동했었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;state에 담은 뒤 왼쪽 이미지와 같이 화면이 렌더링되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;처음엔 코드펜에서 react와 react-dom import 하는 과정에서 버전이 달랐나싶어 재확인하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;코드샌드박스, repl.it 까지 확인을 했는데 똑같이 에러도 확인되지 않은채 렌더링이 안되길래&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;강의에서 놓친 부분이 있나싶어 돌려봤는데 아무설명없이 갑자기 코드가 추가되었더라&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(타이핑하는 부분도 편집되어있었다 갑자기 툭튀어나온 코드)&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;701&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYZvpn/btrj2hKjn0x/nd0oBiLywOoBvuxBCjkB61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYZvpn/btrj2hKjn0x/nd0oBiLywOoBvuxBCjkB61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYZvpn/btrj2hKjn0x/nd0oBiLywOoBvuxBCjkB61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYZvpn%2Fbtrj2hKjn0x%2Fnd0oBiLywOoBvuxBCjkB61%2Fimg.png&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;701&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;if 문을 추가하니 정상적으로 작동이 되는데 왜 그런지 이유를 찾아볼수 없어 질의를 남기려 했으나&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;초창기에는 그래도 메일로 질의를 받았던거 같은데 지금은 무슨 이유에서인지 질의응답을 제공하지 않는다고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;인프런과 패스트캠퍼스 둘다 이용해본 입장으로 인프런에서 제공하는 질의응답 서비스는 벤치마킹할 필요가 있다고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;해당 클립을 공부하면서 먼저 질문되었던 내용과 답변을 보며 공부되는 부분도 있었고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;나도 동일한 의문을 가진 적이 꽤 있었기에 너무 만족했던 서비스였기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #ee2323;&quot;&gt;&lt;b&gt;결론은 질의응답 서비스 제공해주세요 패캠&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636199451259&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tLc5y/hyMfkxCBVo/UD275yGHp5boUeqdKmBDYK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tLc5y/hyMfkxCBVo/UD275yGHp5boUeqdKmBDYK/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;같이 읽으면 좋은 글&amp;nbsp;  &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://ko.reactjs.org/docs/lifting-state-up.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공식문서 state 끌어올리기&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://joshua1988.github.io/web-development/javascript/promise-for-beginners/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;자바스크립트 Promise 쉽게 이해하기&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/62</guid>
      <comments>https://recoderr.tistory.com/62#entry62comment</comments>
      <pubDate>Sat, 6 Nov 2021 22:40:11 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 5일차 - 리액트 Key와 리렌더링</title>
      <link>https://recoderr.tistory.com/61</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcie14/btrjVC8pawc/bQWMdBggEZBmte7QoHvrIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcie14/btrjVC8pawc/bQWMdBggEZBmte7QoHvrIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcie14/btrjVC8pawc/bQWMdBggEZBmte7QoHvrIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcie14%2FbtrjVC8pawc%2FbQWMdBggEZBmte7QoHvrIk%2Fimg.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-filename=&quot;photo_2021-11-05_22-00-21.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MtefC/btrj2eeXy05/grXUPdYOYBxQofgihR0BwK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MtefC/btrj2eeXy05/grXUPdYOYBxQofgihR0BwK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MtefC/btrj2eeXy05/grXUPdYOYBxQofgihR0BwK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMtefC%2Fbtrj2eeXy05%2FgrXUPdYOYBxQofgihR0BwK%2Fimg.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-filename=&quot;photo_2021-11-05_22-00-21.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p 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;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;key와 리렌더링&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;size14&quot;&gt;효율적으로 변화를 감지하고 리렌더링 하기 위해 리액트에서는&amp;nbsp;key라는 엘리먼트 리스트를 만들때 포함해야되는 특수한 속성을 지원한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;key는 기존 트리와 이후 트리의 자식들이 일치하는지 확인해주는 역할을 하기 때문에,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;전역에서 유일할 필요없이 형제요소에서만 유일성을 유지하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;js,result&quot; data-slug-hash=&quot;bGrLmyW&quot; data-user=&quot;beginnerww&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/beginnerww/pen/bGrLmyW&quot;&gt; Untitled&lt;/a&gt; by BEGINNERWW (&lt;a href=&quot;https://codepen.io/beginnerww&quot;&gt;@beginnerww&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;key는 고유하게 식별할 수 있어야 하기 때문에 대부분의 경우 데이터의 ID 값을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;유일하게 사용할 수 있는 값이 없을 경우 인덱스를 key로 사용할 수 있으나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;인덱스를 key로 사용하게 되면 재배열이 일어날 경우 컴포넌트에 예기치않은 문제가 발생할 수 있기때문에 주의해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;(여기서 인덱스는 array[index] 처럼 배열이나 리스트의 순서를 의미한다.)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;** 리액트는 key를 명시적으로 지정하지 않을 경우 기본적으로 index를 key로 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;** key 속성을 명시하더라도 컴포넌트에 props로 전달되지 않기때문에 해당 값이 필요할 경우 따로 props를 넘겨주어야한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;강의 중 JS 문법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;setInterval / clearInterval&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;setInterval()&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #2c3e50;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; :&lt;/span&gt;&amp;nbsp;주기적으로 인자를 실행하는 함수&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;//Hello!라는 문자열을 콘솔에 3초에 1번씩 실행한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #cc99cd;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #f08d49;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; console&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f08d49;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #7ec699;&quot;&gt;&quot;Hello!&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #f08d49;&quot;&gt;setInterval&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;test&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #f08d49;&quot;&gt;3000&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;clearInterval()&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #2c3e50;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; : &lt;/span&gt;현재 진행되고 있는 함수를&lt;span&gt;&amp;nbsp;중지&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;//인자로 함수 이름 넣어준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #f08d49;&quot;&gt;clearInterval&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;interval&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-i18n=&quot;9b48533ed470f313be2a50e6f04cca823d741861&quot; data-i18n-hash=&quot;7f&quot; data-original-title=&quot;&quot;&gt;Array.prototype.filter()&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #222426;&quot;&gt;주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #222426;&quot;&gt;해당되는 요소가 없을 경우 빈배열을 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-i18n=&quot;9b48533ed470f313be2a50e6f04cca823d741861&quot; data-i18n-hash=&quot;7f&quot; data-original-title=&quot;&quot;&gt;Array.prototype.includes()&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #212529;&quot;&gt;배열이 특정 요소를 포함하고 있는지 판별한다. (반환값 boolean)&lt;/span&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #212529;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot; data-i18n=&quot;9b48533ed470f313be2a50e6f04cca823d741861&quot; data-i18n-hash=&quot;7f&quot; data-original-title=&quot;&quot;&gt;Array.prototype.find()&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;주어진 판별 함수를 만족하는 첫번쨰 요소의 값을 반환한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;그런 요소가 없으면, undefined를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Array.prototype.map()&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;size14&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열로 반환한다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636071672041&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/GbGcp/hyMdHGyQ7d/keixEymbYXeVraxmAP2R4K/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/GbGcp/hyMdHGyQ7d/keixEymbYXeVraxmAP2R4K/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;같이 읽으면 좋은 글&amp;nbsp;  &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://ko.reactjs.org/docs/reconciliation.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공식문서 재조정(Reconciliation)&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://ko.reactjs.org/docs/lists-and-keys.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공식문서 리스트와 key&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/61</guid>
      <comments>https://recoderr.tistory.com/61#entry61comment</comments>
      <pubDate>Fri, 5 Nov 2021 22:57:30 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 4일차 - 리액트 element 다루기</title>
      <link>https://recoderr.tistory.com/60</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lc3Rq/btrjTZOm43S/oPVXzIt5vjBgUj1KlGxLH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lc3Rq/btrjTZOm43S/oPVXzIt5vjBgUj1KlGxLH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lc3Rq/btrjTZOm43S/oPVXzIt5vjBgUj1KlGxLH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flc3Rq%2FbtrjTZOm43S%2FoPVXzIt5vjBgUj1KlGxLH0%2Fimg.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;412&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BmnE4/btrjPOmWoRy/lRzvXLFIXWCsjzanWJ1F8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BmnE4/btrjPOmWoRy/lRzvXLFIXWCsjzanWJ1F8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BmnE4/btrjPOmWoRy/lRzvXLFIXWCsjzanWJ1F8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBmnE4%2FbtrjPOmWoRy%2FlRzvXLFIXWCsjzanWJ1F8k%2Fimg.png&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;412&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p 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;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Element에 style 입히기&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;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 이미 html 태그로 정의되어있는 element는 class 를 인식하지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;커스텀 element는 class를 인식하지 못하기 때문에 className으로 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- style 적용은 className을 사용하여 css를 작성하는 것과 인라인으로 주입하는 방법이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 인라인으로 주입할 때는 객체형식으로 작성해야하며, 속성명은 카멜케이스로 작성해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 커스텀 컴포넌트 형식으로 작성하여 적용할때는 태그 내에 모든 것들이 props로 전달되기 때문에,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;전체를 사용할때는 파라미터 객체로 받고, 부분 사용시에는 비구조할당으로 받는다. { className } 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xTHkP/btrjR8d15Hf/nqacZ5rigXo2HY09dafXDK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xTHkP/btrjR8d15Hf/nqacZ5rigXo2HY09dafXDK/img.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-filename=&quot;photo6060010761314479849.jpg&quot; style=&quot;width: 36.5273%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xTHkP/btrjR8d15Hf/nqacZ5rigXo2HY09dafXDK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxTHkP%2FbtrjR8d15Hf%2FnqacZ5rigXo2HY09dafXDK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO5jpx/btrjPvg7QRm/rAv1O7eZnAY5ejiVlNganK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO5jpx/btrjPvg7QRm/rAv1O7eZnAY5ejiVlNganK/img.png&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;368&quot; style=&quot;width: 62.3099%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO5jpx/btrjPvg7QRm/rAv1O7eZnAY5ejiVlNganK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO5jpx%2FbtrjPvg7QRm%2FrAv1O7eZnAY5ejiVlNganK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;837&quot; height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;/div&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;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Ref로 DOM 다루기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;강의에서 useRef에 대한 설명이 너무 간단해서 공식문서를 참고했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;DOM을 직접적으로 다뤄야할 때 Ref를 사용하고, 그 외 간접적 접근이 필요할땐 props를 이용하여 해결해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;createref와-useref의-차이점&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;createRef와 useRef의 차이점&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;createRef로 생성된 ref 객체는 DOM element와 클래스 컴포넌트의 인스턴스를 current 프로퍼티 값으로 받기 때문에,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;인스턴스가 생성되지 않는 함수형 컴포넌트에서는 createRef를 사용할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;따라서 함수형 컴포넌트에서는 리액트 훅에서 ref와 동일한 기능을 제공하는 useRef를 사용한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2gYiY/btrjQDswG8A/BFuyGqAKTh3ZabcB6LiaE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2gYiY/btrjQDswG8A/BFuyGqAKTh3ZabcB6LiaE0/img.png&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;293&quot; style=&quot;width: 49.2252%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2gYiY/btrjQDswG8A/BFuyGqAKTh3ZabcB6LiaE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2gYiY%2FbtrjQDswG8A%2FBFuyGqAKTh3ZabcB6LiaE0%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;879&quot; height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCIC3S/btrjVMotYB0/Ie98k7aCmzG5xasEnzV8s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCIC3S/btrjVMotYB0/Ie98k7aCmzG5xasEnzV8s0/img.png&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;297&quot; style=&quot;width: 49.612%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCIC3S/btrjVMotYB0/Ie98k7aCmzG5xasEnzV8s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCIC3S%2FbtrjVMotYB0%2FIe98k7aCmzG5xasEnzV8s0%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;898&quot; height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Form 다루기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;event.preventDefault();&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;form태그 속성 중 action을 기재하면 submit 시에 해당 url로 form-data가 전송되는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;action이 주어지지 않더라도 button의 submit은 기본동작이 되기 때문에 깜빡임 현상이 일어난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이를 방지하기 위해 onSubmit으로 submit 핸들러 함수를 지정해서 기본이벤트를 제거해주는 event.preventDefault(); 를 사용해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이외 리액트에서는 close태그가 없을 경우 error 가 발생되고, label 태그의 for도 htmlFor로 변경해주어야 정상 작동된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;유효성 검사 validation check&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;validation은 submit에서도 onChange에서도 가능하지만 조금더 나은 사용자 경험을 위해 onChange에서 하는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;onChange시 validation check를 진행하려면 input의 value를 직접 관리(controlled)해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;직접 관리시에는 onChange 속성을 부가해야하며, value 속성을 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;관리하지 않을시에는 defaultValue 속성 또는 value관련 속성을 부가하지 않는다. (자동으로 change event가 적용됨)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;js,result&quot; data-slug-hash=&quot;zYdpQYW&quot; data-user=&quot;beginnerww&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/beginnerww/pen/zYdpQYW&quot;&gt; error Boundary&lt;/a&gt; by BEGINNERWW (&lt;a href=&quot;https://codepen.io/beginnerww&quot;&gt;@beginnerww&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&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;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Error 다루기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;렌더링 중에 하위 컴포넌트의 에러발생으로 페인팅 자체가 안되는 현상을 막기위해 ErrorBoundary가 적용되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(자바스크립트의 catch 구문과 유사한 기능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;React 생명주기 메소드 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;static getDerivedStateFromError()&lt;/b&gt;&lt;/span&gt;&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;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;componentDidCatch()&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; 둘 중 하나 이상을 정의하면 해당 클래스 컴포넌트는 ErrorBoundary 컴포넌트가 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;적용되지 않는 에러&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; - 이벤트 핸들러 (더 알아보기) &lt;br /&gt;&amp;nbsp; - 비동기적 코드 (예: setTimeout 혹은 requestAnimationFrame 콜백) &lt;br /&gt;&amp;nbsp; - 서버 사이드 렌더링 &lt;br /&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1635984285562&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/oAMpF/hyMcoghmvI/9EqakqzlEYH6qR1VoOUx4k/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/oAMpF/hyMcoghmvI/9EqakqzlEYH6qR1VoOUx4k/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;같이 읽으면 좋은 글&amp;nbsp;  &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://ko.reactjs.org/docs/refs-and-the-dom.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공식문서 ref와 DOM&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://ko.reactjs.org/docs/hooks-reference.html#useref&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공식문서 Hooks api - useRef&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://ko.reactjs.org/docs/error-boundaries.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식문서 ErrorBoundary&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/60</guid>
      <comments>https://recoderr.tistory.com/60#entry60comment</comments>
      <pubDate>Thu, 4 Nov 2021 16:47:48 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 3일차 - 리액트 Hooks</title>
      <link>https://recoderr.tistory.com/59</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKUrFk/btrjHVG6YAK/UBGJxR9KoYRObCNs7Mjw5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKUrFk/btrjHVG6YAK/UBGJxR9KoYRObCNs7Mjw5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKUrFk/btrjHVG6YAK/UBGJxR9KoYRObCNs7Mjw5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKUrFk%2FbtrjHVG6YAK%2FUBGJxR9KoYRObCNs7Mjw5K%2Fimg.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;리액트는 컴포넌트 단위로 사용되는데 여기서 &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;컴포넌트란 element의 집합&lt;/b&gt;&lt;/span&gt;을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;ex) input 여러개~, form 등등을 요소로 칭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;지난 강의에서 바닐라js로 구현한 검색입력창을 리액트 훅(useState)을 이용하여 구현해보았다.&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;js,result&quot; data-slug-hash=&quot;WNEdNNK&quot; data-user=&quot;beginnerww&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/beginnerww/pen/WNEdNNK&quot;&gt; 검색입력창 vjs&lt;/a&gt; by BEGINNERWW (&lt;a href=&quot;https://codepen.io/beginnerww&quot;&gt;@beginnerww&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;컴포넌트 상태관리 : useState (함수형 컴포넌트에서 변수 관리)&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;size14&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const [keyword, setKeyword] = useState(&quot;&quot;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;useState의 return값이 배열형태이기 때문에 변수 선언시 배열의 &lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://learnjs.vlpt.us/useful/06-destructuring.html&quot;&gt;비구조화 할당(destructuring)&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;기법을 이용해 두 개의 변수를 선언한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(물론 const keywordState = React.useState(&quot;&quot;); 로 선언 후 배열 index로 각각 변수 선언하여 이용할수도 있다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;setState시 이전값(prev)이 자동으로 주입되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;따라서 [state, setState] 라면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;setState(!state)도 가능하지만 setShow((prev) =&amp;gt; (!prev)); 도&amp;nbsp;가능&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;하다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HFM2Z/btrjKOUpkh0/zcHJJnCvrKprBDbodU2pIk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HFM2Z/btrjKOUpkh0/zcHJJnCvrKprBDbodU2pIk/img.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-filename=&quot;photo6057541210953854212.jpg&quot; style=&quot;width: 38.2626%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HFM2Z/btrjKOUpkh0/zcHJJnCvrKprBDbodU2pIk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHFM2Z%2FbtrjKOUpkh0%2FzcHJJnCvrKprBDbodU2pIk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7hSF7/btrjJ7mkBej/kbapMgaBPMBXk86mjQCnpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7hSF7/btrjJ7mkBej/kbapMgaBPMBXk86mjQCnpk/img.png&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;406&quot; style=&quot;width: 60.5746%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7hSF7/btrjJ7mkBej/kbapMgaBPMBXk86mjQCnpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7hSF7%2FbtrjJ7mkBej%2FkbapMgaBPMBXk86mjQCnpk%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;857&quot; height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/div&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;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;컴포넌트 사이드이펙트 다루기 : useEffect&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 변수 또는 객체의 값의 변화를 인지하고 업데이트 해주는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;- 사이드이펙트이기 때문에, 컴포넌트가 다 그려지고나서 작동한다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;- 실행되는 조건&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1) 페이지 처음 렌더링시 무조건 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2) useEffect 안에 배열로 지정한 useState의 값이 변경되면 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #f89009; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 사용방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;&amp;nbsp;1) useEffect(() =&amp;gt; {});&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 가장 기본적인 형태이나 dependency가 없어 작은 요소라도 변화하면 계속 실행되어,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 불필요한 실행이 많아져 거의 사용하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;b&gt;2) useEffect(() =&amp;gt; {}, []);&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 렌더링 후 단 한번만 실행하고 싶을때 사용하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 대괄호[] 안에 변수나 값을 지정하지 않고 비어있다면, 렌더링 후 단 한번만 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;b&gt;3) const [name, setName] = useState();&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; useEffect(() =&amp;gt; {}, [name]);&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 렌더링 후 한번, 배열 안 변수의 값이 변할 때마다 실행된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre id=&quot;code_1635915383501&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function useLocalStorage(itemName, value = &quot;&quot;){
  const [state, setState] = React.useState(() =&amp;gt; {
    return window.localStorage.getItem(itemName) || value;
  });
  
  React.useEffect(() =&amp;gt; {
    window.localStorage.setItem(itemName, state);
  }, [state]);
  
  return [state, setState];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;커스텀 훅 만들기 : 훅의 반복&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 어떠한 액션에 대한 반복을 함수화해서 중복된 코드를 줄여나갔었는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 훅도 마찬가지로 커스텀 훅(함수화)을 만들어서 불필요한 코드를 줄일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 강의에 나온 커스텀 훅은 state를 localStorage에 저장하고 state 값이 변할때마다 localStorage에 저장된 값도 변경하는 내용이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 커스텀 훅이라고 크게 무언가 다른 건 없었고 사용되는 위치, 역할에 따라 구조에 신경써야될 것 같다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;414&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dN6A8Z/btrjKNPuMCn/geiFKv0cDFQZ1fgj7eNRk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dN6A8Z/btrjKNPuMCn/geiFKv0cDFQZ1fgj7eNRk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dN6A8Z/btrjKNPuMCn/geiFKv0cDFQZ1fgj7eNRk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdN6A8Z%2FbtrjKNPuMCn%2FgeiFKv0cDFQZ1fgj7eNRk0%2Fimg.png&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;414&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p 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;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Hook flow 이해하기&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;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- useEffect 는 render가 완료된 후 이루어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 해당 컴포넌트의 변화(update)시 useEffect clean up이 먼저 실행되고 useEffect가 실행된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1635920069149&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  React.useEffect(() =&amp;gt; {
    console.log(&quot;useEffect, empty deps&quot;);
    
     return () =&amp;gt; {
      console.log(&quot;App useEffect [CleanUp] empty deps&quot;);
    }
  }, []);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;&lt;b&gt;- 컴포넌트가 Parent, Child 로 이루어져 있다면,&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;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;1. App 실행 &amp;gt; Parent 렌더 start &amp;gt; useState &amp;gt; Parent 렌더 end &amp;gt; Parent useEffect&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; 2. 이벤트 발생으로 Child 컴포넌트 렌더시&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Parent 컴포넌트 렌더 start, end &amp;gt; Child 렌더 start, useState, end &amp;gt; Parent useEffect Clean Up &amp;gt; Child useEffect &amp;gt; Parent useEffect&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; 3. Child 컴포넌트의 요소 변경으로 인한 useEffect 실행&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Child 렌더 start, end &amp;gt; Child useEffect Clean Up &amp;gt; Childs useEffect&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; 4. 이벤트 발생으로 Child 컴포넌트 제거시&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Parent 컴포넌트 렌더 start, end &amp;gt; Child useEffect Clean Up &amp;gt; Parent&lt;span&gt;&amp;nbsp;&lt;/span&gt;seEffect Clean Up &amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Parent useEffect&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1635901827965&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMDBOs/hyMcomxypc/5dkcq9cRvKLncl2cZCL36K/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMDBOs/hyMcomxypc/5dkcq9cRvKLncl2cZCL36K/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/59</guid>
      <comments>https://recoderr.tistory.com/59#entry59comment</comments>
      <pubDate>Wed, 3 Nov 2021 15:57:32 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 2일차 - 리액트의 리렌더링</title>
      <link>https://recoderr.tistory.com/58</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HUpi4/btrjDgDHk0m/ZlWzS56tgqEfFdhDS5YKT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HUpi4/btrjDgDHk0m/ZlWzS56tgqEfFdhDS5YKT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HUpi4/btrjDgDHk0m/ZlWzS56tgqEfFdhDS5YKT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHUpi4%2FbtrjDgDHk0m%2FZlWzS56tgqEfFdhDS5YKT1%2Fimg.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJgfoz/btrjDgw0fJ7/bLhDIjmH4F5IVVQnnFGGrK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJgfoz/btrjDgw0fJ7/bLhDIjmH4F5IVVQnnFGGrK/img.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot; data-filename=&quot;photo6053052570697576255.jpg&quot; style=&quot;width: 43.9114%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJgfoz/btrjDgw0fJ7/bLhDIjmH4F5IVVQnnFGGrK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJgfoz%2FbtrjDgw0fJ7%2FbLhDIjmH4F5IVVQnnFGGrK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dE2VPi/btrjBx7hcLy/7xP1VjPo7NAPQSQZNkKp6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dE2VPi/btrjBx7hcLy/7xP1VjPo7NAPQSQZNkKp6K/img.png&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;602&quot; style=&quot;width: 54.9258%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dE2VPi/btrjBx7hcLy/7xP1VjPo7NAPQSQZNkKp6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdE2VPi%2FbtrjBx7hcLy%2F7xP1VjPo7NAPQSQZNkKp6K%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;1004&quot; height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;오늘은 리액트의 리렌더링에 대한 내용과 이벤트 핸들링에 대해 공부하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;리액트의 장점 &lt;/b&gt;&lt;/span&gt;으로 많이 화자되는 것 중 리렌더링에 대한 부분이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;리액트는 가상돔을 통한 컴포넌트 비교로 변경된 내용을 파악하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;document 전체를 리렌더링하는 것이 아니라&amp;nbsp;변경된 내용이 사용되는 컴포넌트만 리렌더링한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이는 웹개발에 있어서 성능 최적화와 직결되는 장점이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;620&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3PiAz/btrjxA4xfUc/6Ygclu9LR4t6D4g8alYcwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3PiAz/btrjxA4xfUc/6Ygclu9LR4t6D4g8alYcwk/img.png&quot; data-alt=&quot;브라우저엔진(웹킷) 동작과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3PiAz/btrjxA4xfUc/6Ygclu9LR4t6D4g8alYcwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3PiAz%2FbtrjxA4xfUc%2F6Ygclu9LR4t6D4g8alYcwk%2Fimg.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;620&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;브라우저엔진(웹킷) 동작과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;성능 최적화하면 리플로우(reflow), 리페인트(repaint)의 개념을 알아야된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;브라우저가 동작할때 리플로우는 배치, 리페인트는 그리기에 해당하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;리플로우&lt;/b&gt;&lt;/span&gt;는 플로우작업(DOM트리 + css/javascript 를 합쳐주면서 해당 돔요소의 크기와 위치에 배치하는 것)을 다시 하는 것을 의미한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;렌더트리를 기반으로 화면을 그리는 작업을 다시 할때(수정할때) &lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;리페인트&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;가 호출된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;아래 코드는 강의에서 나온 코드가 아니라 직접 리플로우와 리페인트에 대해 검색하여 읽은 포스팅에 포함된 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이처럼 통합해서 한번에 수정하느냐, 각각 대입하느냐에 따라 리플로우 호출 횟수가 달라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;성능 최적화를 위해 코드를 작성할때 리플로우와 리페인트를 줄이는 것에 대해 고려해야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(리액트에서는 가상돔을 이용한 별도의 비교 알고리즘이 적용된다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1635816363890&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// bad
const body = document.body;
body.style.width = '50px';
body.style.height = '100px';
 
// good
const body = document.body;
body.style.cssText = 'width: 50px; heigh: 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;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;네이밍룰(표기법)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; - 지난 강의에서 봤듯이 리액트의 커스텀 컴포넌트는 태그로 사용할때 첫글자가 대문자로 사용된다. (파스칼케이스)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; - 이벤트, 변수 등등 네이밍룰 표기법으로 카멜 케이스를 적용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;기본 문장 on click&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;font-size: 0.87em;&quot;&gt;카멜 케이스 (camel-case)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; onClick&lt;/li&gt;
&lt;li style=&quot;font-size: 0.87em;&quot;&gt;파스칼 케이스 (pascal-case)&amp;nbsp; &amp;nbsp; &amp;nbsp;OnClick&lt;/li&gt;
&lt;li style=&quot;font-size: 0.87em;&quot;&gt;케밥 케이스 (kebab-case)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; on-click&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;font-size: 0.87em;&quot;&gt;스네이크 케이스 (snake-case)&amp;nbsp; &amp;nbsp;on_click&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;310&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yH6mB/btrjCZWT2Ip/ab7sqGpzLeek4Eg1t0tBtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yH6mB/btrjCZWT2Ip/ab7sqGpzLeek4Eg1t0tBtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yH6mB/btrjCZWT2Ip/ab7sqGpzLeek4Eg1t0tBtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyH6mB%2FbtrjCZWT2Ip%2Fab7sqGpzLeek4Eg1t0tBtk%2Fimg.png&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;310&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;전역변수를 사용해서 input 의 value 값이 변할때의 이벤트 (onChange)와 search 버튼을 클릭했을때의 이벤트를 구현했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;QWMOgjz&quot; data-user=&quot;beginnerww&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/beginnerww/pen/QWMOgjz&quot;&gt; Untitled&lt;/a&gt; by BEGINNERWW (&lt;a href=&quot;https://codepen.io/beginnerww&quot;&gt;@beginnerww&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1635817241733&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dlpiuw/hyMcroTmkc/cYSeJ3uFb3JL4uikhN6wI1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dlpiuw/hyMcroTmkc/cYSeJ3uFb3JL4uikhN6wI1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;같이 읽으면 좋은 글&amp;nbsp;  &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;http://https://d2.naver.com/helloworld/59361&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;브라우저는 어떻게 동작하는가? - 네이버D2&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;HTTP 개요 - MDN&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://ko.reactjs.org/docs/rendering-elements.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;리액트 엘리먼트 렌더링&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://ko.reactjs.org/docs/reconciliation.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;리액트 재조정(Reconciliation)&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/58</guid>
      <comments>https://recoderr.tistory.com/58#entry58comment</comments>
      <pubDate>Tue, 2 Nov 2021 15:25:30 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 챌린지 1일차</title>
      <link>https://recoderr.tistory.com/57</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5p1X4/btrjDgQ0Q8C/bJCVKnJskSYnkui2asO3Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5p1X4/btrjDgQ0Q8C/bJCVKnJskSYnkui2asO3Vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5p1X4/btrjDgQ0Q8C/bJCVKnJskSYnkui2asO3Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5p1X4%2FbtrjDgQ0Q8C%2FbJCVKnJskSYnkui2asO3Vk%2Fimg.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;461&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;최근 회사에서 리액트, node.js(koa.js) spec으로 프로젝트를 진행했었는데(외주??였나 그랬음)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리액트 기본 강의(벨로퍼트님,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;John Ahn님 등&lt;/span&gt;)만 듣고 실제 리액트에서 자주 사용하는 상태관리 라이브러리, ui라이브러리 등&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실전에 필요한 내용은 거의 전무하다시피 했다보니 한달내내 생고생하고 프로젝트는 빠그러지게 되었던 경험이 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리액트 처럼 생태계가 활성화 되어있고 광범위할 때에는 활용능력에 따라 완성도의 차이가 결정되는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;경험이 전무하다시피하니 프로젝트 진행속도도 더뎠고 구현한 기능 자체의 state 관리가 어려웠었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(상태관리 라이브러리가 redux만 있는 줄 알았었고 mobx는 처음 들어봤는데 심지어 중간에 스택이 바뀌는 참사도 있었다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그렇다보니 회사에서 리액트 실무 코드를 보기엔 어려울것 같았고 (진행한 리액트 프로젝트가 거의 없었다)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;최근 좋은 샘플 코드가 생겼지만 이해하기도 쉽지않아 온라인 강의를 선택하게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8rdjV/btrjBxzaP7h/kqimQmskFTog7LYeLCHUOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8rdjV/btrjBxzaP7h/kqimQmskFTog7LYeLCHUOK/img.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot; style=&quot;width: 63.2398%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8rdjV/btrjBxzaP7h/kqimQmskFTog7LYeLCHUOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8rdjV%2FbtrjBxzaP7h%2FkqimQmskFTog7LYeLCHUOK%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;1440&quot; height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blvylB/btrjAeGD8cR/mLCpcihKuokOy9tscGykH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blvylB/btrjAeGD8cR/mLCpcihKuokOy9tscGykH1/img.png&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;473&quot; style=&quot;width: 35.5974%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blvylB/btrjAeGD8cR/mLCpcihKuokOy9tscGykH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblvylB%2FbtrjAeGD8cR%2FmLCpcihKuokOy9tscGykH1%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;355&quot; height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기존에 들어본 강의력은 조*영님이 탑이었는데 하나하나 다 결제하기엔(회사에 청구할거라) 좀 눈치 보여서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;패스트 캠퍼스 환급 챌린지를 선택했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의에 담겨있는 라이브러리가 압도적으로 많았기에 선택한 것도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;part1. React 기초의 현재 ch 01. React 맛보기 ~ 05.Element 찍어내기 까지 수강완료 했는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;리액트 기초 강의(문법)을 한번쯤 봤었고 완전히 이해한다면 건너뛰어도 될정도이나&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;저같은 경우는 다른 강의에서 충분히 이해하고 있었지만 바닐라js에서 react를 사용하면서의 변천사라고 할까&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;같은 내용의 코드를 가장 간편하게 표현하는 방법을 순차적으로 보여주는 면이 새로웠다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&amp;lt;div&amp;gt;로 감싸주었던 html element를 React.Flagment로 React.Flagment가 &amp;lt;&amp;gt;로 표현되는 등&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이부분은 알고 있었던 내용이지만 이 외에도 다시보면 새로운 내용들이 종종 들어가 있더라&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그래서 조금은 지루할것 같지만 part1부터 차근차근 완강할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;강의에서 리액트 외에도 기본적인 js 문법에 대해 간단히 설명도 해주기에 es6문법을 잘 모르더라도 수강하는데 문제는 없을것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://bit.ly/3FVdhDa&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1635772311462&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;수강료 100% 환급 챌린지 | 패스트캠퍼스&quot; data-og-description=&quot;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&quot; data-og-host=&quot;fastcampus.co.kr&quot; data-og-source-url=&quot;https://bit.ly/3FVdhDa&quot; data-og-url=&quot;https://fastcampus.co.kr/event_online_challenge?utm_source=naver&amp;amp;utm_medium=viral&amp;amp;utm_campaign=prm^211020^AOP&amp;amp;utm_content=powercontents^challenge^AOP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ClEvP/hyMa5HuNeL/5Kr2IwneAjo33BsfKOwuD1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705&quot;&gt;&lt;a href=&quot;https://bit.ly/3FVdhDa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bit.ly/3FVdhDa&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ClEvP/hyMa5HuNeL/5Kr2IwneAjo33BsfKOwuD1/img.png?width=1100&amp;amp;height=705&amp;amp;face=0_0_1100_705');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;수강료 100% 환급 챌린지 | 패스트캠퍼스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fastcampus.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Light';&quot;&gt;#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는React의모든것초격차패키지Online.&lt;/span&gt;&lt;/p&gt;</description>
      <category>ETC/패캠환급챌린지(리액트)</category>
      <category>직장인인강</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>패캠챌린지</category>
      <category>한번에끝내는React의모든것초격차패키지Online.</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/57</guid>
      <comments>https://recoderr.tistory.com/57#entry57comment</comments>
      <pubDate>Mon, 1 Nov 2021 22:53:11 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] 날짜와 관련된 &amp;lt;input&amp;gt; 요소의 type(date, month, week) 활용하기 (유효성, 포맷전환, 데이터 핸들링)</title>
      <link>https://recoderr.tistory.com/56</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;PomyOor&quot; data-user=&quot;beginnerww&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/beginnerww/pen/PomyOor&quot;&gt; onChangeInputType&lt;/a&gt; by BEGINNERWW (&lt;a href=&quot;https://codepen.io/beginnerww&quot;&gt;@beginnerww&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;목적&lt;/span&gt;&lt;/b&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;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 기간설정으로 파라미터값을 전달하여 범위에 해당하는 데이터값을 가져온다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;과정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;1. &amp;lt;select&amp;gt; 태그에 일간, 주간, 월간, 연간을 선택할 수 있게 option을 주고 값이 변할때마다 이벤트를 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;2. select 태그의 값이 변할때마다 onChange이벤트로 기간 범위 템플릿을 변경해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (function onChangeCal(event))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;3. 범위값이 변경될때 마다 유효성 검사를 실시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (시작일 : startValidity(event) / 종료일 : endValidity(event))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1628471361500&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;select name=&quot;condition&quot; id=&quot;calendar&quot; onchange=&quot;onChangeCal(event)&quot;&amp;gt;
	&amp;lt;option value=&quot;year&quot;&amp;gt;연도별&amp;lt;/option&amp;gt;
	&amp;lt;option value=&quot;month&quot; selected&amp;gt;월별&amp;lt;/option&amp;gt;
	&amp;lt;option value=&quot;week&quot;&amp;gt;주별&amp;lt;/option&amp;gt;
	&amp;lt;option value=&quot;day&quot;&amp;gt;일별&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;
&amp;lt;span id =&quot;cal&quot;&amp;gt;
	&amp;lt;input type=&quot;month&quot; class=&quot;input_type&quot; id=&quot;startDate&quot; style=&quot;width: 200px;&quot; onChange=&quot;startValidity(event)&quot;&amp;gt; 
	&amp;lt;span class=&quot;hypen&quot;&amp;gt; ~ &amp;lt;/span&amp;gt; 
    &amp;lt;input id=&quot;endDate&quot; type=&quot;month&quot; class=&quot;input_type&quot; style=&quot;width: 200px;&quot;  onChange=&quot;endValidity(event)&quot;&amp;gt;
&amp;lt;/span&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;lt;select&amp;gt; 태그의 기본 값을 설정하려면 &amp;lt;option&amp;gt; 태그의 속성으로 selected를 주면 default 값으로 설정된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://snowple.tistory.com/379&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;Jquery로 selectbox 제어하기&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;테스트하기에 월별로 설정하는게 (데이터가 제일 적게나와서) 좋아서 default 값을 월별로 지정해주었다.&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;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;&lt;b&gt;값 변경에 따른 이벤트 onchange=&quot;onChangeCal(event)&quot;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;selectBox의 값이 변경되면 input 태그 type도 변경되도록 함수를 작성하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;input 태그에는 날짜관련 type이 date, week, month 세개나 있었고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 ui도 깔끔하게 되어있어서 css 때문이라면 굳이 jquery datepicker나 bootstrap datepicker를 사용하지 않아도된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(유효성이라던지 기타 날짜 설정 등등의 자바스크립트를 적용은 따로 해야되지만)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;시작일 유효성 function startValidity(e)&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;옵션 선택에 따른 분기 처리를 하였다. (day와 month는 과정이 동일하나 약간의 다름으로 인해 분기처리.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. input type = date, week, month 는 선택한 값을 문자열로 반환해주기 때문에 오늘 이후의 날짜를 선택할 수 없도록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;오늘 날짜와의 비교를 위해 선택값을 new Date(e.target.value)를 통해 date 객체로 만들어주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. var startValidity = Math.floor(now.valueOf()/(24*60*60*1000)-startD.valueOf()/(24*60*60*1000));&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 현재 날짜와 선택한 시작일 값의 차를 가지고 오늘 이후로 선택되지 않도록 하였다 (차가 0이면 오늘)&lt;/p&gt;
&lt;pre id=&quot;code_1628479929178&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 오늘과 날짜 비교
startD.getFullYear() == now.getFullYear() &amp;amp;&amp;amp; startD.getMonth() == now.getMonth()
startD.getTime() &amp;lt;= now.getTime()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;67&quot; width=&quot;466&quot; height=&quot;93&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B3zVr/btrbIdAkPwF/yGvThALUDMGtoqvIrn2nik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B3zVr/btrbIdAkPwF/yGvThALUDMGtoqvIrn2nik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B3zVr/btrbIdAkPwF/yGvThALUDMGtoqvIrn2nik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB3zVr%2FbtrbIdAkPwF%2FyGvThALUDMGtoqvIrn2nik%2Fimg.png&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;67&quot; width=&quot;466&quot; height=&quot;93&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 시작일을 오늘로 선택시 종료일 또한 오늘 이후의 날짜를 선택하지 못하도록 자동으로 value값을 넣어주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;(.toISOString()으로 반환값에 맞는 문자열 형식으로 변경 후 slice 하여 자릿수를 맞추어 적용)&lt;/p&gt;
&lt;pre id=&quot;code_1628484779590&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Date 객체를 받아 week number를 반환 
function getWeekFromISODate(dt) { 
	dt.setHours(0,0,0,0); 
	dt.setDate(dt.getDate() + 3 - (dt.getDay() + 6) % 7); 
	var week1 = new Date(dt.getFullYear(), 0, 4); 

	var weekNumber = 1 + Math.round(((dt.getTime() - week1.getTime())/ 86400000 - 3 + (week1.getDay() + 6) % 7) / 7); 
	
	return dt.getFullYear() +'-W'+ weekNumber; 
} 

// YYYY-W00 형태의 ISO 8601 week number를 받아 해당 주의 월요일 Date 객체를 반환 
function getStartDateFromISOWeek(ISOweek) { 
	var y = parseInt(ISOweek.substring(0, 4)); 
	var w = parseInt(ISOweek.substring(6, 8)); 
	
	var simpleDate = new Date(y, 0, 1 + (w - 1) * 7); 
	var dayOfWeek = simpleDate.getDay(); 
	var ISOweekStart = simpleDate; 
	
	if (dayOfWeek &amp;lt;= 4) {
		ISOweekStart.setDate(simpleDate.getDate() - simpleDate.getDay() + 1);
	} else { 
		ISOweekStart.setDate(simpleDate.getDate() + 8 - simpleDate.getDay()); 
	} 
	
	return ISOweekStart; 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. input type = &quot;week&quot; 는 value값이 'yyyy-W00' 형식이라 date객체로 생성하면 invalid date가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;따로 ISO문자열 형식으로 변환, date형식으로 변환하는 함수를 작성하여 적용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;종료일 유효성 function endValidity(e)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 종료일 선택은 시작일 선택 이후 선택 가능하고, 시작일 이전, 금일 이후로 선택 불가능하도록 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. limit - selectBox option 값이 day인 경우 30일, week인 경우 3개월, month인 경우 12개월로 설정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 전체코드는 코드펜을 참고해주세요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1628060360223&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(selectOpt == &quot;month&quot;){
  startDate = startDate + '-01';

  var arr = [1,3,5,7,8,10,12];
  var endM = endDate.split('-');
  if(endM[1] == 2){
    var dayCnt = new Date(endM[0],2,0).getDate();
    if(dyaCnt == 29){
   		endDate = endDate + '-29';
    }else{
    	endDate = endDate + '-28';
    }
  }

  var cnt;
  endDate = arr.reduce((acc, cur) =&amp;gt; {
    var acc = [];
    if(cur != endM[1]){
    	cnt = acc.push(cur);
  	}
  	return endDate + '-31';
  })

  if(cnt.length == 7 &amp;amp;&amp;amp; endM[1] !=2){
  	endDate = endDate + '-30';
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 날짜를 DB로 전달시에 (date_format을 설정안하고 yyyy-mm-dd 형식으로 전달할때)&lt;br /&gt;&amp;nbsp; &amp;nbsp;월에 따른 마지막 날짜를 추가하여 yyyy-mm-dd 형식으로 반환하는 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 쿼리 조회시 date_format을 사용하여 yyyy-mm, yyyy-W00 등으로 파라미터를 전달할수 있어 지워진 코드....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작일/종료일 유효성 검사 switch문을 사용하여 가독성 높이기&lt;span style=&quot;color: #000000;&quot;&gt; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/* &lt;br /&gt;*&amp;nbsp;@description&amp;nbsp;시작일&amp;nbsp;유효성 &lt;br /&gt;*&amp;nbsp;@param&amp;nbsp; &lt;br /&gt;*&amp;nbsp;@return&amp;nbsp; &lt;br /&gt;*/ &lt;br /&gt;function&amp;nbsp;startValidity(e){ &lt;br /&gt;var&amp;nbsp;selectOpt&amp;nbsp;=&amp;nbsp;$(&quot;#calendar&amp;nbsp;option:selected&quot;).val(); &lt;br /&gt;var&amp;nbsp;startD&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Date(e.target.value); &lt;br /&gt;if(selectOpt&amp;nbsp;==&amp;nbsp;&quot;week&quot;){ &lt;br /&gt;startD&amp;nbsp;=&amp;nbsp;getStartDateFromISOWeek(e.target.value); &lt;br /&gt;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;startValidity&amp;nbsp;=&amp;nbsp;Math.floor(now.valueOf()/(24*60*60*1000)-startD.valueOf()/(24*60*60*1000)); &lt;br /&gt;&lt;br /&gt;if(startValidity&amp;nbsp;&amp;lt;&amp;nbsp;0&amp;nbsp;){ &lt;br /&gt;$('#startDate').val(''); &lt;br /&gt;return&amp;nbsp;&amp;nbsp;&amp;nbsp;$mslk('msg').err('오늘&amp;nbsp;날짜&amp;nbsp;이후로는&amp;nbsp;조회가&amp;nbsp;불가능합니다.'); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;if(startD.getTime()&amp;nbsp;&amp;lt;=&amp;nbsp;now.getTime()){ &lt;br /&gt;switch(selectOpt){ &lt;br /&gt;case&amp;nbsp;'day'&amp;nbsp;: &lt;br /&gt;if(startD.getFullYear()&amp;nbsp;==&amp;nbsp;now.getFullYear()&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;startD.getMonth()&amp;nbsp;==&amp;nbsp;now.getMonth()&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;startD.getDay()&amp;nbsp;==&amp;nbsp;now.getDay()){ &lt;br /&gt;startD&amp;nbsp;=&amp;nbsp;startD.toISOString().slice(0,&amp;nbsp;10); &lt;br /&gt;$('#endDate').val(startD); &lt;br /&gt;return&amp;nbsp;&amp;nbsp;&amp;nbsp;$mslk('msg').msg('종료일은&amp;nbsp;최대&amp;nbsp;금일까지&amp;nbsp;선택&amp;nbsp;가능합니다.'); &lt;br /&gt;} &lt;br /&gt;break; &lt;br /&gt;case&amp;nbsp;'week'&amp;nbsp;: &lt;br /&gt;document.getElementById(&quot;startDate&quot;).stepUp(1); &lt;br /&gt;var&amp;nbsp;next&amp;nbsp;=&amp;nbsp;document.getElementById(&quot;startDate&quot;).value; &lt;br /&gt;var&amp;nbsp;nextISO&amp;nbsp;=&amp;nbsp;getStartDateFromISOWeek(next); &lt;br /&gt;&lt;br /&gt;if(now.getTime()&amp;nbsp;&amp;lt;&amp;nbsp;nextISO.getTime()){ &lt;br /&gt;document.getElementById(&quot;startDate&quot;).stepDown(1); &lt;br /&gt;startD&amp;nbsp;=&amp;nbsp;getWeekFromISODate(startD); &lt;br /&gt;$('#endDate').val(startD); &lt;br /&gt;return&amp;nbsp;&amp;nbsp;&amp;nbsp;$mslk('msg').msg('종료일은&amp;nbsp;최대&amp;nbsp;금주까지&amp;nbsp;선택&amp;nbsp;가능합니다.'); &lt;br /&gt;} &lt;br /&gt;break; &lt;br /&gt;case&amp;nbsp;'month'&amp;nbsp;:&amp;nbsp; &lt;br /&gt;if(startD.getFullYear()&amp;nbsp;==&amp;nbsp;now.getFullYear()&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;startD.getMonth()&amp;nbsp;==&amp;nbsp;now.getMonth()){ &lt;br /&gt;startD&amp;nbsp;=&amp;nbsp;startD.toISOString().slice(0,&amp;nbsp;7); &lt;br /&gt;$('#endDate').val(startD); &lt;br /&gt;return&amp;nbsp;&amp;nbsp;&amp;nbsp;$mslk('msg').msg('종료일은&amp;nbsp;최대&amp;nbsp;금월까지&amp;nbsp;선택&amp;nbsp;가능합니다.'); &lt;br /&gt;} &lt;br /&gt;break; &lt;br /&gt;default&amp;nbsp;: &lt;br /&gt;return; &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;$('#endDate').val(''); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;/* &lt;br /&gt;*&amp;nbsp;@description&amp;nbsp;종료일&amp;nbsp;유효성 &lt;br /&gt;*&amp;nbsp;@param&amp;nbsp; &lt;br /&gt;*&amp;nbsp;@return&amp;nbsp; &lt;br /&gt;*/ &lt;br /&gt;function&amp;nbsp;endValidity(e){ &lt;br /&gt;var&amp;nbsp;selectOpt&amp;nbsp;=&amp;nbsp;$(&quot;#calendar&amp;nbsp;option:selected&quot;).val(); &lt;br /&gt;var&amp;nbsp;endD&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Date(e.target.value); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;endValidity&amp;nbsp;=&amp;nbsp;Math.floor(now.valueOf()/(24*60*60*1000)-endD.valueOf()/(24*60*60*1000)); &lt;br /&gt;var&amp;nbsp;$startDate&amp;nbsp;=&amp;nbsp;$('#startDate').val(); &lt;br /&gt;var&amp;nbsp;startD,&amp;nbsp;limitD,&amp;nbsp;msg; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if(selectOpt&amp;nbsp;==&amp;nbsp;&quot;week&quot;){ &lt;br /&gt;endD&amp;nbsp;=&amp;nbsp;getStartDateFromISOWeek(e.target.value); &lt;br /&gt;endValidity&amp;nbsp;=&amp;nbsp;Math.floor(now.valueOf()/(24*60*60*1000)-endD.valueOf()/(24*60*60*1000)); &lt;br /&gt;$startDate&amp;nbsp;=&amp;nbsp;getStartDateFromISOWeek($startDate); &lt;br /&gt;&lt;br /&gt;if($startDate.getTime()&amp;nbsp;&amp;gt;&amp;nbsp;endD.getTime()){ &lt;br /&gt;$('#endDate').val(''); &lt;br /&gt;return&amp;nbsp;&amp;nbsp;&amp;nbsp;$mslk('msg').err('종료일은&amp;nbsp;시작일&amp;nbsp;이전으로&amp;nbsp;선택&amp;nbsp;불가능합니다.'); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;}else{ &lt;br /&gt;$startDate&amp;nbsp;=&amp;nbsp;$startDate.split('-'); &lt;br /&gt;if(selectOpt&amp;nbsp;==&amp;nbsp;&quot;day&quot;){ &lt;br /&gt;startD&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Date($startDate[0],&amp;nbsp;$startDate[1]-1,&amp;nbsp;$startDate[2]); &lt;br /&gt;} &lt;br /&gt;if(selectOpt&amp;nbsp;==&amp;nbsp;&quot;month&quot;){ &lt;br /&gt;startD&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Date($startDate[0],&amp;nbsp;($startDate[1]-1)); &lt;br /&gt;} &lt;br /&gt;if(startD.getTime()&amp;nbsp;&amp;gt;&amp;nbsp;endD.getTime()){ &lt;br /&gt;$('#endDate').val(''); &lt;br /&gt;return&amp;nbsp;&amp;nbsp;&amp;nbsp;$mslk('msg').err('종료일은&amp;nbsp;시작일&amp;nbsp;이전으로&amp;nbsp;선택&amp;nbsp;불가능합니다.'); &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;if($startDate&amp;nbsp;==&amp;nbsp;&quot;&quot;&amp;nbsp;||&amp;nbsp;$startDate&amp;nbsp;==&amp;nbsp;null){ &lt;br /&gt;$('#endDate').val(''); &lt;br /&gt;return&amp;nbsp;&amp;nbsp;&amp;nbsp;$mslk('msg').err('종료일은&amp;nbsp;시작일&amp;nbsp;선택&amp;nbsp;후&amp;nbsp;선택&amp;nbsp;가능합니다.'); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;if(endValidity&amp;nbsp;&amp;lt;&amp;nbsp;0){ &lt;br /&gt;$('#endDate').val(''); &lt;br /&gt;return&amp;nbsp;&amp;nbsp;&amp;nbsp;$mslk('msg').err('금일&amp;nbsp;이후로&amp;nbsp;선택&amp;nbsp;불가능합니다.'); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;switch(selectOpt){ &lt;br /&gt;case&amp;nbsp;'day'&amp;nbsp;: &lt;br /&gt;limitD&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Date(startD.getFullYear(),startD.getMonth()+1,startD.getDate()); &lt;br /&gt;msg&amp;nbsp;=&amp;nbsp;'종료일은&amp;nbsp;시작일로부터&amp;nbsp;30일까지&amp;nbsp;선택가능합니다.' &lt;br /&gt;$('#endDate').attr('max',&amp;nbsp;limitD); &lt;br /&gt;break; &lt;br /&gt;case&amp;nbsp;'week'&amp;nbsp;: &lt;br /&gt;startD&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Date($startDate[0],&amp;nbsp;$startDate[1]-1,&amp;nbsp;$startDate[2]); &lt;br /&gt;limitD&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Date(startD.getFullYear(),startD.getMonth()+3,startD.getDate()); &lt;br /&gt;limitD&amp;nbsp;=&amp;nbsp;getWeekFromISODate(limitD); &lt;br /&gt;msg&amp;nbsp;=&amp;nbsp;'종료일은&amp;nbsp;시작일로부터&amp;nbsp;3개월까지&amp;nbsp;선택가능합니다.' &lt;br /&gt;&lt;br /&gt;$('#endDate').attr('max',&amp;nbsp;limitD); &lt;br /&gt;break; &lt;br /&gt;case&amp;nbsp;'month'&amp;nbsp;: &lt;br /&gt;limitD&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Date(startD.getFullYear(),startD.getMonth()+12,startD.getDate()); &lt;br /&gt;msg&amp;nbsp;=&amp;nbsp;'종료일은&amp;nbsp;시작일로부터&amp;nbsp;12개월까지&amp;nbsp;선택가능합니다.' &lt;br /&gt;&lt;br /&gt;$('#endDate').attr('max',&amp;nbsp;limitD); &lt;br /&gt;break; &lt;br /&gt;default&amp;nbsp;: &lt;br /&gt;break; &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endValidity&amp;nbsp;=&amp;nbsp;Math.floor(endD.valueOf()/(24*60*60*1000)-limitD.valueOf()/(24*60*60*1000)); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(endValidity&amp;nbsp;&amp;gt;&amp;nbsp;0){ &lt;br /&gt;$('#endDate').val(''); &lt;br /&gt;return&amp;nbsp;&amp;nbsp;&amp;nbsp;$mslk('msg').err(msg); &lt;br /&gt;} &lt;br /&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&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; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://notpeelbean.tistory.com/entry/javascript-%EB%82%A0%EC%A7%9C-%EC%84%A0%ED%83%9D-%EC%A0%9C%ED%95%9C-%ED%95%98%EA%B8%B0&quot;&gt;날짜 선택 제한 하기.&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://bloodguy.tistory.com/entry/JavaScript-input-typeweek-value%EB%A5%BC-javascript%EB%A1%9C-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0-ISO-8601-week-number&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;type=week ISO 8601 week number 변환&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://mainia.tistory.com/2564&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;자바스크립트로 날짜 계산하는 다양한 방법&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://snowple.tistory.com/379&quot;&gt;Jquery로 selectbox 제어하기&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/month&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;날짜관련 input type&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://runebook.dev/ko/docs/html/element/input/month&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;날짜관련 input type(한글버전)&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;240&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lIlPP/btrbbT4Lgzd/Gqnh7pMWCRNgrIat1OSpr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lIlPP/btrbbT4Lgzd/Gqnh7pMWCRNgrIat1OSpr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lIlPP/btrbbT4Lgzd/Gqnh7pMWCRNgrIat1OSpr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlIlPP%2FbtrbbT4Lgzd%2FGqnh7pMWCRNgrIat1OSpr1%2Fimg.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;240&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/JavaScript</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/56</guid>
      <comments>https://recoderr.tistory.com/56#entry56comment</comments>
      <pubDate>Mon, 9 Aug 2021 15:09:12 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] 리덕스(Redux) 알아보기</title>
      <link>https://recoderr.tistory.com/55</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;리덕스(Redux)란?&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- 자바스크립트 어플리케이션에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;상태를 효율적으로 관리&lt;/span&gt;할 수 있게 도와주는 도구&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;631&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pMTVg/btrbtzkkeym/u5fBaLk7OV8Z8iISpeNE71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pMTVg/btrbtzkkeym/u5fBaLk7OV8Z8iISpeNE71/img.png&quot; data-alt=&quot;이미지 출처&amp;amp;amp;nbsp;https://redux.vlpt.us/2-1-redux-devtools.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pMTVg/btrbtzkkeym/u5fBaLk7OV8Z8iISpeNE71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpMTVg%2Fbtrbtzkkeym%2Fu5fBaLk7OV8Z8iISpeNE71%2Fimg.png&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;631&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처&amp;nbsp;https://redux.vlpt.us/2-1-redux-devtools.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;리덕스 devTools 사용하기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 리덕스를 이용하여 중앙집중식 state 관리를 할때 리덕스 devtools(크롬 확장 프로그램)을 설치하면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; 해당 웹애플리케이션을 사용할때의 state 변화를 구동 시작부부터 확인할수 있다.(서버 내리기전 언제든지)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 데이터를 json형태로 받거나 아니면 반대로 데이터를 임의적으로 넣어 보는 것도 가능하다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 id=&quot;1-리덕스에서-사용되는-키워드-숙지하기&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;✔ &lt;/b&gt;&lt;/span&gt;기본개념 - 리덕스에서 사용되는 키워드 숙지하기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1628374628157&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var store = Redux.createStore(
    reducer
);

var state = store.getState();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1. 스토어(Store)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;직접 액세스하거나 변경할 수 없는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;단일 중앙 집중식 상태(single, centralized state)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;즉, 전역객체(global JS object)라고 말할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;.getState&lt;/b&gt;&lt;/span&gt; : state값을 호출할때 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1628374663292&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function reducer(state, action){
    if(state === undefined){
        return {color:'yellow'}
    }
    var newState;
    if(action.type === 'CHANGE_COLOR'){
        newState = Object.assign({}, state, {color:action.color});
    }
    console.log(action.type, action, state, newState);
    return newState;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;2. 리듀서(Reducer)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;전역 상태를 변경하고 업데이트하는 로직이 포함된 순수함수&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;리듀서(Reducer)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #292929;&quot;&gt;&amp;nbsp; &amp;nbsp;- Reducer는 반드시 이전의 데이터(상태)와 Action을 매개변수(입력값)로 받는다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #292929;&quot;&gt;&amp;nbsp; &amp;nbsp;- Reducer는 결과값으로 이전의 데이터를 변경시키지 않고 새로운 데이터(객체)를 만들어 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;순수함수란?&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #292929;&quot;&gt;- 함수가 실행되는 곳이 어디서든, 언제든 외부의 상태를 변경하지 않으면서 동일한 입력값에는 동일한 결과값을 반환해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1628377114313&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; store.dispatch({type:'CHANGE_COLOR', color:'blue'});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;3. 액션(Action)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;리듀서 함수가 실행되도록 트리거하기 위해 디스패치(dispatch)될 수 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #f89009; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;액션(Action)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;4. 디스패치(Dispatch)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;리듀서를 호출해서 state를 변경한다. (리듀서 호출시 현재 state와 action을 전달한다.)&lt;/p&gt;
&lt;pre id=&quot;code_1628377129489&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;store.subscribe(blue);&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;디스패치-dispatch&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;5. 구독(Subscriptions)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;전역 상태에서 데이터를 가져오기 위한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;구독(Subscriptions)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;386&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfffvJ/btrbwgSdv5B/Cp0XqfQKyHEOypWb2uVH41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfffvJ/btrbwgSdv5B/Cp0XqfQKyHEOypWb2uVH41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfffvJ/btrbwgSdv5B/Cp0XqfQKyHEOypWb2uVH41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfffvJ%2FbtrbwgSdv5B%2FCp0XqfQKyHEOypWb2uVH41%2Fimg.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;386&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;✔ 정리&lt;/b&gt;&lt;b&gt;&amp;nbsp;- 리덕스의 흐름&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;subscribe(상태 변화 감지요청) &amp;gt;&amp;gt; action(상태 변화) &amp;gt;&amp;gt; dispatch(상태업데이트, store에 action 전달)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&amp;gt;&amp;gt; Store(state 갱신) &amp;gt;&amp;gt; listener(상태 변화 알림) &amp;gt;&amp;gt; 컴포넌트 리렌더링&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1. 추가, 삭제와 같은 각각의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;액션타입 정의&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;2. &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;액션 함수&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;는 각각의 액션 type과 파라미터를 입력받아, 액션을 객체지향 형태로 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;3. 상태변화가 필요해질 때,&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;디스패치&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;가 액션을 발생시켜 스토어에게 알림&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;4. &lt;span style=&quot;color: #8a3db6;&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;/span&gt;로 전달된 액션은 스토어의 리듀서 함수 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;5. 호출된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;리듀서&amp;nbsp;함수&lt;/b&gt;&lt;/span&gt;는 (이전상태, 액션타입)을 파라미터로 전달받아,&lt;br /&gt;6. 정의된 로직대로 &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;현재 상태값을 변화&lt;/b&gt;&lt;/span&gt;시켜 변화된 상태를 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;7. 반환된 상태는 &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;스토어에 저장&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;✔ 리덕스를 사용하는 이유&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #292929;&quot;&gt;데이터가&lt;span&gt; 스토어에&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;집중화(Centralized)&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #292929;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;되어 있어서&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;예측 가능하며(Predictable),&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #292929;&quot;&gt;데이터 흐름이 단방향이라서&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;디버깅하기 쉽다(Debuggable)&lt;/b&gt;&lt;span style=&quot;color: #292929;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;lt; Redux 의 3 원칙 &amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1. Single source of truth&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; 애플리케이션 내에&lt;span&gt;&amp;nbsp;&lt;/span&gt;Store는 반드시 1개 뿐.&lt;span&gt;&amp;nbsp;&lt;/span&gt;Store는 반드시 1개만 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;2. State is read-only&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; state를 직접 변경해서는 안.된.다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; state를 변화시키는 유일한 방법은&lt;span&gt;&amp;nbsp;&lt;/span&gt;Action을&lt;span&gt;&amp;nbsp;&lt;/span&gt;Reducer에 dispatch(송신, 전달)하는 방법 뿐이다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; 즉,&amp;nbsp;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;state의 변경은Reducer만&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Reducer&lt;span&gt;&amp;nbsp;&lt;/span&gt;이외의 공간에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;state는 읽기 전용인 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;3. Changes are made with pure functions&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Reducer는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;순수 함수&lt;/b&gt;&lt;/span&gt;여야만 한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; Reducer 함수는&lt;span&gt;&amp;nbsp;&lt;/span&gt;parameter로&lt;span&gt;&amp;nbsp;&lt;/span&gt;기존의 state와&lt;span&gt;&amp;nbsp;&lt;/span&gt;Action을 받는데,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; Reducer 함수는&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기존의 state를 직접 변경하지 않고, 새.로.운 state object(객체)를 작성해서 return해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc9af;&quot;&gt;&lt;b&gt;객체의 복사 :&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Object.assign(빈객체, 복사할 객체, 추가할 객체), 빈객체에 복사+추가되어 데이터를 가진 객체(주소는 빈객체)가 반환된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc9af;&quot;&gt;배열의 복사 :&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp; &amp;nbsp; 1. concat() 함수&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ddca7e;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const&lt;/span&gt; &lt;span style=&quot;color: #809bbd;&quot;&gt;arr&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;=&lt;/span&gt; [&lt;span style=&quot;color: #d0782a;&quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;color: #d0782a;&quot;&gt;2&lt;/span&gt;, &lt;span style=&quot;color: #d0782a;&quot;&gt;3&lt;/span&gt;]; &lt;span style=&quot;color: #ddca7e;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #809bbd;&quot;&gt;newArr&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #ddca7e;&quot;&gt;arr&lt;/span&gt;.&lt;span style=&quot;color: #9a8297;&quot;&gt;concat&lt;/span&gt;(&lt;span style=&quot;color: #96b38a;&quot;&gt;'a'&lt;/span&gt;, [&lt;span style=&quot;color: #96b38a;&quot;&gt;'b'&lt;/span&gt;, &lt;span style=&quot;color: #96b38a;&quot;&gt;'c'&lt;/span&gt;], &lt;span style=&quot;color: #96b38a;&quot;&gt;'abc'&lt;/span&gt;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp; &amp;nbsp; 2. ... spread operator (전개 연산자)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ddca7e;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const&lt;/span&gt; &lt;span style=&quot;color: #809bbd;&quot;&gt;newArr&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;=&lt;/span&gt; [ &lt;span style=&quot;color: #9a8297;&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color: #ddca7e;&quot;&gt;arr1&lt;/span&gt;, &lt;span style=&quot;color: #9a8297;&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color: #ddca7e;&quot;&gt;arr2&lt;/span&gt;, &lt;span style=&quot;color: #9a8297;&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color: #ddca7e;&quot;&gt;arr3&lt;/span&gt; ];&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp; &amp;nbsp; 3. push() 함수와 spread operator&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ddca7e;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const&lt;/span&gt; &lt;span style=&quot;color: #809bbd;&quot;&gt;arr1&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;=&lt;/span&gt; [&lt;span style=&quot;color: #d0782a;&quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;color: #d0782a;&quot;&gt;2&lt;/span&gt;, &lt;span style=&quot;color: #d0782a;&quot;&gt;3&lt;/span&gt;];&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ddca7e;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const&lt;/span&gt; &lt;span style=&quot;color: #809bbd;&quot;&gt;arr2&lt;/span&gt; &lt;span style=&quot;color: #cccccc;&quot;&gt;=&lt;/span&gt; [&lt;span style=&quot;color: #d0782a;&quot;&gt;4&lt;/span&gt;, &lt;span style=&quot;color: #d0782a;&quot;&gt;5&lt;/span&gt;, &lt;span style=&quot;color: #d0782a;&quot;&gt;6&lt;/span&gt;];&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ddca7e;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;arr1&lt;/span&gt;.&lt;span style=&quot;color: #9a8297;&quot;&gt;push&lt;/span&gt;(&lt;span style=&quot;color: #9a8297;&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color: #ddca7e;&quot;&gt;arr2&lt;/span&gt;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result : arr1[1,2,3,4,5,6]&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&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 style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://react.vlpt.us/redux/01-keywords.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;리덕스 기본개념&lt;/a&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;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의정보&amp;nbsp;  &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;outline: 0px; word-break: break-all; font-size: 0.87em; padding-top: 0px !important; padding-bottom: 0px !important; letter-spacing: 0.8px; line-height: 1.8em; margin: 0px !important 0px 0px !important 0px;&quot; data-ke-size=&quot;size14&quot;&gt;플랫폼 : 인프런&lt;/p&gt;
&lt;p style=&quot;outline: 0px; word-break: break-all; font-size: 0.87em; padding-top: 0px !important; padding-bottom: 0px !important; letter-spacing: 0.8px; line-height: 1.8em; margin: 0px !important 0px 0px !important 0px;&quot; data-ke-size=&quot;size14&quot;&gt;강의 : 생활코딩 - Redux&lt;/p&gt;
&lt;p style=&quot;outline: 0px; word-break: break-all; font-size: 0.87em; padding-top: 0px !important; padding-bottom: 0px !important; letter-spacing: 0.8px; line-height: 1.8em; margin: 0px !important 0px 0px !important 0px;&quot; data-ke-size=&quot;size14&quot;&gt;강사 : Egoing Lee&lt;/p&gt;
&lt;p style=&quot;outline: 0px; word-break: break-all; font-size: 0.87em; padding-top: 0px !important; padding-bottom: 0px !important; letter-spacing: 0.8px; line-height: 1.8em; margin: 0px !important 0px 0px !important 0px;&quot; data-ke-size=&quot;size14&quot;&gt;url :&lt;span style=&quot;outline: 0px; word-break: break-all; line-height: 1.8em; letter-spacing: 0.8px;&quot;&gt;&lt;span&gt; &lt;a href=&quot;https://www.inflearn.com/course/redux-%EC%83%9D%ED%99%9C%EC%BD%94%EB%94%A9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/redux-%EC%83%9D%ED%99%9C%EC%BD%94%EB%94%A9&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;500&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1CLgi/btrbwhKkDZd/r4EO22krhP1diwwXOekFk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1CLgi/btrbwhKkDZd/r4EO22krhP1diwwXOekFk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1CLgi/btrbwhKkDZd/r4EO22krhP1diwwXOekFk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1CLgi%2FbtrbwhKkDZd%2Fr4EO22krhP1diwwXOekFk1%2Fimg.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;500&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/JavaScript</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/55</guid>
      <comments>https://recoderr.tistory.com/55#entry55comment</comments>
      <pubDate>Sun, 8 Aug 2021 08:39:31 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] table에 동적으로 행(row), 열(column)추가, 삭제하기, td 너비 일정하게 유지하기</title>
      <link>https://recoderr.tistory.com/54</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;abWaaor&quot; data-user=&quot;beginnerww&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/beginnerww/pen/abWaaor&quot;&gt; Dynamic generation Table Row&lt;/a&gt; by BEGINNERWW (&lt;a href=&quot;https://codepen.io/beginnerww&quot;&gt;@beginnerww&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;lt;table&amp;gt;태그에 동적으로 row(행) 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; - 본 코드는 10줄씩 출력되고 페이징 기능을 고려하여 작성하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;&lt;b&gt;추가 클릭 이벤트 &lt;/b&gt;onClick=&quot;userAdd()&quot;&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;1. var trCnt =&amp;nbsp;document.getElementsByTagName('tr').length;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; -&amp;nbsp; tr 태그의 갯수를 구한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;2. 기존에 입력되어있는 데이터가 있을 경우 해당 데이터의 index를 담고 있는 변수 baseCamp를 trCnt에 대입한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;3. row가 10줄이상이 된 시점(즉, 11행)이 되었을때 첫번째 row 를 숨긴다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;4. $('#tbHead').after(inner); &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;- thead 아래 tr을 추가한다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1628140076003&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1	var targetBtn = event.target;
2	var parentTr = targetBtn.parentNode.parentNode;
3	var tdNode = parentTr.childNodes;
4	var tdArr = new Array();

5	for(var i = 0; i &amp;lt; tdNode.length; i++){
6		tdArr.push(tdNode[i].textContent);		
	}&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;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;수정 클릭 이벤트 function onClickUpdate()&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;size14&quot;&gt;&lt;span&gt;&amp;nbsp;1줄 event.target &amp;gt;&amp;gt; click event를 실행된 객체, 즉 수정btn 자체를 의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;2줄 수정btn의 부모노드 td의 부모노드 tr&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;3줄 클릭한 버튼이 있는 tr의 자식노드(td들)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;4~6줄 tdNode에서 td의 값, 우리눈에 보이는 텍스트 값을 가져오기 위해 array 객체를 생성하고 반복문을 통해 배열 객체에 담아준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;취소 클릭 이벤트 function onClickCancle(trCnt)&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;size14&quot;&gt;&lt;span&gt;&amp;nbsp;1. var row = document.querySelectorAll('.updateRow');&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &lt;span&gt;&amp;nbsp;- 수정 클릭 후 취소 이벤트인지 추가 클릭 후 취소 이벤트인지 확인할 수 있도록 수정 클릭시 class=updateRow를 추가해주었었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;- 해당 클래스를 모두 찾아 row에 대입한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&amp;nbsp;2. 입력칸이 활성화되어있는 row를 삭제한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&amp;nbsp;3. row가 11줄일 때 숨겨두었던 첫번째 row를 보여준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&amp;nbsp;4. 수정 중인 tr의 숫자 즉, 변수 row가 값을 가지고 있을때 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; .updateRow 인 노드를 보여주고, 해당 tr에 추가되었던 updateRow 클래스를 삭제한다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1269&quot; data-origin-height=&quot;541&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEsoLW/btrblQsw8nn/78DZb0J1QWzhgGSqD4T4S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEsoLW/btrblQsw8nn/78DZb0J1QWzhgGSqD4T4S0/img.png&quot; data-alt=&quot;1,2,3 모두 동적으로 생성한 table&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEsoLW/btrblQsw8nn/78DZb0J1QWzhgGSqD4T4S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEsoLW%2FbtrblQsw8nn%2F78DZb0J1QWzhgGSqD4T4S0%2Fimg.png&quot; data-origin-width=&quot;1269&quot; data-origin-height=&quot;541&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1,2,3 모두 동적으로 생성한 table&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;ajax로 받아온 데이터를 바탕으로 동적으로 table 생성하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 조회조건이 회사, 기간이었기 때문에 해당 table은 thead부분과 모듈명이 조건에 따라 다르게 적용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 따라서 row와 column 모두 정해진 갯수가 없어 테이블 데이터를 모두 동적으로 넣어주었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1627&quot; data-origin-height=&quot;659&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQA08s/btraHs6Bwh4/EqtZ5d8gYB68ZadAe3gxe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQA08s/btraHs6Bwh4/EqtZ5d8gYB68ZadAe3gxe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQA08s/btraHs6Bwh4/EqtZ5d8gYB68ZadAe3gxe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQA08s%2FbtraHs6Bwh4%2FEqtZ5d8gYB68ZadAe3gxe1%2Fimg.png&quot; data-origin-width=&quot;1627&quot; data-origin-height=&quot;659&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1. 기준이 되는 기간과 모듈을 테이블에 넣어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1625&quot; data-origin-height=&quot;697&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BpaB1/btraEe3kEIb/vKxksIdNmmYzMR2eiSWigK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BpaB1/btraEe3kEIb/vKxksIdNmmYzMR2eiSWigK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BpaB1/btraEe3kEIb/vKxksIdNmmYzMR2eiSWigK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBpaB1%2FbtraEe3kEIb%2FvKxksIdNmmYzMR2eiSWigK%2Fimg.png&quot; data-origin-width=&quot;1625&quot; data-origin-height=&quot;697&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2. 데이터 넣어주기&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;WNGXWWb&quot; data-user=&quot;hianna&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/hianna/pen/WNGXWWb&quot;&gt; 테이블1&lt;/a&gt; by anna (&lt;a href=&quot;https://codepen.io/hianna&quot;&gt;@hianna&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1628146767127&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   function addColumn() {
1     const table = document.getElementById('fruits');
  
2     for(let i = 0; i &amp;lt; table.rows.length; i++)  {
3        const newCell =table.rows[i].insertCell(-1);
4        newCell.innerText = 'New';
     }
   }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 코드를 보고 참고해서 구현했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1줄 .getElementById로 table element를 찾아 변수 table에 대입한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2줄 table.rows.length 테이블 row 수 만큼 반복한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;3~4줄 table.rows[i]에 가장 뒤에 cell(td)를 추가하고 태그 안에 텍스트 'New' 를 넣어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1. 테이블에 행 추가/삭제 - insertRow(idx), &lt;b&gt;deleteRow(&lt;b&gt;idx&lt;/b&gt;)&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;2. 테이블에 셀 추가/삭제 - &lt;b&gt;insertCell(&lt;b&gt;idx&lt;/b&gt;), deleteCell(&lt;b&gt;idx&lt;/b&gt;)&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;default 값은 모두 -1이고 insertRow(), insertCell() 은 &lt;span style=&quot;color: #666666;&quot;&gt;새로 추가된 요소를 가리키는 reference를 리턴한다.&lt;/span&gt;&lt;br /&gt;-1은 가장 마지막에 추가/삭제를 실행하고, 가장 첫번째에 이벤트가 발생하려면 인덱스를 0으로 주면된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;ajax success 전체 코드 보기 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var&amp;nbsp;moduleList&amp;nbsp;=&amp;nbsp;result[0].moduleList; &lt;br /&gt;var&amp;nbsp;regdata&amp;nbsp;=&amp;nbsp;result[0].regdata; &lt;br /&gt;var&amp;nbsp;completeData&amp;nbsp;=&amp;nbsp;result[0].completeData; &lt;br /&gt;var&amp;nbsp;date&amp;nbsp;=&amp;nbsp;[]; &lt;br /&gt;var&amp;nbsp;start&amp;nbsp;=&amp;nbsp;[]; &lt;br /&gt;var&amp;nbsp;end&amp;nbsp;=&amp;nbsp;[] &lt;br /&gt;&lt;br /&gt;if(selectOpt&amp;nbsp;==&amp;nbsp;'week'){ &lt;br /&gt;&amp;nbsp;&amp;nbsp;for(var&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;result[0].regdata.length;&amp;nbsp;i++){ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;date.push(regdata[i].RCEPT_DT); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start.push(regdata[i].START); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end.push(regdata[i].END); &lt;br /&gt;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}else{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;for(var&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;result[0].regdata.length;&amp;nbsp;i++){ &lt;br /&gt;&amp;nbsp;&amp;nbsp; date.push(regdata[i].RCEPT_DT); &lt;br /&gt;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;date&amp;nbsp;=&amp;nbsp;Array.from(new&amp;nbsp;Set(date)); &lt;br /&gt;date.sort(); &lt;br /&gt;if(date[0]&amp;nbsp;==&amp;nbsp;0){ &lt;br /&gt;&amp;nbsp; &amp;nbsp;date.splice(0,1); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;var&amp;nbsp;str&amp;nbsp;=&amp;nbsp;''; &lt;br /&gt;var&amp;nbsp;head&amp;nbsp;=&amp;nbsp;'&amp;lt;tr&amp;gt;&amp;lt;th&amp;nbsp;rowspan=2&amp;gt;모듈명&amp;lt;/th&amp;gt;'; &lt;br /&gt;$.each(date,&amp;nbsp;function(index,&amp;nbsp;value){ &lt;br /&gt;&amp;nbsp; &amp;nbsp;head += '&amp;lt;th colspan=3&amp;gt;'+ value + '&amp;lt;/th&amp;gt;'; &lt;br /&gt;}) &lt;br /&gt;head&amp;nbsp;+=&amp;nbsp;'&amp;lt;/tr&amp;gt;'; &lt;br /&gt;$('#tbHead').append(head); &lt;br /&gt;&lt;br /&gt;var&amp;nbsp;table&amp;nbsp;=&amp;nbsp;document.getElementById('srState'); &lt;br /&gt;head='&amp;lt;tr&amp;gt;' &lt;br /&gt;var&amp;nbsp;newCell&amp;nbsp;=&amp;nbsp;table.rows[0].insertCell(-1); &lt;br /&gt;for(var&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;date.length;&amp;nbsp;i++){ &lt;br /&gt;&amp;nbsp; &amp;nbsp;head +='&amp;lt;th&amp;gt;접수&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;완료&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;완료율&amp;lt;/th&amp;gt;'; &lt;br /&gt;} &lt;br /&gt;head&amp;nbsp;+=&amp;nbsp;'&amp;lt;/tr&amp;gt;'; &lt;br /&gt;$('#tbHead').append(head); &lt;br /&gt;&lt;br /&gt;for(var&amp;nbsp;i&amp;nbsp;=&amp;nbsp;1&amp;nbsp;;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;moduleList.length&amp;nbsp;;&amp;nbsp;i++){ &lt;br /&gt;&amp;nbsp; &amp;nbsp; str += '&amp;lt;tr id=&quot;'+ moduleList[i].DETAIL_CD +'&quot;&amp;gt;&amp;lt;td&amp;gt;'+ moduleList[i].DETAIL_CD_NM+&quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&quot;; &lt;br /&gt;} &lt;br /&gt;$(&quot;#srState&quot;).append(str);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mkTable(result,&amp;nbsp;selectOpt,&amp;nbsp;date);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;function&amp;nbsp;mkTable(result,&amp;nbsp;modules,&amp;nbsp;selectOpt,&amp;nbsp;date){ &lt;br /&gt;&amp;nbsp; var&amp;nbsp;regdata&amp;nbsp;=&amp;nbsp;result[0].regdata; &lt;br /&gt;&amp;nbsp; var completeData = result[0].completeData; &lt;br /&gt;&amp;nbsp; var table = document.getElementById('srState'); &lt;br /&gt;&amp;nbsp; var newCell; &lt;br /&gt;&amp;nbsp; var cnt; &lt;br /&gt;&amp;nbsp; var j = 0, k = 0, l = 0; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; for(var col = 0; col &amp;lt; date.length; col++){ &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; cnt = 1; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; for(var i = 2; i &amp;lt; table.rows.length &amp;amp;&amp;amp; cnt &amp;lt; 4; i++){ &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; //접수 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(cnt == 1){ &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; newCell = table.rows[i].insertCell(-1); &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; newCell.innerHTML = '&amp;lt;td&amp;gt;'+ regdata[j].REG+'&amp;lt;/td&amp;gt;'; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; j++; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if( i == (table.rows.length-1)){ &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cnt++; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;i = 1; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; //완료 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}else if(cnt == 2){ &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; newCell = table.rows[i].insertCell(-1); &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; newCell.innerHTML = '&amp;lt;td&amp;gt;'+ completeData[k].REG+'&amp;lt;/td&amp;gt;'; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; k++ &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if( i == (table.rows.length-1)){ &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cnt++; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i = 1; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; //완료율 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}else if(cnt == 3){ &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var per = '0%'; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(parseInt(completeData[l].REG) != 0){ &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; per = (completeData[l].REG / regdata[l].REG * 100) + '%'; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; newCell = table.rows[i].insertCell(-1); &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; newCell.innerHTML = '&amp;lt;td&amp;gt;'+ per +'&amp;lt;/td&amp;gt;'; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; l++; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if( i == (table.rows.length-1)){ &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cnt++; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;} &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1641&quot; data-origin-height=&quot;724&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvfbbF/btraNyN2QkS/7tYCGT9ageled1V7lEsqq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvfbbF/btraNyN2QkS/7tYCGT9ageled1V7lEsqq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvfbbF/btraNyN2QkS/7tYCGT9ageled1V7lEsqq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvfbbF%2FbtraNyN2QkS%2F7tYCGT9ageled1V7lEsqq0%2Fimg.png&quot; data-origin-width=&quot;1641&quot; data-origin-height=&quot;724&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;날짜가 많아서 테이블 width가 길어져 scroll이 자동으로 나오게 css 수정했으나 td 크기에 맞게 쪼그라들어 보이는 문제가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;예전에 동적으로 만든 태그에 상위 요소의 width, height를 정의하지 않아서 고정이 안되었던적이 있어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;인라인 방식으로 tr, td, table ... 기타 등등 확인하고 추가했는데 사이즈가 반영되지 반영되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1627817405563&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;colgroup&amp;gt;
	&amp;lt;col width = &quot;16.6%&quot;&amp;gt;
	&amp;lt;col width = &quot;16.6%&quot;&amp;gt;
	&amp;lt;col width = &quot;16.6%&quot;&amp;gt;
	&amp;lt;col width = &quot;16.6%&quot;&amp;gt;
	&amp;lt;col width = &quot;16.6%&quot;&amp;gt;
	&amp;lt;col width = &quot;16.6%&quot;&amp;gt;
&amp;lt;/colgroup&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제점을 해결하기 위해 colgroup은 사용할수 없다, 컬럼의 갯수가 정해져있지 않고 기간 설정에 따라 달라지기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;colgroup&lt;/b&gt; &lt;/span&gt;은 table의 컬럼의 일정한 width를 주어 일정한 간격을 유지하게 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그러나, 글자가 넘치는 것을 방지할수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;710&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEzXrZ/btraWvP50nt/HwUit1KHKRUAXWALMyjp3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEzXrZ/btraWvP50nt/HwUit1KHKRUAXWALMyjp3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEzXrZ/btraWvP50nt/HwUit1KHKRUAXWALMyjp3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEzXrZ%2FbtraWvP50nt%2FHwUit1KHKRUAXWALMyjp3K%2Fimg.png&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;710&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;table 태그의 css에 &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;style=&quot;table-layout: fixed; word-break:break-all;&quot;&lt;/b&gt;&lt;/span&gt; 추가를 해주면 cell size가 고정되면서 자동으로 줄바꿈도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;table-layout : fixed;&lt;/b&gt;&lt;/span&gt; cell size를 고정해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;word-break : break-all;&lt;/b&gt;&lt;/span&gt; 글자수가 cell size보다 넘칠경우 자동으로 줄바꿈해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&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; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://hianna.tistory.com/473&quot;&gt;https://hianna.tistory.com/473&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://www.w3schools.com/jsref/met_tablerow_insertcell.asp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.w3schools.com/jsref/met_tablerow_insertcell.asp&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableRowElement/insertCell&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableRowElement/insertCell&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;240&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nH0vz/btra8ze850m/fkxT9fntvPcdS3brTJ3Vwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nH0vz/btra8ze850m/fkxT9fntvPcdS3brTJ3Vwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nH0vz/btra8ze850m/fkxT9fntvPcdS3brTJ3Vwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnH0vz%2Fbtra8ze850m%2FfkxT9fntvPcdS3brTJ3Vwk%2Fimg.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;240&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/JavaScript</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/54</guid>
      <comments>https://recoderr.tistory.com/54#entry54comment</comments>
      <pubDate>Thu, 5 Aug 2021 16:26:37 +0900</pubDate>
    </item>
    <item>
      <title>MYSQL 날짜 형변환 과 데이터가 없어도 날짜 출력하는 방법</title>
      <link>https://recoderr.tistory.com/53</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;119&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVsdFf/btra34MOUIN/ZxGj3EK3FnZoYtEGoHtDXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVsdFf/btra34MOUIN/ZxGj3EK3FnZoYtEGoHtDXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVsdFf/btra34MOUIN/ZxGj3EK3FnZoYtEGoHtDXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVsdFf%2Fbtra34MOUIN%2FZxGj3EK3FnZoYtEGoHtDXK%2Fimg.png&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;119&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;개발환경&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; - Java8, &lt;span&gt;Mybatis, SpringBoot, gradle, mariaDB, JSP&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;목적과 문제발생&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 기간별 데이터를 출력해야하는데 데이터가 없는 기간은 조회되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;해결방법&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;1. 출력할 날짜 템플릿을 만드는 쿼리를 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;2. 모듈도 중복되서 출력되면 안되므로 기간 템플릿 쿼리와 조인하여 최종 템플릿 쿼리를 픽스한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;3. 템플릿 쿼리에 넣을 데이터를 가지고 있는 테이블을 조인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;162&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh7JzN/btraWv43ftd/ukCHo4ls9BjILjuN27fLK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh7JzN/btraWv43ftd/ukCHo4ls9BjILjuN27fLK0/img.png&quot; data-alt=&quot;테이블구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh7JzN/btraWv43ftd/ukCHo4ls9BjILjuN27fLK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh7JzN%2FbtraWv43ftd%2FukCHo4ls9BjILjuN27fLK0%2Fimg.png&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;162&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;테이블구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;하기는 문제해결 과정으로 쿼리 변천사이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1627628125380&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT 
IFNULL(MONTH(B.접수일), 0) AS 접수일
, A.세부코드명 AS 모듈명
, A.세부코드 AS 세부코드
, COUNT(B.진행상태) AS 접수건수
FROM 
(SELECT * FROM 공통코드 WHERE 회사SEQ = #{회사SEQ}) A
LEFT OUTER JOIN 
SR_BOARD B 
ON 
A.세부코드 = B.모듈
&amp;lt;if test=&quot;진행상태 != null and 진행상태 != ''&quot;&amp;gt;
AND B.진행상태= #{진행상태}
&amp;lt;/if&amp;gt;
&amp;lt;if test=&quot;startDate != null and startDate != '' and endDate != null and endDate != ''&quot;&amp;gt;
&amp;lt;![CDATA[	
AND DATE_FORMAT(B.접수일, '%Y-%m') &amp;gt;= #{startDate} 
AND DATE_FORMAT(B.접수일, '%Y-%m') &amp;lt;= #{endDate} 
]]&amp;gt;
&amp;lt;/if&amp;gt;
GROUP BY 접수일, 모듈명
ORDER BY A.세부코드​&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;1차 작성 쿼리&lt;/span&gt; &lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;//&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;문제점 - 데이터가 없는 날짜는 회신되지 않음&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;- IFNULL(&lt;span style=&quot;color: #a626a4;&quot;&gt;Column&lt;/span&gt;명&lt;span style=&quot;color: #24292e;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #50a14f;&quot;&gt;&quot;Null일 경우 대체 값&quot;&lt;/span&gt;) // ORACLE의 경우 NVL, MSSQL의 경우 ISNULL을 사용하여 NULL 체크후 대체값 적용&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 선택한 회사의 날짜별, 모듈별 데이터를 가져와 추가 데이터 가공없이 사용하기위해 NULL체크를 진행하였다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;- &amp;lt;if test=&quot;진행상태 != null and 진행상태 != ''&quot;&amp;gt; ~ &amp;lt;/if&amp;gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 이 쿼리는 접수, 완료건을 파라미터의 존재여부로 각각 조회하여, 접수 / 완료 건수를 추출한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://recoderr.tistory.com/52&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2021.08.01 - [Programming/DataBase] - MYSQL 쿼리문 통계(일간/주간/월간/기간별), DATE_FORMAT() 알아보기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1628055150358&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MYSQL 쿼리문 통계(일간/주간/월간/기간별), DATE_FORMAT() 알아보기&quot; data-og-description=&quot;MySQL 쿼리문(일간/주간/월간/기간별) // 일간통계 SELECT DATE(&amp;#96;날짜컬럼&amp;#96;) AS &amp;#96;date&amp;#96;, sum(&amp;#96;value&amp;#96;) FROM test_st GROUP BY &amp;#96;date&amp;#96;; // 주간통계 SELECT DATE_FORMAT(DATE_SUB(&amp;#96;날짜컬럼&amp;#96;, INTERVAL (DAYOFWEEK(..&quot; data-og-host=&quot;recoderr.tistory.com&quot; data-og-source-url=&quot;https://recoderr.tistory.com/52&quot; data-og-url=&quot;https://recoderr.tistory.com/52&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d4KWlp/hyK6pOkE3H/1amk3CFRoak1tngV8VFLHk/img.png?width=500&amp;amp;height=285&amp;amp;face=0_0_500_285,https://scrap.kakaocdn.net/dn/XYjT2/hyK6uB8PNu/EhaJ0xww1KEPJ1IK3XyYCk/img.png?width=500&amp;amp;height=285&amp;amp;face=0_0_500_285,https://scrap.kakaocdn.net/dn/eWvR3/hyK6kTPkaQ/Bj9dYLH5Okghqv4jUlFEg0/img.png?width=631&amp;amp;height=533&amp;amp;face=0_0_631_533&quot;&gt;&lt;a href=&quot;https://recoderr.tistory.com/52&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://recoderr.tistory.com/52&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d4KWlp/hyK6pOkE3H/1amk3CFRoak1tngV8VFLHk/img.png?width=500&amp;amp;height=285&amp;amp;face=0_0_500_285,https://scrap.kakaocdn.net/dn/XYjT2/hyK6uB8PNu/EhaJ0xww1KEPJ1IK3XyYCk/img.png?width=500&amp;amp;height=285&amp;amp;face=0_0_500_285,https://scrap.kakaocdn.net/dn/eWvR3/hyK6kTPkaQ/Bj9dYLH5Okghqv4jUlFEg0/img.png?width=631&amp;amp;height=533&amp;amp;face=0_0_631_533');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MYSQL 쿼리문 통계(일간/주간/월간/기간별), DATE_FORMAT() 알아보기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MySQL 쿼리문(일간/주간/월간/기간별) // 일간통계 SELECT DATE(`날짜컬럼`) AS `date`, sum(`value`) FROM test_st GROUP BY `date`; // 주간통계 SELECT DATE_FORMAT(DATE_SUB(`날짜컬럼`, INTERVAL (DAYOFWEEK(..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;recoderr.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1627628238057&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1번 코드
select 
	a.Date AS 접수일
	, B.모듈명
	, B.세부코드
	, CASE WHEN B.접수건수 IS NULL THEN 0 ELSE 1 END AS 접수건수
from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) ) DAY as Date
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d
) a
left outer JOIN 
(SELECT 
	IFNULL(DATE(B.접수일), 0) AS 접수일
	, A.세부코드명 AS 모듈명
   	, A.세부코드 AS 세부코드
	, COUNT(B.진행상태) AS 접수건수
FROM 
 	(SELECT * FROM 공통코드 WHERE 회사SEQ =2) A
	 	LEFT OUTER JOIN 
	 	SR_BOARD B 
	 	ON 
			A.세부코드 = B.모듈명
		GROUP BY 접수일, 모듈명 ORDER BY A.세부코드) B
on a.Date = DATE_FORMAT(B.접수일, '%Y-%m-%d')
where a.Date between '2021-05-01' and '2021-07-28'
GROUP BY a.Date
ORDER BY a.Date ;
--------------------------------------------------
2번 코드

select 
	DATE_FORMAT(a.Date,'%Y-%m') AS 접수일
	, B.모듈명
    , B.세부코드
	, CASE WHEN B.접수건수 IS NULL THEN 0 ELSE 1 END AS 접수건수
from (
select
    date_format(
        adddate('2021-05-01', INTERVAL @num:=@num+1 month),
        '%Y-%m-%d'
    ) date
FROM
	SR_BOARD
	,(select @num:=-1) num
limit
	12
	)a
left outer JOIN 
(SELECT 
	IFNULL(DATE_FORMAT(B.접수일, '%Y-%m'), 0) AS 접수일
	, A.세부코드명 AS 모듈명
  	, A.세부코드 AS 세부코드
	, COUNT(B.진행상태) AS 접수건수
FROM 
 	(SELECT * FROM 공통코드 WHERE 회사SEQ = 2) A
 	LEFT OUTER JOIN 
 	SR_BOARD B 
	ON 
	A.세부코드 = B.모듈
	GROUP BY B.접수일, 모듈
	ORDER BY A.세부코드) B
on DATE_FORMAT(a.Date,'%Y-%m') = DATE_FORMAT(B.RCEPT_DT, '%Y-%m')
where DATE_FORMAT(a.Date, '%Y-%m') between '2021-05' and '2021-07'
GROUP BY a.DATE, B.접수일, B.모듈
ORDER BY a.date;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;2차 작성 쿼리&lt;/span&gt;&amp;nbsp;// &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;문제점 - 데이터가 없는 날짜도 나오긴 하지만, 날짜 중복(동일 날짜에 모듈 여러개일 가능성)이 반영되지 않음&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;날짜 템플릿을 만들기위해 구글링을 통해 두가지 방법을 찾았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;&amp;lt;1번 코드&amp;gt;&lt;/b&gt;&lt;/span&gt;는 union all을 이용해 계속해서 날짜를 이어간 것이고, (현재날짜까지 날짜를 생성할수 있고 미래날짜 생성불가)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;&amp;lt;2번 코드&amp;gt;&lt;/b&gt;&lt;/span&gt;는 변수 num을 선언하고 adddate(DATE_ADD의 별칭)를 통해 limit 으로 제한한 만큼 날짜를 생성하는 쿼리이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;(미래 날짜도 생성 가능)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;위와같이 조인 할 경우,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1번 코드는 데이터가 있는 날짜에 출력은 되나 해당 날짜에 여러개의 모듈이 있을때 한건만 반영되어 추출되었고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2번 코드는 데이터 값이 있음에도 불구하고 모듈과 세부코드 컬럼값에 null을 반환했다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;283&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6MSHB/btraJzzyO1P/6DxF8rWkpQs8QjFpZpl5NK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6MSHB/btraJzzyO1P/6DxF8rWkpQs8QjFpZpl5NK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6MSHB/btraJzzyO1P/6DxF8rWkpQs8QjFpZpl5NK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6MSHB%2FbtraJzzyO1P%2F6DxF8rWkpQs8QjFpZpl5NK%2Fimg.png&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;283&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1627628323270&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; SELECT
	A.DATE AS 접수일
	, A.세부코드명 AS 모듈
	, A.세부코드 AS 세부코드
	, IFNULL(B.CNT, 0) AS 접수건수
FROM (
	SELECT D.DATE
		,C.세부코드명
		,C.세부코드 
	FROM (
		SELECT DATE_FORMAT(DD.Date, '%Y-%m') AS DATE
		FROM (
			SELECT curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) ) DAY AS Date
		    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
		    	cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
		    	cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
		    	cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d
		) DD
		WHERE DATE_FORMAT(DD.DATE, '%Y-%m') BETWEEN #{startDate} AND #{endDate}	
		GROUP BY DATE_FORMAT(DD.Date, '%Y-%m')
	) D
	JOIN 공통코드 C
	ON 회사SEQ = #{회사SEQ}
	AND 세부코드 IS NOT NULL
) A
LEFT OUTER JOIN (
	SELECT
		DATE_FORMAT(접수일, '%Y-%m') AS 접수일
		, 모듈
		, COUNT(*) AS CNT
	FROM SR_BOARD
	WHERE DATE_FORMAT(접수일, '%Y-%m') BETWEEN #{startDate} AND #{endDate}
	 	&amp;lt;if test=&quot;진행상태 != null and 진행상태 != ''&quot;&amp;gt;
			AND 진행상태 = #{진행상태}
		&amp;lt;/if&amp;gt;
	GROUP BY DATE_FORMAT(접수일, '%Y-%m'), 모듈
) B
ON A.DATE = B.접수일
AND A.세부코드 = 모듈&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;3차 작성 쿼리&lt;/span&gt; // 원하는 데이터값 추출 완료(감격)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;애초에 템플릿을 만들때 모듈과 날짜를 조인하면 동일 날짜에 모듈이 여러개여도 데이터가 모두 추출된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;기본 템플릿을 잘 만들어서 대입해야되는 것이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;코드는 모두 월별로 출력되도록 작성했지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;DATE_FORMAT의 format을 '%Y-%m-%D'로 변경하면 일간, '%Y'는 연간, '%Y-%u'는 주간으로 출력할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1번, 2번 코드 출처&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;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 코드&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://oboki.net/workspace/data-engineering/database/mysql/with-recursive-row-generator/&quot;&gt;https://oboki.net/workspace/data-engineering/database/mysql/with-recursive-row-generator/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번 코드&amp;nbsp;&lt;a href=&quot;https://www.python2.net/questions-1574989.htm&quot;&gt;&amp;nbsp;&lt;/a&gt;&lt;a href=&quot;https://www.python2.net/questions-1574989.htm&quot;&gt;https://www.python2.net/questions-1574989.htm&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;285&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ye72a/btra9XMMGBD/JYkasiyQdLmCRFr9GEqNk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ye72a/btra9XMMGBD/JYkasiyQdLmCRFr9GEqNk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ye72a/btra9XMMGBD/JYkasiyQdLmCRFr9GEqNk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYe72a%2Fbtra9XMMGBD%2FJYkasiyQdLmCRFr9GEqNk1%2Fimg.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;285&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/DataBase</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/53</guid>
      <comments>https://recoderr.tistory.com/53#entry53comment</comments>
      <pubDate>Wed, 4 Aug 2021 15:46:56 +0900</pubDate>
    </item>
    <item>
      <title>MYSQL 쿼리문 통계(일간/주간/월간/기간별), DATE_FORMAT() 알아보기</title>
      <link>https://recoderr.tistory.com/52</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;MySQL 쿼리문(일간/주간/월간/기간별)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627805770054&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 일간통계
SELECT DATE(`날짜컬럼`) AS `date`,
       sum(`value`)
FROM test_st
GROUP BY `date`;

// 주간통계
SELECT DATE_FORMAT(DATE_SUB(`날짜컬럼`, INTERVAL (DAYOFWEEK(`날짜컬럼`)-1) DAY), '%Y/%m/%d') as start,
       DATE_FORMAT(DATE_SUB(`날짜컬럼`, INTERVAL (DAYOFWEEK(`날짜컬럼`)-7) DAY), '%Y/%m/%d') as end,
       DATE_FORMAT(`날짜컬럼`, '%Y%U') AS `date`,
       sum(`value`)
FROM test_st
GROUP BY date;

// 월간통계
SELECT MONTH(`날짜컬럼`) AS `date`,
       sum(`value`)
FROM test_st
GROUP BY `date`;

// 기간별 통계
SELECT DATE(`날짜컬럼`) AS `date`,
       sum(`value`)
FROM test_st
WHERE DATE(`날짜컬럼`) &amp;gt;= STR_TO_DATE('2017-04-01', '%Y-%m-%d')
   AND DATE(`날짜컬럼`) &amp;lt;= STR_TO_DATE('2017-04-10', '%Y-%m-%d')
GROUP BY `date`;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;STR_TO_DATE(str, format)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- DATE_FORMAT() 의 반대&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- format&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;문자열이 날짜와 시간을 모두 포함하고 있다면 DATETIME 값을 반환한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;그렇지 않고 날짜나 시간 둘 중 한 부분만을 포함한다면 DATE 또는 TIME 값을 반환한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;DATE_FORMAT(date, format)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- format&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;문자열에 따라&amp;nbsp;&lt;/span&gt;date&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;값을 형식화한다.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;DATE_ADD(date, INTERVAL expr type) ,&amp;nbsp;DATE_SUB(date, INTERVAL expr type)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;- date 는 시작 날짜를 지정하는 DATETIME 또는 DATE 값이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- expr 는 시작 날짜로부터 더하거나 뺀 간격 값을 지정하는 표현이다. expr 는 문자열이다. 마이너스('-')로 시작될 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- type 는 어떻게 해석할지를 지정하는 키워드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- INTERVAL 키워드와 type 지정자는 대소문자를 구분하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;** 기형적인 날짜를 입력하면 결과는 NULL이 된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z4a3Z/btra1ZXoT0K/8f89KHkorhL0OEOQvJrMVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z4a3Z/btra1ZXoT0K/8f89KHkorhL0OEOQvJrMVK/img.png&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;725&quot; style=&quot;width: 27.2671%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z4a3Z/btra1ZXoT0K/8f89KHkorhL0OEOQvJrMVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz4a3Z%2Fbtra1ZXoT0K%2F8f89KHkorhL0OEOQvJrMVK%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;327&quot; height=&quot;725&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lBWJz/btraVpbW6CX/wIBUL7AU1ckIgnMfHdt7k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lBWJz/btraVpbW6CX/wIBUL7AU1ckIgnMfHdt7k1/img.png&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;533&quot; style=&quot;width: 71.5701%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lBWJz/btraVpbW6CX/wIBUL7AU1ckIgnMfHdt7k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlBWJz%2FbtraVpbW6CX%2FwIBUL7AU1ckIgnMfHdt7k1%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;631&quot; height=&quot;533&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;날짜 format &amp;nbsp;문자열 (좌) / INTERVAL TYPE&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;GROUP BY&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;특정 컬럼을 그룹화 하는&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;GROUP BY&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;특정 컬럼을 그룹화한 결과에 조건을 거는&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;HAVING&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;* WHERE는 그룹화 하기 전, HAVING은 그룹화 후에 적용되는 조건&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1627808796060&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 컬럼 그룹화
SELECT 컬럼 FROM 테이블 GROUP BY 그룹화할 컬럼;

// 조건 처리 후에 컬럼 그룹화 후에 조건 처리
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화할 컬럼 HAVING 조건식;

// ORDER BY가 존재하는 경우
SELECT 컬럼 FROM 테이블 [WHERE 조건식]
GROUP BY 그룹화할 컬럼 [HAVING 조건식] ORDER BY 컬럼1 [, 컬럼2, 컬럼3 ...];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&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;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MySQL - 일간/주간/월간/기간별 통계&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://bluexmas.tistory.com/626&quot;&gt;https://bluexmas.tistory.com/626&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;MySQL DATE_FORMAT()&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://mindols.tistory.com/89&quot;&gt;https://mindols.tistory.com/89&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;MySQL DATE 관련 함수&amp;nbsp;&lt;/p&gt;
&lt;a href=&quot;https://linuxism.ustd.ip.or.kr/510&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://linuxism.ustd.ip.or.kr/510&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;285&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AhZfF/btraSX7OQAD/n4qEG1kgFMJZQkfmrjqYJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AhZfF/btraSX7OQAD/n4qEG1kgFMJZQkfmrjqYJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AhZfF/btraSX7OQAD/n4qEG1kgFMJZQkfmrjqYJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAhZfF%2FbtraSX7OQAD%2Fn4qEG1kgFMJZQkfmrjqYJ0%2Fimg.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;285&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/DataBase</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/52</guid>
      <comments>https://recoderr.tistory.com/52#entry52comment</comments>
      <pubDate>Sun, 1 Aug 2021 18:08:48 +0900</pubDate>
    </item>
    <item>
      <title> 자바스터디  자바의 정석 CH16 네트워킹</title>
      <link>https://recoderr.tistory.com/51</link>
      <description>&lt;h4 id=&quot;1-네트워킹networking&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1. 네트워킹(Networking)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;네트워킹(networking)이란 두 대 이상의 컴퓨터를 케이블로 연결하여 네트워크(network)를 구성하는 것을 말한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;11-클라이언트서버clientserver&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1.1 클라이언트/서버(client/server)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;'클라이언트/서버는 컴퓨터간의 관계를 역할로 구분하는 개념이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;서버(server)는 서비스를 제공하는 컴퓨터(service provider)이고 클라이언트(client)는 서비스를 사용하는 컴퓨터(service user)가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;네트워크를 구성할 때 전용서버를 두는 것을 서버기반모델 이라고 하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;각 클라이언트가 서버역할을 동시에 수행하는 것을 P2P모델 이라고 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 서버는 제공하는 서비스의 종류에 따라 파일서버 메일서버, 어플리케이션 서버 등이 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;215&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pwjRw/btraVTjzZ1y/hX4C5oncwkpzYjvEff6S01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pwjRw/btraVTjzZ1y/hX4C5oncwkpzYjvEff6S01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pwjRw/btraVTjzZ1y/hX4C5oncwkpzYjvEff6S01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpwjRw%2FbtraVTjzZ1y%2FhX4C5oncwkpzYjvEff6S01%2Fimg.png&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;215&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;12-ip주소ip-address&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1.2 IP주소(IP Address)&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;size14&quot;&gt;IP주소는 컴퓨터를 네트워크 상에서 구별하는데 사용되는 고유한 값이며 4byte(32 bit)의 정수로 구성되어 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;IP주소는 네트워크주소와 호스트 주소로 누눌 수 있으며&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;네트워크 주소가 같다는 것은 두 호스트가 같은 네트워크에 포함되어 있다는 것을 의미한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;IP Address에 Subnet Mask를 '&amp;amp;'연산을 해주면 네트워크 주소를 알 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;| 192 | 168 | 10 | 100 | | 255 | 255 | 255 | 0 | |--|--|--|--| |11000000|10101000|00001010|01100100| |11111111|11111111|11111111|00000000| |11000000|10101000|00001010|01100100|&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;13-inetaddress&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1.3 InetAddress&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;size14&quot;&gt;자바에서는 IP주소를 다루기 위한 클래스로 InetAddress를 제공한다&lt;/p&gt;
&lt;pre id=&quot;code_1627803136050&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.net.*;
import java.util.*;

public class Hello {

    public static void main(String[] args) {
        InetAddress ip = null;
        InetAddress[] ipArr = null;

        try{
            ip = InetAddress.getByName(&quot;www.daum.net&quot;);
            System.out.println(&quot;getHostName() :&quot; + ip.getHostName());
            System.out.println(&quot;getHostAddress() :&quot; + ip.getHostAddress());
            System.out.println(&quot;toString() :&quot; + ip.toString());

            byte[] ipAddr = ip.getAddress();
            System.out.println(&quot;getAddress() :&quot; + Arrays.toString(ipAddr));

            String result = &quot;&quot;;
            for (int i=0; i &amp;lt; ipAddr.length; i++) {
                result += (ipAddr[i] &amp;lt; 0) ? ipAddr[i] + 256 : ipAddr[i];
                result += &quot;.&quot;;
            }
            System.out.println(&quot;getAddress() + 256 :&quot; + result);
            System.out.println();
        }
        catch(UnknownHostException e){
            e.printStackTrace();    
        }

        try{
            ip = InetAddress.getLocalHost();
            System.out.println(&quot;getHostName() :&quot; + ip.getHostName());
            System.out.println(&quot;getHostAddress() :&quot; + ip.getHostAddress());
            System.out.println();
        }
        catch(UnknownHostException e){
            e.printStackTrace();    
        }

        try{
            ipArr = InetAddress.getAllByName(&quot;www.daum.net&quot;);

            for (int i=0; i &amp;lt; ipArr.length; i++) {
                System.out.println(&quot;ipArr[&quot;+i+&quot;]&quot; + ipArr[i]);
            }
        }
        catch(UnknownHostException e){
            e.printStackTrace();    
        }

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1627803145592&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;getHostName() :www.daum.net
getHostAddress() :117.52.2.25
toString() :www.daum.net/117.52.2.25
getAddress() :[117, 52, 2, 25]
getAddress() + 256 :117.52.2.25.

getHostName() :KyleYui-MacBook-Pro.local
getHostAddress() :192.168.99.1

ipArr[0]www.daum.net/117.52.2.25
ipArr[1]www.daum.net/61.111.62.165&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;14-urluniform-resource-location&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1.4 URL(Uniform Resource Location)&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;size14&quot;&gt;URL은 인터넷에 존재하는 여러 서버들이 제공하는 자원에 접근할 수 있는 주소를 표현하기 위한것&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;'프로토콜//호스트명:포트번호/경로명/파일명?쿼리스트링#참조'&lt;/b&gt; &lt;/span&gt;형태로 이루어져 있다&lt;/p&gt;
&lt;pre id=&quot;code_1627803228938&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://www.codechobo.com:80/sample/hello.html?referer=codechobo#index1
프로토콜 자원에 접근하기 위해 서버와 통신하는데 사용되는 통신규약(http)
호스트명 자원을 제공하는 서버의 이름(www.javachobo.com)
포트번호 통신에 사용되는 서버의 포트번호(80)
경로명 접근하려는 자원이 저장된 서버상의 위치(/sample)
파일명 접근하려는 자원의 이름(hello.html)
쿼리query) URL에서 '?'이후의 부분(referer=javachobo)
참조(anchor) URL에서 '#'이후의 부분(index1)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1627803262733&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.net.URL;

public class Main {

    public static void main(String[] args) {
        try {
            URL url = new URL(&quot;http://media.daum.net/mainnews/?type=sports#index1&quot;);

            System.out.println(&quot;url.getAuthority() :&quot; + url.getAuthority());
            System.out.println(&quot;url.getContent() :&quot; + url.getContent().toString());
            System.out.println(&quot;url.getDefaultPort() :&quot; + url.getDefaultPort());
            System.out.println(&quot;url.getPort() :&quot; + url.getPort());
            System.out.println(&quot;url.getFile() :&quot; + url.getFile());
            System.out.println(&quot;url.getHost() :&quot; + url.getHost());
            System.out.println(&quot;url.getPath() :&quot; + url.getPath());
            System.out.println(&quot;url.getProtocol() :&quot; + url.getProtocol());
            System.out.println(&quot;url.getQuery() :&quot; + url.getQuery());
            System.out.println(&quot;url.getRef() :&quot; + url.getRef());
            System.out.println(&quot;url.getUserInfo() :&quot; + url.getUserInfo());
            System.out.println(&quot;url.toExternalForm() :&quot; + url.toExternalForm());
            System.out.println(&quot;url.toURI() :&quot; + url.toURI());


        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

-----------------------------------------------------------------------------------------
url.getAuthority() :media.daum.net
url.getContent() :[email protected]e80c
url.getDefaultPort() :80
url.getPort() :-1
url.getFile() :/mainnews/?type=sports
url.getHost() :media.daum.net
url.getPath() :/mainnews/
url.getProtocol() :http
url.getQuery() :type=sports
url.getRef() :index1
url.getUserInfo() :null
url.toExternalForm() :http://media.daum.net/mainnews/?type=sports#index1
url.toURI() :http://media.daum.net/mainnews/?type=sports#index1&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;15-urlconnection&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.5 URLConnection&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;size14&quot;&gt;URLConnection은 어플리케이션과 URL간의 통신연결을 나타내는 클래스의 최상위 클래스로 추상클래스이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;URLConnection을 상속받아 구현한 클래스로는 HttpURLConnection과 JarURLConnection이 있으며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;URL의 프로토콜이 http프로토콜이라면 openConnection()은 Http URLConnection을 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javase/8/docs/api/java/net/URLConnection.html&quot;&gt;https://docs.oracle.com/javase/8/docs/api/java/net/URLConnection.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;gt; &lt;br /&gt;&amp;lt;html&amp;nbsp;lang=&quot;ko&quot;&amp;gt; &lt;br /&gt;&amp;lt;head&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;meta&amp;nbsp;charset=&quot;UTF-8&quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;meta&amp;nbsp;http-equiv='refresh'&amp;nbsp;content='0;url=&lt;a href=&quot;http://www.codechobo.com/main'&amp;gt;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.codechobo.com/main'&amp;gt;&lt;/a&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;코드초보&amp;lt;/title&amp;gt; &lt;br /&gt;&amp;lt;/head&amp;gt; &lt;br /&gt;&amp;lt;body&amp;gt; &lt;br /&gt;&amp;lt;/body&amp;gt; &lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;데이터가 문자데이터이기 때문에 BefferedReader를 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;url.openStream()은 url.openConnection().getInputStream() 과 같다&lt;/p&gt;
&lt;pre id=&quot;code_1627803384001&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;

public class Main {

    public static void main(String[] args) {
        URL url = null;
        InputStream in = null;
        FileOutputStream out = null;
        String address = &quot;http://www.codechobo.com&quot;;
        int ch = 0;
        try {
            url = new URL(address);
            in = url.openStream();
            out = new FileOutputStream(&quot;javajungsuk.zip&quot;);

            while( (ch=in.read()) != -1){
                out.write(ch);
            }
            in.close();
            out.close();

        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;Helloworld.class Helloworld.java Java Test.iml javajungsuk.zip out src&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;텍스트가 아닌 이진 데이터를 읽어서 파일에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;2-소켓-프로그래밍&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;2. 소켓 프로그래밍&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;소켓(socket)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- 네트워크의 양방향 통신에서 양쪽 끝단으로, TCP/IP 단에서 구분할 수 있는 하나의 포트 번호를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- Java의 소켓 프로그래밍&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- java.net 패키지가 소켓 프로그래밍 클래스들을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;21-tcp와-udp&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;2.1 TCP와 UDP&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;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;TCP/UDP&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; - TCP와 UDP 모두 TCP/IP 프로토콜에 포함되어있는 프로토콜로, OSI 7계층의 전송 계층(transport layer)에 해당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;TCP와 UDP의 특징&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;252&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nv1Dc/btra35bXsUr/OUqHdhyzgwaK1Bv9qeHGX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nv1Dc/btra35bXsUr/OUqHdhyzgwaK1Bv9qeHGX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nv1Dc/btra35bXsUr/OUqHdhyzgwaK1Bv9qeHGX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNv1Dc%2Fbtra35bXsUr%2FOUqHdhyzgwaK1Bv9qeHGX1%2Fimg.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;252&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;22-tcp소켓-프로그래밍&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;2.2 TCP소켓 프로그래밍&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;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;서버/클라이언트의 통신 과정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;[서버]&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;ServerSocket으로 특정 포트로 소켓을 연다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;[클라이언트]&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;서버의 IP 주소와 포트로 Socket을 만들어 서버에 연결 요청을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;[서버]&lt;/b&gt;&amp;nbsp;&lt;/span&gt;클라이언트의 연결 요청을 받으면 Socket을 만들어 클라이언트의 소켓과 연결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;[서버/클라이언트]&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;연결된 각자의 소켓을 이용해 통신을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;소켓&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; - 여러 소켓이 포트 하나를 공유할 수 있지만, 서버소켓은 포트 하나를 독점한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; - 소켓은 입력스트림과 출력스트림을 가지고 상대방 소켓과 서로 교차연결해 데이터를 주고받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;23-udp소켓-프로그래밍&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;2.3 UDP소켓 프로그래밍&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;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; - 연결지향이 아니므로 ServerSocket이 따로 필요하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; - 소켓은 DatagramSocket를 사용해 만들어 DatagramPacket에 데이터를 담아 통신한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; - DatagramPacket에는 헤더와 데이터가 있으며 헤더에 수신할 상대방의 정보(주소와 포트)를 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;204&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SRQDK/btraWSLuvuY/4nny51psrBA4ts1nBq7mYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SRQDK/btraWSLuvuY/4nny51psrBA4ts1nBq7mYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SRQDK/btraWSLuvuY/4nny51psrBA4ts1nBq7mYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSRQDK%2FbtraWSLuvuY%2F4nny51psrBA4ts1nBq7mYK%2Fimg.png&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;204&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/Java \ Spring</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/51</guid>
      <comments>https://recoderr.tistory.com/51#entry51comment</comments>
      <pubDate>Sun, 1 Aug 2021 16:48:37 +0900</pubDate>
    </item>
    <item>
      <title>[React ] Redux와 useReducer의 차이, Context API 사용하기</title>
      <link>https://recoderr.tistory.com/50</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhZuXT/btraSZEkFZP/xkQ9re0iHHkc4Bmb9lMStK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhZuXT/btraSZEkFZP/xkQ9re0iHHkc4Bmb9lMStK/img.png&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;422&quot; style=&quot;width: 71.0282%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhZuXT/btraSZEkFZP/xkQ9re0iHHkc4Bmb9lMStK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhZuXT%2FbtraSZEkFZP%2FxkQ9re0iHHkc4Bmb9lMStK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;757&quot; height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOkLvK/btraVoYcvZs/K0k6A16Tk1FGmlz5uMIKzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOkLvK/btraVoYcvZs/K0k6A16Tk1FGmlz5uMIKzK/img.png&quot; data-origin-width=&quot;302&quot; data-origin-height=&quot;430&quot; style=&quot;width: 27.809%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOkLvK/btraVoYcvZs/K0k6A16Tk1FGmlz5uMIKzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOkLvK%2FbtraVoYcvZs%2FK0k6A16Tk1FGmlz5uMIKzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;302&quot; height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;redux 사용전 컴포넌트의 상태 변화의 전달 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tKWb2/btraZLLCCg8/tsSJjIu80wwKbkZSju7Oc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tKWb2/btraZLLCCg8/tsSJjIu80wwKbkZSju7Oc0/img.png&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;430&quot; style=&quot;width: 34.2742%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tKWb2/btraZLLCCg8/tsSJjIu80wwKbkZSju7Oc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtKWb2%2FbtraZLLCCg8%2FtsSJjIu80wwKbkZSju7Oc0%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;614&quot; height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uSM26/btraPu59s6k/77yLtEAqbWVPxZNokgidn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uSM26/btraPu59s6k/77yLtEAqbWVPxZNokgidn0/img.png&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;430&quot; style=&quot;width: 34.4975%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uSM26/btraPu59s6k/77yLtEAqbWVPxZNokgidn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuSM26%2FbtraPu59s6k%2F77yLtEAqbWVPxZNokgidn0%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;618&quot; height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhWiw8/btraRwI8EV2/vWzh27TKq12gAR6dvwZLHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhWiw8/btraRwI8EV2/vWzh27TKq12gAR6dvwZLHK/img.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;485&quot; style=&quot;width: 28.9027%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhWiw8/btraRwI8EV2/vWzh27TKq12gAR6dvwZLHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhWiw8%2FbtraRwI8EV2%2FvWzh27TKq12gAR6dvwZLHK%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;584&quot; height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;redux를 사용 후 컴포넌트 외부에서 상태관리 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Redux를 사용하는 이유&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;리액트 프로젝트의 경우 대부분의 작업시 부모 컴포넌트를 통해 하위 컴포넌트의 데이터를 업데이트 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(데이터의 연관이 있는 컴포넌트끼리 ref를 사용하여 전달할 수 있으나 코드가 꼬이는 문제로 인해 지양한다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;컴포넌트의 갯수가 적을때는 문제가 되지 않지만, 점점 늘어날수록 유지보수의 어려움이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;예를 들어 변수명의 변경을 하면 연관된 컴포넌트 파일 모두에 수정을 거쳐야된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그러나 리덕스를 사용하게 되면 데이터 상태를 컴포넌트 외부에서 관리하기 때문에 과정을 단순화 시킬 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;Reducer&lt;/b&gt;&lt;/span&gt; : 업데이트 로직을 정의하는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;386&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dggwsI/btraSYenA8U/9mKIkhwAxcKtKAo5jWTkF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dggwsI/btraSYenA8U/9mKIkhwAxcKtKAo5jWTkF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dggwsI/btraSYenA8U/9mKIkhwAxcKtKAo5jWTkF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdggwsI%2FbtraSYenA8U%2F9mKIkhwAxcKtKAo5jWTkF1%2Fimg.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;386&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;lt; Redux 흐름 &amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;subscribe(상태 변화 감지요청) &amp;gt;&amp;gt; action(상태 변화) &amp;gt;&amp;gt; dispatch(상태업데이트, store에 action 전달) &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&amp;gt;&amp;gt; Store(state 갱신) &amp;gt;&amp;gt; listener(상태 변화 알림) &amp;gt;&amp;gt; 컴포넌트 리렌더링&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 여러 컴포넌트를 거칠 필요없이 부모 컴포넌트에서 다이렉트로 받는거처럼 리덕스 스토어에서 원하는 상태값을 전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;(단방향 데이터 흐름으로 데이터 구조의 단순화)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;lt; Redux 의 3 원칙 &amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;1. Single source of truth&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; 애플리케이션 내에&lt;span&gt;&amp;nbsp;&lt;/span&gt;Store는 반드시 1개 뿐.&lt;span&gt;&amp;nbsp;&lt;/span&gt;Store는 반드시 1개만 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;2. State is read-only&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; state를 직접 변경해서는 안.된.다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; state를 변화시키는 유일한 방법은&lt;span&gt;&amp;nbsp;&lt;/span&gt;Action을&lt;span&gt;&amp;nbsp;&lt;/span&gt;Reducer에 dispatch(송신, 전달)하는 방법 뿐이다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; 즉,&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;state의 변경은Reducer만&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Reducer&lt;span&gt;&amp;nbsp;&lt;/span&gt;이외의 공간에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;state는 읽기 전용인 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;3. Changes are made with pure functions&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Reducer는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333;&quot;&gt;&lt;b&gt;순수 함수&lt;/b&gt;&lt;/span&gt;여야만 한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; Reducer 함수는&lt;span&gt;&amp;nbsp;&lt;/span&gt;parameter로&lt;span&gt;&amp;nbsp;&lt;/span&gt;기존의 state와&lt;span&gt;&amp;nbsp;&lt;/span&gt;Action을 받는데,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; Reducer 함수는&lt;span&gt;&amp;nbsp;&lt;/span&gt;기존의 state를 직접 변경하지 않고, 새.로.운 state object(객체)를 작성해서 return해야한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;useReducer&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;useReducer와 context api 로 redux의 기능을 대부분 구현할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(그러나 프로젝트의 규모가 크다면 useReducer와 context api 조합의 한계로 비동기적인 작업시 불편하다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1627753362984&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useState, useReducer } from 'react';

const initialState = { //state 정의
	winner: '',
    turn : 'O',
    tableData : [['','',''], ['','',''], ['','','']],
};

const reducer = (state, action) =&amp;gt; { //state 변화 정의
	
};
const [state, dispatch] = useReducer(reducer, initialState);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 여러개의 state를 하나의 state로 만들어 state의 갯수를 줄여준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;lt; Redux와 useReducer 차이 &amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1. 리덕스는 dispatch를 통해 state가 동기적으로 변경, useReducer는 비동기적으로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;106&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K46bi/btraVUJovKU/gQCyWsgLA4J8qAOdKKAKF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K46bi/btraVUJovKU/gQCyWsgLA4J8qAOdKKAKF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K46bi/btraVUJovKU/gQCyWsgLA4J8qAOdKKAKF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK46bi%2FbtraVUJovKU%2FgQCyWsgLA4J8qAOdKKAKF0%2Fimg.png&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;106&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;table 최적화 하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;useEffect를 사용하여 렌더링 될 때 console.log로&lt;span&gt;&amp;nbsp;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;두번째인자(바뀌는 값)을 넣어서 어떠한 값의 변화로 인한 리렌더링인지 확인할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;최종 하위 컴포넌트(td) 값의 변화로 리렌더링 될때 부모 컴포넌트까지 렌더링되지 않도록 memo를 사용하여 props의 값을 기억해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;** React.memo : &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;기억해둔 props의 값이 같다면 기억해둔 값을 재사용, 다르다면 리렌더링&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;** useCallback :&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;함수 자체를 메모이징해서 재사용한다. 불필요한 렌더링을 줄일수 있다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre id=&quot;code_1627767172821&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//부모 컴포넌트
import React, { useReducer, createContext } from 'react';

const Context = createContext({initial});
const value = useMemo(() =&amp;gt; ({tableData : state.tableData, dispatch}), [state.tableData]);

&amp;lt;Context.Provider value={ value }&amp;gt;
	&amp;lt;Form /&amp;gt;
    &amp;lt;Table /&amp;gt;
&amp;lt;/Context.Provider&amp;gt;


//하위 컴포넌트
import React, { useContext } from 'react';
import { Context } form '부모컴포넌트';

const Table = () =&amp;gt; {
	const { tableData } = useContext(Context);
    ...
};

export default Table;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Context Api&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;context api를 제외하고 useReducer만 사용할 경우, dispatch 와 reducer를 통해 변경할 데이터(action)을 props로 최종 변경할 컴포넌트까지 전달해주어야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 자식 컴포넌트 뿐 아니라 해당 데이터를 사용할 컴포넌트 모두에게 다이렉트로 전달할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1. createContext(기본값)&lt;/b&gt;&lt;/span&gt; 으로 Context 객체를 생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;2. Context.Provider :&lt;/b&gt;&lt;/span&gt; 하위 컴포넌트에 접근 가능하도록 명시&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; - Context.Provider 의 value 속성으로 데이터 전달&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; - value 속성에 객체로 명시해주면 렌더링시 계속 새로운 객체를 만들기 때문에 최적화에 문제가 발생,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;gt;&amp;gt; useMemo를 사용(캐싱)하여 메모이징하여 해결한다. &lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;dispatch는 항상 같으므로 변경될 값에 기재하지 않아도된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;3. useContext :&lt;/b&gt;&lt;/span&gt; Context(부모 컴포넌트에서 전달될 props)를 자식컴포넌트에서 불러오도록 해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;8-context-api-최적화&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;lt; Context API 최적화 &amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;memo,&lt;span&gt;&amp;nbsp;&lt;/span&gt;useMemo를 적절히 사용하여 캐싱을 통해 최적화&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&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;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://velog.io/@iamhayoung/Redux-JavaScript-Redux-%EC%9E%85%EB%AC%B8-Store-Reducer-Action-Dispatch-Subscription&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@iamhayoung/Redux-JavaScript-Redux-%EC%9E%85%EB%AC%B8-Store-Reducer-Action-Dispatch-Subscription&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://react.vlpt.us/basic/20-useReducer.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://react.vlpt.us/basic/20-useReducer.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의정보&amp;nbsp;  &lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;플랫폼 : 인프런&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;강의 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;웹 게임을 만들며 배우는 React&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;강사 : 제로초(조현영)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;개발환경 : vscode, react&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;url :&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.inflearn.com/course/web-game-react&quot;&gt;https://www.inflearn.com/course/web-game-react&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;196&quot; data-origin-height=&quot;165&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H3zpE/btranyOr5n3/RBpGv2ieOaDCtUg80KhZ2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H3zpE/btranyOr5n3/RBpGv2ieOaDCtUg80KhZ2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H3zpE/btranyOr5n3/RBpGv2ieOaDCtUg80KhZ2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH3zpE%2FbtranyOr5n3%2FRBpGv2ieOaDCtUg80KhZ2K%2Fimg.png&quot; data-origin-width=&quot;196&quot; data-origin-height=&quot;165&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/JavaScript</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/50</guid>
      <comments>https://recoderr.tistory.com/50#entry50comment</comments>
      <pubDate>Sun, 1 Aug 2021 09:57:02 +0900</pubDate>
    </item>
    <item>
      <title> 자바스터디  자바의 정석 CH15 입출력(I/O)</title>
      <link>https://recoderr.tistory.com/49</link>
      <description>&lt;p id=&quot;1-자바에서의-입출력&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333;&quot;&gt;&lt;b&gt;1. 자바에서의 입출력&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;11-입출력이란&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8; color: #333333;&quot;&gt;&lt;b&gt;1.1 입출력이란?&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;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;12-스트림stream&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8; color: #333333;&quot;&gt;&lt;b&gt;1.2 스트림(stream)&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;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;자바에서 입출력을 수행하기 위해 두 대상을 연결하고 데이터를 운반하는데 사용되는 연결통로&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;먼저 보낸 데이터를 먼저 받게 되어 있으며 중간에 건너뜀 없이 연속적으로 데이터를 주고 받는다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;13-바이트기반-스트림--inputstream-outputstream&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1.3 바이트기반 스트림 - InputStream, OutputStream&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 스트림은 바이트단위로 데이터를 전송하며 입출력 대상에 따라 다음과 같은 입출력스트림이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;212&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CNyES/btraqSETJkI/qOriHnKjoRKk8UKrDZrIo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CNyES/btraqSETJkI/qOriHnKjoRKk8UKrDZrIo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CNyES/btraqSETJkI/qOriHnKjoRKk8UKrDZrIo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCNyES%2FbtraqSETJkI%2FqOriHnKjoRKk8UKrDZrIo0%2Fimg.png&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;212&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;169&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9cUCZ/btrapFTlwsv/FI7bhxR57sk0k0qhDN3c40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9cUCZ/btrapFTlwsv/FI7bhxR57sk0k0qhDN3c40/img.png&quot; data-alt=&quot;[표15-2] InputStream과 OutputStream에 정의된 읽기와 쓰기를 수행하는 메서드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9cUCZ/btrapFTlwsv/FI7bhxR57sk0k0qhDN3c40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9cUCZ%2FbtrapFTlwsv%2FFI7bhxR57sk0k0qhDN3c40%2Fimg.png&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;169&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[표15-2] InputStream과 OutputStream에 정의된 읽기와 쓰기를 수행하는 메서드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;14-보조스트림&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1.4 보조스트림&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 실제 데이터를 주고받는 스트림이 아니기 때문에 데이터를 입출력할 수 있는 기능은 없지만, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627166095340&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 먼저 기반스트림을 생성한다.
FileInputStream fis = new FileInpustStream(&quot;test.txt&quot;);

// 기반스트림을 이용해서 보조스트림을 생성한다.
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(); // 보조스트림인 BufferedInputStream으로부터 데이터를 읽는다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 입력기능은 BufferedInputStream과 연결된 FileInputStream이 수행하고, 보조 스트립인 BufferedInputStream은 버퍼만을 제공한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 버퍼를 사용한 입출력과 사용하지 않은 입출력간의 성능차이 때문에 대부분의 경우에 버퍼를 이용한 보조스트림을 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;505&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EgsCt/btraoCJzyRr/xjsKKhfSBq9bgaRt8NP1V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EgsCt/btraoCJzyRr/xjsKKhfSBq9bgaRt8NP1V1/img.png&quot; data-alt=&quot;보조스트림의 종류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EgsCt/btraoCJzyRr/xjsKKhfSBq9bgaRt8NP1V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEgsCt%2FbtraoCJzyRr%2FxjsKKhfSBq9bgaRt8NP1V1%2Fimg.png&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;505&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;보조스트림의 종류&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;15-문자기반-스트림--reader-writer&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1.5 문자기반 스트림 - Reader, Writer&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; Java에서는 한 문자를 의미하는 char형이 1byte가 아니라 2byte이기 때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 바이트기반의 스트림으로 2byte인 문자를 처리하는 데는 어려움이 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 이 점을 보완하기 위해서 문자기반의 스트림이 제공된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;2-바이트기반-스트림&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 바이트기반 스트림&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;21-inputstream과-outputstream&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2.1 InputStream과 OutputStream&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 스트림의 종류에 따라서 &lt;span style=&quot;color: #f89009; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;mark()와 reset()&lt;/b&gt;&lt;/span&gt;을 사용하여 &lt;u&gt;이미 읽은 데이터를 되돌려서 다시 읽을 수 있다. &lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 이 기능을 지원하는 스트림인지 확인하는 markSupported()를 통해서 알 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt; flush()&lt;/b&gt;&lt;/span&gt;는 버퍼가 있는 출력스트림의 경우에만 의미가 있으며, OutputSteream에 정의된 flush()는 아무런 일도 하지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 프로그램이 종료될 때, 사용하고 닫지 않은 스트림을 JVM이 자동적으로 닫아 주기는 하지만, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 스트림을 사용해서 모든 작업을 마치고 난 후에는 close()를 호출해서 반드시 닫아주어야 한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 그러나 ByteArrayInputStream과 같이 메모리를 사용하는 스트림과 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; System.in, System.out과 같은 표준 입출력 스트림은 닫아 주지 않아도 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;22-bytearrayinputstream과-bytearrayoutputstream&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2.2 ByteArrayInputStream과 ByteArrayOutputStream&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 메모리, 즉 바이트배열에 데이터를 입출력 하는데 사용되는 스트림이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;23-fileinputstream과-fileoutputstream&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2.3 FileInputStream과 FileOutputStream&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 파일에 입출력을 하기 위한 스트림&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;3-바이트기반의-보조스트림&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. 바이트기반의 보조스트림&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;31-filterinputstream과-filteroutputstream&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3.1 FilterInputStream과 FilterOutputStream&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 생성자 FilterInputStream(InputStream in)는 접근 제어자가 protected이기 때문에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; FilterInputStream의 인스턴스를 생성해서 사용할 수 없고 상속을 통해서 오버라이딩되어야 한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; FilterInputStrem/FilterOutputStream을 상속받아서 기반스트림에 보조기능을 추가한 보조스트림 클래스는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627166335172&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FilterInputStream의 자손 - BufferedInputStream, DataInputStream, PushbackInputStream 등
FilterOutputStream의 자손 - BufferedInputStream, DataOutputStream, PrintStream 등&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;32-bufferedinputstream과-bufferedoutputstream&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3.2 BufferedInputStream과 BufferedOutputStream&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 스트림의 입출력 효율을 높이기 위해 버퍼를 사용하는 보조스트림으로 한 바이트씩 입출력하는 것보다는 버퍼(바이트 배열)를 이용해서 한 번에 여러 바이트를 입출력하는 것이 빠르기 때문에 대부분의 입출력 작업에 사용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #f89009; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;BufferedInputStream&lt;/b&gt;&lt;/span&gt;은 입력소스로 부터 버퍼 크기만큼의 데이터를 읽어다 자신의 내부 버퍼에 저장하고 프로그램에서는 버퍼에 저장된 데이터를 읽으며, 다 읽고 그 다음 데이터를 읽기 위해 read메서드가 호출되면, BufferedInputStream은 입력소스로부터 다시 버퍼크기 만큼의 데이터를 읽어다 버퍼에 저장하는 작업을 반복한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;BufferedOutputStream&lt;/b&gt; &lt;/span&gt;역시 버퍼를 이용해서 출력소스와 작업을 하게 되는데 프로그램에서 write메서드를 이용한 출력이 BufferedOutputStream의 버퍼에 저장된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;버퍼가 가득 차면, 그 때 버퍼의 모든 내용을 출력소스에 출력한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;u&gt;버퍼가 가득 찼을 때만 출력소스에 출력&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;을 하기 때문에, 마지막 출력부분이 출력소스에 쓰이지 못하고 BufferedOutputStream의 버퍼에 남아있는 채로 프로그램이 종료될 수 있다는 점을 주의해야 한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그래서 프로그램에서 모든 출력작업을 마친 후 BufferedOutputStream에 close()나 flush()를 호출해서 마지막에 버퍼에 있는 모든 내용이 출력소스에 출력되도록 해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;33-datainputstream과-dataoutputstream&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3.3 DataInputStream과 DataOutputStream&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 데이터를 읽고 쓰는데 있어서 byte단위가 아닌, 8가지 기본 자료형의 단위로 읽고 쓰기 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;34-sequenceinputstream&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3.4 SequenceInputStream&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 여러 개의 입력스트림을 연속적으로 연결해서 하나의 스트림으로부터 데이터를 읽는 것과 같이 처리할 수 있도록 도와준다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;183&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BLmlA/btrapFeJQNC/klMNPl7bOeeXKfBjlSJ471/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BLmlA/btrapFeJQNC/klMNPl7bOeeXKfBjlSJ471/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BLmlA/btrapFeJQNC/klMNPl7bOeeXKfBjlSJ471/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBLmlA%2FbtrapFeJQNC%2FklMNPl7bOeeXKfBjlSJ471%2Fimg.png&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;183&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;35-printstream&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3.5 PrintStream&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 데이터를 기반스트림에 다양한 형태로 출력할 수 있는 print, println, printf와 같은 메서드를 오버로딩하여 제공&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;4-문자기반-스트림&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4. 문자기반 스트림&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;41-reader와-writer&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4.1 Reader와 Writer&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; Char 배열을 사용한 문자기반의 스트림 제공. Text의 읽기/쓰기에 특화되어있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;42-filereader와-filewriter&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4.2 FileReader와 FileWriter&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; File로부터 Text 데이터를 읽고 쓰는데 사용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;43-pipedreader와-pipedwriter&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4.3 PipedReader와 PipedWriter&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 주로 쓰레드 간에 데이터를 주고 받을 때 사용된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;44-stringreader와-stringwriter&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4.4 StringReader와 StringWriter&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; StringReader/Writer는 입출력 대상이 메모리인 스트림이다. 내부의 StringBuffer에 저장된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; StringReader는 문자열 데이터를 Reader 형태로 변환해준다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 문자열 데이터를 오직 Reader를 기반으로 접근하게 변환이 필요할 경우 유용한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;5-문자기반의-보조스트림&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;5. 문자기반의 보조스트림&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;51-bufferedreader와-bufferedwriter&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;5.1 BufferedReader와 BufferedWriter&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; BufferedReader/BufferedWriter 버퍼를 이용해서 입출력의 효율을 높일 수 있게 해주는 역할을 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; Buffer Size : bufferedReader의 버퍼사이즈를 정할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;52-inputstreamreader와-outputstreamwriter&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;5.2 InputStreamReader와 OutputStreamWriter&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; Byte 기반 스트림을 문자기반 스트림으로 연결시켜주는 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 주로 파일이나 네트워트 연결로부터 Byte로 제공되는 Text를 문자기반(char)로 읽고 쓰기를 할 경우에 많이 쓰인다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; Read() : char 값의 정수를 리턴한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;400&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wB3yo/btraqReWpaN/PCvyXSmAke5FIL1F4WnSV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wB3yo/btraqReWpaN/PCvyXSmAke5FIL1F4WnSV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wB3yo/btraqReWpaN/PCvyXSmAke5FIL1F4WnSV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwB3yo%2FbtraqReWpaN%2FPCvyXSmAke5FIL1F4WnSV0%2Fimg.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;400&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;6-표준입출력과-file&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6. 표준입출력과 File&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;61-표준입출력--systemin-systemout-systemerr&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6.1 표준입출력 - System.in, System.out, System.err&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;위의 세 스트림은 JVM이 시작할때 초기화가 되므로 직접 초기화를 할 필요가 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;System.in&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;System.in 은 콘솔의 키보드 인풋에 연결된 inputStream이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;System.out&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;System.out은 PrintStream이다. 콘솔로 데이터를 내보는 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #f89009; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;System.err&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;System.err PrintStream이다. System.out과 비슷하지만 일반적으로 에러메세지를 내보낼때 사용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;System.out과 System.err 사용비교&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627166655543&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;try {
  InputStream input = new FileInputStream(&quot;test.txt&quot;);
  System.out.println(&quot;File opened...&quot;);

} catch (IOException e){
  System.err.println(&quot;File opening failed:&quot;);
  e.printStackTrace();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;62-표준입출력의-대상변경--setout-seterr-setin&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6.2 표준입출력의 대상변경 - setOut(), setErr(), setIn()&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; InputStream으로 System.in, OutputStream으로 System.out, System.err의 읽기/쓰기를 새로우 스트림으로 변경할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;nbsp; &amp;nbsp; System Stream 설정&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627166673397&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;OutputStream output = new FileOutputStream(&quot;system.out.txt&quot;);
PrintStream printOut = new PrintStream(output);

System.setOut(printOut);&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;63-randomaccessfile&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6.3 RandomAccessFile&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 입력과 출력을 하나의 클래스로 파일에 대한 입력/출력을 모두 할 수 있게 설계된 클래스. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 가장 큰 장점은 파일의 어느 위치에나 읽기/쓰기가 가능하다는 점이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627166770528&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//RandomAccessFile 생성, 
//생성자의 두번째 값 'rw'는 RandomAccessFile의 mode 값이다. rw는 Read/Write를 뜻한다.

RandomAccessFile file = new RandomAccessFile(&quot;file.txt&quot;, &quot;rw&quot;);

//RandomAccessFile 이동

RandomAccessFile file = new RandomAccessFile(&quot;file.txt&quot;, &quot;rw&quot;);

//단위 : Byte
file.seek(200);

long pointer = file.getFilePointer();

file.close();

//RandomAccessFile 읽기/쓰기

//읽기 사용법
RandomAccessFile file = new RandomAccessFile(&quot;file.txt&quot;, &quot;rw&quot;);

int aByte = file.read();

file.close();

//쓰기 사용법
RandomAccessFile file = new RandomAccessFile(&quot;file.txt&quot;, &quot;rw&quot;);

file.write(&quot;Hello World&quot;.getBytes());

file.close();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6.4 File&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; File클래스는 파일과 파일의 메타데이터의 접근하는 기능만 제공한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 만약 파일의 내용을 읽기/쓰기 기능을 원한다면 file Stream을 이용해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 만약 NIO를 사용한다면 파일에 대한 접근은 java.nio.FileChannel를 사용해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627166971274&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//File 초기화
File file = new File(&quot;input-file.txt&quot;);

//존재여부 확인 (객체 생성시점에 실제 파일이 존재하지 않아도 예외가 발생되지 않는다)
boolean fileExists = file.exists();

//디렉토리 생성
//mkdir() / mkdirs()

File file = new File(&quot;c:\\users\\javastudy\\newdir&quot;);
boolean dirCreated = file.mkdir();

//파일 길이
long length = file.length();

//Rename
boolean success = file.renameTo(new File(&quot;c:\\data\\new-file.txt&quot;));

//파일삭제
boolean success = file.delete();

//디렉토리확인
boolean isDirectory = file.isDirectory();

//파일리스트
File file = new File(&quot;c:\\data&quot;);
String[] fileNames = file.list();
File[]   files = file.listFiles();&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;7-직렬화serialization&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;7. 직렬화(Serialization)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;71-직렬화란&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;7.1 직렬화란?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 직렬화란 객체를 데이터 스트림으로 만드는 것을 뜻한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 객체에 저장된 데이터를 스트림에 쓰기위해 연속적인(serial) 데이터로 변환하는 것을 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;72-objectinputstream과-objectoutputstream&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;7.2 ObjectInputStream과 ObjectOutputStream&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; ObjectInputStream/ObjectOutputStream은 raw 한 byte를 읽는 대신,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; InputStream/OutputStream을 통해 자바 오브젝트를 읽을 수 있도록 해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;73-직렬화가-가능한-클래스-만들기--serializable-transient&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;7.3 직렬화가 가능한 클래스 만들기 - Serializable, transient&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 직렬화가 가능한 클래스를 만드는 방법은 Serializable 인터페이스를 원하는 클래스에 구현(선언)하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; password와 같은 직렬화하지 않을 멤버변수 앞에 transient 를 붙이면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;74-직렬화가능한-클래스의-버전관리&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;7.4 직렬화가능한 클래스의 버전관리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;serialVersionUID&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 직렬화된 객체를 역직렬화할 떄는 직렬화 했을 떄와 같은 클래스를 사용해야한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 하지만 클래스의 내용이 변경된 경우 역직렬화에 실패한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;static 변수나 transient가 붙은 인스턴스변수는 직렬화에 영향을 미치지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;204&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwKzoB/btrany8K1o7/fqGJChTjaUmhdNjs1muSCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwKzoB/btrany8K1o7/fqGJChTjaUmhdNjs1muSCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwKzoB/btrany8K1o7/fqGJChTjaUmhdNjs1muSCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwKzoB%2Fbtrany8K1o7%2FfqGJChTjaUmhdNjs1muSCK%2Fimg.png&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;204&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/Java \ Spring</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/49</guid>
      <comments>https://recoderr.tistory.com/49#entry49comment</comments>
      <pubDate>Sun, 25 Jul 2021 08:04:32 +0900</pubDate>
    </item>
    <item>
      <title>[React]  리액트 라이프사이클, Hooks 알아보기</title>
      <link>https://recoderr.tistory.com/48</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;웹게임 가위바위보&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;본 강의에서는 react의 component를 상속받은 class component를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;React에서 extends Component 후 성능적 이슈가 있을지 react devtools로 확인 후 pure Component를 사용할지 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;쓸데없이 리렌더링이 일어날 때는 pure Component로 전환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;135&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yGuJ5/btranhr6qXd/hezH9qQl58ZoKK3UwgPvTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yGuJ5/btranhr6qXd/hezH9qQl58ZoKK3UwgPvTK/img.png&quot; data-alt=&quot;가위바위보 이미지(한개)를 css로 세가지로 보여줄 수 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yGuJ5/btranhr6qXd/hezH9qQl58ZoKK3UwgPvTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyGuJ5%2Fbtranhr6qXd%2FhezH9qQl58ZoKK3UwgPvTK%2Fimg.png&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;135&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가위바위보 이미지(한개)를 css로 세가지로 보여줄 수 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;background-postion을 통해 하나의 이미지의 부분부분을 재조명해준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1674&quot; data-origin-height=&quot;917&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbjCeQ/btraoCCIwLe/xJ21u6Gi7hpmI0KQtYtGv0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbjCeQ/btraoCCIwLe/xJ21u6Gi7hpmI0KQtYtGv0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbjCeQ/btraoCCIwLe/xJ21u6Gi7hpmI0KQtYtGv0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbjCeQ%2FbtraoCCIwLe%2FxJ21u6Gi7hpmI0KQtYtGv0%2Fimg.jpg&quot; data-origin-width=&quot;1674&quot; data-origin-height=&quot;917&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;React life cycle&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;클래스 컴포넌트의 경우 -&amp;gt; constructor -&amp;gt; render -&amp;gt; ref (있을 경우) -&amp;gt; componentDidMount&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;-&amp;gt; (setState/props 의 값이 변경될 때 -&amp;gt; shouldComponentUpdate(true) -&amp;gt; render -&amp;gt; componentDidUpdate)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;-&amp;gt; 부모 컴포넌트가 현재 컴포넌트 제거시 -&amp;gt; componentWillUnmount -&amp;gt; 컴포넌트 소멸&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;componentDidMount(){ }&lt;/b&gt;&lt;/span&gt; //&amp;nbsp;컴포넌트가&amp;nbsp;첫&amp;nbsp;렌더링된&amp;nbsp;후,&amp;nbsp;여기에&amp;nbsp;비동기&amp;nbsp;요청을&amp;nbsp;많이&amp;nbsp;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;componentDidUpdate(){ }&lt;/b&gt;&lt;/span&gt; //&amp;nbsp;리렌더링&amp;nbsp;후&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;componentWillUnmount(){ }&lt;/b&gt;&lt;/span&gt; //&amp;nbsp;컴포넌트가&amp;nbsp;제거되기&amp;nbsp;직전,&amp;nbsp;비동기&amp;nbsp;요청의&amp;nbsp;정리를&amp;nbsp;많이&amp;nbsp;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;** hooks 에는 라이프사이클 메소드가 없지만 useEffect가 라이프사이클 메소드의 역할을 해준다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; 단 useEffect의 경우 두번째 인자값을 넣을 경우 해당 state의 변화감지시 컴포넌트 전체가 리렌더링 되기 때문에 주의해야한다.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627154475910&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;useEffect(() =&amp;gt; { // componentDidMount, componentDidUpdate 역할(1대1 대응은 아님)
  interval.current = setInterval(changeHand, 100);
  
  return () =&amp;gt;{ // 두번째 인자가 빈값일 때 componentWillUnmount 역할
  	clearInterval(interval.current)
  }

}, [imgCoord]); // 두번째 인자가 있을때 componentDidMount 와 componentDidUpdate 둘 다 수행&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;** class 컴포넌트와 hooks 의 라이플사이클 비교&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- useEffect는 [ ] 인자값으로 update될 state를 지정한다면,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;클래스의 경우 componentDidMount나 componentDidUpdate에서 모든 state를 조건문으로 분기 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(state 별로 처리 내용이 다르면 useEffect가 여러개가 될 수 있다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Serif KR';&quot;&gt;리액트 Hooks&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;useRef&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - getElementById, querySelector 와 같이 특정 DOM을 선택해야되는 상황에서 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;- 컴포넌트 안에서 조회 및 수정 할 수 있는 변수를 관리하는 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (변수값이 변해도 리렌더링되지 않음, 설정후 바로 조회가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; [ 관리할수 있는 변수 ]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1. setTimeout,&lt;span&gt;&amp;nbsp;&lt;/span&gt;setInterval&lt;span&gt;&amp;nbsp;&lt;/span&gt;을 통해서 만들어진&lt;span&gt;&amp;nbsp;&lt;/span&gt;id&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 2. 외부 라이브러리를 사용하여 생성된 인스턴스&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 3. scroll 위치&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; [사용방법]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1. useRef() 를 사용하여 Ref 객체를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1-1. useRef() 를 사용 할 때 파라미터를 넣어주면, 이 값이 .current 값의 기본값이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 2. 생성한 객체를 선택하고 싶은 DOM 에 ref 값으로 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 3. Ref 객체의 .current 값은 설정한 DOM 을 가르킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 4. Ref 객체의 값(.current)을 수정할 때에는 .current 값을 수정하고, 조회시에도 .current를 조회한다.&lt;/p&gt;
&lt;pre id=&quot;code_1627156155179&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const nameInput = useRef();

const onClick = () =&amp;gt; {
    nameInput.current.focus();
}

const nextId = useRef(4);
const onCreate = () =&amp;gt; {
    // ...
    nextId.current += 1;
};
  
return(
    &amp;lt;input ref={nameInput} /&amp;gt;
    &amp;lt;button onClick={onClick}&amp;gt;클릭&amp;lt;/button&amp;gt;
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;969&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMbRbL/btrao7P2nns/KTcCUGn0wUnUqKq0tyOhT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMbRbL/btrao7P2nns/KTcCUGn0wUnUqKq0tyOhT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMbRbL/btrao7P2nns/KTcCUGn0wUnUqKq0tyOhT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMbRbL%2Fbtrao7P2nns%2FKTcCUGn0wUnUqKq0tyOhT0%2Fimg.png&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;969&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p 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: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;useLayoutEffect 와 useEffect 비교&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 id=&quot;useeffect&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;useEffect&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 컴포넌트 렌더링 - 화면 업데이트 -&lt;span&gt;&amp;nbsp;&lt;/span&gt;useEffect실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 비동기적으로 실행됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - DOM과 인터렉션이 없는 경우에 사용(대부분 경우)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;uselayouteffect&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;useLayoutEffect&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 컴포넌트 렌더링 -&lt;span&gt;&amp;nbsp;&lt;/span&gt;useLayoutEffect&lt;span&gt;&amp;nbsp;&lt;/span&gt;실행 - 화면 업데이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 동기적으로 실행됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 렌더링 직후 DOM요소의 값을 읽을 때 유용함(scroll position등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - DOM을 mutate할 경우에 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;useEffect를 사용할 경우 effect가 실행됨과 동시에 DOM에 mutation이 일어날 경우 flickering이 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이러한 경우&lt;span&gt;&amp;nbsp;&lt;/span&gt;useLayoutEffect를 사용해서 flickering(깜빡임)을 막을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;결국 두 hook의 가장 큰 차이점은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;실행 시점&lt;/b&gt;&lt;/span&gt;이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;렌더링할 state가 이펙트 내에서 초기화되어야 할 경우, 사용자 경험을 위해 useLayoutEffect을 사용하는 편이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;442&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AlHwe/btrao6cwQSQ/zjvILVs7LyCbeQzVOVLLwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AlHwe/btrao6cwQSQ/zjvILVs7LyCbeQzVOVLLwk/img.png&quot; data-alt=&quot;로또추첨기 중 반복수행될 부분을 component화 하였다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AlHwe/btrao6cwQSQ/zjvILVs7LyCbeQzVOVLLwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAlHwe%2Fbtrao6cwQSQ%2FzjvILVs7LyCbeQzVOVLLwk%2Fimg.png&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;442&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로또추첨기 중 반복수행될 부분을 component화 하였다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #222222;&quot;&gt;고차 컴퍼넌트(Higher Order Component, HOC)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; - &lt;span style=&quot;color: #222222;&quot;&gt;HOC는 &lt;/span&gt;컴포넌트를 다른 컴포넌트로 감싸는 형태를 취하고 있고 &lt;span style=&quot;color: #000000;&quot;&gt;컴포넌트를 인자로 받아 새로운 컴포넌트롤 다시 return한다.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; - React.memo를 사용하면 PureComponent 역할을 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;React.memo&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[작동기전]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 컴퍼넌트가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;React.memo()&lt;span style=&quot;color: #222222;&quot;&gt;로 래핑 될 때, React는 컴퍼넌트를 렌더링하고 결과를 메모이징(Memoizing)한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 다음 렌더링이 일어날 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;props&lt;span style=&quot;color: #222222;&quot;&gt;가 같다면, React는 메모이징(Memoizing)된 내용을 재사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 컴포넌트에서 리렌더링이 필요한 상황에서만 리렌더링을 하도록 설정한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 비슷한 역할을 하는 useCallback, useMemo, React.memo 는 렌더링 최적화로 컴포넌트의 성능을 실제로 개선할 때 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- React.memo 에서 두번째 파라미터에 propsAreEqual 이라는 함수를 사용하여 특정 값들만 비교를 하는 것도 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;useMemo()&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 값을 메모이징해서 재사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- useMemo의 두번째 인자가 변경되면 초기화된다.&lt;/p&gt;
&lt;pre id=&quot;code_1627164385238&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function NameTag(props) {
	return useMemo( () =&amp;gt; &amp;lt;div&amp;gt;{props.name}&amp;lt;/div&amp;gt; , [props.name] )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;useCallback()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 함수 자체를 메모이징해서 재사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- useCallback의 두번째 인자가 변경되면 초기화된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- useCallback&lt;span style=&quot;color: #555555;&quot;&gt;은 상하위 컴포넌트 관계에서 &lt;span style=&quot;color: #f89009; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;상위 컴포넌트가 넘겨주는 props를 핸들링하는 역할&lt;/b&gt;&lt;/span&gt;을 하는데, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;하위 컴포넌트가 그 부분을 신경쓰지 않고 상위 컴포넌트의 렌더링 여부에 따라 자동으로 렌더링이 되면 무용지물이되기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;React.memo 또는 useMemo와 함께 사용되어야한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627164541396&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const memoizedCallback = useCallback(
	() =&amp;gt; {doSomething(a,b);}, //inline callback
	[a, b], //dependency
);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Hooks 사용 tip&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1. hooks를 한번 선언하면 순서를 지켜주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;따라서 조건문 안에는 절대 넣으면 안되고, 함수나 반복문, 다른 hooks 안에서 사용하면 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2. useEffect 패턴&lt;/p&gt;
&lt;pre id=&quot;code_1627165385210&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;useEffect(() =&amp;gt; {
	//ajax
}, []); //componentDidMount에서만 실행


const mounted = useRef(false);
useEffect(()=&amp;gt;{
	if(!mounted.current){
    	mounted.current = true;
    } else {
    	//ajax
    }
}, [바뀌는 값]); //componentUpdate에서만 실행&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;196&quot; data-origin-height=&quot;165&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o5GmF/btrapFyV6bK/6cvwO3wAY3YMrkxcIPrtP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o5GmF/btrapFyV6bK/6cvwO3wAY3YMrkxcIPrtP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o5GmF/btrapFyV6bK/6cvwO3wAY3YMrkxcIPrtP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo5GmF%2FbtrapFyV6bK%2F6cvwO3wAY3YMrkxcIPrtP0%2Fimg.png&quot; data-origin-width=&quot;196&quot; data-origin-height=&quot;165&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&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; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;라이프사이클 메소드 &lt;a href=&quot;https://react.vlpt.us/basic/25-lifecycle.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://react.vlpt.us/basic/25-lifecycle.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;useRef &lt;a href=&quot;https://react.vlpt.us/basic/12-variable-with-useRef.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://react.vlpt.us/basic/12-variable-with-useRef.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;useLayoutEffect&amp;nbsp;&lt;a href=&quot;https://merrily-code.tistory.com/46&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://merrily-code.tistory.com/46&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;React.memo() &lt;a href=&quot;https://ui.toast.com/weekly-pick/ko_20190731&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ui.toast.com/weekly-pick/ko_20190731&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의정보&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;플랫폼 : 인프런&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;강의 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;웹 게임을 만들며 배우는 React&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;강사 : 제로초(조현영)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;개발환경 : vscode, react&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;url :&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.inflearn.com/course/web-game-react&quot;&gt;https://www.inflearn.com/course/web-game-react&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Programming/JavaScript</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/48</guid>
      <comments>https://recoderr.tistory.com/48#entry48comment</comments>
      <pubDate>Sun, 25 Jul 2021 05:39:59 +0900</pubDate>
    </item>
    <item>
      <title>[React ] Webpack으로 React.js 빌드하기</title>
      <link>https://recoderr.tistory.com/47</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;572&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tTKAc/btrapszqTz7/udRil2vLbdZ1LypKEki8FK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tTKAc/btrapszqTz7/udRil2vLbdZ1LypKEki8FK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tTKAc/btrapszqTz7/udRil2vLbdZ1LypKEki8FK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtTKAc%2FbtrapszqTz7%2FudRil2vLbdZ1LypKEki8FK%2Fimg.png&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;572&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;webpack을 사용하는 이유&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;웹팩은 모듈 번들러이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;코딩할 때 편의를 위해 여러 개의 모듈로 나눠서 작업하는 경우가 많은데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;브라우저에서 파일 단위 모듈 시스템을 이용하는 것은 많은 네트워크 비용 낭비를 유발한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이러한 문제를 해결하기 위해서 여러 개의 모듈을 하나의 파일로 묶어서 보낼 모듈 번들러가 웹팩이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;웹팩에서는 자바스크립트, 스타일시트, 이미지 등 모든 것을 모듈로 취급한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(webpack을 이용하기 위해서는 node(자바스크립트 실행기)를 알아야한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(실제 서비스할때는 webpack을 사용하지 않고, 개발시에만 사용한다.)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;모듈 시스템과 웹팩&amp;nbsp;설정 (&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;react 기본 설정)&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;size14&quot;&gt;1. package.json (실행 명령어 &amp;gt;&amp;gt; npm init)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; package.json&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; package name: (ifn_webgame) ifn_webgame (원하는 이름)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; author, license 를 제외한 나머지는 건너뛰어도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2. npm install 명령어로 필요한 라이브러리를 설치한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; react, react-dom, webpack, webpack-cli 설치&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; (webpack은 개발환경에서만 사용되므로 npm install -D 로 표기하여 dependency를 나누어 준다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #8a3db6;&quot;&gt;npm i -D @babel/core @babel/preset-env babel-loader &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;(babel도 개발환경에서만 사용됨)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; babel/core : 바벨의 기본적인 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; babel/preset-env :브라우저에 맞는 최신문법을 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; babel-loader : babel과 webpack을 연결시켜줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;3. index.html&lt;/p&gt;
&lt;pre id=&quot;code_1627139015540&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//index.html

&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;가위바위보&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;root&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;script src=&quot;./dist/app.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;4. client.jsx&lt;/p&gt;
&lt;pre id=&quot;code_1627139060071&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//client.jsx

const React = require('react');
const ReactDom = require('react-dom');

ReactDom.render('컴포넌트명', document.querySelector('#root'));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;ReactDom.render('컴포넌트명',&amp;nbsp;document.querySelector('#root'));&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;lt;div id = &quot;root&quot;&amp;gt;&amp;lt;/div&amp;gt; 안에 app.js를 통에 렌더링된 컴포넌트의 return값(jsx, html태그들)을 넣어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;5. webpack.config.js&lt;/p&gt;
&lt;pre id=&quot;code_1627137228770&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//webpack.config.js

const path = require('path'); 

module.exports = {
	//webpack 속성들을 기재
    name: 'setting',
    mode: 'development', //실서비스 :production
    devtool: 'eval', //빠르게
    resolve: {
        extensions:['.js', '.jsx'] //entry에 포함되는 파일의 확장자를 확인해주기 때문에 app.js라면 app 만 넣어줘도 된다.
    },
    entry : {
        app: ['./client.jsx', './RSP.jsx'], // 만약 client.jsx 에서 RSP.jsx를 rendering 하고 있으면 client.jsx 만 기재해도 된다. 
    }, //입력
    
    module: {
        rules : [{
            test : /\.jsx?/,  // .js 와 .jsx 에 적용하겠다는 정규식
            loader : 'bable-loader',
            options : {
                presets : [ 
                	['@babel/preset-env', {
                    	targets : {
                        	browsers : ['last 2 chrome versions'],
                        },
                    }],
                    '@babel/preset-react',
                ],
                plugins : [ '@babel/plugin-proposal-class-properties'],
            },
        }],
    },
    
    output :{
        path : path.join(__dirname, 'dist'),  // __dirname 현재폴더에 dist를 합쳐서 반환한다.
        filename: 'app.js',
        publicPath:'/dist/', //가상경로
    }, //출력
    devServer :{
        publicPath:'/dist/',
        hot : true,
    },
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;html에서 &amp;lt;script src=&quot;./dist/app.js&quot;&amp;gt;&amp;lt;/script&amp;gt; 하나만 넣을수 있도록 webpack.config.js 에서 설정해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;resolve 속성&lt;/b&gt;&lt;/span&gt;에 extensions에 적은 확장자를 적어두면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;entry 속성&lt;/b&gt;&lt;/span&gt;에 포함될 파일의 확장자를 확인해주기 때문에 app.js라면 app 만 넣어줘도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;resolve 속성이 없을 경우 : app: ['./client.jsx', './RSP.jsx']&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;resolve extensions:['.js', '.jsx'] 로 정의할 경우 app:['client', 'RSP']&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;//&amp;nbsp;만약&amp;nbsp;client.jsx&amp;nbsp;에서&amp;nbsp;RSP.jsx를&amp;nbsp;rendering&amp;nbsp;하고&amp;nbsp;있으면&amp;nbsp;client.jsx&amp;nbsp;만&amp;nbsp;기재해도&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;module 속성&lt;/b&gt;&lt;/span&gt;은 babel을 적용시키기 위한 옵션을 나열한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;create-react-app&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;을 이용하면 이와 같은 설정을 사용하지 않아도 된다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #8a3db6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; .js 와 .jsx 는 큰 차이가 없지만 파일안에 jsx 문법(만들어둔 컴포넌트 불러오기 ex &amp;lt;GuGuDan / &amp;gt;)을 사용할 경우&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #8a3db6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; jsx 확장자를 사용하는 것이 좋다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #8a3db6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; (jsx문법을 담고있다, 리액트전용 파일임을 파일명만 보고 인지할수 있어 편리하다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #8a3db6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;279&quot; data-origin-height=&quot;71&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chrwJT/btrapssCsXR/QwZceSvOzv0czK6rLeRr60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chrwJT/btrapssCsXR/QwZceSvOzv0czK6rLeRr60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chrwJT/btrapssCsXR/QwZceSvOzv0czK6rLeRr60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchrwJT%2FbtrapssCsXR%2FQwZceSvOzv0czK6rLeRr60%2Fimg.png&quot; data-origin-width=&quot;279&quot; data-origin-height=&quot;71&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;webpack.config.js 를 이용하여 하나의 js 파일을 생성하려면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;npx webpack 을 실행하거나 package.json 파일에 webpack 실행 명령어를 생성해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(&quot;scripts&quot;: { &quot;webpack&quot; : webpack } )&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;130&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2DFFD/btranbsg0Qp/lBcQesfHexklffqJLEux41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2DFFD/btranbsg0Qp/lBcQesfHexklffqJLEux41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2DFFD/btranbsg0Qp/lBcQesfHexklffqJLEux41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2DFFD%2Fbtranbsg0Qp%2FlBcQesfHexklffqJLEux41%2Fimg.png&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;130&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;webpack.config.js 빌드시 에러 내용 1&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;[webpack-li] Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;configuration.module&amp;nbsp;should&amp;nbsp;be&amp;nbsp;an&amp;nbsp;object: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;object&amp;nbsp;{&amp;nbsp;defaultRules?,&amp;nbsp;exprContextCritical?,&amp;nbsp;exprContextRecursive?,&amp;nbsp;exprContextRegExp?,&amp;nbsp;exprContextRequest?,&amp;nbsp;generator?,&amp;nbsp;noParse?,&amp;nbsp;parser?,&amp;nbsp;rules?,&amp;nbsp;strictExportextCritical?,&amp;nbsp;wrappedContextRecursive?,&amp;nbsp;wrappedContextRegExp?&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt;&amp;nbsp;Options&amp;nbsp;affecting&amp;nbsp;the&amp;nbsp;normal&amp;nbsp;modules&amp;nbsp;(`NormalModuleFactory`).&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;module: [{ rules &lt;/b&gt;&lt;/span&gt;라고 적어서 발생한 에러이다. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;module: { rules&lt;/b&gt;&lt;/span&gt; 로 수정하면 정상적으로 빌드된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;211&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b38hXi/btrakoSOoxC/ruTs7ymwpj0HnkFn1GKNxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b38hXi/btrakoSOoxC/ruTs7ymwpj0HnkFn1GKNxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b38hXi/btrakoSOoxC/ruTs7ymwpj0HnkFn1GKNxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb38hXi%2FbtrakoSOoxC%2FruTs7ymwpj0HnkFn1GKNxK%2Fimg.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;211&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;webpack.config.js 빌드시 에러 내용 2&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;[webpack-cli]&amp;nbsp;Failed&amp;nbsp;to&amp;nbsp;load&amp;nbsp;'C:\Users\mslk\Documents\ifn_webgame\webpack.config.js'&amp;nbsp;config &lt;br /&gt;[webpack-cli]&amp;nbsp;TypeError:&amp;nbsp;webpack.LoaderOptionsPlugin&amp;nbsp;is&amp;nbsp;not&amp;nbsp;a&amp;nbsp;constructor &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;Object.&amp;lt;anonymous&amp;gt;&amp;nbsp;(C:\Users\mslk\Documents\ifn_webgame\webpack.config.js:33:9) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;Module._compile&amp;nbsp;(C:\Users\mslk\Documents\ifn_webgame\node_modules\v8-compile-cache\v8-compile-cache.js:192:30) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;Object.Module._extensions..js&amp;nbsp;(internal/modules/cjs/loader.js:1092:10) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;Module.load&amp;nbsp;(internal/modules/cjs/loader.js:928:32) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;Function.Module._load&amp;nbsp;(internal/modules/cjs/loader.js:769:14) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;Module.require&amp;nbsp;(internal/modules/cjs/loader.js:952:19) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;require&amp;nbsp;(C:\Users\mslk\Documents\ifn_webgame\node_modules\v8-compile-cache\v8-compile-cache.js:159:20) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;WebpackCLI.tryRequireThenImport&amp;nbsp;(C:\Users\mslk\Documents\ifn_webgame\node_modules\webpack-cli\lib\webpack-cli.js:32:22) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;loadConfig&amp;nbsp;(C:\Users\mslk\Documents\ifn_webgame\node_modules\webpack-cli\lib\webpack-cli.js:1536:38) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;WebpackCLI.resolveConfig&amp;nbsp;(C:\Users\mslk\Documents\ifn_webgame\node_modules\webpack-cli\lib\webpack-cli.js:1639:44)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;396&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NDYnw/btrao6p1FDe/nKkBbreOsDtrMCVcW46Q90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NDYnw/btrao6p1FDe/nKkBbreOsDtrMCVcW46Q90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NDYnw/btrao6p1FDe/nKkBbreOsDtrMCVcW46Q90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNDYnw%2Fbtrao6p1FDe%2FnKkBbreOsDtrMCVcW46Q90%2Fimg.png&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;396&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;LoaderOptionsPlugin이 웹팩 2에서 2로 웹팩 1에서 마이그레이션을 위해&lt;span&gt; 사용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;webpack 공식문서 plugins 에서 v5 plugin 리스트에서는 확인되지 않아서 삭제된 줄 알았는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #ee2323;&quot;&gt;&lt;b&gt;new webpack.LoaderOptionsPlugin ({ debug : true })&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;대신&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #ee2323;&quot;&gt;&lt;b&gt;const&amp;nbsp;LoaderOptionsPlugin&amp;nbsp;=&amp;nbsp;require('webpack/lib/LoaderOptionsPlugin');&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #ee2323;&quot;&gt;&lt;b&gt;new LoaderOptionsPlugin ({ debug : true })&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;로 변경하면 정상적으로 빌드된다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;webpack-dev-server 와 핫 리로딩&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;npm install -D&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; react-refresh&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; @pmmmwh/react-refresh-webpack-plugin&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; webpack-dev-server&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- webpack-dev-server 는 핫 리로딩 기능을 가지고 있어서 변경점을 감지할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; 따라서 소스코드의 변경이 생기면 감지 후 webpack.config.js 빌드 결과물 즉, app.js 를 수정해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; (핫리로딩을 하기 위해 설치한 플러그인&amp;nbsp; react-refresh, @pmmmwh/react-refresh-webpack-plugin )&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;nbsp; (핫리로딩은 리로딩(새로고침)과 다르게 기존의 데이터를 유지하면서 리로딩해준다.)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&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; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;browserlist &lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&lt;a href=&quot;https://github.com/browserslist/browserslist&quot;&gt;https://github.com/browserslist/browserslist&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웹팩 공식문서&lt;/span&gt; &lt;a href=&quot;https://webpack.js.org/concepts/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://webpack.js.org/concepts/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&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;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의정보&amp;nbsp;  &lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;플랫폼 : 인프런&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;강의 : &lt;span style=&quot;color: #333333;&quot;&gt;웹 게임을 만들며 배우는 React&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;강사 : 제로초(조현영)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;개발환경 : vscode, react&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;url :&lt;span&gt;&lt;span&gt; &lt;a href=&quot;https://www.inflearn.com/course/web-game-react&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/web-game-react&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;196&quot; data-origin-height=&quot;165&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kzhx1/btranx2SsVB/5sSzK72QhJ2BlAysronK4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kzhx1/btranx2SsVB/5sSzK72QhJ2BlAysronK4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kzhx1/btranx2SsVB/5sSzK72QhJ2BlAysronK4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkzhx1%2Fbtranx2SsVB%2F5sSzK72QhJ2BlAysronK4K%2Fimg.png&quot; data-origin-width=&quot;196&quot; data-origin-height=&quot;165&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/JavaScript</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/47</guid>
      <comments>https://recoderr.tistory.com/47#entry47comment</comments>
      <pubDate>Sun, 25 Jul 2021 02:47:24 +0900</pubDate>
    </item>
    <item>
      <title> 자바스터디  자바의 정석 CH14 람다와 스트림</title>
      <link>https://recoderr.tistory.com/46</link>
      <description>&lt;h2 id=&quot;1-람다식&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1. 람다식&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p id=&quot;11-람다식이란&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.1 람다식이란?&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;람다식은 메서드를 하나의 식(expression)으로 표현한 것.&lt;/p&gt;
&lt;pre id=&quot;code_1626574356128&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- 객체 지향 언어보다는 함수 지향 언어에 가깝다.
- 함수를 간략하면서도 명확한 식으로 표현할 수 있도록 해준다.
- 메서드를 람다식으로 표현하면 메서드의 이름 및 반환 값이 없어지므로 익명 함수 라고도 한다.
- 람다식의 형태는 매개 변수를 가진 코드 블록이지만 런타임 시에는 익명 구현 객체를 생성한다.&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;12-람다식-작성하기&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.2 람다식 작성하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1626574397906&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(타입 매개변수) -&amp;gt; { 실행문; ... }

ex)
- ExFunctionInterfaceTest.java

interface ExFunctionInterface
{
    public void method();
}


public class ExFunctionInterfaceTest
{
    public static void main(String[] args)
    {
        ExFunctionInterface test = new ExFunctionInterface() {

            public void method() {
                System.out.println(&quot;test&quot;);
            }
        };

        test.method();
    }
}

public class ExFunctionInterfaceTest
{
    public static void main(String[] args)
    {
        ExFunctionInterface test = () -&amp;gt; System.out.println(&quot;test&quot;);

        test.method();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;반환 값이 있는 메서드의 경우 return 대신 expression 으로 대신할 수 있다. (expression인 경우 ; 를 붙이지 않는다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;람다식에 선언된 매개변수 타입은 추론이 가능한 경우 생략 가능(대부분 생략가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;매개 변수가 하나인 경우 ()를 생략할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;{} 안 문장이 하나인 경우 생략할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;13-함수형-인터페이스functional-interface&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.3 함수형 인터페이스(Functional Interface)&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;size14&quot;&gt;함수형 인터페이스는 람다식을 다루기 위한 인터페이스로 하나의 추상 메서드만 정의되어 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;단, static 메서드와 default 메서드의 개수에는 제약이 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 함수형 인터페이스 타입의 매개변수 및 반환 타입이 함수형 인터페이스 타입이라면&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 람다식을 참조하는 참조변수를 매개변수로 지정하고 람다식을 가리키는 참조변수를 반환하거나 또는 람다식 자체를 반환할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 람다식은 Object 타입으로 형변환 할 수 없으며, 오직 함수형 인터페이스로만 형변환이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 람다식 내에서 참조하는 지역변수는 final이 붙어 있지 않아도 상수로 간주되며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 외부 지역변수와 같은 이름의 매개변수를 허용하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 함수형 인터페이스는 @FuntionalInterface 라는 어노테이션을 붙일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; (컴파일러에서 추상메서드를 갖춘 인터페이스인지 검사,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;javadoc 페이지에서 해당 인터페이스가 함수형 인터페이스임을 알 수 있도록 한다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;14-javautilfunction패키지-803p&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.4 java.util.function패키지&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 메서드 이름 통일&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 재사용성&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 유지보수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;15-function의-합성과-predicate의-결합&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.5 Function의 합성과 Predicate의 결합&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;size14&quot;&gt;- Function의 합성 andThen :&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a.andThen(b) : a함수 적용 후 b함수 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;compose : a.compose(b) : b함수 적용 후 a함수 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;identity : 항등 함수 (잘 사용되지 않는 편이나 map()으로 변환 작업할 때 변환없이 그대로 처리하고자할 때 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- Predicate의 결합&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;and() : and 조건&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;or() : or 조건&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;negate() : not&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;isEqual() : 두 대상 비교&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;16-메서드-참조&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.6 메서드 참조&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;size14&quot;&gt;메서드를 참조해서 매개변수의 정보 및 리턴 타입을 알아내어 람다식에서 불필요한 매개 변수를 제거하는 것이 목적.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;람다식의 매개 변수는 메서드의 매개값을 전달하는 역할만 하기 때문에 메서드 참조를 이용하면 깔끔하게 처리할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1626574758826&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(a, b) -&amp;gt; Math.max(a, b);

Math::max&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;하나의 메서드만 호출하는 람다식은 '클래스이름::메서드이름 또는 '참조변수::메서드이름'으로 바꿀 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;생성자의 메서드 참조&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1626574811954&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Supplier&amp;lt;MyClass&amp;gt; s = () -&amp;gt; new MyClass();
Supplier&amp;lt;MyClass&amp;gt; s = MyClass::new;

Function&amp;lt;Integer, MyClass&amp;gt; f = (i) -&amp;gt; new MyClass(i);
Function&amp;lt;Integer, MyClass&amp;gt; f2 = MyClass::new;

Function&amp;lt;Integer, int[]&amp;gt; f = x -&amp;gt; new int[x];
Function&amp;lt;Integer, int[]&amp;gt; f2 = int[]::new;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;2-스트림stream&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;2. 스트림(stream)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p id=&quot;21-스트림이란&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;2.1 스트림이란?&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;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 라이브러리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 스트림은 데이터 소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드들을 정의해놓았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 스트림을 이용하면, 배열이나 컬렉션 뿐만 아니라 파일에 저장된 데이터도 모두 같은 방식으로 다룰 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1626574989050&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
문자열 배열 'strArr'과 같은 내용의 문자열을 저장하는 리스트 'strList'가 있을 때, 
각각의 데이터를 정렬하고 출력하는 방법
*/

String[] strArr = {&quot;aaa&quot;, &quot;ddd&quot;, &quot;ccc&quot;};
List&amp;lt;String&amp;gt; strList = Arrys.asList(strArr);

/* 방법1. 예전의 방법 */

Arrays.sort(strArr);
Collections.sort(strList);

for(String str : strArr) 
  System.out.println(str);

for(String str : strList)
  System.out.println(str);
  
/* 방법2. 스트림을 활용한 방법 */

Stream&amp;lt;String&amp;gt; strStreamArr = Arrays.stream(strArr);
Stream&amp;lt;String&amp;gt; strStreamList = strList.stream();

strStremaArr.sorted().forEach(System.out::println);
strStreamList.sorted().forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;스트림의 연산&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1. 중간연산 : 연산결과가 스트림. 연속해서 수행 가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 2. 최종연산 : 연산결과가 스트림이 아님. 스트림의 요소를 소모하기 때문에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;단 한번만&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;중간연산&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 모든 중간연산의 결과는 스트림이지만, 연산 전의 스트림과 같은 것은 아니다.&lt;/p&gt;
&lt;pre id=&quot;code_1626575099555&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String[] strArr = {&quot;dd&quot;, &quot;aaa&quot;, &quot;cc&quot;, &quot;cc&quot;, &quot;e&quot;}

Stream&amp;lt;String&amp;gt; Stream = Stream.of(strArr);
Stream&amp;lt;String&amp;gt; distenctedStream = stream.distinct();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;최종연산&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;450&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZtge4/btq9MEaVazU/2QVdw7YN5B9R3Ps8hjaFyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZtge4/btq9MEaVazU/2QVdw7YN5B9R3Ps8hjaFyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZtge4/btq9MEaVazU/2QVdw7YN5B9R3Ps8hjaFyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZtge4%2Fbtq9MEaVazU%2F2QVdw7YN5B9R3Ps8hjaFyk%2Fimg.png&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;450&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;reduce() : 스트림의 요소를 하나씩 줄여가면서(reducing) 계산한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;collect() : 스트림의 요소를 수집한다. 주로 요소를 그룹화하거나 결과를 컬렉션에 담아 반환하는데 사용된다.&lt;/p&gt;
&lt;pre id=&quot;code_1626575180700&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;String&amp;gt; sortedList = strStreamList.sorted().collect(Collectors.toList());&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;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;스트림의 특징&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1. 스트림은 데이터 소스를 변경하지 않는다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;스트림은 데이터 소스로부터 데이터를 읽기만 할 뿐, 데이터소스를 변경하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;정렬된 결과가 필요할 경우, collect를 활용해서 컬렉션이나 배열에 담아 return할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;2. 스트림은 일회용이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;스트림은 한번 사용하면 닫혀서 다시 사용할 수 없다. 필요하다면 스트림을 다시 생성해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;3. 스트림은 작업을 내부 반복으로 처리한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 내부 반복이란, 반복문을 메서드의 내부에 숨길 수 있다는 것을 의미한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; forEach()&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 스트림에 정의된 메서드 중의 하나로 매개변수에 대입된 람다식을 데이터소스의 모든 요소에 적용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 즉,&lt;span&gt;&amp;nbsp;&lt;/span&gt;forEach()는 메서드 안에&lt;span&gt;&amp;nbsp;&lt;/span&gt;for문을 넣어버린 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;4. 지연된 연산&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 스트림 연산에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;최종 연산이 수행되기 전까지는 중간 연산이 수행되지 않는다.&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 스트림에 대해 sort()나 distinct()같은 중간 연산을 호출해도 즉각적으로 수행되지 않는다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 중간연산을 호출하는 것은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;단지 어떤 작업이 수행되어야하는지를 지정해주는 것일 뿐&lt;/b&gt;&lt;/span&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 최종연산이 수행되어서야 스트림의 요소들이 중간연산을 거치고 최종연산에 소모된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;5. 기본형 스트림&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 오토박싱, 언박싱으로 인한 비효율을 줄이기 위해 데이터 소스의 요소를 기본형으로 다루는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;IntStream, LongStream, DoubleStream&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&amp;nbsp;&lt;/span&gt;이 제공된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 일반적으로 Stream&amp;lt; Integer &amp;gt; 대신 IntStream을 사용하는 것이 더 효율적이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; IntStream에는 int타입으로 작업하는데 유용한 메서드들이 포함되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;6. 병렬스트림&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 앞서 13장에서 fork&amp;amp;join framework으로 병렬처리하는 것에 대해 배웠는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 스트림은 내부적으로 이 framework를 이용해서 연산을 자동적으로 병렬로 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; parallel() 메서드를 호출하면 병렬로 연산이 수행되고, sequential() 메서드를 호출하면 병렬로 처리되지 않게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; 모든 스트림은 기본적으로 병렬 스트림이 아니기 때문에 sequential() 메서드는 parallel()를 취소할 때만 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;22-스트림-만들기&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;2.2 스트림 만들기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1626575521226&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 컬렉션 */

Stream &amp;lt;T&amp;gt; Collection.stream()

List&amp;lt;Integer&amp;gt; list = Arrays.asList(1,2,3,4,5);
Stream&amp;lt;Integer&amp;gt; intStream = list.stream();

/* 배열 */

String[] strArr = {&quot;aaa&quot;, &quot;ddd&quot;, &quot;ccc&quot;};

Stream&amp;lt;String&amp;gt; strStream = Stream.of(strArr); 
Stream&amp;lt;String&amp;gt; strStream = Arrays.stream(strArr);

/* 특정범위의 정수 */

IntStream intStream = IntStream.range(1, 5); // 1,2,3,4 
IntStream intStream = IntStream.rangeClosed(1, 5); // 1,2,3,4,5

/* 난수 */

IntStream ints()
LongStream longs()
DoubleStream doubles()

IntStream intStream = new Random().ints(); // 무한 스트림
intStream.limit(5).forEach(System.out::println); // 5개의 요소만 출력

IntStream intStream = new Random().ints(5); // 크기가 5인 난수 스트림을 반환&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;람다식&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Stream 클래스의 iterate(), generate()는 람다식을 매개변수로 받아서,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이&amp;nbsp;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;람다식에 의해 계산되는 결과값들을 요소로&lt;/span&gt;&lt;/b&gt;&amp;nbsp;하는 무한 스트림을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;iterate()&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;: 이전 결과에 대해 종속적&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;generate()&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;: 이전 결과에 대해 독립적&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;iterate()와 generate()에 의해 생성된 스트림은 아래와 같이 기본형 스트림 타입의 참조변수로 다룰 수 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1626575695358&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;IntStream evenStream = Stream.iterate(0, n-&amp;gt;n+2); //error
DoubleStream randomStream = Stream.generate(Math::random); //error

/* Stream, IntStream 변환하면 사용가능 */
IntStream evenStream = Stream.iterate(0, n-&amp;gt;n+2).mapToInt(Integer::valueOf);
Stream&amp;lt;Integer&amp;gt; stream = evenStream.boxed();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1626575809222&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 파일 */

Stream&amp;lt;Path&amp;gt; Files.list(Path dir) // Path는 파일 또는 디렉토리

/* 빈 스트림 */

//요소가 하나도 없는 비어있는 스트림을 생성할 수도 있다.
//스트림에 연산을 수행한 결과가 하나도 없을 때 null보다는 빈 스트림을 return하는 것이 낫다.

Stream emptyStream = Stream.empty();


/* 두 스트림 연결 */

String[] str1 = {&quot;123&quot;, &quot;456&quot; };
String[] str2 = {&quot;aaa&quot;, &quot;bbb&quot;, &quot;cc&quot;};

Stream&amp;lt;String&amp;gt; strs1 = Stream.of(str1);
Stream&amp;lt;String&amp;gt; strs2 = Stream.of(str2);
Stream&amp;lt;String&amp;gt; strs3 = Stream.concat(strs1, strs2);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;23-스트림의-중간연산&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2.3 스트림의 중간연산&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;중간연산&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;294&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPq7XW/btq9NsH6Pss/Yljms82rbFx0hL47IZFqrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPq7XW/btq9NsH6Pss/Yljms82rbFx0hL47IZFqrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPq7XW/btq9NsH6Pss/Yljms82rbFx0hL47IZFqrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPq7XW%2Fbtq9NsH6Pss%2FYljms82rbFx0hL47IZFqrK%2Fimg.png&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;294&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;sorted()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;는 지정된 Comparator로 스트림을 정렬하는데, int 값을 반환하는 람다식을 사용하는 것도 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;변환 : map()&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;스트림의 요소에 저장된 값 중에서 원하는 필드만 뽑다내거나 특정 형태로 변환해야될 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;174&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NcrJm/btq9O6YA2ii/R3D1RkkULbmUBeqlLDhUNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NcrJm/btq9O6YA2ii/R3D1RkkULbmUBeqlLDhUNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NcrJm/btq9O6YA2ii/R3D1RkkULbmUBeqlLDhUNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNcrJm%2Fbtq9O6YA2ii%2FR3D1RkkULbmUBeqlLDhUNK%2Fimg.png&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;174&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;mapToInt(), mapToLong(), mapToDouble()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;스트림의 요소를 숫자로 반환하는 경우, IntStream같은 기본형 스트림으로 변환하는 것이 더 유용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;기본형 스트림은 숫자를 다루는 데 편리한 메서드들을 제공하기 때문이다.&lt;/p&gt;
&lt;pre id=&quot;code_1626576035500&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;IntStream studentScoreStream = studentStream.mapToInt(Student::getTotalScore);
int allTotalScore = studentScoreStream.sum(); // IntStream의 sum()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;추가적으로 이 메서드들은 최종연산이기 때문에 호출 후 스트림이 닫힌다. 따라서 sum(), average() 를 연속해서 호출할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이러한 경우에 스트림을 또 생성해야하므로 불편하다. 그래서 summarystatics()라는 메서드가 따로 제공된다.&lt;/p&gt;
&lt;pre id=&quot;code_1626576057586&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;IntSummaryStatistics stat = scoreStream.summaryStatistics();

long totalCount = stat.getCount();
long totalScore = stat.getSum();
double avgScore = stat.getAverage();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;mapToObj(), boxed()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;반대로 IntStream을 Stream &amp;lt; T &amp;gt;로 변환할 때는 mapToObj()를, Stream로 변환할 때는 boxed()를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;flatMap()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;스트림의 요소가 배열이거나 map의 연산결과가 배열인경우, Stream &amp;lt; T [] &amp;gt;를 Stream &amp;lt; T &amp;gt;로 다루는 것이 더 편리할 때 flatMap()을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;faltMap()은 map()과 달리 스트림의 스트림이 아닌 스트림으로 만들어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;177&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJtcvs/btq9VkBkIZQ/1Kt9Eoj6LMCf96UKGTeKl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJtcvs/btq9VkBkIZQ/1Kt9Eoj6LMCf96UKGTeKl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJtcvs/btq9VkBkIZQ/1Kt9Eoj6LMCf96UKGTeKl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJtcvs%2Fbtq9VkBkIZQ%2F1Kt9Eoj6LMCf96UKGTeKl1%2Fimg.png&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;177&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;24-optional-t-와-optionalint&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;2.4 Optional&amp;lt; T &amp;gt;와 OptionalInt&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;size14&quot;&gt;Optional은 지네릭클래스로, T타입의 객체를 감싸는 래퍼클래스이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Optional 타입의 객체에는 모든 타입의 참조변수를 담을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;최종 연산의 결과를 그냥 반환하는게 아니라 Optional객체에 담아서 반환을 하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;반환된 결과가 null인지 매번 if문으로 체크하는 대신 Optional에 정의된 메서드를 통해 간단히 처리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Optional 객체생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;참조변수의 값이 null일 가능성이 있으면 of()대신 ofNullable()을 사용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;of()는 매개변수의 값이 null이면 NullPointerException을 발생시키기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1626576259200&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Optional &amp;lt; T &amp;gt; 참조변수의 초기화

Optional &amp;lt;String&amp;gt; optVal = null;                     //null로 초기화
Optional &amp;lt;String&amp;gt; optVal = Optional.&amp;lt;String&amp;gt;empty(); //빈 객체로 초기화

// Optional 객체의 값 가져오기

Optional&amp;lt;String&amp;gt; optVal = Optional.of(&quot;abc&quot;);

String str1 = optVal.get(); 
// optVal에 저장된 값을 반환. null이면 예외발생 

String str2 = optVal.orElse(&quot;&quot;); 
// optVal에 저장된 값이 null일 때는, &quot;&quot;를 반환 

String str3 = optVal.orElseGet(String::new); 
// 람다식 사용가능 () -&amp;gt; new String()

String str4 = optVal.orElseThrow(NullPointerException::new); 
// 널이면 예외발생

// isPresent()

if(Optional.ofNullable(str).isPresent()) { 
  System.out.println(str); //Optional 객체의 값이 null이면 false, 아니면 true를 반환한다.
}

// ifPresent()
Optional.ofNullable(str).ifPresent(System.out::println);

// OptionalInt, OptionalLong, OptionalDouble

public final class OptionalInt {
  ...
  private final boolean isPresent; // 값이 저장되어 있으면 true
  private final int value; // int타입의 변수
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;25-스트림의-최종연산&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2.5 스트림의 최종연산&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;최종연산&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;455&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1RG1o/btq9MtzVn1R/2nAlEynOS0RBGxdK53coi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1RG1o/btq9MtzVn1R/2nAlEynOS0RBGxdK53coi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1RG1o/btq9MtzVn1R/2nAlEynOS0RBGxdK53coi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1RG1o%2Fbtq9MtzVn1R%2F2nAlEynOS0RBGxdK53coi1%2Fimg.png&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;455&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;reduce()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;스트림의 요소를 하나씩 줄여가면서(reducing) 계산하고 최종결과를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;처음 두 요소를 가지고 연산한 결과를 가지고 그 다음 요소와 연산한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;이 과정에서 스트림의 요소를 하나씩 소모하게 되며, 스트림의 모든 요소를 소모하게 되면 그 결과를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;** 최종연산 count(), sum() 등은 내부적으로 모두 reduce를 이용해서 작성된 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;26-collect&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;2.6 collect()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;collect()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 스트림의 요소를 수집한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 주로 요소를 그룹화하거나 결과를 컬렉션에 담아 반환하는데 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Collector&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; collect에 필요한 메서드를 정의해놓은 인터페이스이다&lt;/p&gt;
&lt;pre id=&quot;code_1626576422603&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface Collector &amp;lt;T, A, R&amp;gt; {     
//T(요소)를 A에 누적한 다음 결과를 R로 변환해서 return

  Supplier &amp;lt; A &amp;gt;   supplier();   
  //StringBuilder::new   
  //결과를 저장할 공간(A)을 제공

  BiConsumer &amp;lt; A, T &amp;gt; accumulator();   
  //(sb, s) -&amp;gt; sb.append(s) 
  //스트림의 요소를 수집(collect)할 방법을 제공

  BinaryOperator &amp;lt; A &amp;gt; combiner();   
  //(sb1, sb2) -&amp;gt; sb1.append(sb2) 
  //두 저장공간(A)을 결합할 방법을 제공(병렬 스트림)

  Function &amp;lt; A, R &amp;gt; finisher();   
  //sb -&amp;gt; sb.toString()  
  //최종변환
  //변환할 필요가 없는 경우, x-&amp;gt;x

  Set&amp;lt;Characteristics&amp;gt; characteristics;  
  //컬렉터의 특성이 담긴 set return
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Collectors&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 다양한 기능의 메소드를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- 변환 : mapping(), toList(), toSet(), toMap(), toCollection(), ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- 통계 : counting(), summingInt(), averagingInt(), maxBy(), minBy(), summarizingInt(), ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- 문자열 결합 : joining()&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- 리듀싱 : reducing()&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;- 그룹화와 분할 : partitioningBy() (스트림요소 2분할), groupingBy()(스트림요소 그룹화), collectingAndThen()&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;27-collector구현하기&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;2.7 Collector구현하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; Collector인터페이스를 구현하는 클래스를 작성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1626576556115&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface Collector &amp;lt; T, A, B &amp;gt; {
  //T(요소)를 A에 누적한 다음, 결과를 R로 변환해서 return

  Supplier &amp;lt; A &amp;gt;   supplier();   
  //StringBuilder::new   
  //결과를 저장할 공간(A)을 제공

  BiConsumer &amp;lt; A, T &amp;gt; accumulator();   
  //(sb, s) -&amp;gt; sb.append(s) 
  //스트림의 요소를 수집(collect)할 방법을 제공

  BinaryOperator &amp;lt; A &amp;gt; combiner();   
  //(sb1, sb2) -&amp;gt; sb1.append(sb2) 
  //두 저장공간(A)을 결합할 방법을 제공(병렬 스트림)

  Function &amp;lt; A, R &amp;gt; finisher();   
  //sb -&amp;gt; sb.toString()  
  //최종변환
  //변환할 필요가 없는 경우, x-&amp;gt;x

  Set&amp;lt;Characteristics&amp;gt; characteristics;  
  //컬렉터의 특성이 담긴 Set return
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;characteristics()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;컬렉터가 수행할 작업의 속성정보를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;지정할 특성이 없으면 빈 set을 return한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Example. ConcatCollector&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 문자열 스트림의 모든 요소를 연결하는 컬렉터이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;28-스트림의-변환&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2.8 스트림의 변환&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;204&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/suCin/btq9NYzpFI3/0tz2IVUrnKJsvkWKwzTbqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/suCin/btq9NYzpFI3/0tz2IVUrnKJsvkWKwzTbqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/suCin/btq9NYzpFI3/0tz2IVUrnKJsvkWKwzTbqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsuCin%2Fbtq9NYzpFI3%2F0tz2IVUrnKJsvkWKwzTbqK%2Fimg.png&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;204&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Java \ Spring</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/46</guid>
      <comments>https://recoderr.tistory.com/46#entry46comment</comments>
      <pubDate>Sun, 18 Jul 2021 11:50:08 +0900</pubDate>
    </item>
    <item>
      <title>[React / Node.js] 유튜브 사이트 클론코딩 - 에러 해결, React, ES6 문법 알아보기</title>
      <link>https://recoderr.tistory.com/45</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;175&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drztk1/btq9Rfgd6Vv/yIsZ3Bmjx94wbKITL1pfa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drztk1/btq9Rfgd6Vv/yIsZ3Bmjx94wbKITL1pfa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drztk1/btq9Rfgd6Vv/yIsZ3Bmjx94wbKITL1pfa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdrztk1%2Fbtq9Rfgd6Vv%2FyIsZ3Bmjx94wbKITL1pfa1%2Fimg.png&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;175&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;error 내용&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; Router.use() requires a middleware function but got a Object ....&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; 동영상 강의 그대로 쓰다보니 화면에 나오지 않은 코드를 안적어서 생겼던 문제,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; 이 부분은 server(node) 쪽 router에다 video upload 를 저장하는 내용을 적었던 부분인데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;&amp;nbsp; &amp;nbsp; module&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;exports&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;router&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; 동영상 강의 그대로 쓰다보니 화면에 나오지 않은 코드를 안적어서 생겼던 문제, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; (강사님이 미리 작성했던 모듈에서 복붙해오셨던거라 router를 export 해주는 부분이 안보였었다... )&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;300&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzdSfa/btq9NRUWFtT/LPcu1oLzeuBN935EhKKQVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzdSfa/btq9NRUWFtT/LPcu1oLzeuBN935EhKKQVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzdSfa/btq9NRUWFtT/LPcu1oLzeuBN935EhKKQVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzdSfa%2Fbtq9NRUWFtT%2FLPcu1oLzeuBN935EhKKQVk%2Fimg.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;300&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Express.js&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;server단의 controller 역할(url에 따른 모듈 매칭(route 이용))을 한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;app.use 또는 app.method (get, post, delete 등과 같은 HTTP 메소드)로 사용할수 있으며&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;사용의 폭은 .use가 더 다양하다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1626531793859&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const express = require(&quot;express&quot;);
const app = express();
const cookieParser = require(&quot;cookie-parser&quot;);

// 마운트 경로(url)이 없는 경우 request가 발생시마다 실행된다.
app.use(cookieParser());    

// /api/video 경로에 대한 모든 유형의 HTTP 요청에 대해 실행된다.
// 특정 HTTP 요청에 대한 수행을 원할 경우 app.get 등과 같이 HTTP메소드를 사용하면된다.
app.use('/api/video', require('./routes/video'));
aap.post('/data',function(req,res,next){
    console.log('POST 메서드 / data 주소의 요청일 때만 실행된다.');
    next();
});

//router 하나에 미들웨어를 여러 개 장착할 수도 있다. 
router.get('/', middleware1, middleware2, middleware3);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;강의에서 우리가 만들었던 server/routes/video.js 등과 같은 모듈은 모두 express.js 의 라우터 레벨 미들웨어이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;express&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'express'&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;router&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;express&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;Router&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;module&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;exports&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;router&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이렇게 세트를 이루어 사용해야만 오류나지않고 작동한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;리액트는 민감해서 빌드시 어떠한 모듈에 오류가 발생하면 디비커넥션도 일어나지 않는것 같다. &lt;br /&gt;(아예 컴파일시 에러를 발견하면 마운팅하지 않는것 같다. 추후 리액트 컴포넌트 주기에 대해 공부해보면 알수 있을듯)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1626566709680&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;router.get('/', function(req,res,next){
    next('route');
},function(req,res,next){
    console.log('설치 되지 않았습니다.');
},function(req,res,next){
    next();
});
 
router.get('/',function(req,res){
    console.log('실행됩니다');
    res.render('index',{title:'Express'});
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;next() 그리고 next('router')&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&amp;nbsp;next() &lt;/span&gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;스택내 다음의 미들웨어 함수는 일반적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;next&lt;span style=&quot;color: #555555;&quot;&gt;라는 이름의 변수로 표시한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&amp;nbsp;next('router') &lt;/span&gt;는 라우터에 연결된 나머지 미들웨어들을 건너뛰고 싶을 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;br /&gt;같은 주소의 라우터를 두 개 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;첫 번째 라우터의 첫 번째 미들웨어에서 next('router')를 호출하자&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;두 번째,&amp;nbsp;세 번째 미들웨어는 실행되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;대신&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;주소와 일치하는 다음 라우터로 넘어&lt;/b&gt;간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;만약 next('router')가 없었다면, 첫번째 라우터의 미들웨어가 모두 실행되고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;두번째 라우터도 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;만약 첫번째 라우터에서 res.send 또는 json 등등의 &lt;span style=&quot;color: #000000;&quot;&gt;response methods를 이용하여 요청-응답 주기를 종료했다면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;두번째 라우터는 실행되지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;467&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/spjSw/btq9LrJxirQ/ZNkpYsMXC0IltS8s0O06Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/spjSw/btq9LrJxirQ/ZNkpYsMXC0IltS8s0O06Sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/spjSw/btq9LrJxirQ/ZNkpYsMXC0IltS8s0O06Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FspjSw%2Fbtq9LrJxirQ%2FZNkpYsMXC0IltS8s0O06Sk%2Fimg.png&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;467&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;React에서 arr.prototype.map 활용법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; - 배열의 요소를 돌면서 인자로 전달된 함수를 사용하여 처리 된 새로운 결과를 새로운 배열에 담아 반환하는 함수&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; - 데이터처럼 동일한 요소를 가진 객체를 배열 형태로 반환되었을 때 &lt;span&gt;while, for, forEach 보다 간편하게 반복 처리할수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; ** &lt;/span&gt;리액트(React)에서는 컴포넌트를 렌더링 할때 어떤 원소가 변경되었는지 빠르게 감지하기 위해 key를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;만약 key가 설정되지 않았다면 가상 DOM을 순차적으로 비교하면서 감지하기 때문에 key가 없을때보다 속도가 느리다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;이러한 key 값은 map() 함수를 호출할 때 인자로 넘기는 Callback 함수의 인자로 넘어오는 index 값을 사용하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;19&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PnHy8/btq9Rdbt5Ya/YIIkpPbgpQZBQrKyVQNsV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PnHy8/btq9Rdbt5Ya/YIIkpPbgpQZBQrKyVQNsV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PnHy8/btq9Rdbt5Ya/YIIkpPbgpQZBQrKyVQNsV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPnHy8%2Fbtq9Rdbt5Ya%2FYIIkpPbgpQZBQrKyVQNsV0%2Fimg.png&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;19&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; *** 따라서 key값을 명시해주지 않으면 &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;(ex &amp;lt;div key={index}&amp;gt;)&lt;/b&gt;&lt;/span&gt; 에러를 만날수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;141&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGM7Kq/btq9MFgB0zk/PYBYISojVVB0iIcmxd30Ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGM7Kq/btq9MFgB0zk/PYBYISojVVB0iIcmxd30Ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGM7Kq/btq9MFgB0zk/PYBYISojVVB0iIcmxd30Ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGM7Kq%2Fbtq9MFgB0zk%2FPYBYISojVVB0iIcmxd30Ck%2Fimg.png&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;141&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;**** Map Object도 있는데 arr.map을 사용하는 것에 대한 부분도 index 때문인것 같다고 생각했는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #212529;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #212529;&quot;&gt;key로 index를 사용한다면 배열의 처음이나 중간에 &lt;/span&gt;&lt;span style=&quot;color: #212529;&quot;&gt;새로 데이터가 삽입(삭제) 시 그 부분을 캐치하지 못하기 때문에&lt;/span&gt;&lt;span style=&quot;color: #212529;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #212529;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DB와 연계된 State(변할수 있는 값)은 pk값을 key로 설정하는 것이 좋겠다. &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt; (index를 key값으로 사용하는 것을 지양한다)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;101&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ds3jdP/btq9R5YWbEG/fxPAinKORK4XL5XQOqtt6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ds3jdP/btq9R5YWbEG/fxPAinKORK4XL5XQOqtt6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ds3jdP/btq9R5YWbEG/fxPAinKORK4XL5XQOqtt6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fds3jdP%2Fbtq9R5YWbEG%2FfxPAinKORK4XL5XQOqtt6K%2Fimg.png&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;101&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;React.Fragment&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; React에서 컴포넌트가 여러 엘리먼트를 반환하는 것은 흔한 패턴이고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Fragments는 DOM에 별도의 노드를 추가하지 않고 여러 자식을 그룹화할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;React.Fragment 는 jsx를 사용할때 한 컴포넌트에서 여러 요소들을 반환할때 div로 감싸지 않고 그대로 반환하기 때문에&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Fragment를 사용하면 불필요한 div를 줄일수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;276&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lyRgo/btq9R5YWfwd/esZJ8n8JUPNZzaKQmL3jJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lyRgo/btq9R5YWfwd/esZJ8n8JUPNZzaKQmL3jJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lyRgo/btq9R5YWfwd/esZJ8n8JUPNZzaKQmL3jJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlyRgo%2Fbtq9R5YWfwd%2FesZJ8n8JUPNZzaKQmL3jJK%2Fimg.png&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;276&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Fragment는 대신 &amp;lt;&amp;gt;로 줄여서 사용할 수 있으나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #000000;&quot;&gt;Fragments에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;key&lt;span style=&quot;color: #000000;&quot;&gt;가 있다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;lt;React.Fragment&amp;gt;&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;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (key는 Fragment가 유일하게 가질수 있는 속성이다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&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; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://expressjs.com/ko/guide/using-middleware.html%20&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;express.js 공식 docs &lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://backback.tistory.com/341%20&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;express.js 관련 참고할만한 블로그&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://wooooooak.github.io/frontend/2019/01/30/%EB%A6%AC%EC%95%A1%ED%8A%B8%EB%B0%B0%EC%97%B4%EB%B3%80%EA%B2%BD/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;리액트와 arr.map()&amp;nbsp; 관련 내용 블로그&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://ko.reactjs.org/docs/fragments.html#short-syntax&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;리액트 Fragment 공식문서&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의정보&amp;nbsp;  &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;플랫폼 : 인프런&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;강의 : 따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;강사 : John Ahn&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;개발환경 : vscode, 서버 node.js, 클라이언트 react.js, 데이터베이스 mongoDB&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;boiler-plate git add :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/jaewonhimnae/boilerplate-mern-stack.git&quot;&gt;https://github.com/jaewonhimnae/boilerplate-mern-stack.git&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;url :&lt;span&gt; &lt;a href=&quot;https://www.inflearn.com/course/%EB%94%B0%EB%9D%BC%ED%95%98%EB%A9%B0-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EB%85%B8%EB%93%9C-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%9C%A0%ED%8A%9C%EB%B8%8C-%EB%A7%8C%EB%93%A4%EA%B8%B0/dashboard&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EB%94%B0%EB%9D%BC%ED%95%98%EB%A9%B0-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EB%85%B8%EB%93%9C-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%9C%A0%ED%8A%9C%EB%B8%8C-%EB%A7%8C%EB%93%A4%EA%B8%B0/dashboard&lt;/a&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;169&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXx8H1/btq9C9IN02N/XrK2ywESAFUzc1C9cdfWSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXx8H1/btq9C9IN02N/XrK2ywESAFUzc1C9cdfWSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXx8H1/btq9C9IN02N/XrK2ywESAFUzc1C9cdfWSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXx8H1%2Fbtq9C9IN02N%2FXrK2ywESAFUzc1C9cdfWSk%2Fimg.png&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;169&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/JavaScript</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/45</guid>
      <comments>https://recoderr.tistory.com/45#entry45comment</comments>
      <pubDate>Sun, 18 Jul 2021 07:38:59 +0900</pubDate>
    </item>
    <item>
      <title> 자바스터디  자바의 정석 CH13 쓰레드</title>
      <link>https://recoderr.tistory.com/44</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;13장. 쓰레드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;-프로세스 &amp;amp; 쓰레드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 프로세스 : 실행 중인 프로그램&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 프로세스 구성 : 필요한 데이터 &amp;amp; 메모리 등의 자원, 쓰레드&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 쓰레드 : 실제로 작업을 수행하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ** 쓰레드가 둘 이상이면 멀티쓰레드 프로세스라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ex) 프로세스 = 공장 ,&amp;nbsp; 쓰레드 = 일꾼 이라고 생각하면 이해하기 쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;-멀티쓰레딩&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style4&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;장점&lt;/td&gt;
&lt;td&gt;단점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;- CPU사용률을 향상시킨다.&lt;br /&gt;- 자원을 보다 효율적으로 사용 가능하다.&lt;br /&gt;- 응답성이 향상된다.&lt;br /&gt;- 작업 분리 -&amp;gt; 코드가 간결해진다.&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;- 자원을 공유하는 특성 존재&lt;br /&gt;- 동기화(synchronization), 교착상태(deadlock) 같은 문제들을 고려하면서 프로그래밍 진행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;-쓰레드의 구현 &amp;amp; 실행&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;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- Thread클래스를 상속받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- Runnable인터페이스를 구현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;** 2가지 방법 모두 상관없지만 Thread클래스를 상속받으면 다른 클래스 상속이 안되기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;보통은 Runnable인터페이스 구현을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(Runnable인터페이스는 run()만 정의되어 있는 간단한 인터페이스이다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;-start()&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;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 쓰레드를 생성한 후 start()를 호출해야 쓰레드가 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 쓰레드 작업이 한번 더 진행되어야 한다면 새로운 쓰레드를 한번 더 생성한 다음 start() 호출해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;-start() &amp;amp; run()&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;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - main메서드에서 쓰레드의 start() 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - start()는 새로운 쓰레드 생성, 쓰레드가 작업하는데 사용될 호출스택 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 생성된 호출스택에 run() 호출 -&amp;gt; 쓰레드가 독립된 공간에서 작업 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 호출스택이 2개 -&amp;gt; 스케줄러가 정한 순서에 의해 진행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;-싱글쓰레드 &amp;amp; 멀티쓰레드&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;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 하나의 쓰레드로 2개의 작업을 수행한 시간 : T1&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 2개의 쓰레드로 2개의 작업을 수행한 시간 : T2&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(T1과 T2는 거의 비슷하다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** 멀티쓰레드가 context switching 때문에 좀 더 걸리기 때문에 단순 계산작업은 싱글쓰레드가 더 효율적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;-쓰레드의 I/O블락킹&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;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 서로 다른 자원을 사용하는 작업의 경우 : 멀티쓰레드 프로세스가 더 효율적&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ex) 사용자로부터 입력받는 작업과 화면에 출력하는 작업이 있을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;멀티쓰레드는 하나의 쓰레드가 사용자의 입력을 기다리는 동안 다른 쓰레드가 작업을 처리 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 효율적인 CPU 사용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;-쓰레드의 우선순위&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 쓰레드에 우선순위를 정해 실행시간이 달라질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 범위 : 1~10&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;숫자가 높을수록 우선순위가 높다(10 : 최대우선순위, 1 : 최소우선순위, 5 : 보통우선순위)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 자바가 OS독립적인 특성을 가지고 있지만 쓰레드는 OS 종속적인 특성을 가지고 있어&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;OS마다 다른 방식으로 스케쥴링하기 때문에 컴퓨터마다(OS마다) 다른 결과가 도출될수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;-쓰레드 그룹(Thread Group)&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;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 서로 관련된 쓰레드를 그룹으로 다루기 위한 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 보안상의 이유로 도입된 개념&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 그룹을 지정하지 않으면 자동으로 main쓰레드 그룹에 속하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;-데몬 쓰레드(daemon thread)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 일반 쓰레드의 작업을 보조하는 보조적인 역할을 수행하는 쓰레드&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ex) 가비지 컬렉터, 자동저장, 화면자동갱신 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 데몬 쓰레드가 생성한 쓰레드는 자동으로 데몬 쓰레드가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - setDaemon메서드는 반드시 start()를 호출하기 전에 실행되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;그렇지 않으면 IllegalThreadStateException이 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;-쓰레드의 상태&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;상태&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NEW&lt;/td&gt;
&lt;td&gt;쓰레드가 생성되고 아직 start()는 호출되지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RUNNABLE&lt;/td&gt;
&lt;td&gt;실행 중 또는 실행 가능 상태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BLOCKED&lt;/td&gt;
&lt;td&gt;동기화블럭에 의해 일시정지된 상태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WAITING , TIMED_WAITING&lt;/td&gt;
&lt;td&gt;- 쓰레드의 작업은 종료X, 실행가능하지 않은 일시정지상태&lt;br /&gt;- TIMED_WAITING은 일시정지시간이 지정된 경우&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TERMINATED&lt;/td&gt;
&lt;td&gt;쓰레드의 작업 종료&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;-쓰레드의 실행제어&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 쓰레드의 실행을 제어하는 메서드 제공하여 효율적인 프로그래밍 가능하도록 도와준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sleep() : 지정시간동안 멈춤&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; interrupt() : 쓰레드의 작업을 멈추라고 요청 , 강제성은 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; suspend(), resume(), stop() : 쓰레드의 실행제어를 하는 가장 손쉬운 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;하지만 교착상태를 일으키기 쉬움 -&amp;gt; 현재는 Deprecated됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; join() : 다른 쓰레드의 작업을 기다림&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; yield() : 다른 쓰레드에게 양보&amp;nbsp; -&amp;gt; yield() 와 interrupt()를 잘 사용하면 효율적인 실행 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;-쓰레드의 동기화&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드에게 방해받지 않도록 해야되기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 쓰레드의 동기화는 멀티쓰레드 프로세스에서 필수적으로 고려해야한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;critical section(임계 영역), lock 개념이 도입&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;synchronization(동기화) : 한 쓰레드가 진행 중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[ 쓰레드 동기화 방법]&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;synchronized 키워드를 이용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;메서드를 임계영역으로 지정 OR 특정 영역을 임계영역으로 지정 -&amp;gt; 2가지 방식 존재&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;임계영역에 들어가면 lock(락)을 얻어 작업을 수행 ,&amp;nbsp; 벗어나면 lock(락)을 반환.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;-wait() &amp;amp; notify()&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;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;** sychronized로 동기화 하면 공유 데이터를 보호할 수 있으나,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 특정 쓰레드가 락을 오랜 시간 유지하면 안되기 때문에 wait, notify 메소드가 등장했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;wait() : 쓰레드가 락을 반납하고 기다리게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;notify() : 작업을 중단했던 쓰레드가 다시 락을 얻어 작업을 진행할 수 있게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;204&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cukDhv/btq9kQ2lDE7/6OVVT6crnKikYcGpcfxgRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cukDhv/btq9kQ2lDE7/6OVVT6crnKikYcGpcfxgRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cukDhv/btq9kQ2lDE7/6OVVT6crnKikYcGpcfxgRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcukDhv%2Fbtq9kQ2lDE7%2F6OVVT6crnKikYcGpcfxgRk%2Fimg.png&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;204&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/Java \ Spring</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/44</guid>
      <comments>https://recoderr.tistory.com/44#entry44comment</comments>
      <pubDate>Sun, 11 Jul 2021 11:05:07 +0900</pubDate>
    </item>
    <item>
      <title> 자바스터디  자바의 정석 CH12 지네릭스, 열거형, 어노테이션</title>
      <link>https://recoderr.tistory.com/43</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1.&amp;nbsp;&amp;nbsp;제네릭(Generic)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.1&amp;nbsp;제네릭?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;제네릭의 정의&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;제네릭&lt;/u&gt;&lt;u&gt;(Generic)&lt;/u&gt;은&amp;nbsp;&lt;u&gt;컴파일 시 타입을 체크 해 주는 기능이다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 또는&amp;nbsp;&lt;u&gt;타입을 파라미터화 해서 컴파일 시 구체적인 타입이 결정 되도록 하는 것&lt;/u&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;제네릭의 장점&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;객체의&amp;nbsp;&lt;/u&gt;&lt;u&gt;타입 안정성을 높인다.&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; ※ &quot;타입 안정성을 높인다&quot;는 것은 의도하지 않은 타입의 객체가 저장되는 것을 막고, 저장된 객체를 꺼내올 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;원래의 타입과 다른 타입으로 잘못 형변환 되어 발생할 수 있는 오류를 줄여준다는 뜻이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;br /&gt;-&amp;nbsp;&lt;u&gt;형 변환의 번거로움을 줄여준다.&lt;/u&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.2 제네릭 클래스의 선언&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;제네릭&amp;nbsp;클래스를 작성할 때, Object 타입 대신 타입 매개변수(E)를 선언해서 사용한다.&amp;nbsp;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;① 예를 들어, ArrayList 클래스는 다음과 같이 정의 되어 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625396966469&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ArrayList extends AbstractList{

    private transient Object[] elementData;
    public boolean add(Object o) { /* 내용 생략 */ }
    public Object add(int index) { /* 내용 생략 */ }
    
    ...
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;② 클래스 이름 옆에 '&amp;lt;E&amp;gt;'를 붙인 다음,&amp;nbsp; 'Object'가 모두 'E'로 변경되었다. (JDK 1.5 부터)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625396995004&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ArrayList&amp;lt;E&amp;gt; extends AbstractList&amp;lt;E&amp;gt;{

    private transient E[] elementData;
    public boolean add(E o) { /* 내용 생략 */ }
    public E add(int index) { /* 내용 생략 */ }
    
    ...
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;제네릭 클래스의 객체를 생성할 때는 타입 매개변수(E) 대신에 실제 타입(String)을 지정해야 한다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 타입 매개변수 대신 실제 타입이 지정되면, 형 변환 생략 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1625397012411&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 타입 매개변수 E 대신에 실제 타입 Tv를 대입
ArrayList&amp;lt;Tv&amp;gt; tvList = new ArrayList&amp;lt;Tv&amp;gt;();

tvList.add(new Tv());
Tv t = tvList.get(0); // 형 변환 생략 가능&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.3&amp;nbsp;제네릭의 용어&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Box&amp;lt;T&amp;gt;&amp;nbsp;:&amp;nbsp;제네릭&amp;nbsp;클래스.&amp;nbsp;&amp;lsquo;T의&amp;nbsp;Box&amp;rsquo;&amp;nbsp;또는&amp;nbsp;&amp;lsquo;T&amp;nbsp;Box&amp;rsquo;라고&amp;nbsp;읽는다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;T&amp;nbsp;:&amp;nbsp;타입&amp;nbsp;변수&amp;nbsp;또는&amp;nbsp;타입&amp;nbsp;매개변수.&amp;nbsp;(T는&amp;nbsp;타입&amp;nbsp;문자)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Box&amp;nbsp;:&amp;nbsp;원시&amp;nbsp;타입(raw&amp;nbsp;type)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fykidq%2FbtqGAggFmmn%2FDkLizJjQfkpaKSHs7Fl1AK%2Fimg.png&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;138&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sp0e6/btq8KRuOo8W/esTo7o6v9RND65xagiOfK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sp0e6/btq8KRuOo8W/esTo7o6v9RND65xagiOfK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sp0e6/btq8KRuOo8W/esTo7o6v9RND65xagiOfK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fykidq%2FbtqGAggFmmn%2FDkLizJjQfkpaKSHs7Fl1AK%2Fimg.png&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;138&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;아래와 같이&amp;nbsp;타입 매개변수에 타입을 지정하는 것을 &quot;제네릭 타입 호출&quot;이라 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;지정된 타입 'String'을 매개변수화된 타입이라 한다.&amp;nbsp;(해당 용어가 좀 길어서, &quot;대입된 타입&quot;이라는 용어를 사용할 것이다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfK3Pa%2FbtqGxxqhBYV%2FlAGKuB51cyLnTMyRGsr470%2Fimg.png&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;165&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bokAav/btq8JulEiHA/HCeH7Qu6F99qdyiKdaIuR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bokAav/btq8JulEiHA/HCeH7Qu6F99qdyiKdaIuR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bokAav/btq8JulEiHA/HCeH7Qu6F99qdyiKdaIuR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfK3Pa%2FbtqGxxqhBYV%2FlAGKuB51cyLnTMyRGsr470%2Fimg.png&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;165&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1.4 제네릭 타입과 다형성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 참조 변수와 생성자의 대입된 타입은 일치 해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397043329&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ArrayList&amp;lt;Tv&amp;gt; tvList = new ArrayList&amp;lt;Tv&amp;gt;(); // OK. 일치

ArrayList&amp;lt;Product&amp;gt; productList = new ArrayList&amp;lt;Tv&amp;gt;(); // 에러. 불일치&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 제네릭 클래스 간의 다형성은 성립한다. (여전히 대입된 타입은 일치 해야 한다.)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397075427&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;Tv&amp;gt; list1 = new ArrayList&amp;lt;Tv&amp;gt;();
List&amp;lt;Tv&amp;gt; list2 = new LinkedList&amp;lt;Tv&amp;gt;();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 매개변수의 다형성도 성립한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397091979&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ArrayList&amp;lt;Product&amp;gt; list = new ArrayList&amp;lt;Product&amp;gt;();
list.add(new Product());
list.add(new Tv());     // OK
list.add(new Audio());  // OK

boolean add(E e){ ... } // E에는 Product가 대입 됨 그래서 Product와 그 자손 객체가 가능&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;JDK 1.7 부터 타입 추론이 가능한 경우, 생성자의 타입을 생략 할 수 있다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; (참조변수의 타입으로 ArrayList가 Product 타입의 객체만 저장한다는 것을 알 수 있기 때문에 생략 가능하다.)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397112767&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ArrayList&amp;lt;Product&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.5 제네릭 타입의 형 변환&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;제네릭 타입과 원시 타입 간의 형 변환은 가능 하지만 바람직 하지 않다.&lt;/u&gt;&amp;nbsp;(경고가 발생)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397185369&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Box box = null;              // 원시 타입
Box&amp;lt;Object&amp;gt; objBox = null;  // 제네릭 타입

box = (Box)objBox; // OK. 제네릭 타입 -&amp;gt; 원시 타입 (경고 발생)
objBox = (Box&amp;lt;Object&amp;gt;)box; // OK. 원시 타입 -&amp;gt; 제네릭 타입 (경고 발생)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;대입된 타입이 다른 제네릭 타입 간의 형 변환은 불가능하다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397237128&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Box&amp;lt;Object&amp;gt; objBox = null;
Box&amp;lt;String&amp;gt; strBox = null;

objBox = (Box&amp;lt;Object&amp;gt;)strBox; // 에러. Box&amp;lt;String&amp;gt; -&amp;gt; Box&amp;lt;Object&amp;gt;
strBox = (Box&amp;lt;String&amp;gt;)objBox; // 에러. Box&amp;lt;Object&amp;gt; -&amp;gt; Box&amp;lt;String&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;와일드 카드가 사용된 제네릭 타입으로는 형 변환이 가능하다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;①&amp;nbsp;FruitBox&amp;nbsp;&amp;rarr;&amp;nbsp;FruitBox&lt;!--? extends Fruit--&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397268840&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Box&amp;lt;Object&amp;gt; objBox = (Box&amp;lt;Object&amp;gt;) new Box&amp;lt;&amp;lt;String&amp;gt;();                  // 에러. 형변환 불가능
Box&amp;lt;? extends Object&amp;gt; wBox = (Box&amp;lt;? extends Object&amp;gt;) new Box&amp;lt;String&amp;gt;(); // OK
Box&amp;lt;? extends Object&amp;gt; wBox2 = new Box&amp;lt;String&amp;gt;();                        // 위 문장과 동일

// 매개변수로 FruitBox&amp;lt;Fruit&amp;gt;, FruitBox&amp;lt;Apple&amp;gt;, FruitBox&amp;lt;Grape&amp;gt; 등이 가능
static Juice makeJuice(FruitBox&amp;lt;? extends Fruit&amp;gt; box) { ... }

FruitBox&amp;lt;? extends Fruit&amp;gt; box = new FruitBox&amp;lt;Fruit&amp;gt;(); // OK

// FruitBox&amp;lt;Apple&amp;gt; &amp;rarr; FruitBox&amp;lt;? extends Fruit&amp;gt;
FruitBox&amp;lt;? extends Fruit&amp;gt; box = new FruitBox&amp;lt;Apple&amp;gt;(); // OK&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; ②&amp;nbsp;FruitBox&lt;!--? extends Fruit--&gt;&amp;nbsp;&amp;rarr;&amp;nbsp;FruitBox&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;와일드 카드가 사용된 제네릭 타입에서 제네릭 타입으로의 형변환은 &quot;확인되지 않은 형변환&quot;이라는 경고가 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;FruitBox&lt;!--? extends Fruit--&gt;는 대입될 수 있는 타입은 여러 개인데, 명확한 타입인 FruitBox으로 형 변환하려고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;하기 때문에&amp;nbsp;경고가 발생하는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397293535&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// FruitBox&amp;lt;? extends Fruit&amp;gt; &amp;rarr; FruitBox&amp;lt;Apple&amp;gt; 
FruitBox&amp;lt;? extends Fruit&amp;gt; box = null;
FruitBox&amp;lt;Apple&amp;gt; appleBox = (FruitBox&amp;lt;Apple&amp;gt;) box; // OK. 미확인 타입으로 형 변환 경고&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1.6 제네릭 타입의 제거&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;컴파일러는 제네릭 타입을 제거하고, 필요한 곳에 형 변환을 넣는다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;① 제네릭 타입의 경계(bound)를 제거한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyPZ5K%2FbtqGzYA0LYW%2FwSUAOBFpcFF1Loq8oJXwjk%2Fimg.png&quot; width=&quot;645&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;141&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wR8Qa/btq8HejOu3o/wTdkvGhdSpbKVtEePpNK51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wR8Qa/btq8HejOu3o/wTdkvGhdSpbKVtEePpNK51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wR8Qa/btq8HejOu3o/wTdkvGhdSpbKVtEePpNK51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyPZ5K%2FbtqGzYA0LYW%2FwSUAOBFpcFF1Loq8oJXwjk%2Fimg.png&quot; width=&quot;645&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;141&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;② 제네릭 타입을 제거한 후에 타입이 일치하지 않으면, 형 변환을 추가한다.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrjMa4%2FbtqGAHyGYzM%2FT8pYbGcaTj69pVkuGysVn1%2Fimg.png&quot; width=&quot;644&quot; height=&quot;NaN&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;105&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bajdFr/btq8L66jmpd/p6tm6Z5rpaxPUy6giQadSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bajdFr/btq8L66jmpd/p6tm6Z5rpaxPUy6giQadSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bajdFr/btq8L66jmpd/p6tm6Z5rpaxPUy6giQadSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrjMa4%2FbtqGAHyGYzM%2FT8pYbGcaTj69pVkuGysVn1%2Fimg.png&quot; width=&quot;644&quot; height=&quot;NaN&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;105&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;③ 와일드 카드가 포함되어 있는 경우에는 적절한 타입으로의 형 변환이 추가된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBmzM8%2FbtqGAP4natq%2FoDBmcMiWrpLO94556vSPsK%2Fimg.png&quot; width=&quot;556&quot; height=&quot;NaN&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;686&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg51z9/btq8NcZx5Bf/fJXXknW8qPDp5qvbHkaWXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg51z9/btq8NcZx5Bf/fJXXknW8qPDp5qvbHkaWXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg51z9/btq8NcZx5Bf/fJXXknW8qPDp5qvbHkaWXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBmzM8%2FbtqGAP4natq%2FoDBmcMiWrpLO94556vSPsK%2Fimg.png&quot; width=&quot;556&quot; height=&quot;NaN&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;686&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1.7 제한된 제네릭 클래스&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;제네릭 타입에 &amp;lsquo;extends&amp;rsquo;를 사용하면, 특정 타입의 자손들만 대입할 수 있게 제한 할 수 있다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&lt;span style=&quot;background-color: #eff1f2; color: #000000;&quot;&gt;&amp;nbsp;&amp;lt;T extends 조상&amp;nbsp;타입&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397322707&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class FruitBox&amp;lt;T extends Fruit&amp;gt; { // Fruit과 그 자손만 타입으로 지정 가능
    ArrayList&amp;lt;T&amp;gt; list = new ArrayList&amp;lt;T&amp;gt;();
    
    void add(T item) {list.add(item);}
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 게다가 add()의 매개변수 타입 T도 Fruit와 그 자손 타입이 될 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; 그러므로 아래와 같이 여러 과일을 담을 수 있는 과일 상자가 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397339008&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FruitBox&amp;lt;Fruit&amp;gt; fruitBox = new FruitBox&amp;lt;Fruit&amp;gt;();
fruitBox.add(new Apple()); // OK. Apple이 Fruit의 자손
fruitBox.add(new Grape()); // OK. Grape가 Fruit의 자손&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;인터페이스를 구현해야 한다는 제약이 필요하면&lt;/u&gt;&amp;nbsp;&amp;lsquo;implements&amp;rsquo;가 아닌,&amp;nbsp;&lt;u&gt;&amp;lsquo;extends&amp;rsquo;를 사용한다.&amp;nbsp;&lt;/u&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397358763&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface Eatable {}

// Eatable 인터페이스를 구현한 클래스만 타입 매개변수 T에 대입 될 수 있다.
class FruitBox&amp;lt;T extends Eatable&amp;gt; { . . . } 

// Fruit의 자손이면서 Eatable 인터페이스를 구현한 클래스만 타입 매개변수 T에 대입 될 수 있다.
class FruitBox&amp;lt;T extends Fruit &amp;amp; Eatable&amp;gt; { . . . } &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1.8 제네릭의 제약&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;static 멤버에는 타입 매개변수(T)를 사용 할 수 없다.&amp;nbsp;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;rarr; 타입 매개변수에 대입하는 것은 인스턴스 마다 다르게 지정 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 그래서 static 멤버는 같은 클래스의 모든 인스턴스들이 공통으로 사용하는 멤버이기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397433589&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Box&amp;lt;T&amp;gt; {
    T[] itemArr; // OK. T 타입의 배열을 위한 참조변수
        . . .
        
    T[] toArray(); {
    	T[] tmpArr = new T[itemArr.length]; // 에러. 제네릭 타입의 배열 생성 불가
        . . .
        return tmpArr;
    }
    
        . . .    	
}

T[] tmpArr = (T[]) new Object[itemArr.length]; // Object 배열을 만들고 T 타입 배열로 형 변환 하면 된다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 타입 매개변수(T)로 배열을 생성 할 수 없다. (타입 매개변수로 배열을 선언하는 것은 가능)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;u&gt;즉, new 연산자 뒤에 타입 매개변수(T)를 사용 할 수 없다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;제네릭 타입의 배열을 생성 해야 한다면 Object 배열을 만들고 T 타입의 배열로 형 변환하면 된다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.9 와일드 카드 '?'&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;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 와일드 카드를 사용하면 하나의 참조 변수로 대입된 타입이 다른 객체를 참조 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;와일드카드는 기호 '?'로 표현하며 와일드 카드는 어떠한 타입도 될 수 있다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;lt;? extends T&amp;gt;&amp;nbsp;: 와일드 카드의 상한 제한. T와 그 자손들만 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;? super T&amp;gt;&amp;nbsp;&amp;nbsp;: 와일드 카드의 하한 제한. T와 그 조상들만 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;lt;?&amp;gt;&amp;nbsp;: 제한없음. 모든 타입 가능.&amp;nbsp;&amp;lt;? extends Object&amp;gt;와 동일&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;와일드 카드에는 &quot;&amp;amp;&quot;를 사용 할 수 없다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; 즉, &amp;lt;? extends T &amp;amp; E&amp;gt;와 같이 사용 할 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;메서드의 매개변수에 와일드 카드를 사용 할 수 있다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397471164&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static Juice makeJuice(FruitBox&amp;lt;? extends Fruit&amp;gt; box) {
	String tmp = &quot;&quot;;
	for(Fruit f: box.getList()) tmp += f + &quot; &quot;;
	return new Juice(tmp);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1.10 제네릭 메서드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;제네릭 메서드&lt;/u&gt;는&amp;nbsp;&lt;u&gt;반환 타입 앞에 제네릭 타입이 선언된 메서드이다.&lt;/u&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; 이전 Chapter에서 살펴본 Collections.sort()가 바로 제네릭 메서드이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397521731&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static &amp;lt;T&amp;gt; void sort(List&amp;lt;T&amp;gt; list, Comparator&amp;lt;? super T&amp;gt; c)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;제네릭 클래스의 타입 매개변수 &amp;lt;T&amp;gt;와 제네릭 메서드의 타입 매개변수 &amp;lt;T&amp;gt;는 별개&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; static 멤버에는 타입 매개변수를 사용할 수 없지만, 메서드에 제네릭 타입을 선언하고 사용하는 것은 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;제네릭 메서드는 호출할 때 마다, 타입 매개변수에 타입을 대입해야 한다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; (대부분의 경우, 추론이 가능하므로 생략할 수 있음)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397587665&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FruitBox&amp;lt;Fruit&amp;gt; fruitBox = new FruitBox&amp;lt;Fruit&amp;gt;();
FruitBox&amp;lt;Apple&amp;gt; appleBox = new FruitBox&amp;lt;Apple&amp;gt;();

System.out.println(Juicer.&amp;lt;Fruit&amp;gt;makeJuice(fruitBox)); // 메서드를 호출 할 때 타입을 대입 해야 하나
System.out.println(Juicer.makeJuice(fruitBox));        // 대입된 타입을 생략 할 수 있다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;※ 제네릭 메서드와 와일드 카드의 차이&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 와일드 카드는 하나의 참조변수로 서로 다른 타입이 대입된 여러 제네릭 객체를 다루기 위한 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 제네릭 메서드는 메서드를 호출 할 때 마다 다른 제네릭 타입을 대입 할 수 있도록 한 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;2. 열거형(enums)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;2.1&amp;nbsp;열거형이란?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;열거형의 정의&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;열거형(enum)&lt;/u&gt;은&amp;nbsp;&lt;u&gt;관련된 상수들을 같이 묶어 놓은 것&lt;/u&gt;이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;Java는 타입에 안전한 열거형을 제공한다.&amp;nbsp;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; * &quot;타입에 안전한 열거형&quot;이라는 것은 실제 값이 같아도 타입이 다르면 컴파일 에러가 발생하는 것을 의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 즉, 자바의 열거형은 값과 타입을 모두 체크한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;2.2 열거형의 정의와 사용&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;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;1) 열거형을 정의하는 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;enum 열거형이름 { 상수명 1, 상수명2, . . . }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;enum Direction { EAST, WEST, SOUTH, NORTH }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;rarr; Direction이라는 열거형을 선언한다. 상수의 값은 자동으로 0 부터 시작하는 정수 값이 부여된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;pre id=&quot;code_1625397646489&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum Direction { EAST, WEST, SOUTH, NORTH }

class Unit{
    int x, y;	// 유닛의 초기화
    Direction dir;	// 열거형을 인스턴스 변수로 선언
    
    void init() {
    	dir = Direction.EAST; // 유닛의 방향을 EAST로 초기화
                              // 열거형 변수의 값은 열거형 상수 값(EAST, WEST ..) 중 하나 이어야 한다.
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;3) 열거형 상수의 비교에 ==와 compareTo()를 사용 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 열거형을 비교할 때는 compareTo()를 사용 해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - compareTo()는 열거형 상수가 정의된 순서의 차이를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397668187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if( dir == Direction.EAST ){
	x++;
} else if (dir &amp;gt; Direction.WEST){ // 에러. 열거형 상수에 비교 연산자 사용 불가 
	...
} else if (dir.compareTo(Direction.WEST) &amp;gt; 0){ // compareTo()는 가능
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;2.3&amp;nbsp;모든&amp;nbsp;열거형의 조상 - java.lang.Enum&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;모든 열거형은 추상 클래스 Enum의 자손이며 아래의 메서드를 상속 받는다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;251&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxsQbM/btq8NdRHKZt/0X2J1LTju0MrKYxwgWk5O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxsQbM/btq8NdRHKZt/0X2J1LTju0MrKYxwgWk5O1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxsQbM/btq8NdRHKZt/0X2J1LTju0MrKYxwgWk5O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxsQbM%2Fbtq8NdRHKZt%2F0X2J1LTju0MrKYxwgWk5O1%2Fimg.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;251&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;아래와 같이 컴파일러가 자동적으로 추가해주는 메서드가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;static E values()&amp;nbsp;&amp;nbsp;: 해당 열거형의 모든 상수를 배열에 담아 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;static E valueOf(String name)&amp;nbsp;&amp;nbsp;:&amp;nbsp;전달된 문자열과 일치하는 해당 열거형의 상수를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;2.4 열거형에 멤버 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 불연속적인 열거형 상수의 경우, 원하는 값을 괄호() 안에 적는다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397758567&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum Direction { EAST(1), SOUTH(5), WEST(-1), NORTH(10) }
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 괄호()를 사용하려면, 인스턴스 변수와 생성자를 새로 추가해 줘야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 열거형의 생성자는 묵시적으로 private 이므로, 외부에서 열거형의 객체를 생성 할 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;열거형에 멤버를 추가하는 예시&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397815340&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum Direction {
    EAST(1, &quot;&amp;gt;&quot;), SOUTH(2, &quot;V&quot;), WEST(3, &quot;&amp;lt;&quot;), NORTH(4, &quot;^&quot;); // 끝에 ';'를 추가해야 한다.
    
    private final int value;
    private final String symbol;
    
    Direction(int value, String symbol) { // 접근 제어자 private이 생략됨 
    	this.value = value;
        this.symbol = symbol;
    }
    
    public int getValue() { return value; }
    public String getSymbol() { return symbol; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;2.5&amp;nbsp;열거형의 이해&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;열거형 Direction이 아래와 같이 선언되어 있을 때,&amp;nbsp;사실은 열거형 상수 하나 하나가 객체이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;3. 애노테이션(annotation)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;3.1&amp;nbsp;애노테이션이란?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;애노테이션?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;애노테이션&lt;/u&gt;은&amp;nbsp;&lt;u&gt;소스코드에 붙여서 특별한 의미를 부여하는 기능&lt;/u&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 주석(comment)처럼 프로그래밍 언어에 영향을 미치지 않으면서도 다른 프로그램에게 유용한 정보를 제공할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;애노테이션의 사용 예시&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- @Test는 이 메서드를 테스트 해야 한다는 것을 테스트 프로그램에게 알리는 역할을 할 뿐, 메서드가 포함된 프로그램 자체에는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; 아무런 영향을&amp;nbsp;미치지 않는다.&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397868357&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Test // 이 메서드가 테스트 대상임을 테스트 프로그램에게 알린다.
public void method() {
	. . .
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;3.2 표준 애노테이션&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;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;표준 애노테이션?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 표준 애노테이션은 Java에서 제공하는 애노테이션이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;530&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yLMp4/btq8KRImCVy/bPJmWzoGdsyS249oRB9geK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yLMp4/btq8KRImCVy/bPJmWzoGdsyS249oRB9geK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yLMp4/btq8KRImCVy/bPJmWzoGdsyS249oRB9geK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyLMp4%2Fbtq8KRImCVy%2FbPJmWzoGdsyS249oRB9geK%2Fimg.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;530&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;위의 표에서&amp;nbsp;초록&amp;nbsp;바탕의 애노테이션은 &quot;메타 애노테이션&quot;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;*&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt; 메타 애노테이션&lt;/b&gt; &lt;/span&gt;: 애노테이션을 정의 하는데 사용되는 애노테이션이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;3.3 메타 애노테이션&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;메타 애노테이션?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;메타 애노테이션&lt;/u&gt;은&amp;nbsp;애노테이션을 정의할 때 사용하는 애노테이션이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 애노테이션을 정의할 때, 애노테이션의 적용 대상(target)이나 유지 기간(retention) 등을 지정하는데 사용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Serif KR';&quot;&gt;@Target&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;@Target은&amp;nbsp;애노테이션이 적용 가능한 대상을 지정하는데 사용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 여러 개의 값을 지정할 때는 배열에서 처럼 괄호 {}를 사용해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625397971163&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;537&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcCaaq/btq8OjKGc73/DSo9adkZBgifkC7EOv0iyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcCaaq/btq8OjKGc73/DSo9adkZBgifkC7EOv0iyK/img.png&quot; data-alt=&quot;@Target으로 지정 할 수 있는 애노테이션 적용 대상의 종류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcCaaq/btq8OjKGc73/DSo9adkZBgifkC7EOv0iyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcCaaq%2Fbtq8OjKGc73%2FDSo9adkZBgifkC7EOv0iyK%2Fimg.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;537&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;@Target으로 지정 할 수 있는 애노테이션 적용 대상의 종류&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;* ANNOTATION_TYPE은 애노테이션을 선언할 때 붙일 수 있다는 뜻이며&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; CONSTRUCTOR는 생성자를 선언할 때 붙일 수 있다는 뜻이며&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;. . .&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; TYPE_USE는 타입이 사용되는 모든 곳에 붙일 수 있다는 뜻이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;@Retention&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;@Retention은 애노테이션이 유지(retention)되는 기간을 지정하는데 사용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;231&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rqLCl/btq8HGG7KwR/EdzwcUNsvzfDirjxOTak3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rqLCl/btq8HGG7KwR/EdzwcUNsvzfDirjxOTak3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rqLCl/btq8HGG7KwR/EdzwcUNsvzfDirjxOTak3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrqLCl%2Fbtq8HGG7KwR%2FEdzwcUNsvzfDirjxOTak3K%2Fimg.png&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;231&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 컴파일러에 의해 사용되는 애노테이션의 유지 정책은 SOURCE이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; (컴파일러를 직접 작성할 것이 아니면, 이 유지 정책은 필요 없다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;실행 시에 사용 가능한 애너테이션의 정책은 RUNTIME이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;(유지 정책을 RUNTIME으로 하면, 실행 시에 리플렉션을 통해 클래스 파일에 저장된 애노테이션의 정보를 읽어서 처리할 수 있다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;@Documented&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;@Documented는&amp;nbsp;애노테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;@Inherited&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;&lt;u&gt;@Inherited&lt;/u&gt;는&amp;nbsp;&lt;u&gt;애노테이션이 자손 클래스에 상속 되도록 한다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- @Inherited가 붙은 애노테이션을 조상 클래스에 붙이면, 자손 클래스도 이 애노테이션이 붙은 것과 같이 인식된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;@Repeatable&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;@Repeatable는&amp;nbsp;반복해서 붙일 수 있는 애노테이션을 정의할 때 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;@Repeatable이 붙은 애너테이션은 반복해서 붙일 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;@Native&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;@Native는&amp;nbsp;&lt;u&gt;native 메서드에 의해 참조되는 상수에 붙이는 애노테이션&lt;/u&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 네이티브 메서드는&amp;nbsp;JVM이 설치된 OS의 메서드를 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; 네이티브 메서드는 보통 C 언어로 작성되어 있는데, 자바에서는 메서드의 선언부만 정의하고 구현은 하지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 자바에 정의된 네이티브 메서드와 OS의 메서드를 연결해주는 작업은 JNI(Java Native Interface)가 담당한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;3.4 애노테이션 타입 정의하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;새로운 애노테이션을 정의하는 방법&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625398139440&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@interface 애노테이션이름{
    타입 요소이름(); // 애노테이션의 요소를 선언한다.
    . . .
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;애노테이션의 요소&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&lt;u&gt;&amp;nbsp;애노테이션의 요소(element)&lt;/u&gt;는&amp;nbsp;&lt;u&gt;애노테이션 내에 선언된 메서드&lt;/u&gt;를 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 애노테이션의 요소는 반환 값이 있고, 매개 변수는 없는 추상 메서드의 형태를 가진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; 그리고 애노테이션을 적용할 때 이 요소들의 값을 모두 지정 해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; (요소의 이름도 같이 적어주므로 순서는 상관 없다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;애노테이션 요소의 기본 값&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;애노테이션을 적용 시 값을 지정하지 않으면,&amp;nbsp;사용 될 수 있는 요소의 기본 값을 지정 할 수 있다. (기본 값으로 null은 사용 불가)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 애노테이션의&amp;nbsp;요소가 하나이고 이름이 value인 경우, &amp;nbsp;애노테이션을 적용할 때 요소의 이름을 생략 하고 값만 적어도 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;요소의 타입이 배열인 경우, 중괄호 {}를 사용해서 여러 개의 값을 지정할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;기본 값을 지정할 때도 괄호{}를 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #f89009; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;java.lang.annotation.Annotation&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;Annotation은&amp;nbsp;모든 애노테이션의 조상이지만 상속은 불가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 사실,&amp;nbsp;Annotation은 인터페이스로 정의되어 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;마커 애노테이션 (Marker Anntation)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp;마커 애노테이션은&amp;nbsp;요소가 하나도 정의되지 않은 애노테이션이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #f89009; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;애노테이션 요소의 규칙&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 애노테이션의 요소를 선언할 때 지켜야 하는 규칙은 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1625398234640&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;① 요소의 타입은 기본형, String, enum, 애노테이션, Class만 허용된다.

② 괄호() 안에 매개변수를 선언할 수 없다.

③ 예외를 선언할 수 없다.

④ 요소를 타입 매개변수로 정의할 수 없다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;204&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J75Vn/btq8L7YuvLf/S452MuB7pTLHqBsTNUKZhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J75Vn/btq8L7YuvLf/S452MuB7pTLHqBsTNUKZhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J75Vn/btq8L7YuvLf/S452MuB7pTLHqBsTNUKZhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ75Vn%2Fbtq8L7YuvLf%2FS452MuB7pTLHqBsTNUKZhk%2Fimg.png&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;204&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/Java \ Spring</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/43</guid>
      <comments>https://recoderr.tistory.com/43#entry43comment</comments>
      <pubDate>Sun, 4 Jul 2021 20:41:43 +0900</pubDate>
    </item>
    <item>
      <title>[React / Node.js] react-router 리액트 라우터 알아보기</title>
      <link>https://recoderr.tistory.com/42</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;react-router&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;라우팅&lt;/b&gt; &lt;/span&gt;: &lt;span style=&quot;color: #222222;&quot;&gt;다른 주소에 따라 다른 뷰를 보여주는 것&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 리액트에서 라우팅 기능을 제공하고 있지 않기때문에 직접 구현하여 사용해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 그렇기 때문에 react-router 는 리액트를 사용함으로써 필수적이라 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; - 클라이언트 사이드에서 이뤄지는 라우팅을 간단하게 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; - 서버 사이드 렌더링을 도와준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;431&quot; data-origin-height=&quot;251&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FqcOv/btq8KbGrcQX/6wgkuHLy5zI1aALDoQpwC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FqcOv/btq8KbGrcQX/6wgkuHLy5zI1aALDoQpwC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FqcOv/btq8KbGrcQX/6wgkuHLy5zI1aALDoQpwC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFqcOv%2Fbtq8KbGrcQX%2F6wgkuHLy5zI1aALDoQpwC1%2Fimg.png&quot; data-origin-width=&quot;431&quot; data-origin-height=&quot;251&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p 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;font-family: 'Noto Serif KR'; color: #000000;&quot;&gt;&lt;b&gt;import&amp;nbsp;{&amp;nbsp;&lt;span style=&quot;color: #f89009;&quot;&gt;BrowserRouter&amp;nbsp;&lt;/span&gt;}&amp;nbsp;from&amp;nbsp;&quot;react-router-dom&quot;;&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;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; react-router-dom의 라우터는 &amp;lt;BrowserRouter&amp;gt;와 &amp;lt;HashRouter&amp;gt; 두가지가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;BrowserRouter&amp;gt;는 HTML5의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;history API&lt;/b&gt;를 활용하여 UI를 업데이트하고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;HashRouter&amp;gt;는 URL의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;hash&lt;/b&gt;를 활용한 라우터로 정적인(static)페이지에 적합하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;329&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7E5m6/btq8NcYQHqk/LipkVDXbgjy1OhDlPxApuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7E5m6/btq8NcYQHqk/LipkVDXbgjy1OhDlPxApuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7E5m6/btq8NcYQHqk/LipkVDXbgjy1OhDlPxApuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7E5m6%2Fbtq8NcYQHqk%2FLipkVDXbgjy1OhDlPxApuK%2Fimg.png&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;329&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;import&amp;nbsp;{&amp;nbsp;&lt;span style=&quot;color: #f89009;&quot;&gt;Route,&amp;nbsp;Switch&lt;/span&gt;&amp;nbsp;}&amp;nbsp;from&amp;nbsp;&quot;react-router-dom&quot;;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;라우트를 설정 할 때에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Route&lt;/b&gt;&amp;nbsp;&lt;/span&gt;컴포넌트를 사용하고, &lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;경로는&amp;nbsp;path&amp;nbsp;값&lt;/b&gt;&lt;/span&gt;으로 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;exact path&lt;/b&gt;&lt;/span&gt; 는 주어진 경로와 정확히 맞아야만 설정한 컴포넌트를 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;exact 를 하지 않으면,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;/ 경로로 접속시 /login, /register, /movie/:movieId &lt;span style=&quot;color: #222222;&quot;&gt;에도&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;/&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;가 있기 때문에, 매칭이 되어서 보여지게된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Switch&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;컴포넌트를 사용하면, 이 컴포넌트에 감싸진 라우트 중 매칭되는 첫번째 라우트만 보여주고 나머지는 보여주지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;단, switch 컴포넌트는 위에서부터 순서대로 비교하기 때문에 나열하는 순서가 매우 중요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;(/about 과 /about/:name 두 라우트를 순서대로 switch로 감싸주었을때 name 파라미터를 전달해도 /about이 먼저 매칭되어버린다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;** Route 컴포넌트의 exact path, Switch 컴포넌트를 이용하여 라우트 정확도를 높일 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;382&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpV9T5/btq8NcEzf9N/T8vXjEjy6TWY6Pi4FoTtf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpV9T5/btq8NcEzf9N/T8vXjEjy6TWY6Pi4FoTtf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpV9T5/btq8NcEzf9N/T8vXjEjy6TWY6Pi4FoTtf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpV9T5%2Fbtq8NcEzf9N%2FT8vXjEjy6TWY6Pi4FoTtf0%2Fimg.png&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;382&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;102&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X4H6A/btq8NcLm7Dt/Fk4HfuEMSiJUwhqO6dGuyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X4H6A/btq8NcLm7Dt/Fk4HfuEMSiJUwhqO6dGuyK/img.png&quot; data-alt=&quot;console .log(this.props)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X4H6A/btq8NcLm7Dt/Fk4HfuEMSiJUwhqO6dGuyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX4H6A%2Fbtq8NcLm7Dt%2FFk4HfuEMSiJUwhqO6dGuyK%2Fimg.png&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;102&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;console .log(this.props)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1625338732874&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &amp;lt;Route exact path=&quot;/movie/:movieId&quot; component={Auth(MovieDetail, null)} /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;라우트-파라미터-읽기&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;라우트 파라미터 읽기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; - 라우트로 설정한 컴포넌트는 자동으로 3가지 props를 전달받게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #f89009; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;history :&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;push,&lt;span&gt;&amp;nbsp;&lt;/span&gt;replace&lt;span&gt; 를 이용하여&lt;/span&gt; 다른 경로로 이동하거나 앞/뒤 페이지로 전환 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #f89009; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;location :&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;현재 경로에 대한 정보를 지니고 있고 URL 쿼리 (/about?foo=bar&lt;span&gt;&amp;nbsp;&lt;/span&gt;형식) 정보도 가지고있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #f89009; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;match : &lt;/b&gt;&lt;/span&gt;어떤 라우트에 매칭이 되었는지에 대한 정보가 있고 params (/about/:name&lt;span&gt;&amp;nbsp;&lt;/span&gt;형식) 정보를 가지고있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; - 라우트에 파라미터값을 전달하려면 params 또는 query 를 이용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;params 예시 : /movie/:movieId&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;특정 아이디 혹은 이름을 사용하여 조회할 때&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;사용 전에 라우트에 꼭 지정해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;query 예시 :&amp;nbsp; /movie?details=true&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;어떤 키워드를 검색하거나 페이지에 필요한 옵션을 전달할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;컴포넌트 내에서 동적으로 사용할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; - query 는 해석을 위해 라이브러리를 따로 추가해야한다&lt;span style=&quot;color: #333333;&quot;&gt;(query-string 등)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 해석시 &lt;span style=&quot;color: #222222;&quot;&gt;받아오는 값들은 &lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;모두 문자열&lt;/b&gt;&lt;/span&gt;이라는 점을 주의해야한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const query = queryString.parse(location.search);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;import { &lt;span style=&quot;color: #f89009;&quot;&gt;Link,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;NavLink&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&amp;nbsp;&lt;/span&gt;}&amp;nbsp;from&amp;nbsp;&quot;react-router-dom&quot;;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp;리액트 내에서 &amp;lt;a href&amp;gt;속성을 이용하여 페이지 이동 등을 하는 것은 완전 새로고침(첫 렌더링)되기때문에,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp; &amp;nbsp;Link 컴포넌트를 사용하여 페이지를 새로 불러오는걸 막고, 원하는 라우트로 화면 전환을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp;NavLink&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt; :&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;활성화된 url&lt;/span&gt;에 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;특정 스타일(&lt;/span&gt;&lt;span style=&quot;background-color: #282c34; color: #d19a66;&quot;&gt;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e;&quot;&gt;activeStyle&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp;혹은 클래스(&lt;/span&gt;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e;&quot;&gt;activeClassName)&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;를 지정 할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;출처 &lt;span style=&quot;color: #000000;&quot;&gt; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ing-yeo.net/2020/10/react-beginner-5/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ing-yeo.net/2020/10/react-beginner-5/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velopert.com/3417&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velopert.com/3417&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://gongbu-ing.tistory.com/45?category=780189&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;169&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Dtox/btq8Kbl2rp9/JZeukIIOFcfSlIP4k92Tck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Dtox/btq8Kbl2rp9/JZeukIIOFcfSlIP4k92Tck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Dtox/btq8Kbl2rp9/JZeukIIOFcfSlIP4k92Tck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Dtox%2Fbtq8Kbl2rp9%2FJZeukIIOFcfSlIP4k92Tck%2Fimg.png&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;169&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/JavaScript</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/42</guid>
      <comments>https://recoderr.tistory.com/42#entry42comment</comments>
      <pubDate>Sun, 4 Jul 2021 05:00:49 +0900</pubDate>
    </item>
    <item>
      <title>[인프런] 레츠기릿 자바스크립트 / 끝말잇기, 셀프체크 쿵쿵따 만들기</title>
      <link>https://recoderr.tistory.com/41</link>
      <description>&lt;pre id=&quot;code_1624930737038&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;끝말잇기&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;span id=&quot;order&quot;&amp;gt;1&amp;lt;/span&amp;gt;번째 참가자&amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;제시어 : &amp;lt;span id=&quot;word&quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;input type=&quot;text&quot;&amp;gt;
    &amp;lt;button&amp;gt;입력&amp;lt;/button&amp;gt;
    &amp;lt;script&amp;gt;
        const number = parseInt(prompt(&quot;몇 명이 참가하나요?&quot;), 10); // 10 생략해도 10진법으로 인식함   
        const $button = document.querySelector('button');
        const $input = document.querySelector('input');
        const $word = document.querySelector('#word');
        const $order = document.querySelector('#order');


        let word; //제시어
        let newWord; //새로 입력한 단어

        const onClickButton = function(){
            console.log(&quot;버튼 클릭&quot;)
            if(!word || word[word.length -1] === newWord[0]){ //제시어가 빈값인지 확인
               
                word = newWord;
                $word.textContent = word;
                const order = parseInt($order.textContent); //현재 순서

                if(order + 1 &amp;gt; number){
                    $order.textContent = 1;
                } else{
                    $order.textContent = order + 1;
                }
                
            }else{
                alert('올바르지 않은 단어입니다!');
            }
            $input.value = '';
            $input.focus();
        };

        const onInput = (event) =&amp;gt; {
          newWord = event.target.value;
        };
        /*
        alert(number);
        const yesOrNo = confirm(&quot;맞나요?&quot;) ;
       
        document.querySelector(&quot;input&quot;).addEventListener('input', (event) =&amp;gt; { // 키보드 입력 모두 이벤트로 인식(backspace도 인식, 키 하나하나를 이벤트 하나로 인식)
            console.log(&quot;입력&quot;, event.target.value);
        });
        */

        $button.addEventListener('click', onClickButton);
        $input.addEventListener('input', onInput);

    &amp;lt;/script&amp;gt;
    
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;대화창(prompt, alert, confirm)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; - 브라우저 환경에서 사용되는 최소한의 사용자 인터페이스 기능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1) alert(&quot;hello&quot;)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;사용자가 [확인]을 누르기 전까지 계속 떠있는 메세지창&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;** 메시지가 있는 작은 창은 모달 창(modal window) 이라고 한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; '모달&amp;rsquo;이란 단어엔 페이지의 나머지 부분과 상호 작용이 불가능하다는 의미가 내포되어 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;2) result &lt;span style=&quot;color: #a67f59;&quot;&gt;=&lt;/span&gt; prompt&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;title&lt;span style=&quot;color: #999999;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #999999;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #0077aa;&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;텍스트 메시지와 입력 필드(input field), 확인(OK) 및 취소(Cancel) 버튼이 있는 모달 창&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;title : 사용자에게 보여줄 문자열 (ex &lt;span style=&quot;color: #dcdcaa;&quot;&gt;prompt&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;참여할 인원은 몇 명인가요?&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ce9178; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;default(선택값) : 입력 필드의 초기값&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;사용자가 입력 필드에 기재한 문자열을 반환한다, 만약 사용자가 &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #f89009;&quot;&gt;&lt;b&gt;입력을 취소한 경우는 null이 반환&lt;/b&gt;&lt;/span&gt;된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt; 3) result &lt;span style=&quot;color: #a67f59;&quot;&gt;=&lt;/span&gt; confirm&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;question&lt;span style=&quot;color: #999999;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #999999; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt; &amp;nbsp;매개변수로 받은&amp;nbsp;question(질문)과 확인 및 취소 버튼이 있는 모달 창&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;사용자가 &lt;span style=&quot;color: #f89009; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;확인버튼를 누르면&amp;nbsp;true, 그 외의 경우는&amp;nbsp;false를 반환&lt;/b&gt;&lt;/span&gt;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;parseInt&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;prompt&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;참여할&amp;nbsp;인원은&amp;nbsp;몇&amp;nbsp;명인가요?&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;));&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;// prompt는 취소를 누르면 null &amp;gt;&amp;gt; Number / parseInt로 형변환시 NaN이 반환된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;HTML 태그 선택하기(querySelector)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;querySelector&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; elem.querySelector(css)는 주어진 CSS 선택자에 대응하는 요소 중 첫 번째 요소를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; ** document 노드에서만 호출 가능하다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&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;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;addEventListener&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; document 특정요소의 event를 등록할때 사용한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;자주-사용하는-이벤트의-종류&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&amp;nbsp; &lt;span style=&quot;background-color: #f6e199;&quot;&gt;[ 자주 사용하는 이벤트의 종류 ]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; click&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 마우스버튼을 클릭하고 버튼에서 손가락을 떼면 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; mouseover&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 마우스를 HTML요소 위에 올리면 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; mouseout&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 마우스가 HTML요소 밖으로 벗어날 때 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; mousedown&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 클릭을 하기 위해 마우스버튼을 누르고 아직 떼기 전인 그 순간, HTML요소를 드래그할 때 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; mouseup&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 마우스버튼을 떼는 그 순간, 드래그한 HTML요소를 어딘가에 놓을 때 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; mousemove&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 마우스가 움직일때마다 발생한다. 마우스커서의 현재 위치를 계속 기록하는 것에 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; focus&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; HTML요소에 포커스가 갔을때 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; blur&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; HTML요소가 포커스에서 벗어났을때 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; keypress&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 키를 누르는 순간에 발생하고 키를 누르고 있는 동안 계속해서 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; keydown&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 키를 누를 때 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; keyup&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 키를 눌렀다가 떼는 순간에 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; load&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 웹페이지에서 사용할 모든 파일의 다운로드가 완료되었을때 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; resize&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 브라우저 창의 크기를 조절할때 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; scroll&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 스크롤바를 드래그하거나 키보드(up, down)를 사용하거나 마우스 휠을 사용해서 웹페이지를 스크롤할 때 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;페이지에 스크롤바가 없다면 이벤트는 발생하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; unload&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 링크를 클릭해서 다른 페이지로 이동하거나 브라우저 탭을 닫을 때 혹은 브라우저 창을 닫을 때 이벤트가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; change&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; 폼 필드의 상태가 변경되었을 때 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;라디오 버튼을 클릭하거나 셀렉트 박스에서 값을 선택하는 경우를 예로 들수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;셀프체크 쿵쿵따 &lt;span style=&quot;color: #000000;&quot;&gt; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;DOCTYPE&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;lang&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;ko&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;http-equiv&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;X-UA-Compatible&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;IE=edge&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;viewport&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;width=device-width,&amp;nbsp;initial-scale=1.0&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;쿵쿵따&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;order&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;번의&amp;nbsp;순서&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;제시어&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;word&quot;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;maxlength&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;3&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;입력&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;parseInt&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;prompt&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;참여할&amp;nbsp;인원은&amp;nbsp;몇&amp;nbsp;명인가요?&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;));&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // prompt는 취소를 누르면 null &amp;gt;&amp;gt; Number / parseInt로 형변환시 NaN&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;){&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;$button&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;querySelector&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'button'&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;$input&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;querySelector&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'input'&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;$order&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;querySelector&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'#order'&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;$word&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;querySelector&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'#word'&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;word&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;//제시어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;newWord&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;inputText&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;{&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;newWord&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;newWord&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&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: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;btnClick&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;()&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;{&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;클릭&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(!&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;word&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;||&amp;nbsp;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;word&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;word&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;-&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;]&amp;nbsp;===&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;newWord&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;]&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;newWord&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;===&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)){&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;word&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;newWord&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;$word&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;word&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&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: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;parseInt&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;$order&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)&amp;nbsp;&amp;lt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;){&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;$order&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;parseInt&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;$order&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;$order&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;textContent&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;{&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;alert&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Booooommmmm!&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;$input&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;$input&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;focus&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;();&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;$button&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'click'&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;btnClick&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;$input&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'input'&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;inputText&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;처음에 스크립트 부분을 head 태그 안에 넣었다가 내용이 적용되지 않는 것을 확인하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;load시 먼저 실행하도록 했다가 뭔가 잘못되었는지 안되길래 다시 body 안에 넣었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;순서도를 그리지 않고 바로 코드를 작성했더니 중간중간 의도하지 않은 결과가 도출되어 끝말잇기 코드를 다시보고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;수정을 조금했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;원래 addEventListener 대신 해당 요소에 onClick, oninput 을 넣고, 함수변수로 지정했었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;왜인지 실행이 되지않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;코드 작성할때 테스팅해서 원인과 결과를 재도출했어야하는데 그냥 넘어가버려서 지금은 문제되었던 코드상태를 몰라서 못한다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;최대의 패착&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;원인을 찾지 못했지만 추후 더 공부하다보면 알수 있지 않을까한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;575&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG0Xl8/btq8kKcmrdq/w9jc3DMEH8cF947kthivAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG0Xl8/btq8kKcmrdq/w9jc3DMEH8cF947kthivAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG0Xl8/btq8kKcmrdq/w9jc3DMEH8cF947kthivAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG0Xl8%2Fbtq8kKcmrdq%2Fw9jc3DMEH8cF947kthivAK%2Fimg.png&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;575&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;제로초 강사님의 신간 레츠기릿 자바스크립트를 기반으로한 무료강의로&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;초반 1강은 es6 기본 문법을 설명해준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(앞부분은 자바스크립트를 조금이라도 깔짝여봤다면 추후 복습용으로 봐도 무관할 정도의 내용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;세심한 부분까지 설명해주기 때문에 타 강의에서 궁금했거나 들었는데 지났쳤을법한 내용도 나오기도 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;본 강의는 자바스크립트 입문자를 대상으로 하기 때문에 정말 쉽게 설명되어있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;프로그래밍 입문자를 대상으로 하기 때문에 코드를 짤 때의 사고방식에 대해 훈련하는 법을 알려준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;순서도를 그리는 내용은 입사하고 나서 고민해왔던 코드를 작성하고 테스트(구동하여 오류가 없는지 확인)하는 과정에서 계속된 코드 수정의 원인을 해결하려고 생각했던 방안(요구사항 분석 후 코딩)과 일맥상통하는 것 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;vscode의 단축키와 각종 꿀팁이 난무하는 강의, 아직 강의 초반이지만 수강 만족도는 별다섯개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;강의정보&amp;nbsp;  &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;플랫폼 : 인프런&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;강의 : 레츠기릿 자바스크립트&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;강사 : 제로초&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;개발환경 : vscode, es6&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;url :&lt;span&gt; &lt;a href=&quot;https://www.inflearn.com/course/%EB%A0%88%EC%B8%A0%EA%B8%B0%EB%A6%BF-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8/dashboard&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EB%A0%88%EC%B8%A0%EA%B8%B0%EB%A6%BF-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8/dashboard&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;포스팅 내용 출처 &lt;span style=&quot;color: #000000;&quot;&gt; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://ko.javascript.info/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.javascript.info/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://kyounghwan01.github.io/blog/JS/JSbasic/addEventListener/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://kyounghwan01.github.io/blog/JS/JSbasic/addEventListener/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;240&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmsupD/btq8lXPMkOV/NV2EKgQ8ObU6CJcsSkGe5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmsupD/btq8lXPMkOV/NV2EKgQ8ObU6CJcsSkGe5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmsupD/btq8lXPMkOV/NV2EKgQ8ObU6CJcsSkGe5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmsupD%2Fbtq8lXPMkOV%2FNV2EKgQ8ObU6CJcsSkGe5k%2Fimg.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;240&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/JavaScript</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/41</guid>
      <comments>https://recoderr.tistory.com/41#entry41comment</comments>
      <pubDate>Wed, 30 Jun 2021 14:09:16 +0900</pubDate>
    </item>
    <item>
      <title> 자바스터디  자바의 정석 CH11 컬렉션프레임웍</title>
      <link>https://recoderr.tistory.com/40</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1. 컬렉션프레임워크&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.1 컬렉션 프레임워크의 핵심 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;491&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qmMtk/btq8dR3iIZP/Rz1tsh4tTbGLhlpKDh6Pok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qmMtk/btq8dR3iIZP/Rz1tsh4tTbGLhlpKDh6Pok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qmMtk/btq8dR3iIZP/Rz1tsh4tTbGLhlpKDh6Pok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqmMtk%2Fbtq8dR3iIZP%2FRz1tsh4tTbGLhlpKDh6Pok%2Fimg.png&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;491&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;- Collection 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &amp;nbsp; 컬렉션 클래스에 저장된 데이터를 읽고 추가하고 삭제하는 등 가장 기본적인 메소드들을 정의&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;422&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZAqDR/btq8ftASj1v/ZIz0kBsLCRptKwxzZmoQ11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZAqDR/btq8ftASj1v/ZIz0kBsLCRptKwxzZmoQ11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZAqDR/btq8ftASj1v/ZIz0kBsLCRptKwxzZmoQ11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZAqDR%2Fbtq8ftASj1v%2FZIz0kBsLCRptKwxzZmoQ11%2Fimg.png&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;422&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;- List 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;중복을 허용하면서 저장순서가 유지&lt;/span&gt;&lt;/b&gt;되는 컬렉션을 구현하는데 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;571&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GVxWj/btq8c0zGK8J/xsgkePRiKyrE1BWR6XdT2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GVxWj/btq8c0zGK8J/xsgkePRiKyrE1BWR6XdT2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GVxWj/btq8c0zGK8J/xsgkePRiKyrE1BWR6XdT2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGVxWj%2Fbtq8c0zGK8J%2FxsgkePRiKyrE1BWR6XdT2K%2Fimg.png&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;571&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;- Set 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;중복을 허용하지않고 저장순서가 유지&lt;/span&gt;&lt;/b&gt;되는 컬렉션을 구현하는데 사용(HashSet, TreeSet 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;- Map 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;키와 값을 하나의 쌍으로 묶어서 저장하는 컬렉션을 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;키는 중복될수 없지만 값을 중복을 허용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;500&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmMBQi/btq8bq5EBk4/nmKpwSukKKXj5ZeFjPROOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmMBQi/btq8bq5EBk4/nmKpwSukKKXj5ZeFjPROOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmMBQi/btq8bq5EBk4/nmKpwSukKKXj5ZeFjPROOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmMBQi%2Fbtq8bq5EBk4%2FnmKpwSukKKXj5ZeFjPROOK%2Fimg.png&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;500&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;- Map.Entry 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Map에 저장되는 key-value 쌍을 다루기 위해 내부적으로 Entry인터페이스를 정의했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.2 ArrayList&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;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- Object 배열을 이용해서 데이터의 저장순서가 유지되고 중복을 허용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 삭제 진행시 데이터의 저장순서가 유지되기 때문에 마지막 데이터를 삭제하는 경우가 아니라면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;arraycopy가 발생된다. 데이터를 옮기는 작업을 거치기 때문에 데이터가 많을수록 수행시간이 오래걸린다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.3 LinkedList&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;[배열의 장단점]&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 1) 장점&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 구조가 간단하며 사용하기 쉽고 데이터를 읽어오는데 걸리는 시간이 가장 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 2) 단점&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 크기를 변경할 수 없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 배열의 단점을 보완하기 위해 만들어짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- &lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;삭제&lt;/b&gt;&lt;/span&gt;하고자 하는 요소의 이전요소가 삭제하고자하는 요소의 다음요소를 참조하도록 변경하면 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- &lt;span style=&quot;color: #8a3db6; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;추가&lt;/b&gt;&lt;/span&gt;하고자 하는 위치의 이전 요소의 참조를 새로운 요소에 대한 참조로 변경,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;새로운 요소가 그 다음 요소를 참조하도록 변경하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 링크드 리스트는 이동방향이 단방향이라 이전요소에 대한 접근이 어려워 이를 보완하여 더블 링크드리스트가 만들어졌다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #8a3db6;&quot;&gt;&lt;b&gt;ArrayList vs LinkedList 성능 비교&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;①&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;순차적으로&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;데이터를&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;추가&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;삭제&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- ArrayList&lt;/span&gt;&lt;span&gt;가&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;빠름&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;②&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;비순차적으로&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;데이터를&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;추가&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;삭제&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- LinkedList&lt;/span&gt;&lt;span&gt;가&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;빠름&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;③&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;접근 시간&lt;/span&gt;&lt;span&gt;(access time) - ArrayList&lt;/span&gt;&lt;span&gt;가&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;빠름&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.4 Stack과 Queue&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- Stack : 마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- Queue : 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO 구조&lt;/p&gt;
&lt;figure data-ke-type=&quot;image&quot; data-ke-style=&quot;alignCenter&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; ** 스택과 큐의 활욜&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;스택 : 수식계산, 수식괄호검사, 워드프로세서의 undo/redo, 웹브라우저의 뒤로/앞으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;큐 : 최근사용문서, 잉ㄴ쇄작업 대기목록, 버퍼(buffer)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; ** Queue의 변형&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;1) 덱(Deque)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 양쪽 끝에서 저장(offer)과 삭제(poll)가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - Deque은 인터페이스이며 구현체로는 ArrayDeque, LinkedList이다. (Deque은 Queue의 자손이다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsYZDo%2FbtqGpyKiiO6%2FKIdcZzLJJBUNyZpzJF7Kt1%2Fimg.png&quot; width=&quot;254&quot; height=&quot;NaN&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;394&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJ286J/btq8ewEEbkx/f6w34W9WkBVxjlOKkJRz9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJ286J/btq8ewEEbkx/f6w34W9WkBVxjlOKkJRz9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJ286J/btq8ewEEbkx/f6w34W9WkBVxjlOKkJRz9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsYZDo%2FbtqGpyKiiO6%2FKIdcZzLJJBUNyZpzJF7Kt1%2Fimg.png&quot; width=&quot;254&quot; height=&quot;NaN&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;394&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 2) 우선 순위 큐(Priority Queue)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 저장 순서에 관계 없이 우선 순위가 높은 것부터 꺼낸다. (제일 작은 값 부터 꺼냄)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- null은 저장 할 수 없다. (우선 순위를 판단할 수 없기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 우선 순위 큐는 저장 공간으로 배열을 사용하며, 각 요소를 힙(Heap)이라는 자료구조의 형태로 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 예를 들어, 입력[3, 1, 5, 2, 4] &amp;rarr; 출력[1, 2, 3, 4, 5]&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;1.5 Iterator, ListIterator,&amp;nbsp;Enumeration&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;컬렉션에&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;저장된&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;데이터를&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;접근하는데&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;사용되는&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;인터페이스&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Iterator&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;컬렉션에&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;저장된&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;요소들을&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;읽어오는&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;방법을&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;표준화한&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;것&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;컬렉션에&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;iterator()&lt;/span&gt;&lt;span&gt;를&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;호출해서&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Iterator&lt;/span&gt;&lt;span&gt;를&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;구현한&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;객체를&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;얻어서&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;사용&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;- Iterator는 1 회용이므로 다 사용 했다면 다시 얻어 와야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;- Iterator의 remove는 단독으로 사용 불가, next와 함께 사용해야한다(읽어온것 삭제)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;ListIterator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;-&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Iterator&lt;/span&gt;&lt;span&gt;의&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;접근성을&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;향상시킨&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;것이&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;ListIterator&lt;/span&gt;&lt;span&gt;이다&lt;/span&gt;&lt;span&gt;. (&lt;/span&gt;&lt;span&gt;단방향&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;rarr;&lt;/span&gt;&lt;span&gt;양방향&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;-&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;listIterator()&lt;/span&gt;&lt;span&gt;를&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;통해서&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;얻을&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;수&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;있다&lt;/span&gt;&lt;span&gt;.(List&lt;/span&gt;&lt;span&gt;를&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;구현한&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;컬렉션&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;클래스에&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;존재&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Map과 Iterator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;-&lt;span&gt;&lt;span&gt;&amp;nbsp;Map은 Collection의 자손이 아니므로&amp;nbsp;&lt;/span&gt;&lt;span&gt;Iterator()가 없다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;- 그래서 Map은 keySet(), entrySet(), values()를 호출한 다음, Iterator()를 호출해야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1.6 Arrays&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;배열의 복사 - copyOf() 배열전체, copyOfRange() 배열의 일부를 복사해서 새로운 배열을 반환&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;배열 채우기 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; - fill()&amp;nbsp; : 배열의 모든 요소를 지정된 값으로 채운다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; - setAll()&amp;nbsp; : 배열을 채우는데 사용할 함수형 인터페이스를 매개변수로 받는다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;배열의&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;정렬과&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;검색&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; - sort()는 배열을 정렬할 때 사용하고 binarySearch()는 배열에 저장된 요소를 검색할 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; - binarySearch()는 배열에서 지정된 값이 저장된 위치(index)를 찾아서 반환하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 반드시 배열이 정렬된 상태이어야 올바른 결과를 얻는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 검색한 값과 일치하는 요소들이 여러 개 있다면, 이 중에서 어떤 것의 위치가 반환될지는 알 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;문자열의 비교와 출력 - equals(), toString()&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;배열을 List로 변환 - asList(Object... a) : 배열을 List에 담아서 반환(반환한 List의 크기변경 불가)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;parallelXXX(), spliterator(), stream()&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1.7 Comparator와 Comparable&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;-&amp;nbsp;객체를 정렬 하는데 필요한 메서드를 정의한 인터페이스이다.&amp;nbsp;(정렬 기준 제공)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Comparable - 기본 정렬 기준을 구현하는데 사용. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Comparator - 기본 정렬 기준 외에 다른 기준으로 정렬하고자 할 때 사용.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;-&amp;nbsp;compare()와 compareTo()는&amp;nbsp;두 객체의 비교 결과를 반환 하도록 구현 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;비교하는 두 객체가 같으면 0, 왼쪽이 크면 양수, 왼쪽이 작으면 음수를 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;(리턴 값이 음수일 때 자리 교환이 발생함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- Arrays.sort()는 배열을 정렬할 때 Comparator를 지정하지 않으면 객체 배열에 저장된 객체가 구현한 Comparable에 의해 정렬된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- String의 Comparable 구현은 문자열이 사전 순으로 정렬 되도록 작성되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; String의 오름차순 정렬(사전 순서)은 공백, 숫자, 대문자, 소문자의 순으로 정렬되는 것을 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- String은 대소문자를 구분하지 않고 비교하는 Comparator를 상수 형태로 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;이 Comparator를 이용하면 문자열을 대소문자 구분 없이 정렬 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 정렬(sort)는 두 대상을 비교하여 자리 바꿈을 반복 하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;(정렬 방법은 변경 되지 않으며 정렬 기준만 달라지기 때문에 정렬 기준만 전달하면 된다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;320&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kwLGN/btq8dRhZKEN/ujBuqgNcxdehesVF9i2okk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kwLGN/btq8dRhZKEN/ujBuqgNcxdehesVF9i2okk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kwLGN/btq8dRhZKEN/ujBuqgNcxdehesVF9i2okk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkwLGN%2Fbtq8dRhZKEN%2FujBuqgNcxdehesVF9i2okk%2Fimg.png&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;320&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1.8 HashSet / 1.9 TreeSet&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;1)&amp;nbsp;HashSet&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;-&amp;nbsp;HashSet은&amp;nbsp;저장 순서를 유지 하지 않으며 중복을 허용하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;-&amp;nbsp;내부적으로 HashMap을 이용해서 만들어졌으며&amp;nbsp;Set&amp;nbsp;인터페이스를&amp;nbsp;구현한&amp;nbsp;대표적인&amp;nbsp;컬렉션&amp;nbsp;클래스이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;-&amp;nbsp;저장 순서를 유지하려면&amp;nbsp;LinkedHashSet&amp;nbsp;클래스를&amp;nbsp;사용하면&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;-&amp;nbsp;Set은 정렬 할 수 없기 때문에 Set의 모든 요소를 List에 담아서, Collections.sort()로 정렬한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) TreeSet&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;-&amp;nbsp;TreeSet은&amp;nbsp;이진 탐색 트리라는 자료 구조의 형태로 데이터를 저장하는 컬렉션 클래스이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;-&amp;nbsp;내부적으로 TreeMap을 이용해서 만들어졌으며&amp;nbsp;범위 검색과 정렬에 유리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- HashSet&amp;nbsp;보다&amp;nbsp;데이터&amp;nbsp;추가,&amp;nbsp;삭제에&amp;nbsp;시간이&amp;nbsp;더&amp;nbsp;걸림&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;244&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1FOi2/btq8a1ykju8/xPgbgby6nCIXuDT1SrD5I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1FOi2/btq8a1ykju8/xPgbgby6nCIXuDT1SrD5I1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1FOi2/btq8a1ykju8/xPgbgby6nCIXuDT1SrD5I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1FOi2%2Fbtq8a1ykju8%2FxPgbgby6nCIXuDT1SrD5I1%2Fimg.png&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;244&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;[이진 탐색 트리(binary search tree)]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;모든 노드가 최대 두 개의 자식 노드를 갖는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;부모 보다 작은 값은 왼쪽, 큰 값은 오른쪽에 저장한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;중복된 값을 저장하지 못한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 범위 검색과 정렬에 유리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;- 데이터가 많아질 수록&amp;nbsp;&lt;/span&gt;&lt;span&gt;데이터&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;추가&lt;/span&gt;&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;삭제에&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;시간이&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;더&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;걸린다.&amp;nbsp;&lt;/span&gt;&lt;span&gt;(부모 보다 큰지 작은지를 비교하는 횟수가 증가하기 때문&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.10 HashMap과 Hashtable&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;HashMap은&amp;nbsp;Map&amp;nbsp;인터페이스를&amp;nbsp;구현하였으며&amp;nbsp;데이터를&amp;nbsp;키와&amp;nbsp;값의&amp;nbsp;쌍(entry)으로&amp;nbsp;저장한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- HashMap(동기화 X)은 HashTable(동기화 O)의 새로운 버전이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;해싱(hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보인다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;HashMap은 Entry라는 내부 클래스를 정의하고 다시 Entry 타입의 배열을 선언하고 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;저장 순서를 유지하려면, LinkedHashMap클래스를 사용하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;451&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mzJnK/btq8c0sXfr6/9jNS28A6YA0nVpcUI0oIH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mzJnK/btq8c0sXfr6/9jNS28A6YA0nVpcUI0oIH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mzJnK/btq8c0sXfr6/9jNS28A6YA0nVpcUI0oIH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmzJnK%2Fbtq8c0sXfr6%2F9jNS28A6YA0nVpcUI0oIH1%2Fimg.png&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;451&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;해싱(Hashing)?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;-&amp;nbsp;해싱(Hashing)은&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;해시 함수(hash function)를 이용해서&amp;nbsp;해시 테이블(hash table)에 데이터를 저장하거나&amp;nbsp;&lt;span&gt;검색하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;기법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;해시 함수&lt;/span&gt;(hash function)는&amp;nbsp;키를 전달하면 데이터가 저장된 위치(index)를 알려준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span&gt;* 해시 코드(hash code) = 배열의 인덱스(index)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;①&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;키로&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;해시 함수를&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;호출해서&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;해시코드를&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;얻는다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;②&lt;/span&gt;&lt;span&gt;&amp;nbsp;배열에서&amp;nbsp;&lt;/span&gt;&lt;span&gt;해시코드&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;해시 함수의&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;반환 값&lt;/span&gt;&lt;span&gt;)와 일치&lt;/span&gt;&lt;span&gt;하는&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;연결리스트(Linked List)&lt;/span&gt;&lt;span&gt;를&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;찾는다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;③&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;연결리스트(Linked List)&lt;/span&gt;&lt;span&gt;에서&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;키와&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;일치하는&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;데이터를&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;찾는다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span&gt;-&amp;nbsp;해싱에서 데이터를 저장하는 공간을&amp;nbsp;해시 테이블(Hash Table)이라 한다.&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;(배열과 연결 리스트(Linked List)가 조합된 형태)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;** 해시 함수는 같은 키에 대해 항상 같은 해시 코드를 반환 해야 한다. &lt;/span&gt;&lt;span&gt;서로 다른 키 일지라도 같은 값의 해시 코드를 반환할 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1.11 TreeMap&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;TreeMap&lt;/span&gt;은&amp;nbsp;&lt;/span&gt;&lt;span&gt;이진&amp;nbsp;탐색&amp;nbsp;트리의 구조로 키와 값의 쌍으로 이루어진 데이터를 저장한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- HashMap보다 데이터 추가, 삭제에 시간이 더 걸린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;다수의&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;데이터에서&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;개별적인&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;검색은&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;TreeMap&lt;/span&gt;&lt;span&gt;보다&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;HashMap&lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;빠르다&lt;/span&gt;&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Map&lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;필요할&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;때는&amp;nbsp;&lt;/span&gt;&lt;span&gt;주로&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;HashMap&lt;/span&gt;&lt;span&gt;을&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;사용하고&lt;/span&gt;&lt;span&gt;, 범위 검색이나&amp;nbsp;&lt;/span&gt;&lt;span&gt;정렬&lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;필요&lt;/span&gt;&lt;span&gt;한&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;경우에&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;TreeMap&lt;/span&gt;&lt;span&gt;을&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1.12 Properties&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Properties&lt;/span&gt;는 HashMap의 구버전인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;H&lt;/span&gt;&lt;/span&gt;&lt;span&gt;ashtable을&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;상속 받아 구현한 것&lt;/span&gt;으로&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;span&gt;key&lt;/span&gt;&lt;/span&gt;&lt;span&gt;와 value를 String으로 저장한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp;즉, Properties는 (String, String)의 형태로 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;-&amp;nbsp;&lt;span&gt;주로&lt;/span&gt;&lt;span&gt;&amp;nbsp;애&lt;/span&gt;&lt;span&gt;플리케이션의&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;환경 설정에&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;관련된&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;속성을&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;저장 하는데&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;사용되며&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;파일로부터&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;편리하게&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;값을&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;읽고&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;쓸&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;수&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;있는&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;메서드를&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;제공한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1.13 Collections&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Collections 클래스는 컬렉션를 위한 static 메서드를 제공한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;1)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;컬렉션&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;채우기&lt;/span&gt;&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;복사&lt;/span&gt;&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;정렬&lt;/span&gt;&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;검색&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; fill(), copy(), sort(), binarySearch()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;등의 메서드는 Arrays에서 이미 배웠으므로 설명을 생략한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2)&amp;nbsp;&lt;span&gt;컬렉션의&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;동기화&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; synchronizedXXX()&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;synchronizedXXX()는 동기화 처리를 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;3)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;변경 불가&lt;/span&gt;&lt;span&gt;(readOnly)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;컬렉션&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;만들기&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash;&lt;span&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;unmodifiableXXX()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; - unmodifiableXXX()는 저장된 데이터를 변경 할 수 없는 컬렉션을 만든다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;4)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;싱글톤&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;컬렉션&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;만들기&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash; singletonXXX()&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;singletonXXX()는&lt;span&gt;&amp;nbsp;&lt;/span&gt;단 하나의 객체만을 저장하는 컬렉션을 만든다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;5)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;한&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;종류의&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;객체만&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;저장하는&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;컬렉션&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;만들기&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ndash;&lt;span&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;checkedXXX()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; - checkedXXX()는 한 종류의 객체만 저장하는 컬렉션을 만든다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;- 컬렉션에 저장할 요소의 타입을 제한하는 것은 제네릭으로 간단히 처리할 수 있지만 이러한 메서드들을 제공하는 이유는 호환성 때문이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;204&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vBPU7/btq8gx3IpH0/4gqObhNFNd54tkZk6r471k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vBPU7/btq8gx3IpH0/4gqObhNFNd54tkZk6r471k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vBPU7/btq8gx3IpH0/4gqObhNFNd54tkZk6r471k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvBPU7%2Fbtq8gx3IpH0%2F4gqObhNFNd54tkZk6r471k%2Fimg.png&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;204&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/Java \ Spring</category>
      <author>****7****</author>
      <guid isPermaLink="true">https://recoderr.tistory.com/40</guid>
      <comments>https://recoderr.tistory.com/40#entry40comment</comments>
      <pubDate>Sun, 27 Jun 2021 17:36:35 +0900</pubDate>
    </item>
  </channel>
</rss>