<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>코드 훔쳐보는 변태 코더</title>
    <link>https://codinghentai.tistory.com/</link>
    <description>춤 좋아하는 백엔드 개발자(였으면 좋겠다)</description>
    <language>ko</language>
    <pubDate>Mon, 13 Apr 2026 11:22:56 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>코딩하는 브린스</managingEditor>
    <image>
      <title>코드 훔쳐보는 변태 코더</title>
      <url>https://tistory1.daumcdn.net/tistory/5834955/attach/17c1849cafec434ca20d9a907144e4a4</url>
      <link>https://codinghentai.tistory.com</link>
    </image>
    <item>
      <title>프로세스랑 스레드는 무슨관계?? ;ㅅ;</title>
      <link>https://codinghentai.tistory.com/100</link>
      <description>&lt;h1&gt;프로세스&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 &amp;rarr; 하드디스크 등의 저장매체에 저장되는 실행 파일의 형태를 갖고있는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 &amp;rarr; &lt;b&gt;프로그램이 메모리에 적재되어있는 상태를 뜻한다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스는 프로그램 실행에 필요한 모든 자원을 할당받는다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코드공간 / 힙공간 / 스택공간 / 데이터공간&lt;/b&gt; 을 갖고있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스는 기본적으로 코드공간 힙공간 스택공간 데이터공간 을 가집니다. (코데힙스)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로세스의 특징&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제는 프로그램을 메모리에 적재하고 프로세스로 다루게 된다.&lt;/li&gt;
&lt;li&gt;메모리 할당 &amp;rarr; 코드 , 데이터 적재&lt;/li&gt;
&lt;li&gt;프로세스들은 서로 독립적인 메모리 공간을 가지고 프로세스마다 고유한 번호 **(PID)**를 할당한다.&lt;/li&gt;
&lt;li&gt;프로세스의 모든 정보는 &lt;b&gt;커널에 의해 관리된다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;프로세스는 기본적으로 실행 - 대기 - 잠자기 - 대기 - 실행 - 종료 등의 생명주기를 가지고 &lt;b&gt;커널에 의해 수행된다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운용되는 동안에는 대기하고있는 프로세스 (기본적으로는 단순히 대기도 아닌 하드디스크에 저장되어있다.)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그럼 프로세서는 ? &amp;rarr; &lt;b&gt;하드웨어적인 부분&lt;/b&gt;으로 하드웨어 처리기라는 의미를 갖고있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스는 프로그램의 단위라고 할 수 있으며 프로그램의 정보를 저장한 인스턴스라고도 볼 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로세스 관리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널 (&lt;b&gt;운영체제의 핵심 부분&lt;/b&gt;을 의미합니다. 이 부분은 &lt;b&gt;하드웨어와 소프트웨어 간의 인터페이스 역할&lt;/b&gt;을 하며, 프로세스 관리, 메모리 관리, 입출력 관리 등 시스템의 핵심적인 기능을 제공합니다. )
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널에 의해 커널 영역에 프로세스 테이블을 만들고 프로세스 목록을 관리한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그렇다면 한 프로그램을 여러번 실행할땐 ?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램 실행시마다 독립된 프로세스가 생성되고 &lt;b&gt;다중 인스턴스&lt;/b&gt;라고 부른다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 프로세스에 독립된 메모리 공간이 할당되며 &lt;b&gt;별개의 프로세스로 취급한다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로세스 구성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 영역
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램의 코드가 적재되는 영역이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;데이터 영역
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램의 변수 공간이라 볼 수 있다.&lt;/li&gt;
&lt;li&gt;프로세스 적재시 할당되며 종료시 소멸된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;힙 영역
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동적으로 사용할 수 있도록 할당된 공간이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스택 영역
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수가 실행될 때 사용될 데이터를 위해 할당된 공간이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스는 기본적으로 자바 혹은 자바스크립트와 같은 언어들의 컨텍스트와 비슷한 영역을 갖고있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;스레드&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스레드의 출현 목적
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;멀티태스킹의 문제점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널에 많은 시간과 공간이 부담되며 시스템의 전체 속도를 저하시킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;효율적인 새로운 실행 단위가 필요했기 때문에 스레드가 출현했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스레드는 기본적으로 프로세스보다 크기가 작다.&lt;/li&gt;
&lt;li&gt;프로세스보다 생성 및 소멸이 빠르고 이로인해 컨텍스트 스위칭이 빠르다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스레드의 개념&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스레드는 실행 단위이며 스케줄링 단위이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 작업의 개념을 갖고있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;운영체제에게는 실행단위이고 스케줄링 단위이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스케줄링이란 ? &amp;rarr; 시스템 내에서 실행될 작업들을 어떤 순서에 따라 할당하고 관리하는 것을 의미합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스레드 또한 코드 데이터 힙 스택을 가진 실체이며 프로세스와 마찬가지로 스레드마다 TCB (스레드 컨트롤 블럭) 이 존재한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스는 스레드들의 컨테이너라고 볼 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쉽게 생각하자면 리액트의 useState 가 클로저 개념을 사용해서 캐싱하고 변화를 눈치채는것처럼 프로세스는 스레드를 캐싱해두고 작업에 대한 정보를 얻어서 관리한다고 생각하시면 돼요!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;마찬가지로 프로세스는 회사 / 스레드는 직원에 비유할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;직원 &amp;rarr; &lt;b&gt;회사의 목적&lt;/b&gt;을 위해 일을 하는 단위&lt;/li&gt;
&lt;li&gt;스레드 &amp;rarr; &lt;b&gt;프로세스의 목적&lt;/b&gt;을 위해 &lt;b&gt;동시에 실행될 작업 단위&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로세스는 스레드들의 공유 공간을 제공한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 스레드는 프로세스의 코드 데이터 힙을 공유하며 &lt;b&gt;프로세스의 스택 공간을 나누어 사용한다. 따라서 스레드 사이의 통신이 용이하다. (멀티 프로세스와의 가장 큰 차이점)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로세스의 속한 모든 스레드가 종료되면 프로세스가 종료된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>학교공부</category>
      <author>코딩하는 브린스</author>
      <guid isPermaLink="true">https://codinghentai.tistory.com/100</guid>
      <comments>https://codinghentai.tistory.com/100#entry100comment</comments>
      <pubDate>Thu, 24 Aug 2023 14:22:22 +0900</pubDate>
    </item>
    <item>
      <title>Virtual DOM 가장 쉽게 이해하기</title>
      <link>https://codinghentai.tistory.com/99</link>
      <description>&lt;h1 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;선언형 프로그래밍&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;버추얼돔에 대해서 공부하기 이전에 우리는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;선언형 프로그래밍에과 명령형 프로그래밍에 대해 알고 갈 필요가 있다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-선언형-프로그래밍이란-&quot; style=&quot;color: #000000;&quot; href=&quot;https://github.com/brince0304/react-article-study/blob/main/brince/virtual-dom-reconciliation.md#%EC%84%A0%EC%96%B8%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80-&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;선언형 프로그래밍이란 ?&lt;/h3&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 정의에 따르면, 프로그램이&amp;nbsp;어떤 방법으로&amp;nbsp;해야 하는지를 나타내기보다&amp;nbsp;&lt;b&gt;무엇&lt;/b&gt;과 같은지를 설명하는 경우에 &quot;선언형&quot;이라고 한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;선언형 프로그래밍은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;무엇(What)을 원하는지를 명시하고, 시스템이 어떻게(How) 처리해야 하는지는 추상화된 레벨에서 결정하는 방식이다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;쉽게 말해 리액트에서 UI를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;선언적&lt;/b&gt;으로 작성하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;개발자는 UI의 구조와 렌더링 결과물을 설명하고, 리액트가 이를 실제 DOM 조작으로 변환하고 최적화한다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;a id=&quot;user-content-그럼-명령형-프로그래밍이란-&quot; style=&quot;color: #000000;&quot; href=&quot;https://github.com/brince0304/react-article-study/blob/main/brince/virtual-dom-reconciliation.md#%EA%B7%B8%EB%9F%BC-%EB%AA%85%EB%A0%B9%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80-&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;그럼 명령형 프로그래밍이란 ?&lt;/h3&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래밍의&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://ko.wikipedia.org/w/index.php?title=%EC%83%81%ED%83%9C_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)&amp;amp;action=edit&amp;amp;redlink=1&quot;&gt;상태&lt;/a&gt;와 상태를 변경시키는 구문의 관점에서 연산을 설명하는&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%ED%8C%A8%EB%9F%AC%EB%8B%A4%EC%9E%84&quot;&gt;프로그래밍 패러다임&lt;/a&gt;의 일종이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어떻게(How) 작업을 수행해야 하는지 단계별로 명시하고, 변경 가능한 상태를 직접 조작하여 프로그램의 흐름을 제어하는 방식이다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;개발자의 의도대로 하나부터 열까지 동작해야 하는 상황에서는 좋을 수 있지만, 그게 아니라면 오히려 복잡한 작업순서와 예상치못한 결과를 초래할 수 있다.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&lt;a id=&quot;user-content-dom-document-object-model&quot; style=&quot;color: #000000;&quot; href=&quot;https://github.com/brince0304/react-article-study/blob/main/brince/virtual-dom-reconciliation.md#dom-document-object-model&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;DOM (Document Object Model)&lt;/h1&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://www.geeksforgeeks.org/dom-document-object-model/&quot;&gt;DOM은 Document Object Model의 약자로&lt;/a&gt;&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://www.geeksforgeeks.org/html/&quot;&gt;HTML&lt;/a&gt;&lt;/b&gt;&amp;nbsp;문서&amp;nbsp;의 모든 노드를 구조적으로 표현한 것입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;쉽게 말해 DOM은 응용 프로그램의 UI를 나타낸다고 할 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 당신이 1부터 5까지의 값이 담긴 배열에서 중간의 3을 4로 바꾸고 싶다면 어떻게 할것인가?&lt;/p&gt;
&lt;div style=&quot;background-color: #000000; color: #1f2328; text-align: start;&quot;&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #000000; color: #000000;&quot;&gt;&lt;code&gt;const arr = [1,2,3,4,5] // 변경 전
const arr = [1,2,4,4,5] // 변경 후&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;작은 규모라면, 단순히 하나의 값을 변경한 새 배열을 선언해 대체할 수 있지만, 만약 규모가 작지 않다면 해당 방법은 비효율적일 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이렇게 실제 DOM은 하나의 변경점이 발생해도 모든 노드를 업데이트 하게 된다.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;변경점이 발생하지 않았던 노드도 리렌더링을 하게 된다면 얼마나 큰 비용이 소모되는지 알 수 있다.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&lt;a id=&quot;user-content-virtual-dom&quot; style=&quot;color: #000000;&quot; href=&quot;https://github.com/brince0304/react-article-study/blob/main/brince/virtual-dom-reconciliation.md#virtual-dom&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;Virtual DOM&lt;/h1&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버추얼 돔은 실제 돔의 추상화된 모델이라 볼 수 있다. 그러기 떄문에 추상화의 추상화이다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;경량 복사본이라는 점을 제외하면 실제 DOM 개체와 동일하다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;버추얼돔은 돔의 동작방식을 보완하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;속성이 변경되면 전체 트리가 아닌 해당 노드만 업데이트된다&lt;/b&gt;.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content-리액트에서-버추얼돔은-어떻게-업데이트에-관여할까&quot; style=&quot;color: #000000;&quot; href=&quot;https://github.com/brince0304/react-article-study/blob/main/brince/virtual-dom-reconciliation.md#%EB%A6%AC%EC%95%A1%ED%8A%B8%EC%97%90%EC%84%9C-%EB%B2%84%EC%B6%94%EC%96%BC%EB%8F%94%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8%EC%97%90-%EA%B4%80%EC%97%AC%ED%95%A0%EA%B9%8C&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;리액트에서 버추얼돔은 어떻게 업데이트에 관여할까?&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ReactDOM.render() 는 실제 돔과 버추얼 돔트리를 생성하여 첫 번째 로드시 화면의 요소를 렌더링한다.&lt;/li&gt;
&lt;li&gt;요소에 대한 변경 사항 혹은 상태 변경에 대한 알림을 버추얼 노드로 전송한다. 마찬가지로 노드의 속성이 변경되면 자체적으로 업데이트 된다.&lt;/li&gt;
&lt;li&gt;리액트는 업데이트된 버추얼돔을 실제 돔과 비교한다. 그리고 실제 돔을 업데이트 하며&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;이 과정을 재조정이라고 한다.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;재조정은 Diffing Algorithm 으로 알려진 휴리스틱 알고리즘을 사용하여 수행된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그렇게 버추얼돔은 변경값이 존재하는 속성만 업데이트하여 렌더링함과 동시에&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모든 변경점을 하나하나 리렌더링을 트리거하며 업데이트하지 않고, 필요한 부분만 업데이트하여 한번만 리렌더링을 트리거한다.&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #000000; color: #1f2328; text-align: start;&quot;&gt;
&lt;pre class=&quot;ini&quot; style=&quot;background-color: #000000; color: #000000;&quot;&gt;&lt;code&gt;div.innerHTML='change text'
div.style.cssText='width:100px;height:100px'&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 이러한 변경점이 발생할 때 , 실제 돔은 변경점 하나하나마다 리렌더링을 한다고 하면, 버추얼 돔은 이 변경점을 모두 반영하여 한번의 리렌더링을 발생시킨다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 실제 돔은 이렇게 개발자가 원하는 방향을 하나하나 일일히 명령하여 렌더링과 성능최적화를 직접 신경써야 한다면&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 버추얼 돔은 개발자가 원하는 방향과 처리방법을 선언하면 리액트가 디핑 알고리즘을 통해 변경점을 캐치 후 렌더링한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이것이 선언형 / 명령형 프로그래밍 방식의 차이라고도 볼 수 있다.&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&lt;a id=&quot;user-content-그렇다면-버추얼돔과-실제돔-사이-비교는-어떻게-이뤄질까&quot; style=&quot;color: #000000;&quot; href=&quot;https://github.com/brince0304/react-article-study/blob/main/brince/virtual-dom-reconciliation.md#%EA%B7%B8%EB%A0%87%EB%8B%A4%EB%A9%B4-%EB%B2%84%EC%B6%94%EC%96%BC%EB%8F%94%EA%B3%BC-%EC%8B%A4%EC%A0%9C%EB%8F%94-%EC%82%AC%EC%9D%B4-%EB%B9%84%EA%B5%90%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9D%B4%EB%A4%84%EC%A7%88%EA%B9%8C&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;그렇다면 버추얼돔과 실제돔 사이 비교는 어떻게 이뤄질까?&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;한 트리를 다른 트리로 변환하기 위하여 최소한의 연산을 제공하는 알고리즘은 O(n3)의 시간 복잡도를 가진다고 한다. &amp;rarr; 1000개의 요소를 표시하는데 10억번의 비교가 필요하다는 소리이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;리액트는 이러한 재조정 과정에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Diffing 알고리즘&lt;/b&gt;인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;휴리스틱 알고리즘&lt;/b&gt;을 사용하여 성능을 최적화하며 시간 복잡도를 낮췄다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content-휴리스틱-알고리즘&quot; style=&quot;color: #000000;&quot; href=&quot;https://github.com/brince0304/react-article-study/blob/main/brince/virtual-dom-reconciliation.md#%ED%9C%B4%EB%A6%AC%EC%8A%A4%ED%8B%B1-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;휴리스틱 알고리즘&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 휴리스틱이란 불충분한 시간이나 정보로 인하여 합리적인 판단을 할 수 없거나 체계적이면서 합리적 판단이 필요하지 않은 상황에서 사람들이 빠르게 사용할 수 있도록 구성된 간편 추론 방법이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;단순히&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;중요한 것들만 고려해서&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;최선의 값을 찾아내는 방법이라고 할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 타입의 두 요소는 서로 다른 트리를 생성한다.&lt;/li&gt;
&lt;li&gt;개발자는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Key prop&lt;/b&gt;을 이용해 다른 렌더링 사이에서의 자식 요소에 대한 힌트를 얻을 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;리액트는 위 두가지 가정에 따른 휴리스틱 알고리즘을 채택하여 시간복잡도를 O(n)으로 낮췄다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 휴리스틱 알고리즘이 기반하고 있는 가정에 부합하지 않는 경우에 성능이 나빠질 수 있다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content-재조정-과정&quot; style=&quot;color: #000000;&quot; href=&quot;https://github.com/brince0304/react-article-study/blob/main/brince/virtual-dom-reconciliation.md#%EC%9E%AC%EC%A1%B0%EC%A0%95-%EA%B3%BC%EC%A0%95&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;재조정 과정&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본적으로 두개의 트리를 비교할 때 ,리액트는 비교를 위한 새 버추얼돔을 생성 후 루트 엘리먼트부터 비교한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;돔 요소 타입이 다른경우 리액트는 이전 트리를 버리고 새로운 트리를 구축하며 새로운 돔 노드들이 돔에 삽입되며 연관된 모든 state 는 사라지며 새로 다시 마운트된다.&lt;/li&gt;
&lt;li&gt;같은 경우에는 변경된 속성들만 갱신한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;돔노드의 처리가 끝나면, 리액트는 해당 노드의 자식들을 재귀적으로 처리한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;더 이상 처리할 자식이 없을때까지 처리한다는 뜻&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이러한 상황에서의 Key 프로퍼티가 성능적인 측면에서 중요한 역할을 하게된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자식들이 key를 갖고있다면, 리액트는 key를 통해 기존트리와 이후 트리의 자식들이 일치한지 확인하여 자식 요소들을 순회하지 않고 key 속성으로 쉽게 판단할 수 있게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; key 값으로 인덱스를 사용하면 어떻게 될까?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떠한 상황에서 단순히 key 값으로 인덱스를 사용하는 경우가 존재한다.&lt;/li&gt;
&lt;li&gt;재배열되는 경우에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;항목의 순서가 바뀔 때 key 또한 바뀌기 때문에 식별자로서의 역할을 하지 못한다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;a id=&quot;user-content-주의점&quot; style=&quot;color: #000000;&quot; href=&quot;https://github.com/brince0304/react-article-study/blob/main/brince/virtual-dom-reconciliation.md#%EC%A3%BC%EC%9D%98%EC%A0%90&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;주의점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매우 비슷한 결과물을 출력하는 두 컴포넌트를 교체하고 있다면,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;그 둘을 같은 타입으로 만드는 것이 더 나을수도 있다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;위와 마찬가지로 key 는 변하지 않고 예상이 가능하며 유일해야한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;변하는 키를 사용하면 자식 컴포넌트의 state 가 유실되거나 성능이 나빠질 수 있다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&lt;a id=&quot;user-content-레퍼런스&quot; style=&quot;color: #000000;&quot; href=&quot;https://github.com/brince0304/react-article-study/blob/main/brince/virtual-dom-reconciliation.md#%EB%A0%88%ED%8D%BC%EB%9F%B0%EC%8A%A4&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;레퍼런스&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://www.geeksforgeeks.org/reactjs-reconciliation/&quot;&gt;ReactJS Reconciliation - GeeksforGeeks&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://www.geeksforgeeks.org/difference-between-virtual-dom-and-real-dom/&quot;&gt;Difference between Virtual DOM and Real DOM - GeeksforGeeks&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://www.educative.io/answers/what-is-the-difference-between-virtual-and-real-dom-react&quot;&gt;What is the difference between virtual and real DOM (React)?&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://charles098.tistory.com/204&quot;&gt;[ React ] 재조정(Reconciliation)과 Key 사용 이유&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://ko.legacy.reactjs.org/docs/reconciliation.html&quot;&gt;재조정 (Reconciliation) &amp;ndash; React&lt;/a&gt;&lt;/p&gt;</description>
      <category>React</category>
      <author>코딩하는 브린스</author>
      <guid isPermaLink="true">https://codinghentai.tistory.com/99</guid>
      <comments>https://codinghentai.tistory.com/99#entry99comment</comments>
      <pubDate>Thu, 24 Aug 2023 14:20:20 +0900</pubDate>
    </item>
    <item>
      <title>원티드 프리온보딩 인턴십 1주차 개인&amp;amp;팀과제 회고록</title>
      <link>https://codinghentai.tistory.com/98</link>
      <description>&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;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk5EAh/btsmUwb8ogN/daoPbLSbgJ2P6jUCLN02U1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk5EAh/btsmUwb8ogN/daoPbLSbgJ2P6jUCLN02U1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk5EAh/btsmUwb8ogN/daoPbLSbgJ2P6jUCLN02U1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk5EAh%2FbtsmUwb8ogN%2FdaoPbLSbgJ2P6jUCLN02U1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;702&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 id=&quot;프로젝트-주제&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;프로젝트 주제&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;원티드 프리온보딩 인턴십 교육 (11차) 사전과제 주제는 투두리스트 만들기였습니다.&lt;br /&gt;간단한 투두리스트 라고 생각할 수 있지만, 뭐든지 간단한만큼 신경쓸게 더 많다는 사실.. 방심하지 않고 핵심 기능들을 최대한 깔끔하게 구현해보자 라는 생각으로 임해보았습니다.&lt;/p&gt;
&lt;blockquote style=&quot;color: #212529; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여담이지만 .. 왜 저는 항상 팀장이 되는걸까요 ..? 흑..&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;사전-개인과제-요구사항&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;사전 개인과제 요구사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기능구현에 직접적으로 연관된 라이브러리 사용은 허용되지 않습니다.(React-Query 등)&lt;/li&gt;
&lt;li&gt;README.md 작성은 필수입니다. 아래의 사항은 반드시 포함되도록 해주세요&lt;/li&gt;
&lt;li&gt;페이지별로 요구되는 경로는 도메인 URL뒤에 바로 이어지도록 설정해주세요&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기본적으로 진입 루트가 회원가입 -&amp;gt; 로그인 -&amp;gt; 투두리스트 였고, 기능 구현에 연관된 라이브러리는 사용하지 않는것이 기본 규칙이었습니다.&lt;/p&gt;
&lt;h2 id=&quot;1주차-팀-과제-요구사항&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1주차 팀 과제 요구사항&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;팀빌딩이 이뤄지고 진행되는 1주차 팀 과제는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;BestPractice&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 선정하여 사전과제를 리팩토링 하는것이었습니다.&lt;/p&gt;
&lt;blockquote style=&quot;color: #212529; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Best Practice&lt;/b&gt;란 모범사례라는 말로서, 특정 문제를 효과적으로 해결하기 위한 가장 성공적인 해결책 또는 방법론을 의미합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;쉽게말해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;사전과제의 핵심 기능을 파트별로 나눠, 가장 잘 작성된 코드를 선정해 선정된것들로만 이뤄진 프로젝트를 완성해 제출하는 것&lt;/b&gt;이 1주차 과제였습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1주차 세션에서 진행했던 협업을 위한 툴들을 적용시키기 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;ES Lint 와 Prettier, 그리고 husky를 사용하여 포멧팅을 자동화 하도록 진행했고,&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;너무 세분화하여 진행하지 않고 큰 부분들만 나눠서 불필요한 딜레이를 줄이는것을 목표로 진행되었기 때문에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;고민사항은 크게 3가지로 분류하여 BestPractice 를 선정했습니다.&lt;/b&gt;&lt;br /&gt;(진행은 팀별 디스코드 채널,노션을 생성해 회의와 회의내용을 정리하여 기록하며 진행했습니다.)&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;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cb94Zh/btsmR9OYi1i/m0NREhm9G9zpq0QMZRw2R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cb94Zh/btsmR9OYi1i/m0NREhm9G9zpq0QMZRw2R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cb94Zh/btsmR9OYi1i/m0NREhm9G9zpq0QMZRw2R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcb94Zh%2FbtsmR9OYi1i%2Fm0NREhm9G9zpq0QMZRw2R1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;676&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일트리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체적으로 팀원들이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;프로젝트의 디테일한 폴더 구조에 대한 고민이 많았기 때문에&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;여러부분을 참고하여 진행했지만&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;실무를 겪어보지 못했기 때문에 프로젝트의 규모별로 괜찮은 파일트리를 선정하기 어려웠다는 의견&lt;/b&gt;들이 많았습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인증/인가 로직
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인증에 대한 로직을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;어디서&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;구현해야 할지, 공통 로직을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;분리할 수 있을지&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;, 그리고 그것을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;어떻게&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;구현해야 할지에 대한 고민이 많았습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;컴포넌트 분리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴포넌트를 어떻게&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;어떠한 기준으로 분리하여 유지보수에 최적화된 컴포넌트를 구현할 수 있을지에 대한 고민&lt;/b&gt;이 공통적으로 존재했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;과제-진행중-고민되었던-부분&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;과제 진행중 고민되었던 부분&lt;/h2&gt;
&lt;h3 id=&quot;개인--파일트리&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;개인 : 파일트리&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;개인으로 진행했던 사전과제의 경우에는 파일트리를 프로젝트 전체 깊이가 깊어지더라도 세분화하여 폴더를 생성하여 각 폴더별로 메인이 될 수 있는 컴포넌트를 index.tsx 로 생성하여 관리하는 구조를 택했습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 구조가 개인적으로 각각의 컴포넌트에 대한 작명만 잘한다면 도서관의 원하는 도서 찾기처럼 크게 불편함이 없는 상태로 세분화를 할 수 있겠다는 생각이 들었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oinXD/btsmRoFEEUJ/NHVZOx2cjuCxF4xil3Ydk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oinXD/btsmRoFEEUJ/NHVZOx2cjuCxF4xil3Ydk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oinXD/btsmRoFEEUJ/NHVZOx2cjuCxF4xil3Ydk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoinXD%2FbtsmRoFEEUJ%2FNHVZOx2cjuCxF4xil3Ydk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;372&quot; height=&quot;488&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이전에 진행했던 개인 프로젝트는 아무래도 하나하나를 세분화 하다보니 전체적으로 깊이가 너무 깊어져서 오히려 가독성을 더욱 해칠 수 있겠다는 생각이 들었기 때문에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;이번 프로젝트는 진행하면서 자식 컴포넌트 (HeaderMenu 의 Menu 같은)는 따로 폴더를 생성하지 않고 해당 컴포넌트의 이름으로 네이밍을 하는 방식&lt;/b&gt;으로 진행하였습니다.&lt;/p&gt;
&lt;h3 id=&quot;팀--파일트리&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;팀 : 파일트리&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;팀과제로 진행된 프로젝트의 경우에는 일단 컴포넌트 구현에 앞서서 정확한 파일트리와 인증로직 구현을 진행 후에 컴포넌트를 구현하는게 맞다고 생각했기 때문에 파일트리를 먼저 정하게 되었습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;전체적으로 저는 백엔드를 학습하다가 프론트엔드를 시작했었던지라, 백엔드 프로젝트를 진행할 땐 항상 확장에 대한 가능성을 열어둔 채로 프로젝트를 진행했기 때문에 최대한 쪼갤 수 있는 부분은 쪼개고 각각의 모듈에 대해서 관심사를 분리하는것을 메인으로 삼고 진행했으나,&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;공통적으로 프론트엔드 개발자분들은 대부분 현재 진행하는 프로젝트의 규모에 따라 방식을 정하는듯 하셨습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;저희 팀의 경우 현재 진행해야 하는 투두리스트 또한 규모 자체가 크지 않았기 때문에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;과한 세분화는 지양하고 최대한 커뮤니케이션에 문제가 없게끔 파일트리를 정의하여 깔끔한 프로젝트를 진행하기로 결정되었습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기에 api로직에 대한 부분들은 저의 방식을 BestPractice 로 선정해 apis 폴더에 각 컴포넌트 별로 비즈니스로직을 분리하여 선언하도록 구현했습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 부분에 있어서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;기본적으로 큰 부분 (컴포넌트들,api들, 페이지들 등) 으로 나누어 폴더를 생성 후 각 부분에 맞춰서 필요시에 폴더를 생성하고, 큰 이유가 없다면 파일만 생성하여 관리하는 구조를 택했고,&lt;/b&gt;&lt;span&gt;&amp;nbsp;&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;377&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPq0ye/btsmROkadWU/hSi9XunRIi6WEp60JWItxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPq0ye/btsmROkadWU/hSi9XunRIi6WEp60JWItxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPq0ye/btsmROkadWU/hSi9XunRIi6WEp60JWItxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPq0ye%2FbtsmROkadWU%2FhSi9XunRIi6WEp60JWItxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;377&quot; height=&quot;501&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;501&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&quot;팀-진행으로-인해-얻어간것들-파일트리&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;팀 진행으로 인해 얻어간것들 (파일트리)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떻게 보면 제가 개인으로 정의했던 파일트리는 예를 들었을 때&lt;br /&gt;쓸데없이 즉섭밥을 데워먹어야하는 상황임에도 직접 지은 밥을 고수하는 듯한 느낌을 줄 수도 있겠구나 .. 라는 생각을 하게 되었습니다.&lt;/li&gt;
&lt;li&gt;다른분들의 의견을 통해 상황별로 해당 구조가 필요한 경우가 있겠지만 너무 과하게 멀리보고 진행하기보다는 확실한 규모를 정하고 프로젝트를 진행하는게 좋겠다는 생각을 다시 한번 하게 되었습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;s&gt;개발은 아무래도 나 혼자 하는것이 아니기 때문에 ..&lt;/s&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;개인--인증-로직-구현&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;개인 : 인증 로직 구현&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;인증 로직의 경우에는 기본적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;요청시에 헤더에 토큰을 포함시키고, 토큰이 만료되거나 비밀번호가 옳지 않을때는 공통적으로 401에러를 반환하기 때문에&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;axios interceptor 로 분리하여 로직을 구현할 수 있겠다는 생각이 들었습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이에 대해서 들었던 생각은 두가지였습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ContextAPI 를 사용하여 인증 상태값 저장하기&lt;/li&gt;
&lt;li&gt;단순히 LocalStorage 에서 토큰값을 가져와서 헤더에 포함시키기&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 과제의 경우에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;메인 기능을 구현하는데에 있어서 관련된 라이브러리를 설치하여 사용하는것이 금지되었기 때문에&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;ContextAPI 를 사용하여 구현하는것을 생각했습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 Axios Interceptor 의 경우에는 해당 로직 내부에서 hook사용이 불가능했기 때문에 구현에 있어서 문제가 발생했습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Axios Interceptor 에서는 매 요청시마다 로컬스토리지에 저장된 값을 확인이 가능했기 때문에 로컬스토리지에서 토큰을 찾아서 같이 포함시켰고, Context API는 인증 여부에 따른 라우팅을 담당하는데에 사용하였습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단순히 라우팅시에도 localStorage 에서 값을 찾아오면, 해당 변수에 저장된 boolean 값이 계속 업데이트 되는것이 아니기때문에 제대로된 구현이 어려웠습니다.&lt;br /&gt;+@ 로 useEffect를 사용하여 navigate시에는 블링크 현상이 발생했기 때문에 신경쓸 부분이 많았습니다. (예: 토큰이 없는 상황에서 Todo로 라우팅시에 SignIn 컴포넌트로 네비게이트)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하나의 기능에 대한 구현을 여러 방법으로 구현하는것 처럼 보일 수 있었지만, 이렇게 지속적으로 인증 상태가 변경되는 부분을 감시해야하는 상황에서는 Context API 를 사용했고, Interceptor 에서는 LocalStorage 의 토큰 유무를 매 요청마다 확인하여 반영할 수 있었기 때문에 단순히 getItem 으로 유무를 확인 후 포함하도록 구현했습니다.&lt;/p&gt;
&lt;pre class=&quot;moonscript&quot; style=&quot;color: #212529; text-align: start;&quot;&gt;&lt;code&gt;export function setInterceptors(instance: AxiosInstance) {

    // 요청 인터셉터 추가
    instance.interceptors.request.use(
        (config) =&amp;gt; {
            config.headers[&quot;Content-Type&quot;] = &quot;application/json&quot;;
            if (getTokenFromLocalStorage) {
                config.headers[&quot;Authorization&quot;] = `Bearer ${getTokenFromLocalStorage()}`;
            }
            return config;
        },
        (error) =&amp;gt; {
            interceptorErrorHandler(error);
            return Promise.reject(error);
        }
    );

    instance.interceptors.response.use(
        (response) =&amp;gt; {
            return response;
        },
        (error) =&amp;gt; {
            interceptorErrorHandler(error);
            return Promise.reject(error);
        }
    );

    return instance;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;django&quot; style=&quot;color: #212529; text-align: start;&quot;&gt;&lt;code&gt;function App() {
    const tokenState = useTokenState();
    return (
            &amp;lt;StyledContainer&amp;gt;
                &amp;lt;Header/&amp;gt;
                &amp;lt;Routes&amp;gt;
                    &amp;lt;Route path={&quot;/&quot;} element={tokenState.accessToken ? &amp;lt;Navigate to={&quot;/todo&quot;}/&amp;gt; : &amp;lt;Navigate to={&quot;/signin&quot;}/&amp;gt;}/&amp;gt;
                    &amp;lt;Route path={&quot;/signup&quot;}
                           element={tokenState.accessToken ? &amp;lt;Navigate to={&quot;/todo&quot;}/&amp;gt; : &amp;lt;SignUp/&amp;gt;}/&amp;gt;
                    &amp;lt;Route path={&quot;/signin&quot;}
                           element={tokenState.accessToken ? &amp;lt;Navigate to={&quot;/todo&quot;}/&amp;gt; : &amp;lt;SignIn/&amp;gt;}/&amp;gt;
                    &amp;lt;Route path={&quot;/todo&quot;}
                           element={tokenState.accessToken ? &amp;lt;Todo/&amp;gt; : &amp;lt;Navigate to={&quot;/signin&quot;}/&amp;gt;}/&amp;gt;
                    &amp;lt;Route path={&quot;/signout&quot;}
                           element={tokenState.accessToken ? &amp;lt;SignOut/&amp;gt; : &amp;lt;Navigate to={&quot;/signin&quot;}/&amp;gt;}/&amp;gt;
                    &amp;lt;Route path={&quot;*&quot;} element={&amp;lt;NotFound/&amp;gt;}/&amp;gt;
                &amp;lt;/Routes&amp;gt;
            &amp;lt;/StyledContainer&amp;gt;
    );
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;팀--인증-로직-구현&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;팀 : 인증 로직 구현&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;저희 팀원들 같은 경우에는 리액트 라우터의 createBrowserRouter를 사용하여 구현하셨고, ContextAPI를 사용하시지 않고 단순히 localStorage 에서 토큰의 유무를 확인하고 요청에 포함시키도록 구현하셨었고,&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;감사하게도 제 구현 방법이 BestPractice 로 선정되어 진행되었습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 이 부분에 있어서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;ContextAPI를 사용하지 않고 구현했기 때문에 기본적인 깜빡임 (접근하면 안되는 페이지가 접근이 되었다가 순식간에 구현했던 로직대로 다른 페이지로 이동되는 현상) 이 존재했기때문에 아쉬웠습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;시간상 ContextAPI를 다시 적용시킬 여유가 되지 않았기때문에, 디테일한 구현보다는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;기본적인 요구사항에만 초점을 두고 진행되었습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; style=&quot;color: #212529; text-align: start;&quot;&gt;&lt;code&gt;//인터셉터
const onRequest = (config: InternalAxiosRequestConfig): InternalAxiosRequestConfig =&amp;gt; {
  const token = localStorage.getItem('token');

  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
};

const onResponse = (response: AxiosResponse): AxiosResponse =&amp;gt; {
  return response;
};

const onErrorResponse = (error: AxiosError): Promise&amp;lt;AxiosError&amp;gt; =&amp;gt; {
  if (axios.isAxiosError(error)) {
    if (error.response?.status === 401) {
      localStorage.removeItem('token');
    }
  }

  return Promise.reject(error);
};

export { onRequest, onResponse, onErrorResponse };&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;color: #212529; text-align: start;&quot;&gt;&lt;code&gt;//라우팅
type TCustomRouteObjectParams = {
  path?: string;
  name?: string;
  element?: ReactElement;
};

type TCustomIndexRouteObject = IndexRouteObject &amp;amp; TCustomRouteObjectParams;
type TCustomNonIndexRouteObject = Omit&amp;lt;NonIndexRouteObject, 'children'&amp;gt; &amp;amp;
  TCustomRouteObjectParams &amp;amp; {
    children?: (TCustomIndexRouteObject | TCustomNonIndexRouteObject)[];
  };
type TCustomRouteConfig = TCustomIndexRouteObject | TCustomNonIndexRouteObject;

const routeConfig: TCustomRouteConfig[] = [
  {
    path: '/',
    element: &amp;lt;Home /&amp;gt;,
    errorElement: &amp;lt;div&amp;gt;404 Not Found&amp;lt;/div&amp;gt;,
    name: '홈',
  },
  {
    path: '/signup',
    element: &amp;lt;SignUp /&amp;gt;,
    name: '회원가입',
  },
  {
    path: '/signin',
    element: &amp;lt;SignIn /&amp;gt;,
    name: '로그인',
  },
  {
    path: '/todo',
    element: &amp;lt;Todo /&amp;gt;,
    name: '투두',
  },
];
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;팀-진행으로-인해-얻어간-것들-인증-로직-구현&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;팀 진행으로 인해 얻어간 것들 (인증 로직 구현)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 부분에 대해선 개인적으로 아쉬웠던게 많았습니다.&lt;/li&gt;
&lt;li&gt;아무래도 요구 사항에 무조건적으로 맞춰서 불필요한 부분은 제외해두고 개발한다고 해도 최적의 사용자 경험도 무시할 수 없다고 생각했기때문에, 블링크 현상이라던가, 상황별로 헤더에 나타나는 메뉴를 컨트롤 할 수 없었던 부분이 많이 아쉬웠습니다.&lt;/li&gt;
&lt;li&gt;2주차부터는 자바스크립트의 기본 동작 원리에 대해 더 공부해서 기초 설계 시에 디테일한 부분까지 신경써서 진행해야겠다는 생각이 들었습니다 :)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;개인-컴포넌트-분리&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;개인 :컴포넌트 분리&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아무래도 프론트엔드는 독학으로 공부해왔기 때문에,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;어느 프로젝트를 진행하더라도 항상 고민되었던 부분은 컴포넌트를 어떻게 분리해야할까?&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;에 대한게 가장 컸습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제가 선택한 방식은 아무래도 가장 보편화된 방식으로&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;기능별로 분리를 하는 방식을 선택했습니다.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공통된 기능을 가질 수 있겠다 싶은 부분들을 선정해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;작은 컴포넌트를 만들어 하나의 큰 모듈을 완성하는 것으로 목표&lt;/b&gt;로 작은것부터 차근차근 개발에 임했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;페이지는 크게봤을 때 회원가입 / 로그인 / 투두리스트 로 분리를 할 수 있었고, 각 페이지별로 공통된 부분을 살펴 쪼갠 후 가장 작은 부분부터 구현을 진행하였습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;회원가입-및-로그인&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;회원가입 및 로그인&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;회원가입 , 로그인 부분은 사전과제 요구사항에 공통적으로 요구되는 것이 ,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;1차적인 검증을 진행하고 검증이 실패하면 요청을 보내는 버튼이 비활성화&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;되어야 했습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 검증은 공통적으로 이메일에는 '@' 이 포함되어야 했고, 비밀번호는 8자 이상으로 입력이 되어야 했습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 요구사항으로 인해 로그인, 회원가입에 기본적으로 사용되는 input 컴포넌트는 동일하게 구현해도 되겠다는 생각이 들었습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;ValidationInput 이라는 컴포넌트를 생성해 기본적으로 검증을 진행하는 시각적 효과를 가진 스타일링 컴포넌트를 구현했고, 이에 필요한 공통 로직은 useFormControl 훅을 생성해 로직을 분리&lt;/b&gt;했습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 외에 디테일한 에러핸들링 또한 반영하여 구현하였고 최대한 사용자 입장에서 모르는 에러가 은밀하게 스쳐 지나가지 않도록 구현하는것을 목표로 진행하였습니다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot; style=&quot;color: #212529; text-align: start;&quot;&gt;&lt;code&gt;// useFormControl
export function useFormControl(options: {
    regex: RegExp;
    initialValue?: string;
}): [React.ChangeEventHandler&amp;lt;HTMLInputElement&amp;gt;, string,React.Dispatch&amp;lt;React.SetStateAction&amp;lt;string&amp;gt;&amp;gt;, boolean, React.Dispatch&amp;lt;React.SetStateAction&amp;lt;boolean&amp;gt;&amp;gt;,] {
    const { regex } = options || {};
    const [value, setValue] = useState(options.initialValue || &quot;&quot;);
    const [validation, setValidation] = useState(false);

    const validateValue = (value: string) =&amp;gt; {
        const isValid = regex.test(value);
        setValidation(isValid);
    };

    const handleChange: React.ChangeEventHandler&amp;lt;HTMLInputElement&amp;gt; = (e) =&amp;gt; {
        const value = e.target.value;
        setValue(value);
        validateValue(value);
    };

    return [handleChange, value,setValue, validation, setValidation ,];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기본적으로 요청을 담당하는 로직들은 Page 를 구성하는 컴포넌트에 선언해 처리를 진행했습니다.&lt;/p&gt;
&lt;pre class=&quot;dust&quot; style=&quot;color: #212529; text-align: start;&quot;&gt;&lt;code&gt;	// SignIn.tsx
 ...
    return (
        &amp;lt;StyledFormControl onSubmit={onSubmit}&amp;gt;
            로그인
            &amp;lt;StyledInputBox&amp;gt;
                &amp;lt;ValidationInput {...emailInputProps}/&amp;gt;
            &amp;lt;/StyledInputBox&amp;gt;
            &amp;lt;StyledInputBox&amp;gt;
                &amp;lt;ValidationInput {...passwordInputProps}/&amp;gt;
            &amp;lt;/StyledInputBox&amp;gt;
            &amp;lt;StyledSignInButton type={&quot;submit&quot;} disabled={!emailValidation || !passwordValidation}
                                variant={&quot;contained&quot;}
                                data-testid={&quot;signin-button&quot;}&amp;gt;
                로그인
            &amp;lt;/StyledSignInButton&amp;gt;
        &amp;lt;/StyledFormControl&amp;gt;
    );&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;투두리스트&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;투두리스트&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;투두리스트를 구현하면서 가장 고민되었던 컴포넌트 분리 부분은 아무래도 요구사항 중&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;투두를 수정할 때 기존의 text가 사라지면서 input 으로 변경 된 후 '수정', '삭제' 버튼 또한 '제출','취소' 버튼으로 변경이 되도록 구현하는 것&lt;/b&gt;이었는데,&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해당 부분을 수정모드일때의 컴포넌트를 구현하여 반영을 할지, 혹은 하나의 컴포넌트에 반영을 할지 고민이 많이 되었&lt;/b&gt;고, 주변의 어느분께 헬프를 요청하여 아이디어를 얻게 되었습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아무래도 현업에서 개발을 하고 계시는 프론트엔드 개발자 분들도 공통적으로 고민하는 부분이 컴포넌트 분리에 대한 고민이라고 하시면서, 본인은 각 컴포넌트를 역할별로 분리한다고 하셨고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;해당 투두에대한 수정과 삭제는 해당 투두(항목) 밖에선 일어날 일이 없으므로 굳이 분리할 필요가 없다고 하셨고&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;, 해당 의견을 참고하여 구현하였습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기본적으로 큰 페이지는 투두 입력창 / .map() 을 활용한 투두 로 구성이 되도록 하였으며 투두컨텐츠라는 컴포넌트에 수정/삭제 로직을 포함시켜 구현하였습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;TodoInput 또한 마찬가지로 useFormControl 훅을 재사용해 핵심 로직을 분리시켜서 가독성에 신경썼습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;TodoContent 는 과제 명세에 포함된 내용을 참고하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;디테일한 부분을 살리려 노력했습니다.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(수정중에 체크박스를 클릭해도 업데이트가 진행된다던지 하는 부분들)&lt;/p&gt;
&lt;pre class=&quot;xml&quot; style=&quot;color: #212529; text-align: start;&quot;&gt;&lt;code&gt;        &amp;lt;StyledBox&amp;gt;
            &amp;lt;TodoInput getTodoList={getTodoList}/&amp;gt;
            &amp;lt;StyledTodoList&amp;gt;
                {isLoading ? &amp;lt;Typography variant={&quot;h6&quot;}&amp;gt;로딩중..&amp;lt;/Typography&amp;gt; : (
                    data &amp;amp;&amp;amp; data.length &amp;gt; 0 ?
                        data.map((todo)=&amp;gt;{
                            return &amp;lt;TodoContent key={todo.id} data={todo} getTodoList={getTodoList} /&amp;gt;
                        }) : &amp;lt;Typography variant={&quot;h6&quot;}&amp;gt;할 일이 없습니다.&amp;lt;/Typography&amp;gt;
                    )}
            &amp;lt;/StyledTodoList&amp;gt;
        &amp;lt;/StyledBox&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;팀--컴포넌트-분리&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;팀 : 컴포넌트 분리&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;저같은 경우에는 팀원 중 기본적으로 구현이 되어야하는 컴포넌트 (예 : input, button 등) 을 먼저 구현 후 각 큰 컴포넌트 별로 다시 스타일링 및 구현을 진행한 후 페이지를 완성한 팀원분의 코드를 보고 구조적으로 깔끔하다 생각되어 해당 팀원분을 선정하였습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;스타일링 또한 기본적으로 코딩 컨벤션을 지켜가면서 기능 / 스타일링을 철저히 분리해 가독성을 살리셨고, 다른 팀원분들 또한 마찬가지로 의견이 거의 동일하게 해당 팀원분을 선정하여 진행됐습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 제가 진행했던 부분은 TodoInput 을 구현하는 것이었는데, 구현하는김에 제가 개인적으로 구현했던 useFormControl 훅을 재사용해 useInput 이라는 커스텀 훅을 구현했고,&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 훅을 구현시에 고민했던 부분 (불필요한 리턴값에 대한 핸들링) 을 반영하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;배열 타입으로 반환하지 않고 객체 타입으로 반환하도록 구현했습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기에 BestPractice 로 선정된 팀원분의 의견 (현업에선 UI/UX디자이너 분들께서 MUI , Chakra같은 스타일링 라이브러리를 사용하는것을 안좋아한다)을 참고하여 직접 common 컴포넌트를 구성해 구현하도록 했기때문에, Input 컴포넌트를 직접 구현하게 되었습니다.&lt;/p&gt;
&lt;pre class=&quot;typescript&quot; style=&quot;color: #212529; text-align: start;&quot;&gt;&lt;code&gt;interface IUseInputReturn&amp;lt;T&amp;gt; {
  onChange: React.ChangeEventHandler&amp;lt;HTMLInputElement&amp;gt;;
  value: T;
  setValue: React.Dispatch&amp;lt;React.SetStateAction&amp;lt;T&amp;gt;&amp;gt;;
  isValidated: boolean;
  setIsValidated: React.Dispatch&amp;lt;React.SetStateAction&amp;lt;boolean&amp;gt;&amp;gt;;
  setFocus: () =&amp;gt; void;
  setBlur: () =&amp;gt; void;
}

const useInput = &amp;lt;T&amp;gt;(options: {
  regex?: RegExp;
  ref?: RefObject&amp;lt;HTMLInputElement&amp;gt;;
  initialValue?: T;
}): IUseInputReturn&amp;lt;T&amp;gt; =&amp;gt; {
  const { regex } = options || {};
  const [value, setValue] = useState&amp;lt;T&amp;gt;((options.initialValue as T) ?? ('' as unknown as T));
  const [isValidated, setIsValidated] = useState&amp;lt;boolean&amp;gt;(false);

  const validateValue = (value: T) =&amp;gt; {
    if (typeof value === 'string' &amp;amp;&amp;amp; regex) {
      const isValid = regex.test(value);
      setIsValidated(isValid);
    } else {
      setIsValidated(false);
    }
  };

  const setFocus = () =&amp;gt; {
    if (options.ref) {
      options.ref.current?.focus();
    }
  };

  const setBlur = () =&amp;gt; {
    if (options.ref) {
      options.ref.current?.blur();
    }
  };

  const onChange: React.ChangeEventHandler&amp;lt;HTMLInputElement&amp;gt; = (e) =&amp;gt; {
    const newValue = e.target.value as unknown as T;
    if (newValue !== value) {
      setValue(newValue);
      validateValue(newValue);
    }
  };
  // 기본적으로 훅 사용할때 &amp;lt;type&amp;gt; 형식으로 타입 지정 해주시거나 (객체도 가능) 초기화값 지정해주시면 타입 자동으로 들어갈겁니다.
  /*  폼 제출시 유효성 검사 초기화, 값 초기화를 위해 setter 까지 반환하도록 했습니다.
            전체적으로 빈 값이 들어가는 경우는 없기때문에 정규표현식으로 관리하도록 구현했습니다.*/
  /*  const { data: data1, isLoading: isLoading1 } = useCustomHook(params1);
      const { data: data2, isLoading: isLoading2 } = useCustomHook(params2);*/
  /*  여러번 선언해야할 경우 위와 같이 사용하면 됩니다. (여러번 사용하지 않더라도 변수명 헷갈리지 않게 하기 위해 이렇게 사용하시는걸 추천드립니다.) */
  return { onChange, value, setValue, isValidated, setIsValidated, setFocus, setBlur };
};

export default useInput;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;개인과제로 진행했던 hook은 아무 생각 없이 단순 string 만을 핸들링하도록 구현했고, 이를 반성하며 리팩토링을 통해 제네릭 타입으로 checkbox 등에도 사용할 수 있도록 변경하였습니다.&lt;br /&gt;여기에 refObject 를 전달받아서 focus나 blur 같은 이벤트도 구현할 수 있도록 전체적으로 react-hook-form 의 기능을 모방하여 사용할 수 있도록 구현하였습니다.&lt;/p&gt;
&lt;pre class=&quot;maxima&quot; style=&quot;color: #212529; text-align: start;&quot;&gt;&lt;code&gt;export interface IInputProps extends Omit&amp;lt;HTMLProps&amp;lt;HTMLInputElement&amp;gt;, 'ref'&amp;gt; {
  helperText?: string;
  error?: boolean;
  errorText?: string;
  dataTestId?: string;
  width?: string;
  height?: string;
}

//TODO: 부모 컴포넌트에서 ref 받아오도록 구현해야함
const Input = forwardRef((props: IInputProps, ref: ForwardedRef&amp;lt;HTMLInputElement&amp;gt;) =&amp;gt; {
  const { helperText, error, errorText, dataTestId, width, height, ...inputProps } = props;

  return (
    &amp;lt;S.InputWrap&amp;gt;
      &amp;lt;S.Input {...inputProps} ref={ref} data-testid={props.dataTestId} width={width} height={height} /&amp;gt;
      &amp;lt;S.HelperText error={error} color={error ? 'red' : 'grey'}&amp;gt;
        {error ? errorText : helperText}
      &amp;lt;/S.HelperText&amp;gt;
    &amp;lt;/S.InputWrap&amp;gt;
  );
});
export default Input;
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;input 의 경우에는 기본적으로 input 태그가 갖고있는 attribute를 다 받아올 수 있도록 인터페이스 선언 시에 HTMLProps를 상속받아 사용하도록 구현했고, ref 같은 경우에는 따로 전달하는 값이 있기때문에 Omit 을 사용하여 해당 인터페이스중 ref 항목을 제외하고 상속받도록 구현했습니다.&lt;/p&gt;
&lt;h3 id=&quot;팀-진행으로-인해-얻어간-것들-컴포넌트-분리&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;팀 진행으로 인해 얻어간 것들 (컴포넌트 분리)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Omit과 HTMLProps 라는 새로운 것을 알게되었습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;common component 를 구현할 때 쓸데없이 interface 에 property를 와바박 쓸 일이 없어졌습니다..&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;아무래도 컴포넌트 구현을 저 혼자 하는게 아니었기 때문에 협업을 통해 리팩토링에 신경쓰게 되었고, useInput 을 구현할 때 제네릭 타입을 처음 사용하는 등의 경험이 소중하게 느껴졌습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마찬가지로 주석처리에 신경쓰게 되었고, 커뮤니케이션의 대부분이 컴포넌트 구현 파트에서 이뤄졌기 때문에 실무를 정말 간접적으로 경험할 수 있었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오히려 좋았던점은 커스텀훅을 사용하는 법이 익숙치 않았던 팀원분께서 계셨고, 이로 인해서 주석처리나 가독성 좋은 코드를 작성하려 많이 노력했던 부분이 오히려 실력상승으로 이어지게 되었습니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;개인--테스팅&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;개인 : 테스팅&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 과제에는 존재하지 않았지만, 개인적으로 Jest를 이용한 테스트코드 작성에 대한 흐름이 매번 궁금했었고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;전체적으로 프로젝트 규모가 크지 않으니 이번 기회에 배워서 작성해볼 수 있겠다 !&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;라는 생각을 갖고 테스트코드 작성을 시도해보았습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;테스트는 기본적으로 각 Page별로 진행했고, 상황별로 mocking 을 통해 api를 호출했을때의 상황, routing 유무 등을 테스트하였습니다.&lt;/p&gt;
&lt;pre class=&quot;lisp&quot; style=&quot;color: #212529; text-align: start;&quot;&gt;&lt;code&gt;    it(&quot;이메일과 비밀번호가 일치할 때 contex에 토큰 저장 후 TODO 로 이동&quot;, async () =&amp;gt; {
        const postSignIn = jest.spyOn(apiMethods, &quot;postSignin&quot;).mockResolvedValue({
            access_token : 'token'
        });
        const mockedSetToken = jest.spyOn(context, &quot;setToken&quot;);
        const token = 'token';
        customRender(&amp;lt;SignIn/&amp;gt;);
        const signInButton = screen.getByTestId(&quot;signin-button&quot;);
        const emailInput = screen.getByTestId(&quot;email-input&quot;) as HTMLInputElement;
        const passwordInput = screen.getByTestId(&quot;password-input&quot;) as HTMLInputElement;
        fireEvent.change(emailInput, {target: {value: &quot;mytestemail@email.email&quot;}});
        fireEvent.change(passwordInput, {target: {value: &quot;password&quot;}});
        fireEvent.click(signInButton);
        await waitFor(() =&amp;gt; {
            expect(postSignIn).toBeCalledTimes(1);
        });
        await waitFor(()=&amp;gt;{
            expect(postSignIn).toBeCalledWith({
                email: emailInput.value,
                password: passwordInput.value
            });
        })
        expect(mockedSetToken).toBeCalledTimes(1);
        expect(mockedSetToken).toBeCalledWith(mockedDispatch, token);
        expect(mockedUsedNavigate).toBeCalledWith('/todo');
    });&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;subunit&quot; style=&quot;color: #212529; text-align: start;&quot;&gt;&lt;code&gt;Test Suites: 3 passed, 3 total
Tests:       28 passed, 28 total
Snapshots:   3 passed, 3 total
Time:        4.639 s
Ran all test suites related to changed files.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이런식으로 총 28개의 단위테스트를 3개의 페이지별로 진행했고, 모두 통과하였습니다.&lt;/b&gt;&lt;br /&gt;다행히 스프링부트로 개발을 하면서 단위테스트를 진행했던 경험이 있어서 테스팅 라이브러리를 익히는데에 큰 문제는 없었으나&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;어려웠던건 스프링부트때와 똑같이 mocking 에 대한 부분이었습니다.&lt;br /&gt;스프링부트는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;내가 직접 생성하고 작성한 클래스나 api들을 mocking 해서 단위 테스트를 진행했으나,&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;jest를 이용할때에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;내가 직접 작성한 비즈니스 로직 외에도 npm 으로 설치한 라이브러리까지 mocking 하여 상황별로 given 을 지정해야했기 때문에 ..&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;적응하는데 시간이 꽤 걸렸습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아무래도 해당 부분은 리액트의 동작원리를 파악한다면 더 쉽게 이해할 수 있지 않았을까 하는 생각이 들었습니다.&lt;/p&gt;
&lt;h1 id=&quot;좋았던점과-아쉬웠던점&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;좋았던점과 아쉬웠던점&lt;/h1&gt;
&lt;h2 id=&quot;좋았던점&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;좋았던점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프론트엔드로 팀 개발에 참여한게 처음이었지만 전체적으로 능동적으로 행동하시는 팀원분들과 함께해서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;좋은 첫 스타트를 함께 할 수 있었습니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;개발 공부를 시작한 이후로, 어디를 가던 팀장 역할을 맡아가면서 매번 저의 자질에 대한 고민을 항상 해왔는데,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;이번을 계기로 확실히 나는 묻어가는거도 잘하지만 이끄는거도 나쁘지 않게 하고 있구나 라는 생각을 하게 되었습니다.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;팀원의 장단점을 잘 파악해 역할 분담을 적절하게 잘한것같습니다.&lt;/li&gt;
&lt;li&gt;팀장이라고 무조건 저의 방식대로 강압적으로 리드하지 않고 중립을 지켜가면서 전체적으로 어느 한 분위기에 휩쓸려서 진행되지 않도록 잘 진행한것 같습니다.&lt;/li&gt;
&lt;li&gt;전체적으로 실력향상을 할 수 있게끔 핸들링을 한 것 같습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 팀원분들께서 어려움을 겪는 부분이 있으실 때 최대한 할 수 있는 부분까지 진행하도록 격려하고 나머지 부분은 제가 도와드리는 방식으로 진행했기 때문에, (라이브코딩) 여러모로 상대방이나 제 자신한테 도움되는 부분이 많았다고 생각했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;아쉬웠던점&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;아쉬웠던점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최악의 상황에 대한 대비책을 준비해두지 못했던게 아쉬웠습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;이번 프로젝트의 경우에는 사상 최초로 잠수를 타는 팀원이 존재했고, 그 팀원을 믿고 해당 파트에 대한 대비책을 준비해두지 않았던 부분이 굉장히 아쉬웠습니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;그 팀원으로 인해 전체적인 스타일링이 기본 컴포넌트를 구현해 스타일링까지 직접 진행하는걸로 결정되었었지만, 해당 팀원이 제출 당일 저녁시간부터 연락이 되지 않아 급하게 마무리하여 제출하게 되었습니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;해당 팀원을 탓할수도 있지만,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;팀장으로써 미리 대비책을 준비해두지 않았던게 굉장히 아쉬웠습니다.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;프로페셔널한 개발자라면 미리 이러한 상황에 대비하여 진행해야 했다는 생각이 들었습니다.&lt;/li&gt;
&lt;li&gt;하지만 이로 인해서 다음 과제부터는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;불필요한 시간 투자를 줄이고 최대한 해당 과제의 규모에 맞춰서 라이브러리를 선정하여 진행해야겠다는 생각을 하게 되었습니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;마치며&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;마치며&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;처음으로 합류해봤던 프론트엔드 교육이라 떨리는 마음으로 임하고 있지만, 1주차 과제를 어찌저찌 끝내고 드는 생각은 아무래도 '시간이 지나고 보면 다 별거 아닌 일들이다' 인 것 같습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2주차 과제는 1주차 과제에서 미흡했던 점, 아쉬웠던 점을 보완하여 욕심 부리지 않고 깔끔하게 마무리 하는 방향으로 가려고 합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;오랜만에 작성하는 회고록인만큼 열심히 깔끔하게 작성하려 노력했는데 잘 모르겠네요.. 읽어주셔서 감사합니다!&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;앞으로도 화이팅~!&lt;/p&gt;</description>
      <category>React</category>
      <author>코딩하는 브린스</author>
      <guid isPermaLink="true">https://codinghentai.tistory.com/98</guid>
      <comments>https://codinghentai.tistory.com/98#entry98comment</comments>
      <pubDate>Mon, 10 Jul 2023 12:19:58 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 - 신고 결과 받기 (lv1, 카카오, 자바)</title>
      <link>https://codinghentai.tistory.com/97</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92334&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/92334&lt;/a&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1681449646389&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;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92334&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bPQN7F/hySgqsntZn/882kOwXkhsK3RFnIsKzEl0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bkck2n/hyShN7kur9/T1zbpohOgENWNw7dSZ0ag0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92334&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92334&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bPQN7F/hySgqsntZn/882kOwXkhsK3RFnIsKzEl0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bkck2n/hyShN7kur9/T1zbpohOgENWNw7dSZ0ag0/img.png?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;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-04-14 14.06.18.png&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/odO4S/btsacfAjGSa/8VAdAsU7H4pjCVQaEI49Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/odO4S/btsacfAjGSa/8VAdAsU7H4pjCVQaEI49Dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/odO4S/btsacfAjGSa/8VAdAsU7H4pjCVQaEI49Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FodO4S%2FbtsacfAjGSa%2F8VAdAsU7H4pjCVQaEI49Dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;781&quot; height=&quot;554&quot; data-filename=&quot;스크린샷 2023-04-14 14.06.18.png&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.&lt;/li&gt;
&lt;li&gt;한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 전체 유저 목록이 [&quot;muzi&quot;, &quot;frodo&quot;, &quot;apeach&quot;, &quot;neo&quot;]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저 ID 유저가 신고한 ID 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&quot;muzi&quot;&lt;/td&gt;
&lt;td&gt;&quot;frodo&quot;&lt;/td&gt;
&lt;td&gt;&quot;muzi&quot;가 &quot;frodo&quot;를 신고했습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;apeach&quot;&lt;/td&gt;
&lt;td&gt;&quot;frodo&quot;&lt;/td&gt;
&lt;td&gt;&quot;apeach&quot;가 &quot;frodo&quot;를 신고했습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;frodo&quot;&lt;/td&gt;
&lt;td&gt;&quot;neo&quot;&lt;/td&gt;
&lt;td&gt;&quot;frodo&quot;가 &quot;neo&quot;를 신고했습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;muzi&quot;&lt;/td&gt;
&lt;td&gt;&quot;neo&quot;&lt;/td&gt;
&lt;td&gt;&quot;muzi&quot;가 &quot;neo&quot;를 신고했습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;apeach&quot;&lt;/td&gt;
&lt;td&gt;&quot;muzi&quot;&lt;/td&gt;
&lt;td&gt;&quot;apeach&quot;가 &quot;muzi&quot;를 신고했습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 유저별로 신고당한 횟수는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저 ID 신고당한 횟수&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&quot;muzi&quot;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;frodo&quot;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;apeach&quot;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;neo&quot;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예시에서는 2번 이상 신고당한 &quot;frodo&quot;와 &quot;neo&quot;의 게시판 이용이 정지됩니다. 이때, 각 유저별로 신고한 아이디와 정지된 아이디를 정리하면 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저 ID 유저가 신고한 ID 정지된 ID&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&quot;muzi&quot;&lt;/td&gt;
&lt;td&gt;[&quot;frodo&quot;, &quot;neo&quot;]&lt;/td&gt;
&lt;td&gt;[&quot;frodo&quot;, &quot;neo&quot;]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;frodo&quot;&lt;/td&gt;
&lt;td&gt;[&quot;neo&quot;]&lt;/td&gt;
&lt;td&gt;[&quot;neo&quot;]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;apeach&quot;&lt;/td&gt;
&lt;td&gt;[&quot;muzi&quot;, &quot;frodo&quot;]&lt;/td&gt;
&lt;td&gt;[&quot;frodo&quot;]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;neo&quot;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &quot;muzi&quot;는 처리 결과 메일을 2회, &quot;frodo&quot;와 &quot;apeach&quot;는 각각 처리 결과 메일을 1회 받게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이용자의 ID가 담긴 문자열 배열&amp;nbsp;id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열&amp;nbsp;report, 정지 기준이 되는 신고 횟수&amp;nbsp;k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제한사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2 &amp;le;&amp;nbsp;id_list의 길이 &amp;le; 1,000
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;le;&amp;nbsp;id_list의 원소 길이 &amp;le; 10&lt;/li&gt;
&lt;li&gt;id_list의 원소는 이용자의 id를 나타내는 문자열이며 알파벳 소문자로만 이루어져 있습니다.&lt;/li&gt;
&lt;li&gt;id_list에는 같은 아이디가 중복해서 들어있지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1 &amp;le;&amp;nbsp;report의 길이 &amp;le; 200,000
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3 &amp;le;&amp;nbsp;report의 원소 길이 &amp;le; 21&lt;/li&gt;
&lt;li&gt;report의 원소는 &quot;이용자id 신고한id&quot;형태의 문자열입니다.&lt;/li&gt;
&lt;li&gt;예를 들어 &quot;muzi frodo&quot;의 경우 &quot;muzi&quot;가 &quot;frodo&quot;를 신고했다는 의미입니다.&lt;/li&gt;
&lt;li&gt;id는 알파벳 소문자로만 이루어져 있습니다.&lt;/li&gt;
&lt;li&gt;이용자id와 신고한id는 공백(스페이스)하나로 구분되어 있습니다.&lt;/li&gt;
&lt;li&gt;자기 자신을 신고하는 경우는 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1 &amp;le;&amp;nbsp;k&amp;nbsp;&amp;le; 200,&amp;nbsp;k는 자연수입니다.&lt;/li&gt;
&lt;li&gt;return 하는 배열은&amp;nbsp;id_list에 담긴 id 순서대로 각 유저가 받은 결과 메일 수를 담으면 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;입출력 예&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id_list report k result&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;[&quot;muzi&quot;, &quot;frodo&quot;, &quot;apeach&quot;, &quot;neo&quot;]&lt;/td&gt;
&lt;td&gt;[&quot;muzi frodo&quot;,&quot;apeach frodo&quot;,&quot;frodo neo&quot;,&quot;muzi neo&quot;,&quot;apeach muzi&quot;]&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;[2,1,1,0]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[&quot;con&quot;, &quot;ryan&quot;]&lt;/td&gt;
&lt;td&gt;[&quot;ryan con&quot;, &quot;ryan con&quot;, &quot;ryan con&quot;, &quot;ryan con&quot;]&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;[0,0]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문제는 적절한 자료구조와 문자열 관련 메소드의 활용으로 풀이하면 될 것 같았다.&lt;/p&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차적으로는 해당 회원의 인덱스를 갖고있는 배열이 필요해보였고, 신고 상황을 저장할 배열, 신고 누적 횟수를 저장할 배열, 그리고 이메일 송신 횟수를 갖는 배열 이렇게 4개의 배열을 선언할까 생각했었고,&lt;/p&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차적으로는 인덱스를 해시맵으로 구현, 신고상황은 한 회원이 여러번 같은 회원을 신고할 , 다른 회원을 신고한 기록도 저장해야 하니 해시맵이 아닌 리포트배열은 2차원으로 , 그리고 신고 누적 횟수는 해시맵, 그리고 이메일 배열은 마찬가지로 2차원 배열로 구현하였다 (?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제출 이후인 3차적으로 생각하면 인덱스와 누적 신고 횟수를 합쳐서 정수 리스트를 같는 해시맵과 신고누적 횟수 해시맵 이렇게 2개만 선언해도 됐을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681449606297&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
 public List&amp;lt;Integer&amp;gt; solution(String[] id_list, String[] report, int k) {
    List&amp;lt;Integer&amp;gt; answer = new ArrayList&amp;lt;&amp;gt;();
        HashMap&amp;lt;String,Integer&amp;gt; idxMap = new HashMap&amp;lt;&amp;gt;();
        HashMap&amp;lt;String,Integer&amp;gt; reportedMap = new HashMap&amp;lt;&amp;gt;();
        int[][] reportArr = new int[id_list.length][id_list.length];
        int[][] emailArr = new int[id_list.length][1];
        int idx = 0;
        for(String id : id_list){
            reportedMap.put(id,0);
            idxMap.put(id,idx);
            for(int j=0; j&amp;lt;id_list.length;j++){
                reportArr[idx][j]=0;
            }
            idx++;
        }
        for(String detail:report){
            int spaceIdx = detail.indexOf(&quot; &quot;);
            String reportFrom = detail.substring(0,spaceIdx);
            String reportTo = detail.substring(spaceIdx+1,detail.length());
            int fromIdx = idxMap.get(reportFrom);
            int toIdx = idxMap.get(reportTo);
            if(reportArr[toIdx][fromIdx]!=1){
                reportArr[toIdx][fromIdx]=1;
                reportedMap.put(reportTo,reportedMap.get(reportTo)+1);
            }
        }
        reportedMap.forEach((key,value)-&amp;gt;{
            if(value&amp;gt;=k){
                int toIdx = idxMap.get(key);
                for(int i=0; i&amp;lt;id_list.length;i++){
                    if(reportArr[toIdx][i]==1){
                        emailArr[i][0]++;
                    }
                }
            }
        });
        for(int i=0; i&amp;lt;id_list.length;i++){
            answer.add(emailArr[i][0]);
        }
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm</category>
      <category>신고 결과 받기</category>
      <category>알고리즘</category>
      <category>자바</category>
      <category>카카오</category>
      <category>프로그래머스</category>
      <author>코딩하는 브린스</author>
      <guid isPermaLink="true">https://codinghentai.tistory.com/97</guid>
      <comments>https://codinghentai.tistory.com/97#entry97comment</comments>
      <pubDate>Fri, 14 Apr 2023 14:20:52 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 - 바탕화면 정리 (lv1,자바)</title>
      <link>https://codinghentai.tistory.com/96</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/161990&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/161990&lt;/a&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1681449225506&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;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/161990&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ym3rR/hySgnvyt5H/qAKFoyoFF9CGi04TftsNjK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bnofen/hySggJZnMF/NKbZkYz2Y8kId37sgxFmvK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/161990&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/161990&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ym3rR/hySgnvyt5H/qAKFoyoFF9CGi04TftsNjK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bnofen/hySggJZnMF/NKbZkYz2Y8kId37sgxFmvK/img.png?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;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-04-14 14.06.18.png&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oKPTN/btsaeTKid7T/U4eSfgP93gEkibM2IohQOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oKPTN/btsaeTKid7T/U4eSfgP93gEkibM2IohQOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oKPTN/btsaeTKid7T/U4eSfgP93gEkibM2IohQOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoKPTN%2FbtsaeTKid7T%2FU4eSfgP93gEkibM2IohQOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;781&quot; height=&quot;554&quot; data-filename=&quot;스크린샷 2023-04-14 14.06.18.png&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;554&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩테스트를 준비하는 머쓱이는 프로그래머스에서 문제를 풀고 나중에 다시 코드를 보면서 공부하려고 작성한 코드를 컴퓨터 바탕화면에 아무 위치에나 저장해 둡니다. 저장한 코드가 많아지면서 머쓱이는 본인의 컴퓨터 바탕화면이 너무 지저분하다고 생각했습니다. 프로그래머스에서 작성했던 코드는 그 문제에 가서 다시 볼 수 있기 때문에 저장해 둔 파일들을 전부 삭제하기로 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터 바탕화면은 각 칸이 정사각형인 격자판입니다. 이때 컴퓨터 바탕화면의 상태를 나타낸 문자열 배열&amp;nbsp;wallpaper가 주어집니다. 파일들은 바탕화면의 격자칸에 위치하고 바탕화면의 격자점들은 바탕화면의 가장 왼쪽 위를 (0, 0)으로 시작해 (세로 좌표, 가로 좌표)로 표현합니다. 빈칸은 &quot;.&quot;, 파일이 있는 칸은 &quot;#&quot;의 값을 가집니다. 드래그를 하면 파일들을 선택할 수 있고, 선택된 파일들을 삭제할 수 있습니다. 머쓱이는 최소한의 이동거리를 갖는 한 번의 드래그로 모든 파일을 선택해서 한 번에 지우려고 하며 드래그로 파일들을 선택하는 방법은 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;드래그는 바탕화면의 격자점 S(lux,&amp;nbsp;luy)를 마우스 왼쪽 버튼으로 클릭한 상태로 격자점 E(rdx,&amp;nbsp;rdy)로 이동한 뒤 마우스 왼쪽 버튼을 떼는 행동입니다. 이때, &quot;&lt;b&gt;점 S에서 점 E로 드래그한다&lt;/b&gt;&quot;고 표현하고 점 S와 점 E를 각각 드래그의 시작점, 끝점이라고 표현합니다.&lt;/li&gt;
&lt;li&gt;점 S(lux,&amp;nbsp;luy)에서 점 E(rdx,&amp;nbsp;rdy)로 드래그를 할 때, &quot;&lt;b&gt;드래그 한 거리&lt;/b&gt;&quot;는 |rdx&amp;nbsp;-&amp;nbsp;lux| + |rdy&amp;nbsp;-&amp;nbsp;luy|로 정의합니다.&lt;/li&gt;
&lt;li&gt;점 S에서 점 E로 드래그를 하면 바탕화면에서 두 격자점을 각각 왼쪽 위, 오른쪽 아래로 하는 직사각형 내부에 있는 모든 파일이 선택됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;wallpaper
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;= [&quot;.#...&quot;, &quot;..#..&quot;, &quot;...#.&quot;]인 바탕화면을 그림으로 나타내면 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L1Mi0/btsaevpf24u/6t7KJ2v0StkKTLLkW8n0Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L1Mi0/btsaevpf24u/6t7KJ2v0StkKTLLkW8n0Ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L1Mi0/btsaevpf24u/6t7KJ2v0StkKTLLkW8n0Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL1Mi0%2Fbtsaevpf24u%2F6t7KJ2v0StkKTLLkW8n0Ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;340&quot; height=&quot;220&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 바탕화면에서 다음 그림과 같이 S(0, 1)에서 E(3, 4)로 드래그하면 세 개의 파일이 모두 선택되므로 드래그 한 거리 (3 - 0) + (4 - 1) = 6을 최솟값으로 모든 파일을 선택 가능합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EL1EL/btr94lnOY9l/vudS2ActSvwzkfPHnF3Po1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EL1EL/btr94lnOY9l/vudS2ActSvwzkfPHnF3Po1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EL1EL/btr94lnOY9l/vudS2ActSvwzkfPHnF3Po1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEL1EL%2Fbtr94lnOY9l%2FvudS2ActSvwzkfPHnF3Po1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;340&quot; height=&quot;220&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(0, 0)에서 (3, 5)로 드래그해도 모든 파일을 선택할 수 있지만 이때 드래그 한 거리는 (3 - 0) + (5 - 0) = 8이고 이전의 방법보다 거리가 늘어납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머쓱이의 컴퓨터 바탕화면의 상태를 나타내는 문자열 배열&amp;nbsp;wallpaper가 매개변수로 주어질 때 바탕화면의 파일들을 한 번에 삭제하기 위해 최소한의 이동거리를 갖는 드래그의 시작점과 끝점을 담은 정수 배열을 return하는&amp;nbsp;solution&amp;nbsp;함수를 작성해 주세요. 드래그의 시작점이 (lux,&amp;nbsp;luy), 끝점이 (rdx,&amp;nbsp;rdy)라면 정수 배열 [lux,&amp;nbsp;luy,&amp;nbsp;rdx,&amp;nbsp;rdy]를 return하면 됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;제한사항&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;le;&amp;nbsp;wallpaper의 길이 &amp;le; 50&lt;/li&gt;
&lt;li&gt;1 &amp;le;&amp;nbsp;wallpaper[i]의 길이 &amp;le; 50
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;wallpaper의 모든 원소의 길이는 동일합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;wallpaper[i][j]는 바탕화면에서&amp;nbsp;i + 1행&amp;nbsp;j + 1열에 해당하는 칸의 상태를 나타냅니다.&lt;/li&gt;
&lt;li&gt;wallpaper[i][j]는 &quot;#&quot; 또는 &quot;.&quot;의 값만 가집니다.&lt;/li&gt;
&lt;li&gt;바탕화면에는 적어도 하나의 파일이 있습니다.&lt;/li&gt;
&lt;li&gt;드래그 시작점 (lux,&amp;nbsp;luy)와 끝점 (rdx,&amp;nbsp;rdy)는&amp;nbsp;lux&amp;nbsp;&amp;lt;&amp;nbsp;rdx,&amp;nbsp;luy&amp;nbsp;&amp;lt;&amp;nbsp;rdy를 만족해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;입출력 예&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wallpaper result&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;[&quot;.#...&quot;, &quot;..#..&quot;, &quot;...#.&quot;]&lt;/td&gt;
&lt;td&gt;[0, 1, 3, 4]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[&quot;..........&quot;, &quot;.....#....&quot;, &quot;......##..&quot;, &quot;...##.....&quot;, &quot;....#.....&quot;]&lt;/td&gt;
&lt;td&gt;[1, 3, 5, 8]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[&quot;.##...##.&quot;, &quot;#..#.#..#&quot;, &quot;#...#...#&quot;, &quot;.#.....#.&quot;, &quot;..#...#..&quot;, &quot;...#.#...&quot;, &quot;....#....&quot;]&lt;/td&gt;
&lt;td&gt;[0, 0, 7, 9]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[&quot;..&quot;, &quot;#.&quot;]&lt;/td&gt;
&lt;td&gt;[1, 0, 2, 1]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문제는 1차적인 생각으로는 2차원 배열로 풀이하면 됐었고, 2차적인 생각으로는 가장 큰 x,y 좌표값을 저장하는 변수와 가장 작은 x,y 좌표값을 저장하는 변수를 선언 해 마지막으로 가장 큰 x,y 좌표값에 +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;정답률이 35퍼센트라 겁먹고 들어갔으나 생각보다 너무 빨리 오류도 없이 쉽게 풀어서 당황..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3차적인 생각으로는 반례를 살펴보게 되었는데 파일이 하나일경우가 반례가 될까? 했지만 출력이 정답과 다르지 않아서 그냥 제출했더니 맞았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681449216433&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int[] solution(String[] wallpaper) {
        int leastX = wallpaper[0].length();
        int leastY = wallpaper.length;
        int maxX = 0;
        int maxY = 0;
        for(int i=0; i&amp;lt;wallpaper.length;i++){
            for(int j=0; j&amp;lt;wallpaper[0].length();j++){
                int nowX = j;
                int nowY = i;
                if(wallpaper[i].charAt(j)=='#'){
                    if(leastX&amp;gt;nowX){
                        leastX=nowX;
                    }
                    if(leastY&amp;gt;nowY){
                        leastY=nowY;
                    }
                    if(maxX&amp;lt;nowX){
                        maxX=nowX;
                    }
                    if(maxY&amp;lt;nowY){
                        maxY=nowY;
                    }
                }
            }
        }

        return new int[]{leastY, leastX, maxY + 1, maxX + 1};
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽기 쉬운 코드를 작성하려고 하니 딱히 코드가 엄청 짧지 않아도 이해하기 쉽게 구현이 가능한거 같다. 실력도 늘은거 같고 뿌듯 &amp;gt;&amp;lt;&lt;/p&gt;</description>
      <category>Algorithm</category>
      <category>바탕화면 정리</category>
      <category>알고리즘</category>
      <category>자바</category>
      <category>프로그래머스</category>
      <author>코딩하는 브린스</author>
      <guid isPermaLink="true">https://codinghentai.tistory.com/96</guid>
      <comments>https://codinghentai.tistory.com/96#entry96comment</comments>
      <pubDate>Fri, 14 Apr 2023 14:14:29 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 - 개인정보 수집 유효기간 (카카오, lv1,자바)</title>
      <link>https://codinghentai.tistory.com/95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/150370&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/150370&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681448832229&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;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/150370&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cnQMos/hySgmQ2msu/KLLfjOwM7DKaSfSiC6c3Z1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/xmE2j/hySgmjcE0u/krEJFt6JwTTSNwudcO56C0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/150370&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/150370&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cnQMos/hySgmQ2msu/KLLfjOwM7DKaSfSiC6c3Z1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/xmE2j/hySgmjcE0u/krEJFt6JwTTSNwudcO56C0/img.png?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;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&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-filename=&quot;스크린샷 2023-04-14 14.06.18.png&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byH0rs/btr93kvTTEQ/X8f60edDxPgrntnDdfU93k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byH0rs/btr93kvTTEQ/X8f60edDxPgrntnDdfU93k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byH0rs/btr93kvTTEQ/X8f60edDxPgrntnDdfU93k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyH0rs%2Fbtr93kvTTEQ%2FX8f60edDxPgrntnDdfU93k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;781&quot; height=&quot;554&quot; data-filename=&quot;스크린샷 2023-04-14 14.06.18.png&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;554&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보&amp;nbsp;n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모든 달은 28일까지 있다고 가정합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 오늘 날짜가&amp;nbsp;2022.05.19일 때의 예시입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약관 종류 유효기간&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;6 달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;12 달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;3 달&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;번호 개인정보 수집 일자 약관 종류&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2021.05.02&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2021.07.01&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2022.02.19&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2022.02.20&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 번째 개인정보는 A약관에 의해 2021년 11월 1일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.&lt;/li&gt;
&lt;li&gt;두 번째 개인정보는 B약관에 의해 2022년 6월 28일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.&lt;/li&gt;
&lt;li&gt;세 번째 개인정보는 C약관에 의해 2022년 5월 18일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.&lt;/li&gt;
&lt;li&gt;네 번째 개인정보는 C약관에 의해 2022년 5월 19일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 파기해야 할 개인정보 번호는 [1, 3]입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 날짜를 의미하는 문자열&amp;nbsp;today, 약관의 유효기간을 담은 1차원 문자열 배열&amp;nbsp;terms와 수집된 개인정보의 정보를 담은 1차원 문자열 배열&amp;nbsp;privacies가 매개변수로 주어집니다. 이때 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 return 하도록 solution 함수를 완성해 주세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제한사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;today는 &quot;YYYY.MM.DD&quot; 형태로 오늘 날짜를 나타냅니다.&lt;/li&gt;
&lt;li&gt;1 &amp;le;&amp;nbsp;terms의 길이 &amp;le; 20
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;terms의 원소는 &quot;약관 종류&amp;nbsp;유효기간&quot; 형태의&amp;nbsp;약관 종류와&amp;nbsp;유효기간을 공백 하나로 구분한 문자열입니다.&lt;/li&gt;
&lt;li&gt;약관 종류는&amp;nbsp;A~Z중 알파벳 대문자 하나이며,&amp;nbsp;terms&amp;nbsp;배열에서&amp;nbsp;약관 종류는 중복되지 않습니다.&lt;/li&gt;
&lt;li&gt;유효기간은 개인정보를 보관할 수 있는 달 수를 나타내는 정수이며, 1 이상 100 이하입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1 &amp;le;&amp;nbsp;privacies의 길이 &amp;le; 100
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;privacies[i]는&amp;nbsp;i+1번 개인정보의 수집 일자와 약관 종류를 나타냅니다.&lt;/li&gt;
&lt;li&gt;privacies의 원소는 &quot;날짜&amp;nbsp;약관 종류&quot; 형태의&amp;nbsp;날짜와&amp;nbsp;약관 종류를 공백 하나로 구분한 문자열입니다.&lt;/li&gt;
&lt;li&gt;날짜는 &quot;YYYY.MM.DD&quot; 형태의 개인정보가 수집된 날짜를 나타내며,&amp;nbsp;today&amp;nbsp;이전의 날짜만 주어집니다.&lt;/li&gt;
&lt;li&gt;privacies의&amp;nbsp;약관 종류는 항상&amp;nbsp;terms에 나타난&amp;nbsp;약관 종류만 주어집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;today와&amp;nbsp;privacies에 등장하는&amp;nbsp;날짜의&amp;nbsp;YYYY는 연도,&amp;nbsp;MM은 월,&amp;nbsp;DD는 일을 나타내며 점(.) 하나로 구분되어 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2000 &amp;le;&amp;nbsp;YYYY&amp;nbsp;&amp;le; 2022&lt;/li&gt;
&lt;li&gt;1 &amp;le;&amp;nbsp;MM&amp;nbsp;&amp;le; 12&lt;/li&gt;
&lt;li&gt;MM이 한 자릿수인 경우 앞에 0이 붙습니다.&lt;/li&gt;
&lt;li&gt;1 &amp;le;&amp;nbsp;DD&amp;nbsp;&amp;le; 28&lt;/li&gt;
&lt;li&gt;DD가 한 자릿수인 경우 앞에 0이 붙습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;파기해야 할 개인정보가 하나 이상 존재하는 입력만 주어집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;입출력 예&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;today terms privacies result&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&quot;2022.05.19&quot;&lt;/td&gt;
&lt;td&gt;[&quot;A 6&quot;, &quot;B 12&quot;, &quot;C 3&quot;]&lt;/td&gt;
&lt;td&gt;[&quot;2021.05.02 A&quot;, &quot;2021.07.01 B&quot;, &quot;2022.02.19 C&quot;, &quot;2022.02.20 C&quot;]&lt;/td&gt;
&lt;td&gt;[1, 3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;2020.01.01&quot;&lt;/td&gt;
&lt;td&gt;[&quot;Z 3&quot;, &quot;D 5&quot;]&lt;/td&gt;
&lt;td&gt;[&quot;2019.01.01 D&quot;, &quot;2019.11.15 Z&quot;, &quot;2019.08.02 D&quot;, &quot;2019.07.01 D&quot;, &quot;2018.12.28 Z&quot;]&lt;/td&gt;
&lt;td&gt;[1, 4, 5]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문제 같은 경우는 설명만 길고 단순히 생각의 흐름대로 풀이해보면 되는 문제같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적으로 문자열 관련 메소드를 잘 활용하면 되는 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 좋았던건 한 달이 28일이라고 지정해둔 덕에 어렵지 않게 풀 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681449027754&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

class Solution {
    public List&amp;lt;Integer&amp;gt; solution(String today, String[] terms, String[] privacies) {
        int dayForM = 28;
        int todayY = Integer.parseInt(today.substring(0,4));
        int todayM = Integer.parseInt(today.substring(5,7));
        int todayD = Integer.parseInt(today.substring(8,10));

        int totalD = (todayY*dayForM*12) + (todayM*28) + todayD;
        List&amp;lt;Integer&amp;gt; answerArr = new ArrayList&amp;lt;&amp;gt;();
        HashMap&amp;lt;Character,Integer&amp;gt; termsMap = new HashMap&amp;lt;&amp;gt;();
        for(String term : terms){
            char termO = term.charAt(0);
            int termM = Integer.parseInt(term.substring(2));
            termsMap.put(termO,termM);
        }
        for(int i=0; i&amp;lt;privacies.length; i++){
            char privacyO = privacies[i].charAt(11);
            int privacyY = Integer.parseInt(privacies[i].substring(0,4));
            int privacyM = Integer.parseInt(privacies[i].substring(5,7));
            int privacyD = Integer.parseInt(privacies[i].substring(8,10));
            int totalPrivacyD = (privacyY*12*dayForM) + (privacyM*dayForM) + privacyD;
            int termM = termsMap.get(privacyO);
            int termDay = termM * dayForM;
            if(totalPrivacyD+termDay &amp;lt;=totalD){
                answerArr.add(i+1);
            }
        }

        return answerArr;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문제풀이들을 살펴보니 객체지향으로 풀이하신분도 계셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm</category>
      <category>개인정보 수집 유효기간</category>
      <category>알고리즘</category>
      <category>프로그래머스</category>
      <author>코딩하는 브린스</author>
      <guid isPermaLink="true">https://codinghentai.tistory.com/95</guid>
      <comments>https://codinghentai.tistory.com/95#entry95comment</comments>
      <pubDate>Fri, 14 Apr 2023 14:11:13 +0900</pubDate>
    </item>
    <item>
      <title>운영체제 이론 03-28 (정리) 프로세스와 커널</title>
      <link>https://codinghentai.tistory.com/94</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;인터럽트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입출력 장치들이 &lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;비동기적 사건&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;을 CPU에게 &lt;b&gt;알리는 행위&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비동기 &amp;rarr; 동기와 다르게 요청을 보냈을 때 응답이 도착하지 않아도 요청을 보낼 수 있다.&lt;/li&gt;
&lt;li&gt;마우스 조작 , 키보드 입력&lt;/li&gt;
&lt;li&gt;네트워크로부터 &lt;b&gt;데이터 도착&lt;/b&gt; 등등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;543&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mnqyl/btr9pdJCfc0/v7KpxarK2gZWCj0kgkc0j0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mnqyl/btr9pdJCfc0/v7KpxarK2gZWCj0kgkc0j0/img.png&quot; data-alt=&quot;인터럽트 발생 전 프로그램 실행 중 &amp;amp;rarr; 입력장치로부터 인터럽트 발생 &amp;amp;rarr; 인터럽트 메시지 CPU로 전송 &amp;amp;rarr; CPU코어로부터 전송 및 인터럽트 벡트 번호 반환 &amp;amp;rarr; 인터럽트 벡터 테이블에서 인터럽트의 서비스 루틴의 주소를 알아낸다. &amp;amp;rarr; 인터럽트 서비스 루틴 실행 &amp;amp;rarr; CPU는 인터럽트 발생 전에 하던 작업을 지속한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mnqyl/btr9pdJCfc0/v7KpxarK2gZWCj0kgkc0j0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMnqyl%2Fbtr9pdJCfc0%2Fv7KpxarK2gZWCj0kgkc0j0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;795&quot; height=&quot;543&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;543&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인터럽트 발생 전 프로그램 실행 중 &amp;rarr; 입력장치로부터 인터럽트 발생 &amp;rarr; 인터럽트 메시지 CPU로 전송 &amp;rarr; CPU코어로부터 전송 및 인터럽트 벡트 번호 반환 &amp;rarr; 인터럽트 벡터 테이블에서 인터럽트의 서비스 루틴의 주소를 알아낸다. &amp;rarr; 인터럽트 서비스 루틴 실행 &amp;rarr; CPU는 인터럽트 발생 전에 하던 작업을 지속한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터럽트 서비스 루틴
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ISR &amp;rarr; &lt;b&gt;인터럽트 핸들러&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;위치 : 디바이스 드라이버나 &lt;b&gt;커널 코드&lt;/b&gt;, 임베디드 컴퓨터 ROM&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인터럽트는 다중 프로그래밍 실현의 키이다.&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다중 프로그래밍 리뷰
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 프로세스를 &lt;b&gt;동시에&lt;/b&gt; 실행한다. (&lt;b&gt;멀티 프로그래밍)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;프로그래밍과 프로세서는 &lt;b&gt;프로그램 하나가 프로세서 하나를 같이 운영 할 수 있다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;한 프로세스가 입출력을 시행하면 &lt;b&gt;다른 프로세스로 교체 실행&lt;/b&gt;된다.&lt;/li&gt;
&lt;li&gt;입출력이 완료될 때, 장치로부터 입출력 완료 &lt;b&gt;통보&lt;/b&gt;를 받는 방법이 필요하고 그것이 바로 &lt;b&gt;인터럽트&lt;/b&gt;이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터럽트가 없다면 ? &amp;rarr; CPU는 &lt;b&gt;폴링&lt;/b&gt;을 실행해야 하므로 비효율정이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;폴링 &amp;rArr; &lt;b&gt;하나의 장치(또는 프로그램)가 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치(또는 프로그램)의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;다중 프로그래밍 운영체제의 구현은 사실상 거의 불가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인터럽트의 효과
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터 시스템이 &lt;b&gt;효율적&lt;/b&gt;으로 작동한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU 활용률이 높아진다. (시스템 처리율 향상)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;입출력 장치와 CPU가 동시에 각자의 작업을 실행한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입출력 장치 &amp;rarr; 지시받은 입출력 진행 / CPU &amp;rarr; 다른 프로그램 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트 발생 시 ISR (Interrupt Service Routine) 혹은 Interrupt Handler 가 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트가 존재하지 않는다면 다중 프로그래밍 운영체제의 구현은 사실상 불가능하다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로세스&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드디스크 등의 &lt;b&gt;저장 매체&lt;/b&gt;에 저장된다. (실행 파일의 형태)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로세스
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램이 &lt;b&gt;메모리에 적재되어 실행 되는 상태&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필요한 &lt;b&gt;모든 자원을 할당&lt;/b&gt;받는다.&lt;/li&gt;
&lt;li&gt;코드공간, 데이터공간, 스택공간, 힙공간&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로세스 특징
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제는 &lt;b&gt;프로그램을 메모리에 적재하고 프로세스로 다룬다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;메모리를 할당 후 &lt;b&gt;코드와 데이터&lt;/b&gt; 등을 적재한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로세스들은 서로 독립적인 메모리 공간을 가진다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;운영체제는 프로세스마다 고유한 번호를 할당한다. &amp;rArr; PID&lt;/li&gt;
&lt;li&gt;운영체제는 각 &lt;b&gt;프로세스의 메모리 위치와 크기 정보를 관리&lt;/b&gt;한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로세스의 모든 정보는 커널에 의해 관리된다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;프로세스는 실행 - 대기 - 잠자기 - 대기 - 실행 - 종료 등의 생명 주기를 가진다. (&lt;b&gt;모든 관리는 커널에 의해 수행된다.&lt;/b&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bffJh2/btr9nnToIdA/thm8FTtQHLL8bEvkkikdm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bffJh2/btr9nnToIdA/thm8FTtQHLL8bEvkkikdm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bffJh2/btr9nnToIdA/thm8FTtQHLL8bEvkkikdm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbffJh2%2Fbtr9nnToIdA%2Fthm8FTtQHLL8bEvkkikdm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;795&quot; height=&quot;505&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세서
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU , 그래픽 프로세스 (실제 칩으로 되어있는 것들)&lt;/li&gt;
&lt;li&gt;하드웨어 처리기라는 의미를 갖고있다. (하드웨어 적인 부분)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로세스
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램에 대한 실행 (소프트웨어적인 부분)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&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;프로세스는 프로그램이 메모리에 적재되어 실행되는 상태를 뜻한다. 프로세스의 모든 정보는 커널에 의해 관리되며 프로세스마다 고유한 번호를 가지게 된다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로세스 관리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스의 생성에서 종료까지 관리는 &lt;b&gt;모두 커널에 의해 이루어진다.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널 영역에 &lt;b&gt;프로세스 테이블&lt;/b&gt;을 만들고 프로세스 목록을 관리한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;관리 내용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스 생성, 실행, 일시중단 및 재개, 정보 관리, 프로세스 통신, 프로세스 동기화, 프로세스 중단, 프로세스 컨텍스트 스위칭&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;한 프로그램을 여러 번 실행시킬 때
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램 실행 시 마다 독립된 프로세스 생성 &amp;rarr; 프로세스들을 프로그램의 &lt;b&gt;다중 인스턴스&lt;/b&gt;라고 부른다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;각 프로세스에 독립된 메모리 공간을 할당&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;각 프로세스를 별개의 프로세스로 취급한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&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;프로그램을 여러 번 실행 시킬땐, 다중 인스턴스화 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 프로세스 마다 독립된 메모리 공간을 할당받는다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;응용 프로그램의 자원 접근 문제&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오늘날 운영체제는 &lt;b&gt;다중 프로그래밍 운영체제&lt;/b&gt;이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응용 프로그램이 직접 컴퓨터 자원에 접근하면 충돌과 훼손이 발생한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 응용프로그램이 적재된 메모리를 훼손 할 수 있다.&lt;/li&gt;
&lt;li&gt;다른 응용프로그램이 만든 파일 삭제 및 훼손이 가능하다.&lt;/li&gt;
&lt;li&gt;응용 프로그램이 커널이 적재된 영역 훼손 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;해결 방안
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;자원에 대한 모든 접근은 커널에만 부여한다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;구체적인 해결 방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;사용자 공간 &amp;rarr; 응용 프로그램만 있는 공간&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커널은 커널 공간에만 적재한다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;CPU의 실행모드를 &lt;b&gt;사용자 모드와 커널 모드&lt;/b&gt;로 분리한다.&lt;/li&gt;
&lt;li&gt;응용 프로그램이 커널 기능을 이용할 때, 시스템 호출을 잉요해서만 커널 코드를 이용하도록 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용자 공간과 커널 공간&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 공간
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응용 프로그램들이 적재되는 공간&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;커널 공간
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;커널 코드, 커널 데이터&lt;/b&gt; 등 커널에 의해 &lt;b&gt;배타적으로 사용되는 공간&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;디바이스 드라이버&lt;/b&gt;를 포함한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;분리하는 이유
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널 코드와 데이터를 &lt;b&gt;악의적인 응용프로그램이나 코딩 실수로부터 지키기 위함&lt;/b&gt;이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&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;프로그램이 직접 컴퓨터 자원에 접근하여 발생하는 충돌을 막기 위해 자원에 대한 접근은 커널에만 부여한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용자 공간 크기의 의미&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 응용프로그램의 최대 크기 결정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램 코드 + 데이터 (전역 변수) + 힙(동적 할당) + 스택&lt;/li&gt;
&lt;li&gt;운영체제에서 사용자 공간이 2GB &amp;rarr; &lt;b&gt;응용프로그램을 2GB 크기 이상 개발 X&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;사용자 공간의 주소 범위
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제가 설정한 사용자 공간의 &lt;b&gt;주소 범위를 넘어설 수 없다.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;바로 종료됨 (심각한 오류 예 : 블루스크린)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;601&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKAb24/btr9sfz3hlX/X1ZUdGy5vRIfhI8JpLDFq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKAb24/btr9sfz3hlX/X1ZUdGy5vRIfhI8JpLDFq1/img.png&quot; data-alt=&quot;주소공간은 가상 공간이다. (사용자나 응용프로그램 관점에서 보는 주소 범위) / 사용자가 전체 메모리를 사용하고 있다고 착각하지만 실제론 아니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKAb24/btr9sfz3hlX/X1ZUdGy5vRIfhI8JpLDFq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKAb24%2Fbtr9sfz3hlX%2FX1ZUdGy5vRIfhI8JpLDFq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;793&quot; height=&quot;601&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;601&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주소공간은 가상 공간이다. (사용자나 응용프로그램 관점에서 보는 주소 범위) / 사용자가 전체 메모리를 사용하고 있다고 착각하지만 실제론 아니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 공간의 충돌 해결 &amp;rarr; &lt;b&gt;가상 주소 공간을 물리 메모리에 매핑한다.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매핑 테이블 (주소 공간을 갖고 있는) &amp;rarr; 운영체제가 소유하고 관리한다.&lt;/li&gt;
&lt;li&gt;물리 메모리를 여러 프로그램의 사용자 공긴이 나누어 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제로는 각 프로그램이 사용자 공간의 일부만 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;커널 공간 역시 물리 메모리에 매핑 될 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;물리 메모리가 작은 경우에는 하드 디스크에 저장하여 물리 메모리의 빈 영역을 확보한다. &lt;b&gt;(가상 메모리 기법)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&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;사용자 공간은 운영체제가 정한 범위 이상을 가질 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;h2 data-ke-size=&quot;size26&quot;&gt;사용자 모드와 커널 모드&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU는 사용자 모드와 커널 모드 중 한 모드로 실행한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU 내부에 모드 &lt;b&gt;레지스터&lt;/b&gt; 존재 &amp;rarr; 모드 &lt;b&gt;상태&lt;/b&gt;를 나타냄&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;사용자 모드
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU의 모드 비트 &amp;rarr; 1&lt;/li&gt;
&lt;li&gt;CPU는 커널을 쓸 수 없다. &amp;rarr; 응용 프로그램으로부터 커널 영역을 보호한다.&lt;/li&gt;
&lt;li&gt;특권 명령 실행을 불허한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특권명령 ? 입출력 장치 등 하드웨어나 시스템 중단 등 시스템 관련 처리를 위해 설계된 특별한 명령&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;커널 모드
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU의 모드 비트 &amp;rarr; 0&lt;/li&gt;
&lt;li&gt;CPU가 커널 공간에서 실행하는 중, 혹은 사용자 코드를 실행하는 중&lt;/li&gt;
&lt;li&gt;특권 명령 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 모드에서 커널 모드로 전환하는 경우
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;시스템 호출과 인터럽트&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시스템 호출
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특별한 &lt;b&gt;기계 명령&lt;/b&gt;에 의해 진행된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 장비들마다 기계 명령이 다르다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;기계 명령이 CPU의 모든 비트를 커널 모드로 전환한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인터럽트
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU가 인터럽트를 수신하면 &lt;b&gt;커널 모드로 자동으로 전환&lt;/b&gt;한다.&lt;/li&gt;
&lt;li&gt;CPU는 &lt;b&gt;인터럽트 서비스 루틴을 실행&lt;/b&gt;한다.&lt;/li&gt;
&lt;li&gt;인터럽트 서비스 루틴이 끝나면 &lt;b&gt;사용자 모드로 자동 전환&lt;/b&gt;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU8q2o/btr9mgtPnW6/sSKwwbbfzo6Mr1nmTrwUQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU8q2o/btr9mgtPnW6/sSKwwbbfzo6Mr1nmTrwUQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU8q2o/btr9mgtPnW6/sSKwwbbfzo6Mr1nmTrwUQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU8q2o%2Fbtr9mgtPnW6%2FsSKwwbbfzo6Mr1nmTrwUQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;780&quot; height=&quot;270&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU는 인터럽트를 수신하면 커널 모드로 자동으로 전환 후 서비스 루틴이 끝나면 사용자 모드로 자동 전환한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;특권 명령&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특별한 목적으로 설계된 CPU 명령&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커널 모드에서만 실행&lt;/b&gt;된다.&lt;/li&gt;
&lt;li&gt;종류
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;I/O 명령&lt;/li&gt;
&lt;li&gt;Halt 명령
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU 작동 중지 (유휴 상태로 만듬)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인터럽트 플래그를 켜고 끄는 명령
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU가 인터럽트를 허용하거나 무시하도록 지시한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;타이머 설정 명령&lt;/li&gt;
&lt;li&gt;컨텍스트 스위칭 명령&lt;/li&gt;
&lt;li&gt;메모리 지우기 명령&lt;/li&gt;
&lt;li&gt;장치 상태 테이블 수정 등의 명령&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;사용자 모드와 커널 모드는 CPU에 의해 구현되는가, 운영체제에 의해 구현되는가
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제는 &lt;b&gt;CPU 모드 레지스터&lt;/b&gt;를 이용하여 커널 영역을 지킨다.&lt;/li&gt;
&lt;li&gt;모드는 CPU에 의해 구현, 운영체제가 &lt;b&gt;활용할 수는 있다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;운영체제가 사용자 모드와 커널 모드로 나누는 이유는?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;커널 공간에 대한 보안과 보호&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;사용자 응용프로그램은 사용자 모드에서 심각한 오류가 발생해도 시스템을 중단시키지는 못한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;사용자 응용프로그램이 커널 코드를 호출하는 일이 있는가?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;직접 커널 코드 호출 불가&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CPU가 커널 모드와 사용자 모드 중 어떤 모드로 많이 실행될까?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 전체 통계를 보면 &lt;b&gt;커널 모드에서 많이 실행된다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;장치 액세스의 경우가 많으면 &lt;b&gt;커널 모드 시간 비율이 높아진다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;특권 명령은 커널 모드에서만 실행되는 CPU 명령이다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;커널&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널은 컴파일된 &lt;b&gt;바이너리 형태,&lt;/b&gt; 하드디스크 특정 영역에 저장된다. (부팅 시에 &lt;b&gt;커널 공간의 메모리에 적재된다.)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;커널 코드는 &lt;b&gt;함수들의 집합&lt;/b&gt;이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널 모드에서 실행되는 함수들과 데이터들의 집합이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;792&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdz2EN/btr9mNSs6KC/JykrFRVUTKT0NL6yXc7tk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdz2EN/btr9mNSs6KC/JykrFRVUTKT0NL6yXc7tk1/img.png&quot; data-alt=&quot;커널 자체가 프로세스가 될 순 없다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdz2EN/btr9mNSs6KC/JykrFRVUTKT0NL6yXc7tk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdz2EN%2Fbtr9mNSs6KC%2FJykrFRVUTKT0NL6yXc7tk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;792&quot; height=&quot;448&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;커널 자체가 프로세스가 될 순 없다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널은 스스로 실행되는 프로세스가 아니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수들의 단순 집합, &lt;b&gt;시스템 호출을 통해 호출되는 함수들&lt;/b&gt;이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;시스템 호출&lt;/b&gt;과 &lt;b&gt;인터럽트 서비스 루틴&lt;/b&gt;에 의해 커널 내 스케줄러 함수가 호출되어 실행된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;커널은 실행 중이 아니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널은 &lt;b&gt;프로세스도 스레드도 아니다.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널 코드를 실행하고 있다 / &lt;b&gt;인터럽트 서비스 루틴이 실행되고 있다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;커널은 스택이나 힙을 갖지 않는다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수들의 단순 집합이기 때문 / &lt;b&gt;스레드가 가진다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;스레드마다 &lt;b&gt;사용자 스택과 커널 스택을 소유&lt;/b&gt;한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스레드가 생성될 때 프로세스의 사용자 공간에 사용자 스택 할당 / 커널 공간에 커널 스택 할당 (시스템 호출을 통해)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;h2 data-ke-size=&quot;size26&quot;&gt;라이브러리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램에서 활용하도록 미리 작성된 함수들이 컴파일 되어 바이너리 형태로 제공되는 파일&lt;/li&gt;
&lt;li&gt;개발자는 라이브러리 활용이 없이는 응용프로그램 작성이 불가능하다.&lt;/li&gt;
&lt;li&gt;활용되는 라이브러리는 2가지 유형을 갖는다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;표준 라이브러리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 작성하기 힘든 함수를 제공한다.&lt;/li&gt;
&lt;li&gt;운영체제나 컴퓨터 하드웨어에 상관없이 이름과 사용법이 동일하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시스템 호출 라이브러리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 호출 함수를 포함한다.&lt;/li&gt;
&lt;li&gt;시스템 호출을 진행하여 커널 모드로 바꾸고 커널로 진입하여 커널에 만들어진 함수를 실행한다.&lt;/li&gt;
&lt;li&gt;시스템콜 함수를 커널 API라고 부른다.&lt;/li&gt;
&lt;li&gt;운영체제마다 시스템콜 함수의 이름이 서로 다르다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;링킹&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행 파일이 만들어지는 과정이다.&lt;/li&gt;
&lt;li&gt;응용프로그램이 사용자 공간에 적재 &amp;rarr; 실행 파일 내 사용자 코드와 라이브러리 코드의 &lt;b&gt;메모리&lt;/b&gt; 적재 &amp;rarr; 사용자 전역 변수와 라이브러리의 전역 변수 모두 &lt;b&gt;메모리&lt;/b&gt;에 적재 &amp;rarr; 응용 프로그램은 사용자 모드로 실행 시작&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;함수 호출과 시스템 호출&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수 호출로 라이브러리를 활용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 공간에 적재된 함수가 사용자 공간에 적재된 다른 함수를 호출한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스택에 돌아올 주소, 매개변수를 전달 &amp;rarr; 호출된 함수의 지역 변수를 생성한다.&lt;/li&gt;
&lt;li&gt;사용자 공간에 적재된 함수의 주소로 점프&lt;/li&gt;
&lt;li&gt;함수가 끝나면 함수를 호출한 곳으로 복귀시킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시스템 호출로 커널 코드를 실행&lt;/b&gt;한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널에 작성된 함수 실행
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 호출 라이브러리에 포함된 시스템 호출 함수가 시스템 호출을 일으킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;기계 명령어를 실행한다.&lt;/li&gt;
&lt;li&gt;커널 모드로 전환되고 커널 함수마다 &lt;b&gt;고유 번호를 전달&lt;/b&gt;한다.&lt;/li&gt;
&lt;li&gt;커널의 &lt;b&gt;시스템 호출 핸들러&lt;/b&gt;를 실행한다.&lt;/li&gt;
&lt;li&gt;커널 함수의 고유 번호 분석, 해당 커널 함수 호출&lt;/li&gt;
&lt;li&gt;리턴할 때 사용자 모드로 전환, 사용자 프로그램으로 복귀&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;시스템 호출&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 공간의 코드에서 &lt;b&gt;커널 서비스를 요청하는 과정&lt;/b&gt;이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;커널 콜 / 트랩&lt;/b&gt; 이라고도 불린다.&lt;/li&gt;
&lt;li&gt;응용프로그램에서 커널 기능을 활용하도록 만들어 놓은 기능이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;운영체제는 시스템 호출 라이브러리를 제공한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 호출 함수 혹은 커널 API를 포함한다.&lt;/li&gt;
&lt;li&gt;대략 200개 이상의 시스템 호출 함수가 존재한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시스템 호출을 일으키는 기계 명령
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU마다 시스템 호출을 실행하는 특별한 기계 명령을 제공한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;fread()와 read() 의 비교&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 호출은 함수 호출에 비해 많은 시간 비용이 든다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 호출을 많이 할수록 프로그램 실행 속도가 저하된다.&lt;/li&gt;
&lt;li&gt;fread() &amp;rArr; 1번의 시스템 호출&lt;/li&gt;
&lt;li&gt;read() &amp;rArr; 10번의 시스템 호출 (느리고 비효율적이다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로세스 구성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 영역
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램 &lt;b&gt;코드가 적재되는 영역&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;데이터 영역
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램에서 고정적으로 만든 변수 공간&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로세스 적재시 할당, 종료시 소멸&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;힙 영역
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스의 실행 도중 &lt;b&gt;동적&lt;/b&gt;으로 사용할 수 있도록 할당된 공간&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스택 영역
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수가 실행될 때 사용될 데이터를 위해 할당된 공간&lt;/li&gt;
&lt;li&gt;함수 호출 외에 프로세스에서 필요시 사용이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로세스 주소 공간&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행중에 접근할 수 있도록 허용된 주소의 &lt;b&gt;최대 범위&lt;/b&gt; (범위를 벗어나지 않음)&lt;/li&gt;
&lt;li&gt;논리공간이다. (&lt;b&gt;가상공간&lt;/b&gt;)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0번지에서 시작하여 연속적인 주소를 가진다. (실제는 0번지가 아니라고 볼 수 있다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;32비트 CPU의 경우 4GB 까지 크기를 가질 수 있다.&lt;/li&gt;
&lt;li&gt;프로세스 크기 : 적재된 코드 + 전역 변수 + 힙 영역에서 할당받은 동적 메모리 공간 + 스택 영역에 현재 저장된 데이터 크기 로 &lt;b&gt;매번 달라질 수 있다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;커널 공간&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 호출을 통해 이용하는 커널 공간&lt;/li&gt;
&lt;li&gt;커널 코드 , 커널 데이터, 커널 스택(커널 코드가 실행될 때만) 이 존재한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스의 코드와 데이터는 실행 파일에 결정된 상태로 코드 영역과 데이터 영역에 적재된다. &amp;rarr; &lt;b&gt;실행 중에 크기가 변하지 않는다.&lt;/b&gt; (메모리를 아껴써야 한다.)&lt;/li&gt;
&lt;li&gt;프로세스는 사용자 공간의 최대 범위까지 동적할당 받으면서 힙 영역과 스택 영역을 늘려갈 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;커널 공간의 의미&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 프로세스는 독립된 사용자공간을 소유하고 커널 공간을 공유한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스가 사용자 코드에서 시스템 호출을 통해 커널 코드를 실행할 때 커널 공간을 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;결론
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스마다 각각 &lt;b&gt;사용자 주소 공간이 존재&lt;/b&gt;한다.&lt;/li&gt;
&lt;li&gt;시스템 전체에는 &lt;b&gt;하나의 커널 주소 공간&lt;/b&gt;이 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모든 프로세스는 커널 주소 공간을 공유한다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로세스의 주소 공간&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스의 주소 공간은 가상 공간이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스에서의 0번지는 가상 주소 0번지를 의미한다.&lt;/li&gt;
&lt;li&gt;가상 주소는 0번지부터 시작된다.&lt;/li&gt;
&lt;li&gt;코드 주소 변수 주소 등등은 모두 가상 주소이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로세스의 주소 공간은 각 프로세스마다 주어지고, 가상 주소가 물리 주소로 매핑되기 때문에 물리 메모리에서는 충돌하지 않는다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>학교공부</category>
      <author>코딩하는 브린스</author>
      <guid isPermaLink="true">https://codinghentai.tistory.com/94</guid>
      <comments>https://codinghentai.tistory.com/94#entry94comment</comments>
      <pubDate>Mon, 10 Apr 2023 22:40:18 +0900</pubDate>
    </item>
    <item>
      <title>정보통신 개론 03-27 (정리) 컴퓨터, 부울대수 , 데이터표현</title>
      <link>https://codinghentai.tistory.com/93</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;통신 시스템의 하드웨어&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;통신 제어장치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터 &amp;larr; &lt;b&gt;단말장치&lt;/b&gt; &amp;rarr; 모뎀&lt;/li&gt;
&lt;li&gt;컴퓨터 중앙처리장치와 데이터 전송회선 사이에서 &lt;b&gt;전기적&lt;/b&gt;으로 연결된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전송문자의 조립 / 분해&lt;/li&gt;
&lt;li&gt;코드 변환&lt;/li&gt;
&lt;li&gt;회선의 제어&lt;/li&gt;
&lt;li&gt;에러 제어 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;네트워크 제어 장치 &lt;b&gt;(NCU)&lt;/b&gt; 라고도 한다. (Network Control Unit)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;통신 제어장치&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;장비 측 (디지털 신호) 와 선로 (아날로그 &amp;rarr; 전기신호) 측의 상호 교류를 지원한다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;선로 낭비를 줄이기 위해 &lt;b&gt;다중화, 역 다중화&lt;/b&gt;를 사용한다.&lt;/li&gt;
&lt;li&gt;다중화 (전송문자)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러대의 장비 &amp;rarr; 한 선로&lt;/li&gt;
&lt;li&gt;한 선로 &amp;rarr; 여러대의 장비&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7q2pG/btr9eARVhF9/mj4tJOG7zG3ukjrZdBmRG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7q2pG/btr9eARVhF9/mj4tJOG7zG3ukjrZdBmRG0/img.png&quot; data-alt=&quot;동기 제어 ** &amp;amp;rarr; 송신 측과 수신 측을 일치 시키도록 제어 / 흐름 제어 &amp;amp;rarr; 버퍼 초과 방지 ( 버퍼 : 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역 ) / 응답 제어 &amp;amp;rarr; 응답용 확인 메시지 전송 (3Way handshake방식)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7q2pG/btr9eARVhF9/mj4tJOG7zG3ukjrZdBmRG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7q2pG%2Fbtr9eARVhF9%2Fmj4tJOG7zG3ukjrZdBmRG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;748&quot; height=&quot;361&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;동기 제어 ** &amp;rarr; 송신 측과 수신 측을 일치 시키도록 제어 / 흐름 제어 &amp;rarr; 버퍼 초과 방지 ( 버퍼 : 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역 ) / 응답 제어 &amp;rarr; 응답용 확인 메시지 전송 (3Way handshake방식)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div 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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선로 낭비를 줄이기 위해 다중화 / 역다중화를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보전송 기능 &amp;rarr; 동기제어, 흐름제어 (버퍼 초과 방지 : 데이터 용량 초과 방지) , 응답제어 등&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;통신 제어장치의 부가 장치&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;전위&lt;/b&gt; 처리기 (FEP) &amp;rarr; 앞에 있어서 전위
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터의 바로 앞에 있는 것은 대부분 전위 처리기이다.&lt;/li&gt;
&lt;li&gt;통신기능을 &lt;b&gt;보강&lt;/b&gt;하는 특수한 일만 하는 주 프로세서에 결합되어있다. (통신용 cpu)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;후위&lt;/b&gt; 처리기 (BEP) &amp;rarr; 뒤에 있어서 후위
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터의 뒤에 있는것이 대부분 후위 처리기이다.&lt;/li&gt;
&lt;li&gt;컴퓨터의 &lt;b&gt;부하&lt;/b&gt;를 줄이는 역할을 담당한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;통신 제어 처리 장치 (CCP)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;프로그래밍&lt;/b&gt;을 사용하여 통신 제어장치를 개선한다.&lt;/li&gt;
&lt;li&gt;필요에 의해서 연결시켜준다.&lt;/li&gt;
&lt;li&gt;프로그램 가능한 또는 프로그램 제어 방식의 통신 제어장치&lt;/li&gt;
&lt;li&gt;CPU의 부담을 감소 시킬 수 있다.&lt;/li&gt;
&lt;li&gt;CCP 가 없으면 CPU가 모든 일을 담당해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;확장성이 좋다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;주로 T1 급을 많이 사용한다. (24채널,30 채널까지도 확장이 가능하다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pCZcd/btr8PZS4gwG/HJk5yXFyvLJnqs07rJfGLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pCZcd/btr8PZS4gwG/HJk5yXFyvLJnqs07rJfGLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pCZcd/btr8PZS4gwG/HJk5yXFyvLJnqs07rJfGLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpCZcd%2Fbtr8PZS4gwG%2FHJk5yXFyvLJnqs07rJfGLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;686&quot; height=&quot;417&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인터페이스와 접속 규격&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터페이스 &amp;rarr; 마주보다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 단말장치 &amp;harr; 데이터 통신장치 간의 &lt;b&gt;접속 관계&lt;/b&gt;를 표시한다. (어떠한 매체 간의 접속 관계를 뜻하기도 하는것같다.)&lt;/li&gt;
&lt;li&gt;연결기의 신호선 핀 배치에 따라 종류가 다르다.&lt;/li&gt;
&lt;li&gt;RS-232
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 대표적이다.&lt;/li&gt;
&lt;li&gt;DTE와 DCE 간의 &lt;b&gt;물리적 연결과 신호 수준&lt;/b&gt;을 &lt;b&gt;정의&lt;/b&gt;한다.&lt;/li&gt;
&lt;li&gt;25핀 , 9핀 연결기를 모두 지원한다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접속 규격
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DTE - DCE 인터페이스 규격은 &lt;b&gt;ITU - T (Telecom)&lt;/b&gt; 권고에 정의되어 있다. (ITU - R &amp;rarr; 무선)&lt;/li&gt;
&lt;li&gt;V시리즈 : DTE 와 아날로그 통신회선 간의 접속 규정을 정의한다.&lt;/li&gt;
&lt;li&gt;X시리즈 : DTE 와 디지털 교환망 간의 접속 규정을 정의한다.&lt;/li&gt;
&lt;li&gt;I시리즈 : DTE와 종합정보통신망(ISDN) 간의 접속 규정을 정의한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기계적 &amp;rarr; 연결기 를 정의한다. (연결기 크기 , 핀 개수 등)&lt;/li&gt;
&lt;li&gt;전기적 &amp;rarr; 형식을 알려준다. (신호 전압 , 전압 변동, 잡음 정도 등)&lt;/li&gt;
&lt;li&gt;기능적 &amp;rarr; 데이터 제어, 타이밍, 접지 등 수행 기능 규정&lt;/li&gt;
&lt;li&gt;절차적 &amp;rarr; 데이터를 전송하기 위한 &lt;b&gt;사건이 일어나는 순서를 규정&lt;/b&gt;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정보전송 시스템의 소프트웨어&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소프트웨어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드웨어의 &lt;b&gt;전체 동작을 지시하고 제어하는 모든 프로그램&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;하드웨어를 지시하고 통제하여 결과를 얻도록 하는 명령의 집합이다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시스템 소프트웨어&lt;/b&gt;와 &lt;b&gt;응용 소프트웨어&lt;/b&gt;로 분류된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시스템 소프트웨어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴파일러 &amp;rarr; 기계어로 번역해준다.&lt;/li&gt;
&lt;li&gt;인터프리터 &amp;rarr; ****코드를 &lt;b&gt;한 줄씩 읽어 내려가며 실행&lt;/b&gt;하는 프로그램 (베이직 / 파이썬)&lt;/li&gt;
&lt;li&gt;운영체제&lt;/li&gt;
&lt;li&gt;언어 번역 프로그램&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;응용 소프트웨어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;고급 프로그래밍 언어&lt;/b&gt;를 주로 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;통신 소프트웨어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터 상호 간에 접속하여 정보를 교환할 수 있게 하는 소프트웨어 프로그램의 총칭이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;월드 와이드 웹 브라우저 소프트웨어&lt;/b&gt;, 단말 대행 소프트웨어 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세부적인 구조를 몰라도 통신 프로그램에 동작 지시가 가능하다.&lt;/li&gt;
&lt;/ul&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RS 232&amp;rarr; 대표적인 인터페이스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보 전송 소프트웨어엔 시스템 소프트웨어, 응용 소프트웨어, 통신 소프트웨어가 있다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;컴퓨터 (정보처리) 시스템&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;하드웨어와 소프트웨어&lt;/b&gt;로 구분된다.&lt;/li&gt;
&lt;li&gt;사용자는 응용 소프트웨어를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;컴퓨터의 세대별 구분
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1세대 컴퓨터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;진공관 , 릴레이&lt;/li&gt;
&lt;li&gt;&lt;b&gt;논리 소자&lt;/b&gt; 역할을 했다. (0 과 1을 표현하는데에 활용되었다.)&lt;/li&gt;
&lt;li&gt;1946 ~ 1959&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2세대 컴퓨터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;트랜지스터&lt;/li&gt;
&lt;li&gt;&lt;b&gt;신호를 증폭&lt;/b&gt;시키는 역할을 했다. (0의 신호를 증폭시켜서 1을 만드는 행위 등)&lt;/li&gt;
&lt;li&gt;1959 ~ 1964&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3세대 컴퓨터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반도체를 만나며 &lt;b&gt;집적회로&lt;/b&gt;가 되었다. (작아짐)&lt;/li&gt;
&lt;li&gt;1965 ~ 1974&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4세대 컴퓨터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LSI&lt;/li&gt;
&lt;li&gt;1975 ~ 1984&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;5세대 컴퓨터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VLSI (초고밀도 집적회로)&lt;/li&gt;
&lt;li&gt;1985 ~ 현재&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;컴퓨터의 분류
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디지털 컴퓨터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 데이터를 값으로 &lt;b&gt;수치화하여 사용&lt;/b&gt;하는 &lt;b&gt;계수형 자료를 취급&lt;/b&gt;하는 컴퓨터를 의미한다.&lt;/li&gt;
&lt;li&gt;일반적인 컴퓨터 &amp;rarr; &lt;b&gt;디지털 컴퓨터&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;아날로그 컴퓨터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;물리량을 입력&lt;/b&gt;으로 받아들여서 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하이브리드 컴퓨터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디지털 컴퓨터 + 아날로그 컴퓨터&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모든 자료에 대해서 처리가 가능&lt;/b&gt;하다.&lt;/li&gt;
&lt;li&gt;결과도 아날로그와 디지털로 표현할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용 목적에 따른 분류
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;범용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적인 모든 업무에 사용되는 컴퓨터&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;전용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특수 목적에만 사용되는 컴퓨터&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;처리 성능에 따른 분류
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터의 모든 자원을 고려하여 분류&lt;/li&gt;
&lt;li&gt;마이크로 컴퓨터 / 미니 컴퓨터 / 메인 프레임 컴퓨터 / 초대형 컴퓨터 등
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재는 기술이 발전하여 처리 성능의 구분이 모호해지고 있는 실정이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;컴퓨터 하드웨어 구성과 기능&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중앙처리장치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연산 장치 , 제어 장치 구성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연산 장치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램에 따라 계산을 처리하는 &lt;b&gt;산술 연산과 비교 / 판단을 처리&lt;/b&gt;하는 &lt;b&gt;논리 연산&lt;/b&gt;을 실행한다.&lt;/li&gt;
&lt;li&gt;말그대로 연산을 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;제어 장치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터의 각 장치에 작업을 처리하는 순서를 지시한다.&lt;/li&gt;
&lt;li&gt;주 기억장치 &amp;rarr; 실행명령 해석 &amp;rarr; 제어 신호 생성&lt;/li&gt;
&lt;li&gt;시스템 전체에서 정확하게 수행되도록 통제한다.&lt;/li&gt;
&lt;li&gt;말그대로 제어를 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하드웨어 구성과 기능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주기억장치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수행 중인 프로그램과 &lt;b&gt;필요한 데이터를 저장&lt;/b&gt;한다.&lt;/li&gt;
&lt;li&gt;용량에 제한이 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;롬
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;읽기만 가능한 비휘발성기억 소자&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;램
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;읽기와 쓰기가 모두 가능한 휘발성 기억 소자&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;보조기억장치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드디스크
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알루미늄 또는 플라스틱 판의 표면에 자기 물질을 얇게 입힌 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CD / DVD
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;레이저 광선을 투사하여 반사되는 빛을 읽어 자료를 해독한 후 처리하는 방식 사용&lt;/li&gt;
&lt;li&gt;컴퓨터의 정보 저장매체로 발전했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;USB
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터 &amp;harr; 주변기기 연결하는데 사용되는 입출력 장치&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;입출력 장치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력 장치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터가 처리하는 명령이나 데이터를 컴퓨터 내부로 읽어들이는 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;출력 장치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램 순서에 따라 실행을 마친 후 처리 결과를 사용자에게 보여주는 장치&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중앙처리장치는 산술연산과 논리연산을 수행하는 연산장치와 제어를 담당하는 제어장치로 구성되어있다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;부울 대수의 개념과 연산 **&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부울 대수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 명제가 참 (1) 또는 거짓 (0) 인가를 판단하는데 사용되는 수학적인 방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AND (*) OR (+) NOT (&amp;rsquo;)&lt;/li&gt;
&lt;li&gt;참과 거짓으로만 생각하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV3JUZ/btr9eBwwSYb/XkeSuzcEWlyrvBk44gd52k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV3JUZ/btr9eBwwSYb/XkeSuzcEWlyrvBk44gd52k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV3JUZ/btr9eBwwSYb/XkeSuzcEWlyrvBk44gd52k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV3JUZ%2Fbtr9eBwwSYb%2FXkeSuzcEWlyrvBk44gd52k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;744&quot; height=&quot;402&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;논리회로 개념과 연산
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;논리회로
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디지털 정보 입력을 디지털 신호 0,1로 출력한다.&lt;/li&gt;
&lt;li&gt;기본 게이트 AND, OR , NOT 게이트를 조합하여 구성한다.&lt;/li&gt;
&lt;li&gt;범용 게이트 NAND, NOR 게이트는 &lt;b&gt;트랜지스터로 제조&lt;/b&gt;한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;조합 논리회로
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;8개의 논리 게이트의 조합으로 이루어진 회로이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;0과 1의 조합&lt;/b&gt;에 의해 출력이 결정된다. (과거의 값을 갖고있지 않다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;순차 논리회로
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저장 능력이 있는 &lt;b&gt;플립플롭&lt;/b&gt;과 게이트를 서로 연결하여 구성된다. (과거의 값을 갖고있다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;플립플롭
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1비트를 저장한다. &lt;b&gt;( 두가지 상태로만 변하는 전자회로이다. )&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;레지스터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러개의 플립플롭의 묶음 (비트의 묶음) ,&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기본 논리회로와 논리 게이트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;738&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oI9Ak/btr8UW2MJPi/O3yw9LiRBOpAC5ZFsbFLD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oI9Ak/btr8UW2MJPi/O3yw9LiRBOpAC5ZFsbFLD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oI9Ak/btr8UW2MJPi/O3yw9LiRBOpAC5ZFsbFLD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoI9Ak%2Fbtr8UW2MJPi%2FO3yw9LiRBOpAC5ZFsbFLD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;738&quot; height=&quot;329&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적으로 2개의 입력이 기본으로 들어간다.&lt;/li&gt;
&lt;li&gt;AND &amp;rarr; 작은 수가 결정 논리곱&lt;/li&gt;
&lt;li&gt;OR &amp;rarr; 큰 수가 결정 논리 합&lt;/li&gt;
&lt;li&gt;NOT &amp;rarr; 반대 (출력이 2개가 나올 수 있음) 논리 부정&lt;/li&gt;
&lt;/ul&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;722&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FbZ0K/btr88qvmaC6/0vNkQXQkN9gWrMU0w1VHgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FbZ0K/btr88qvmaC6/0vNkQXQkN9gWrMU0w1VHgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FbZ0K/btr88qvmaC6/0vNkQXQkN9gWrMU0w1VHgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFbZ0K%2Fbtr88qvmaC6%2F0vNkQXQkN9gWrMU0w1VHgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;722&quot; height=&quot;391&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/362Fo/btr8LKPSFl6/U7PqbUWeWCOze8kgQUQnd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/362Fo/btr8LKPSFl6/U7PqbUWeWCOze8kgQUQnd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/362Fo/btr8LKPSFl6/U7PqbUWeWCOze8kgQUQnd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F362Fo%2Fbtr8LKPSFl6%2FU7PqbUWeWCOze8kgQUQnd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;742&quot; height=&quot;422&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFuj55/btr8Xz0Jwc5/581EUWBkEVPX6Rq0xkafU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFuj55/btr8Xz0Jwc5/581EUWBkEVPX6Rq0xkafU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFuj55/btr8Xz0Jwc5/581EUWBkEVPX6Rq0xkafU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFuj55%2Fbtr8Xz0Jwc5%2F581EUWBkEVPX6Rq0xkafU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;353&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFYYZJ/btr8T4mqmfs/WYbZGtr0BeAJatMWNd4JWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFYYZJ/btr8T4mqmfs/WYbZGtr0BeAJatMWNd4JWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFYYZJ/btr8T4mqmfs/WYbZGtr0BeAJatMWNd4JWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFYYZJ%2Fbtr8T4mqmfs%2FWYbZGtr0BeAJatMWNd4JWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;416&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;416&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;729&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/by6Nh4/btr892gT0np/qhCRDWvX6SK37lMuNj9hcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/by6Nh4/btr892gT0np/qhCRDWvX6SK37lMuNj9hcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/by6Nh4/btr892gT0np/qhCRDWvX6SK37lMuNj9hcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fby6Nh4%2Fbtr892gT0np%2FqhCRDWvX6SK37lMuNj9hcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;434&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;/figure&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;부울대수는 0과 1로 참 또는 거짓을 판단하는 이산수학의 한 분야이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AND &amp;rarr; * , OR &amp;rarr; + , NOT&amp;rarr; 반대&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XOR &amp;rarr; 같으면 0 다르면 1 , XNOR &amp;rarr; 같으면 1 다르면 0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAND , NOR &amp;rarr; AND ,OR 과 반대&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 게이트는 하나로 보이지만 더 많을 수 있다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개인용 컴퓨터와 CPU&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4비트 &amp;rarr; 8비트 &amp;rarr; 16비트 &amp;rarr; 32비트&lt;/li&gt;
&lt;li&gt;CPU의 분류
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CISC
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;명령 복합형 프로세서
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연산용 명령어를 수백 개 탑재하고 있는 마이크로 프로세서&lt;/li&gt;
&lt;li&gt;&lt;b&gt;명령어 개수 증가에 따라서 구조가 복잡하고 빠른 작동의 프로세서 제작이 어렵다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RISC
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소수의 주소 기법을 사용한다.&lt;/li&gt;
&lt;li&gt;길이가 일정하고 한개의 클록 사이클로 처리된다.&lt;/li&gt;
&lt;li&gt;명령 축약형 프로세서&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;플린 분류
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터 시스템을 구조적 특징에 따라 분류하는 방식 중에서 가장 널리 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;컴퓨터의 데이터 표현&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;10진수의 데이터를 입력받는다.&lt;/li&gt;
&lt;li&gt;입력 받은 10진수를 2진수로 변환하여 계산 / 분석한다.&lt;/li&gt;
&lt;li&gt;처리된 2진수의 결과를 10진수의 정보로 출력한다.&lt;/li&gt;
&lt;li&gt;논&lt;b&gt;리회로로 표현 할 수 있는 2진수로 표현된다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;10진수를 2진수(혹은 n진수) 로 변환하는 법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;10진수 &amp;rarr; 정수부분 / 소수부분 으로 나눈다.&lt;/li&gt;
&lt;li&gt;정수 부분을 2로 인수분해 한다. ( n진수일 경우엔 n으로 ) 인수분해&lt;/li&gt;
&lt;li&gt;나머지를 순서대로 읽는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;753&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vxOAn/btr9eBDiuox/9F9c4Xz9WldykBipKWWYI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vxOAn/btr9eBDiuox/9F9c4Xz9WldykBipKWWYI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vxOAn/btr9eBDiuox/9F9c4Xz9WldykBipKWWYI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvxOAn%2Fbtr9eBDiuox%2F9F9c4Xz9WldykBipKWWYI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;753&quot; height=&quot;451&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;451&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자료의 표현
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ASCII 코드
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;통신목적으로 제작되었다.&lt;/li&gt;
&lt;li&gt;7비트로 구성되어 128개의 문자를 표현한다.&lt;/li&gt;
&lt;li&gt;현재는 1비트를 추가해 8비트로 확장된 ASCII 코드도 많이쓰인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;EBCDIC 코드
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최대 256 가지의 정보를 나타낼 수 있다.&lt;/li&gt;
&lt;li&gt;IBM 에서 제작되었으며 모든 IBM 장비에 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2진화 10진 코드
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;6비트 BCD 코드라고 한다.&lt;/li&gt;
&lt;li&gt;숫자 / 영문자 / 특수문자 를 코드화 햇다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유니코드
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;텍스트나 스크립트 문자에 대해 바이너리 코드를 확립하기 위한 것&lt;/li&gt;
&lt;li&gt;2바이트 코드의 형식을 갖고있다. 조합형 코드&lt;/li&gt;
&lt;li&gt;아래한글이 나오면서 조합형 문자를 쓰게 되었다. (한글)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;논리자료와 포인터 자료의 표현 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;논리자료 &amp;rarr; 부울식 (참과 거짓)&lt;/li&gt;
&lt;li&gt;포인터자료 &amp;rarr; 주소를 직접 액세스 할것이냐, 간접적으로 액세스 할것이냐
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;일반적으로 링크라고 불린다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;정수의 표현 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비 부호 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;음수 표현이 불가능 하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;부호 절댓값 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;앞자리가 0이면 양, 1이면 음&lt;/li&gt;
&lt;li&gt;음수 표현이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1의 보수 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;절댓값에 대한 방식과 같으나 &lt;b&gt;음수 표시가 다르다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;1의 보수이기 때문에 &lt;b&gt;0이면 1로, 1이면 0으로 바꿔준다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;부호 절댓값과 동일하게 -0 같은 형식이 나온다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2의 보수 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0의 자리를 찾을 수 있다.&lt;/li&gt;
&lt;li&gt;다른 값에 비해서 한자릿수가 더 크다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;실수의 표현 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부동 소수점 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;임의의 수를 가수부분과 지수부분으로 나누어 컴퓨터의 기억공간에 저장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>학교공부</category>
      <author>코딩하는 브린스</author>
      <guid isPermaLink="true">https://codinghentai.tistory.com/93</guid>
      <comments>https://codinghentai.tistory.com/93#entry93comment</comments>
      <pubDate>Sun, 9 Apr 2023 22:25:36 +0900</pubDate>
    </item>
    <item>
      <title>리액트 1달차 토이프로젝트 리뷰 (게임 커뮤니티 사이트) - 작성중</title>
      <link>https://codinghentai.tistory.com/92</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ezgif.com-video-to-gif.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;1057&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWqtR8/btr8GjSLSZb/WffElf4MIqTjdlAvQxKxA0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWqtR8/btr8GjSLSZb/WffElf4MIqTjdlAvQxKxA0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWqtR8/btr8GjSLSZb/WffElf4MIqTjdlAvQxKxA0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cWqtR8/btr8GjSLSZb/WffElf4MIqTjdlAvQxKxA0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;1057&quot; data-filename=&quot;ezgif.com-video-to-gif.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;1057&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;초기 목표&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리액트를 학습하기 위해서 (경험해보기 위해서..)&lt;/li&gt;
&lt;li&gt;백엔드 개발자 지망생으로서 프론트엔드 개발자들에게 어떻게 데이터를 가공해서 넘겨주면 좋을지 이해해보기 위해서&lt;/li&gt;
&lt;li&gt;백엔드, 프론트엔드가 완벽히 분리되어 있을때의 신경 쓸 수 있는 부분을 현업 체험 전에 경험해보자!&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기존 서버사이드 개발 환경&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스프링부트 , 스프링 시큐리티, JPA , Mysql , Redis , 인텔리제이&lt;/li&gt;
&lt;li&gt;게시판
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;게시글 관련&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쓰기, 읽기, 수정, 삭제, 검색&lt;/li&gt;
&lt;li&gt;게시글 추천, 조회수, 베스트 게시글 (최근 3일의 게시글 중 좋아요 10개 이상 상위 5개)&lt;/li&gt;
&lt;li&gt;게시글에 캐릭터 링크 후 클릭 시 해당 캐릭터가 등록된 게시글 혹은 캐릭터 정보 상세보기 조회 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;댓글 관련
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쓰기, 읽기, 수정, 삭제&lt;/li&gt;
&lt;li&gt;대댓글 (계단식이 아닌 하나의 댓글에 한 층(?)의 댓글이 열리는 로직&lt;/li&gt;
&lt;li&gt;대댓글 쓰기 읽기 수정 삭제&lt;/li&gt;
&lt;li&gt;베스트 댓글 (해당 게시글의 좋아요 10개 이상 상위 5개)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;회원
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가입,로그인,탈퇴,정보 변경&lt;/li&gt;
&lt;li&gt;세션 로그인 방식 -&amp;gt; Jwt 토큰 인증 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원활한 소통을 위해서 세션 인증 방식에서 변경 하였으나, 실질적으론 변경할 이유가 없었다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JSESSIONID 쿠키가 클라이언트로 받아와지지 않았던 오류가 발생 했을때 변경했으나, 토큰을 쿠키에 저장하는 방식으로 구현하니 세션 인증 방식과 다를게 없었다.&lt;/li&gt;
&lt;li&gt;오히려 토큰 인증 방식으로 구현하니 잡다한 오류가 많이 발생해 기존의 스프링 시큐리티에서 제공해주는 안정적인 폼 로그인 방식이 더 나아보였다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;회원과 모험단 연동 (직접 연동이 아닌 단순 서버사이드에서 db에서 연관관계를 맺는 방식)&lt;/li&gt;
&lt;li&gt;회원과 캐릭터 즐겨찾기 등록&lt;/li&gt;
&lt;li&gt;프로필 이미지 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;캐릭터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐릭터 정보 검색&amp;nbsp;&lt;/li&gt;
&lt;li&gt;캐릭터 랭킹 조회 (모험단, 개인 캐릭)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;초기 화면 구현 목표&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유지보수가 쉽도록 재사용 가능한 컴포넌트 만들기&lt;/li&gt;
&lt;li&gt;상위 컴포넌트에서 하위 컴포넌트로 여러개의 props 를 넘겨줘서 의존하게 하는 행위 지양&lt;/li&gt;
&lt;li&gt;반응형 템플릿 제작&lt;/li&gt;
&lt;li&gt;딱딱한 사이트가 아닌 최소한의 애니메이션을 이용해 동적인 웹페이지 구성&lt;/li&gt;
&lt;li&gt;기존의 서버사이드 개발시에 중요하게 생각했던 계층형 구조를 생각하며 개발 및 정리&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;클라이언트 사이드 진행상황&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발 환경
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리액트 최신버전, 타입스크립트, REST API, Material UI, Styled Component&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참고 사이트 -&amp;gt; 던파모아 &lt;a href=&quot;https://dunfamoa.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dunfamoa.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;게시판&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;게시글 관련 ⭕️&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쓰기, 읽기, 수정, 삭제, 검색 ⭕️&lt;/li&gt;
&lt;li&gt;게시글 추천, 조회수, 베스트 게시글 (최근 3일의 게시글 중 좋아요 10개 이상 상위 5개) ⭕️&lt;/li&gt;
&lt;li&gt;게시글에 캐릭터 링크 후 클릭 시 해당 캐릭터가 등록된 게시글 혹은 캐릭터 정보 상세보기 조회 가능 ⭕️&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;댓글 관련 ⭕️
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쓰기, 읽기, 수정, 삭제 ⭕️&lt;/li&gt;
&lt;li&gt;대댓글 (계단식이 아닌 하나의 댓글에 한 층(?)의 댓글이 열리는 로직 ⭕️&lt;/li&gt;
&lt;li&gt;대댓글 쓰기 읽기 수정 삭제 ⭕️&lt;/li&gt;
&lt;li&gt;베스트 댓글 (해당 게시글의 좋아요 10개 이상 상위 5개) ⭕️&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;회원
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가입 ⭕️,로그인 ⭕️,탈퇴 ❌ ,정보 변경&amp;nbsp; ❌&lt;/li&gt;
&lt;li&gt;세션 로그인 방식 -&amp;gt; Jwt 토큰 인증 방식 ⭕️&lt;/li&gt;
&lt;li&gt;회원과 모험단 연동 (직접 연동이 아닌 단순 서버사이드에서 db에서 연관관계를 맺는 방식)&amp;nbsp; ❌&lt;/li&gt;
&lt;li&gt;회원과 캐릭터 즐겨찾기 등록 ❌&lt;/li&gt;
&lt;li&gt;프로필 이미지 변경 ⭕️&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;캐릭터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐릭터 정보 검색&amp;nbsp; ⭕️&lt;/li&gt;
&lt;li&gt;캐릭터 랭킹 조회 (모험단, 개인 캐릭) ⭕️&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;메인화면&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;재사용 가능한 테이블 구현&lt;/h3&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;874&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3jDEq/btr8IusvXeu/pTiwPxwvbKEsn6fDgIYCU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3jDEq/btr8IusvXeu/pTiwPxwvbKEsn6fDgIYCU0/img.png&quot; data-alt=&quot;모바일 환경에서도 이용 가능하도록 반응형으로 개발&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3jDEq/btr8IusvXeu/pTiwPxwvbKEsn6fDgIYCU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3jDEq%2Fbtr8IusvXeu%2FpTiwPxwvbKEsn6fDgIYCU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;874&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;874&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모바일 환경에서도 이용 가능하도록 반응형으로 개발&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1950&quot; data-origin-height=&quot;1322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FYvHw/btr8LsGVqTw/aQKJbeJIvmIHIl2LxKioY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FYvHw/btr8LsGVqTw/aQKJbeJIvmIHIl2LxKioY1/img.png&quot; data-alt=&quot;그리드를 이용하여 모바일 환경에서는 한줄, pc 및 태블릿 환경에서는 두줄로 랭킹을 표시하도록 구현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FYvHw/btr8LsGVqTw/aQKJbeJIvmIHIl2LxKioY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFYvHw%2Fbtr8LsGVqTw%2FaQKJbeJIvmIHIl2LxKioY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1950&quot; height=&quot;1322&quot; data-origin-width=&quot;1950&quot; data-origin-height=&quot;1322&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그리드를 이용하여 모바일 환경에서는 한줄, pc 및 태블릿 환경에서는 두줄로 랭킹을 표시하도록 구현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순히 각각의 파트별로 각각의 컴포넌트를 매번 새로 만들 필요 없이 , 단순 틀로 사용 할 수 있는 테이블 컴포넌트를 선언 후 , 테이블의 양옆에 컴포넌트를 렌더링하거나 행동을 지정할 수 있도록 구현했다.&lt;/li&gt;
&lt;li&gt;내용에는 각각 필요에 따라 다른 내용이 들어갈 수 있도록 구현했다. (테이블 컴포넌트 &amp;gt; 내용 컴포넌트 로 이어지는 트리)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 부분은 생각보다 어려운 부분은 없었고, 개발 초기에 구현했던 부분이라 어디까지 나눠서 어떠한걸 props 로 전달해줘야할지 고민이 많았던 부분이었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd9u6r/btr8JZFjIQl/XoZKlqDUaEDM9zkcyfzMh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd9u6r/btr8JZFjIQl/XoZKlqDUaEDM9zkcyfzMh1/img.png&quot; data-alt=&quot;이런식으로 상위 컴포넌트에 전적으로 의지하도록 구현하였다. (단순히 이것 하나로 렌더링 할 무언가가 있을것 같지 않다는 생각이 들었다.)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd9u6r/btr8JZFjIQl/XoZKlqDUaEDM9zkcyfzMh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd9u6r%2Fbtr8JZFjIQl%2FXoZKlqDUaEDM9zkcyfzMh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;428&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이런식으로 상위 컴포넌트에 전적으로 의지하도록 구현하였다. (단순히 이것 하나로 렌더링 할 무언가가 있을것 같지 않다는 생각이 들었다.)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;재사용 가능한 검색창 구현&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lbQoT/btr8FizIifg/zXUfjrXOZIyzZ4I3xnqHgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lbQoT/btr8FizIifg/zXUfjrXOZIyzZ4I3xnqHgk/img.png&quot; data-alt=&quot;깔끔한 느낌의 검색창을 구현하였다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lbQoT/btr8FizIifg/zXUfjrXOZIyzZ4I3xnqHgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlbQoT%2Fbtr8FizIifg%2FzXUfjrXOZIyzZ4I3xnqHgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;826&quot; height=&quot;170&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;깔끔한 느낌의 검색창을 구현하였다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beLoh8/btr8LqWGR0Q/0KxHzMlBKrmzisnPSn8Cok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beLoh8/btr8LqWGR0Q/0KxHzMlBKrmzisnPSn8Cok/img.png&quot; data-alt=&quot;최근 검색 기록과 빠른 검색을 지원해준다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beLoh8/btr8LqWGR0Q/0KxHzMlBKrmzisnPSn8Cok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeLoh8%2Fbtr8LqWGR0Q%2F0KxHzMlBKrmzisnPSn8Cok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;708&quot; height=&quot;566&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최근 검색 기록과 빠른 검색을 지원해준다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;846&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lnlAE/btr8I1p5R3i/tKuTjYFFpw4Qd8tKCbRlSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lnlAE/btr8I1p5R3i/tKuTjYFFpw4Qd8tKCbRlSK/img.png&quot; data-alt=&quot;영상을 업로드 하지 못해서 아쉽지만 mui 의 트랜지션 api 를 사용해 애니메이션을 추가하여서 딱딱한 느낌을 없애주었다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lnlAE/btr8I1p5R3i/tKuTjYFFpw4Qd8tKCbRlSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlnlAE%2Fbtr8I1p5R3i%2FtKuTjYFFpw4Qd8tKCbRlSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;846&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;846&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;영상을 업로드 하지 못해서 아쉽지만 mui 의 트랜지션 api 를 사용해 애니메이션을 추가하여서 딱딱한 느낌을 없애주었다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음엔 단순 노동으로 셀렉트 박스와 서치박스를 합쳐서 해당 컴포넌트를 구현했었다가, mui 의 input base 와 paper 라는 api 를 이용해서&amp;nbsp; 사각형 카드 박스에 버튼으로 셀렉트박스와 input base 로 검색 input 창을 구현 후 합쳤다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이때 css 에 대해서 한번 더 배우게 되었다.&lt;/li&gt;
&lt;li&gt;해당 셀렉트 박스를 api를 이용하지 않고 구현하려면 밑의 화면을 덮어쓰는 쪽으로 구현해야 하는데, position 속성을 처음으로 알게되어 이용하게 되었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;해당 검색창 구현은 코드도 그렇지만 ui 적으로 더더욱 유저 친화적인 부분으로 개발하려고 노력하였다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떻게 보면 검색창 / 선택 박스 / (최근 검색 기록 , 빠른검색&amp;nbsp; ( 최근검색기록 출력화면 , 빠른검색 출력화면 )) 이런식으로 분리되 어 있어서 각각의 이벤트 발생 시에 핸들링을 어떻게 해야할지 고민을 많이 했다.&lt;/li&gt;
&lt;li&gt;하나의 컴포넌트를 통으로 렌더링 하는게 아닌 하나의 div 에 여러개의 div 가 들어가있는 형식이라 이때 검색 창의 외부를 클릭시에 옵션창이 사라진다던지, 옵션창이 나와있는데 셀렉트박스를 누르면 사라졌다가 셀렉트 박스가 닫혀지면 다시 나타난다던지 하는 로직을 구현하는데 머리를 많이 썼다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQRm7Q/btr8H2QD3dc/ZKCKrazMygeXxJqIRrBK5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQRm7Q/btr8H2QD3dc/ZKCKrazMygeXxJqIRrBK5K/img.png&quot; data-alt=&quot;useRef 를 이용하여 클릭 이벤트를 핸들링하였다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQRm7Q/btr8H2QD3dc/ZKCKrazMygeXxJqIRrBK5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQRm7Q%2Fbtr8H2QD3dc%2FZKCKrazMygeXxJqIRrBK5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;831&quot; height=&quot;744&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;744&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;useRef 를 이용하여 클릭 이벤트를 핸들링하였다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 기능을 구현하면서 useRef 훅과 dom 오브젝트 를 다루는법을 조금이나마 이해했다.&lt;/li&gt;
&lt;li&gt;결국 chatGPT 의 도움을 받긴 했지만, 그래도 해당 부분에 대해서 좀 더 논리적으로 고민했던 흔적이 남아있어서 해당 컴포넌트를 구현했을 때 좀 뿌듯했다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>회고록</category>
      <author>코딩하는 브린스</author>
      <guid isPermaLink="true">https://codinghentai.tistory.com/92</guid>
      <comments>https://codinghentai.tistory.com/92#entry92comment</comments>
      <pubDate>Fri, 7 Apr 2023 17:58:47 +0900</pubDate>
    </item>
    <item>
      <title>네트워크 일반 03-22 (정리) OSI 7계층과 프로토콜</title>
      <link>https://codinghentai.tistory.com/91</link>
      <description>&lt;h1&gt;계층 구조&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OSI 참조모델은 &lt;b&gt;7개의 계층&lt;/b&gt;으로 나누어 정의된다.&lt;/li&gt;
&lt;li&gt;Divide and Conquer 개념을 통해 각 계층간의 &lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;독립성&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt; 을 유지한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;의존성을 낮춘다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;IP주소 &amp;rarr; 사용자가 변경 할 수 있다. / MAC 주소 &amp;rarr; &lt;b&gt;제작 시에 정해져서 나온다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;맥주소 &amp;rarr; 48비트(앞 24비트 : 브랜드 / 뒤 24비트 : 기기별 고유번호) , 아이피주소 &amp;rarr; (버전4) 32비트 , 포트 &amp;rarr; (프로세스로 구분) 16비트&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf4SYu/btr8IIYfAjM/6kRxoiU77vK8keGNIDqWC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf4SYu/btr8IIYfAjM/6kRxoiU77vK8keGNIDqWC1/img.png&quot; data-alt=&quot;OSI 7계층과 TCP / IP 계층을 각각 노드라고 할 수 있다. OSI 7 계층의 네트워크 계층 &amp;amp;harr; TCP/IP 계층 네트워크 : 프로토콜&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf4SYu/btr8IIYfAjM/6kRxoiU77vK8keGNIDqWC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf4SYu%2Fbtr8IIYfAjM%2F6kRxoiU77vK8keGNIDqWC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;760&quot; height=&quot;454&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OSI 7계층과 TCP / IP 계층을 각각 노드라고 할 수 있다. OSI 7 계층의 네트워크 계층 &amp;harr; TCP/IP 계층 네트워크 : 프로토콜&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;헤더 &amp;rarr; 데이터의 정보를 나타내는 부분&lt;/li&gt;
&lt;li&gt;레이어 2 &amp;rArr; 프레임 / 레이어 3 &amp;rArr; 데이타그램 (패킷) / 레이어 4 &amp;rArr; 세그먼트 (나누다) , 그 사이에 있는걸 데이터라고 한다.&lt;/li&gt;
&lt;li&gt;총 데이터를 3번 포장한다 . (세그먼트 &amp;rarr; 패킷 &amp;rarr; 프레임 ) (캡슐화)&lt;/li&gt;
&lt;/ul&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;OSI 참조모델은 각 계층의 독립성을 위해 7개의 계층으로 나뉘어져 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레이어 2 &amp;rarr; 맥주소 / 프레임 : 정해져서 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레이어 3 &amp;rarr; IP / 패킷 : 사용자가 변경 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레이어 4 &amp;rarr; 포트 / 세그먼트&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동등 계층간의 통신&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;피어 투 피어&lt;/b&gt; &amp;rarr; 상대편 동일 계층의 모듈과 통신하는 프로세스&lt;/li&gt;
&lt;li&gt;각 계층에서 통신을 해야할 일들이 &lt;b&gt;헤더&lt;/b&gt;에 들어가 있다. 해당 형식으로 계층에서 필요한 정보를 전달한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lnj9r/btr8Io64n5p/bnxefmwQaYssoWykDqi4K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lnj9r/btr8Io64n5p/bnxefmwQaYssoWykDqi4K0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lnj9r/btr8Io64n5p/bnxefmwQaYssoWykDqi4K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flnj9r%2Fbtr8Io64n5p%2FbnxefmwQaYssoWykDqi4K0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;757&quot; height=&quot;392&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IDU &amp;rArr; 인터페이스 (서로 마주본다는 뜻 : &lt;b&gt;계층과 계층 사이에 존재&lt;/b&gt;한다.) &lt;b&gt;Interface&lt;/b&gt; Data Unit : 상위계층 &amp;rarr; 하위계층 : 서비스를 요청한다. / 하위계층 &amp;rarr; 상위계층 : 응답을 전달한다.&lt;/li&gt;
&lt;li&gt;3계층 &amp;rarr; 데이터가 상위 계층에서 내려온다. (일의 역할은 헤더에 존재) PCI 와 SDU, ICI 를 합치는 작업을 캡슐화라 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SDU : Service Data Unit , PCI : Protocol Control Information&lt;/li&gt;
&lt;li&gt;PDU : Protocol Data Unit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;계층간의 통신에는 IDU (인터페이스 데이타 유닛) 이 전달되고 이는 헤더,트레일러, 데이터, 등의 정보를 전부 포함하는 단위이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 계층에서는 데이터 (SDU)와 제어정보(PCI) 를 캡슐화 하여 상위 계층으로 다시 IDU를 전달한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;물리계층&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;물리적 링크를 설정, 유지, 해제 하기위한 특성을 규정한다.&lt;/li&gt;
&lt;li&gt;데이터를 받아서 전송매체로 전송할 수 있도록 변환한다.&lt;/li&gt;
&lt;li&gt;비트의 흐름을 &lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;전자기 또는 광신호로 변환과 인코딩&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;데이터 전송방식에서는 단방향, 반이중 (한번에 한쪽 방향으로만 교대로 이뤄진다.) , 전이중 (동시에 양방향으로 이뤄진다.) 방식을 결정한다.&lt;/li&gt;
&lt;li&gt;접속 형태 ** : 연결방식에 따라서 형태를 정한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;노드 링크 계산식은 n(n-1) / 2 가 된다. : 풀 메쉬&lt;/li&gt;
&lt;li&gt;트리형&lt;/li&gt;
&lt;li&gt;버스형&lt;/li&gt;
&lt;li&gt;스타형&lt;/li&gt;
&lt;li&gt;링형&lt;/li&gt;
&lt;li&gt;메쉬형&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;전송 매체 : UTP / 광케이블 / 무선 3개만 기억하면 된다&lt;/li&gt;
&lt;/ul&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;상위 계층에서 내려온 데이터는 비트열로 받아온 후 물리 계층에서 전송 방식을 결정 후 신호로 (무선,UTP,광케이블) 로 라우터로 전달 그리고 상대 송신측으로 다시 라우터로부터 받아서 작업 반복&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터링크 계층&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;노드간의 데이터 전송을 hop-by-hop 으로 수행한다. (노드와 노드가 서로 옆에 존재하는 것을 hop-by-hop 이라 한다.)&lt;/li&gt;
&lt;li&gt;헤더를 앞부분에 , 트레일러를 뒷부분에 덧붙인다.&lt;/li&gt;
&lt;li&gt;헤더 &amp;rarr; 데이터 시작, 주소 등을 포함한다.&lt;/li&gt;
&lt;li&gt;트레일러 &amp;rarr; 에러 검출 코드&lt;/li&gt;
&lt;li&gt;헤더, 데이터, 트레일러를 통틀어 &lt;b&gt;프레임&lt;/b&gt;이라고 한다. (PDU)&lt;/li&gt;
&lt;li&gt;비트들의 경계를 구분하기 위한 데이터 동기를 제공한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCh6OZ/btr8IJ3THjj/sY3nLkzhQUKOvfad7iocZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCh6OZ/btr8IJ3THjj/sY3nLkzhQUKOvfad7iocZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCh6OZ/btr8IJ3THjj/sY3nLkzhQUKOvfad7iocZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCh6OZ%2Fbtr8IJ3THjj%2FsY3nLkzhQUKOvfad7iocZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;753&quot; height=&quot;463&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주소지정 &amp;rarr; 계층에서 사용하는 주소 : 하드웨어 주소, &lt;b&gt;헤더에 송신지와 수신지의 물리 주소가 포함되어 전송된다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;접근 방식 &amp;rarr; 어느 시스템이 어떤 데이터를 전송할 것인지 결정한다.&lt;/li&gt;
&lt;li&gt;흐름 제어 &amp;rarr; &lt;b&gt;오버 플로우가 발생하지 않도록&lt;/b&gt; 상태를 전달하는 것을 흐름 제어라고 한다.&lt;/li&gt;
&lt;li&gt;에러 제어 &amp;rarr; &lt;b&gt;트레일러&lt;/b&gt;에서 에러를 체크하는 것&lt;/li&gt;
&lt;li&gt;동기화 &amp;rarr; 각각의 전송된 &lt;b&gt;프레임의 타이밍을 맞추는 것&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터링크 동작&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회선을 통해서 전송된 데이터는 수신지의 데이터링크 계층에서 &lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;헤더와 트레일러를 떼어낸 후&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt; , 네트워크 계층으로 올려보낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkV3ma/btr8KIDbVLq/QjzDHviABkGjpi6TqkzK40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkV3ma/btr8KIDbVLq/QjzDHviABkGjpi6TqkzK40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkV3ma/btr8KIDbVLq/QjzDHviABkGjpi6TqkzK40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkV3ma%2Fbtr8KIDbVLq%2FQjzDHviABkGjpi6TqkzK40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;755&quot; height=&quot;253&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;253&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div 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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수신측에서는 헤더와 트레이러를 떼어낸 후 네트워크 계층으로 올려보낸다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;네트워크 계층 특성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크 연결을 관리하고 유지하며 해제하는 기능을 담당한다.&lt;/li&gt;
&lt;li&gt;스위칭과 라우팅이라는 두가지 경로배정에 관한 서비스를 제공한다.&lt;/li&gt;
&lt;li&gt;Host-to-Host 전송을 담당한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전송지와 수신지 : Host to Host : &lt;b&gt;IP 주소 : 라우터&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;양옆의 노드간의 데이터 전송 : hop by hop : &lt;b&gt;맥주소 : 스위치&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;라우팅 : IP주소를 보고 주소를 찾아준다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패킷을 보내기 위한 가장 좋은 경로&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스위칭 : 라우터보다 속도가 일반적으로 빠르다. 전화 네트워크가 스위칭의 대표적인 예이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;589&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GjI7e/btr8BdSzcMF/9X3bG6kHcR0c1yBf8yofbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GjI7e/btr8BdSzcMF/9X3bG6kHcR0c1yBf8yofbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GjI7e/btr8BdSzcMF/9X3bG6kHcR0c1yBf8yofbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGjI7e%2Fbtr8BdSzcMF%2F9X3bG6kHcR0c1yBf8yofbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;758&quot; height=&quot;589&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;589&quot;/&gt;&lt;/span&gt;&lt;/figure&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;네트워크 계층은 라우터를 이용하여 통신하고 IP주소를 보고 주소를 찾아준다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;전송계층&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하위계층으로 이루어진 네트워크 서비스와 상위 계층으로 이루어진 사용자 서비스로 구별된다.&lt;/li&gt;
&lt;li&gt;송수신 프로세스 간의 인터페이스 기능과 데이터에 대한 프로세스 단위 &lt;b&gt;Process to Process&lt;/b&gt; 전송을 담당한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포트 번호로 구분한다.&lt;/li&gt;
&lt;li&gt;해당&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;hop by hop &amp;rarr; 맥주소 &amp;rarr; 프레임&lt;/li&gt;
&lt;li&gt;host to host &amp;rarr; 아이피 &amp;rarr; 패킷&lt;/li&gt;
&lt;li&gt;Process to Process &amp;rarr; 포트 &amp;rarr; 세그먼트&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biXgZk/btr8LhL5D1e/gjIhV1YmKwkusbkOWlO76K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biXgZk/btr8LhL5D1e/gjIhV1YmKwkusbkOWlO76K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biXgZk/btr8LhL5D1e/gjIhV1YmKwkusbkOWlO76K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiXgZk%2Fbtr8LhL5D1e%2FgjIhV1YmKwkusbkOWlO76K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;748&quot; height=&quot;658&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;세션 계층&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;둘이 연결되있는 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;표현 계층&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자의 데이터를 송수신지가 공통으로 이해할 수 있는 &lt;b&gt;데이터 표현 방식을 바꾸는 기능을 담당한다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;아스키코드 &amp;rarr; 7비트 &amp;rArr; 128개의 문자를 표현할 수 있다. (한국어 표기 못함)&lt;/li&gt;
&lt;li&gt;유니 코드 &amp;rarr; 16비트&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;응용 계층&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응용 프로세스들이 &lt;b&gt;상호 간에 유용한 정보교환을 할 수 있도록 하는 창구 역할을 담당&lt;/b&gt;한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예 : 웹 브라우저&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;rarr; Process to Process 방식으로 포트 번호로 구별한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션계층 &amp;rarr; 세션이라 불리는 가상연결을 확립하고 유지하며 동기화 기능을 제공.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표현계층 &amp;rarr; 송수신지가 공통으로 이해할 수 있는 데이터 표현 방식으로 바꾸는 기능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응용계층 &amp;rarr; 응용 프로세스들이 상호간에 유용한 정보 교환을 할 수 있도록 하는 창구 역할을 담당한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로토콜&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;통신규약
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 노드간의 약속을 프로토콜이라 한다.&lt;/li&gt;
&lt;li&gt;상호간에 통신이나 전달방식, 통신방식, 자료형식 및 효과적인 통신을 위한 오류 검출 방식 및 전송속도 등에 대하여 정하고 이를 지켜나가는 것&lt;/li&gt;
&lt;li&gt;프로토콜로 무엇을 어떻게 그리고 언제 통신할 것인가를 규정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로토콜의 구성 요소
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구문 Syntax
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;약속&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;의미 Semantics
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;syntax 가 있으면 의미가 존재한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;타이밍&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zrDoF/btr8Be4496L/BJxF6zr37637WAKkTIkKKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zrDoF/btr8Be4496L/BJxF6zr37637WAKkTIkKKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zrDoF/btr8Be4496L/BJxF6zr37637WAKkTIkKKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzrDoF%2Fbtr8Be4496L%2FBJxF6zr37637WAKkTIkKKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;748&quot; height=&quot;461&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Syntax, Semantics, Timing 으로 구성되어있다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인터네트워킹&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 제조사들이 개발한 네트워크 장비들을 변경하지 않으면서 여러 제조사들의 네트워크를 &lt;b&gt;공동으로 사용하고자&lt;/b&gt; 하는 요구&lt;/li&gt;
&lt;li&gt;인터네트워크 상에서 &lt;b&gt;서로 다른 제조사들의 시스템간 데이터 통신을 위한 공통의 프로토콜이 필요하다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;개념
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서로 떨어져 있는 &lt;b&gt;각각의 네트워크를 연결하여 하나의 네트워크 처럼 사용할 수 있는 기술&lt;/b&gt;로 서로 다른 네트워크들을 상호 접속시킴으로써 네트워크의 집합을 형성하거나 광역화 하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구 사항
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크 사이의 하나의 링크를 제공해야 하며, &lt;b&gt;최소한의 물리 계층과 데이터링크 계층 제어가 필요하다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;네트워크 구조 자체의 변경 없이&lt;/b&gt; 네트워크 연결을 제공해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSfSQs/btr8JZZtpp2/tJnIQg91BCs5w5uzTMktwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSfSQs/btr8JZZtpp2/tJnIQg91BCs5w5uzTMktwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSfSQs/btr8JZZtpp2/tJnIQg91BCs5w5uzTMktwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSfSQs%2Fbtr8JZZtpp2%2FtJnIQg91BCs5w5uzTMktwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;760&quot; height=&quot;502&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&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,2계층 제어가 필요하다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인터네트워크 장비&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리피터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;물리계층&lt;/b&gt;에서 동작&lt;/li&gt;
&lt;li&gt;동일 &lt;b&gt;LAN&lt;/b&gt; 에서 &lt;b&gt;거리의 연장&lt;/b&gt;이나 &lt;b&gt;접속 시스템의 수를 증가&lt;/b&gt;시키기 위한 장비이다.&lt;/li&gt;
&lt;li&gt;전송 신호를 원래 신호로 &lt;b&gt;재생&lt;/b&gt;하여 다시 전송하는 역할을 한다.&lt;/li&gt;
&lt;li&gt;주소가 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;허브
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 컴퓨터들을 연결하기 위해서 &lt;b&gt;중앙 연결지점&lt;/b&gt;을 제공하는 네트워크 장비이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리피터의 모음&lt;/b&gt;이라고 할 수 있다. (멀티 리피터)&lt;/li&gt;
&lt;li&gt;물리계층 (리피터, 허브)&lt;/li&gt;
&lt;li&gt;더미 허브
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;중계 역할 만을 담당&lt;/b&gt;하는 장비&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스위칭 허브
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;point to point 로 접속, &lt;b&gt;전이중 방식&lt;/b&gt; 통신&lt;/li&gt;
&lt;li&gt;&lt;b&gt;충돌이 발생하지 않는다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스태커블 허브
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;허브와 허브 사이를 연결하는 장비&lt;/li&gt;
&lt;li&gt;&lt;b&gt;전송 속도의 저하가 발생되지 않는다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;브리지
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러개의 LAN을 연결하기 위한 장비&lt;/li&gt;
&lt;li&gt;데이터링크 계층에서 동작한다.&lt;/li&gt;
&lt;li&gt;충돌 도메인을 줄임과 동시에 전체 네트워크 확장이 가능하다.&lt;/li&gt;
&lt;li&gt;네트워크를 분산적으로 구성함으로써 보안성을 높일 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7pVMV/btr8Lhk2MLy/FJaRXEEcRZGpTpmw67l2yK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7pVMV/btr8Lhk2MLy/FJaRXEEcRZGpTpmw67l2yK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7pVMV/btr8Lhk2MLy/FJaRXEEcRZGpTpmw67l2yK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7pVMV%2Fbtr8Lhk2MLy%2FFJaRXEEcRZGpTpmw67l2yK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;763&quot; height=&quot;268&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스위치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;맥주소&lt;/b&gt;를 이용하여 동작한다&lt;/li&gt;
&lt;li&gt;네트워크 상에 프레임을 &lt;b&gt;고속으로 전송하기 위해 개발&lt;/b&gt;되었다.&lt;/li&gt;
&lt;li&gt;맥주소를 가지고 포워드 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Cut Through 스위치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;에러 검사 없이 목적지 포트로 전달 프레임의 대기시간과 전달 시간을 최소화한다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Interim Cut Through 스위치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에러가 발생한 프레임은 여전히 처리하지 못하는 단점이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Store and Forward 스위치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;전체 프레임의 버퍼링 과정에서 대기시간이 길다는 단점&lt;/b&gt;이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;라우터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IP주소로 경로를 찾는 기능을 수행한다.&lt;/li&gt;
&lt;li&gt;네트워크 계층 주소인 &lt;b&gt;논리 주소&lt;/b&gt;를 기반으로 네트워크 간의 패킷 전달 기능을 수행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;게이트웨이
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 장비들과 다르게 모든 계층에 대해서 동작한다.&lt;/li&gt;
&lt;li&gt;서로 다른 프로토콜을 사용하는 네트워크의 프로토콜을 변환한다. (데이터 형식 변화)&lt;/li&gt;
&lt;li&gt;네트워크 병목현상을 일으키는 원인이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리피터 &amp;rarr; 주소가 없고 전송 신호를 재생하여 다시 재생하는 역할을 하고, 물리적 거리 확장에는 한계가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허브 &amp;rarr; 리피터의 모음이라 할 수 있다. (4개까지 연결 가능, 다른말로 멀티 리피터) 여러 컴퓨터를 연결하기 위한 중앙 연결 지점을 제공하는 네트워크 장비이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브릿지 &amp;rarr; 데이터링크 계층에서 동작하는 여러개의 LAN을 연결하는 장비이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위치 &amp;rarr; 맥주소를 이용하여 동작한다. 프레임을 고속으로 전송하기 위해 개발되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터 &amp;rarr; IP주소로 경로를 찾는 동작을 수행한다. 패킷전달 기능을 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게이트웨이 &amp;rarr; 프로토콜 변환 모든 계층에 동작하는 장비&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>학교공부</category>
      <author>코딩하는 브린스</author>
      <guid isPermaLink="true">https://codinghentai.tistory.com/91</guid>
      <comments>https://codinghentai.tistory.com/91#entry91comment</comments>
      <pubDate>Fri, 7 Apr 2023 17:26:24 +0900</pubDate>
    </item>
  </channel>
</rss>