<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Win-Brother's Dev</title>
    <link>https://win-bro.tistory.com/</link>
    <description>개발 공부에 대한 글들

email : newhendrick@gmail.com</description>
    <language>ko</language>
    <pubDate>Wed, 10 Jun 2026 00:02:23 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>WinBro</managingEditor>
    <item>
      <title>[JavaScript] 호이스팅이란?</title>
      <link>https://win-bro.tistory.com/150</link>
      <description>&lt;h4 style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;호이스팅이란?&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a5568; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;&lt;b&gt;호이스팅&lt;/b&gt;&lt;/span&gt;은 코드를 실행하기 전&lt;span&gt;&amp;nbsp;&lt;/span&gt;변수선언/함수선언을 해당 스코프의 최상단으로 끌어올리는 것이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff6600;&quot;&gt;&lt;b&gt;아니다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;&lt;b&gt;호이스팅&lt;/b&gt;&lt;/span&gt;은 코드가 실행하기 전&lt;span&gt;&amp;nbsp;&lt;/span&gt;변수선언/함수선언이 해당 스코프의 최상단으로 끌어 올려진 것 같은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ff6600;&quot;&gt;현상을 말한다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;자바스크립트 엔진&lt;/span&gt;&lt;/b&gt;은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ff6600;&quot;&gt;코드를 실행하기 전&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;실행 가능한 코드를 형상화하고 구분하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ff6600;&quot;&gt;과정(*실행 컨텍스트를 위한 과정)을 거친다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;&lt;b&gt;자바스크립트 엔진&lt;/b&gt;&lt;/span&gt;은 코드를 실행하기 전 실행 컨텍스트를 위한과정에서 모든 선언(var, let, const, function, class)을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff6600;&quot;&gt;&lt;b&gt;스코프에 등록&lt;/b&gt;&lt;/span&gt;한다.&lt;/li&gt;
&lt;li&gt;코드 실행 전 이미&lt;span&gt;&amp;nbsp;&lt;/span&gt;변수선언/함수선언이 저장되어 있기 때문에 선언문보다 참조/호출이 먼저 나와도 오류 없이 동작한다.&lt;br /&gt;(정확히는 var 키워드로 선언한 변수와 함수 선언문일 경우 오류 없이 동작한다. 이는 선언이 파일의 맨 위로 끌어올려진 것 처럼 보이게 한다.)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;*실행 컨텍스트&lt;/span&gt;&lt;/b&gt;는 실행 가능한&lt;b&gt;&lt;span style=&quot;color: #ff6600;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;코드가 실행되기 위해 필요한 환경을 의미&lt;/span&gt;&lt;/b&gt;하고 실행되기전 이러한 실행 컨텍스트 과정(코드를 구분하는 과정)을 거친다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 호이스팅이라는 용어를 자바스크립트 실행 컨텍스트에 의한 위에 설명한 현상을 호이스팅이라고 부른다는 것으로 이해하면 되겠다. 그 현상이란 선언이 코드 실행 보다 먼저 메모리에 저장되는 과정으로 인한 현상을 말한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 자바스크립트 실행 컨텍스트에 대한 이해하는 것이 호이스팅을 이해하는데 도움이 된다. (scope, hoisting, this, function, closure 등의 동작원리를 담고 있는 자바스크립트 핵심원리이다. 코드를 보고 실행 컨텍스트를 이해할 수 있어야 코드 독해, 디버깅을 할수 있다.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;변수 호이스팅 (var, let, const 키워드)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a5568; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;자바스크립트의 모든 선언&lt;/span&gt;&lt;/b&gt;에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;호이스팅이 일어난다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;그런데&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;let, const, class를 이용한 선언문&lt;/span&gt;&lt;/b&gt;을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;호이스팅이 발생하지 않는 것처럼 동작한다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;var 키워드로 선언된 변수와는 달리 let 키워드로 선언된 변수를 선언문 이전에 참조하면 참조 에러(ReferenceError)가 발생한다.&lt;/li&gt;
&lt;li&gt;이는&lt;b&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;let 키워드로 선언된 변수&lt;/span&gt;&lt;/b&gt;는 스코프의 시작에서 변수의 선언까지&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ff6600;&quot;&gt;*일시적 사각지대(Temporal Dead Zone; TDZ)에 빠지기 때문&lt;/span&gt;&lt;/b&gt;이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 지점은 이 호이스팅이라는 용어가 &amp;lsquo;선언이 먼저 메모리에 저장되었다.&amp;rsquo;는 것을 의미하기 때문에 즉, &amp;lsquo;선언이 끌어올려진다&amp;rsquo;는 의미이기 때문에 모든 선언은 호이스팅이 일어난다는 말은 참이된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 호이스팅이 파일의 맨 위로 끌어올려진 것 같은 현상을 의미할 때 선언문 이전에 참조해서 에러를 발생시킨다고 호이스팅이 일어나지 않은 것은 아니라는 의미이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a5568; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왜냐하면 정말 선언은 끌어올려진 것이 맞다. (표현하면 그렇고 정확히는 선언이 코드 실행 전에 메모리에 저장되었다는 의미이다.)&lt;/li&gt;
&lt;li&gt;그런데 왜 오류가 나는가 하면 var 키워드는 선언과 함께 undefined로 초기화되어 메모리에 저장되는데 let과 const는 초기화되지 않은 상태로 선언만 메모리에 저장되기 때문이다.&lt;/li&gt;
&lt;li&gt;초기화 되지 않으면 변수를 참조할 수 없다. 그래서 참조 에러를 일으키는 것이다.&lt;/li&gt;
&lt;li&gt;let과 const에도 호이스팅이 일어나기 때문에 에러를 일으키는 것이다.&lt;/li&gt;
&lt;li&gt;호이스팅이 일어나지 않는다면 아래 코드에서 에러가 발생하지 않을 것이다.&lt;/li&gt;
&lt;li&gt;선언이 호이스팅되었기 대문에 블록 스코프에서 foo를 찾을 수 없는 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #f4f2f0; color: #333333; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;list-style-type: none; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #0077aa;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; foo = &lt;/span&gt;&lt;span style=&quot;color: #d53aa9;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; background-color: #f4f2f0; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #999999;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d53aa9;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #404247;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;foo&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; background-color: #f4f2f0; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0077aa;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; foo = &lt;/span&gt;&lt;span style=&quot;color: #d53aa9;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #999999;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호이스팅이 &amp;lsquo;현상&amp;rsquo;을 의미하는 것이라면 변수 키워드 중 var 만이 에러 없이 변수 선언이 상단으로 끌어올려지는 것 같은 &amp;lsquo;현상&amp;rsquo;이 일어나기 때문에 var 만이 호이스팅이 일어난다고 생각했다.&lt;br /&gt;하지만 위 예시에서 알 수 있었고 자바스크립트 엔진이 동작하는 방식을 알고보니 let 키워드에서도 상단으로 끌어올려진 것 같은 &amp;lsquo;현상(즉, 호이스팅)&amp;rsquo;이 발생했기 때문에 에러가 발생하는 것이라는 것을 알게되었다.&lt;br /&gt;(에러가 난다고 호이스팅이 되지 않은 것이 아닌, 호이스팅이 발생했기 때문에 에러가 발생한 것이다.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;변수는 어떻게 생성되며, 호이스팅은 어떻게 이뤄질까?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a5568; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수는 3단계에 걸쳐 생성된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1단계: 선언 단계(Declaration phase)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a5568; 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;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2단계: 초기화 단계(Initialization phase)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a5568; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수 객체에 등록된 변수를 위한 공간을 메모리에 확보한다.&lt;/li&gt;
&lt;li&gt;이 단계에서 변수는 undefined로 초기화 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3단계: 할당 단계(Assignment phase)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #4a5568; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;undefined로 초기화된 변수에 실제 값을 할당한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a5568; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;var 키워드로 선언한 변수는 선언 단계와 초기화 단계가 한번에 이뤄진다. 즉, 스코프에 변수를 등록(선언 단계)하고 메모리에 변수를 위한 공간을 확보한 후, undefined로 초기화한다. 따라서 변수 선언문 이전에 변수에 접근하여도 스코프에 변수가 존재하기 때문에 에러가 발생하지 않는다. 다만 undefined를 반환한다. 이후 변수 할당문에 도달하면 비로소 값이 할당된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a5568; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;let 키워드로 선언된 변수는 선언 단계와 초기화 단계가 분리되어 진행된다. 즉, 스코프에 변수를 등록(선언 단계)하지만 초기화 단계는 변수 선언문에 도달했을 때(코드 실행 후) 이뤄진다. 초기화 이전에 변수에 접근하려고 하면 참조 에러가 발생한다. 이는 아직 변수가 초기화되지 않았기 때문이다. 즉, 변수를 위한 메모리 공간이 아직 확보되지 않았기 때문이다. 따라서 스코프의 시작 지점부터 초기화 시작 지점까지는 변수를 참조할 수 없다. 스코프의 시작 지점부터 초기화 시작 지점까지의 구간을 &amp;lsquo;일시적 사각지대(Temporal Dead Zone; TDZ)&amp;rsquo;라고 부른다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a5568; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a5568; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;호이스팅 예시&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;변수 선언에서의 호이스팅 예시&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #f4f2f0; color: #333333; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;list-style-type: none; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #888888;&quot;&gt;// 호이스팅 때문에 선언이 끌어올려져서 오류 안남.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; background-color: #f4f2f0; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #d53aa9;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #404247;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #888888;&quot;&gt;// (선언 + 초기화 된 상태)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #333333;&quot;&gt;text = &lt;/span&gt;&lt;span style=&quot;color: #669900;&quot;&gt;'Hanamon!'&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #888888;&quot;&gt;// (선언 + 초기화 + 할당 된 상태)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; background-color: #f4f2f0; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #0077aa;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; text;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #d53aa9;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #404247;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f4f2f0; color: #333333; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;list-style-type: none; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #888888;&quot;&gt;// 호이스팅 때문에 선언이 끌어올려졌지만 초기화 안된 상태에서 참조해서 오류 남.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; background-color: #f4f2f0; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #d53aa9;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #404247;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #888888;&quot;&gt;// (선언 된 상태, 초기화(메모리 공간 확보와 undefined로 초기화) 안되서 참조 불가능 -&amp;gt; 에러남)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #0077aa;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; text; &lt;/span&gt;&lt;span style=&quot;color: #888888;&quot;&gt;// 여기서 초기화 단계가 실행됨&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f4f2f0; color: #333333; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;list-style-type: none; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #0077aa;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; text; &lt;/span&gt;&lt;span style=&quot;color: #888888;&quot;&gt;// 에러남. 주의! 애초에 const 키워드로 재할당 불가능! 그래서 선언과 동시에 할당해야함&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #2d3748; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;함수 선언에서의 호이스팅 예시&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #f4f2f0; color: #333333; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;list-style-type: none; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #404247;&quot;&gt;foo1&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #888888;&quot;&gt;// 함수 선언문에서는 호이스팅 일어난다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; background-color: #f4f2f0; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #404247;&quot;&gt;foo2&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #888888;&quot;&gt;// 함수 표현식이라서 호이스팅 안된다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; background-color: #f4f2f0; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #066da1;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #404247;&quot;&gt;foo1&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d53aa9;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #404247;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #669900;&quot;&gt;'Hello'&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; background-color: #f4f2f0; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #999999;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; background-color: #f4f2f0; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #0077aa;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; foo2 = &lt;/span&gt;&lt;span style=&quot;color: #066da1;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d53aa9;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #404247;&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #669900;&quot;&gt;'world'&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;list-style-type: none; background-color: #f4f2f0; color: #aaaaaa;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #999999;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #4a5568; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;참고 : &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Glossary/Hoisting&quot;&gt;https://developer.mozilla.org/ko/docs/Glossary/Hoisting&lt;/a&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;a href=&quot;https://velog.io/@hoo00nn/%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85Hoisting-%EC%9D%B4%EB%9E%80&quot;&gt;https://velog.io/@hoo00nn/%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85Hoisting-%EC%9D%B4%EB%9E%80&lt;/a&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;a href=&quot;https://poiemaweb.com/es6-block-scope#13-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85&quot;&gt;https://poiemaweb.com/es6-block-scope#13-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85&lt;/a&gt;&amp;nbsp;&lt;/b&gt;&lt;/blockquote&gt;</description>
      <category>Frontend</category>
      <author>WinBro</author>
      <guid isPermaLink="true">https://win-bro.tistory.com/150</guid>
      <comments>https://win-bro.tistory.com/150#entry150comment</comments>
      <pubDate>Fri, 31 Mar 2023 07:12:59 +0900</pubDate>
    </item>
    <item>
      <title>공인(Public) &amp;amp;&amp;amp; 사설(Private) IP의 차이점</title>
      <link>https://win-bro.tistory.com/149</link>
      <description>&lt;h2 id=&quot;1-공인-ip-public-ip&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1. 공인 IP (Public IP)&lt;/h2&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;ISP(인터넷 서비스 공급자)가 제공하는 IP 주소&lt;/b&gt;이다. 공용 IP 주소라고도 불리며 외부에 공개되어 있는 IP 주소이다.&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;공인 IP는 전세계에서 유일한 IP 주소를 갖는다.&lt;/li&gt;
&lt;li&gt;공인 IP 주소가 외부에 공개되어 있기에 인터넷에 연결된 다른 PC로부터의 접근이 가능하다. 따라서 공인 IP 주소를 사용하는 경우에는 방화벽 등의 보안 프로그램을 설치할 필요가 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-사설-ip-private-ip&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. 사설 IP (Private IP)&lt;/h2&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;의 IP 주소이며, 로컬 IP, 가상 IP라고도 한다. IPv4의 주소부족으로 인해 서브넷팅된 IP이기 때문에 라우터에 의해 로컬 네트워크상의 PC 나 장치에 할당된다.&lt;/p&gt;
&lt;h3 id=&quot;21-사설ip-주소대역&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2.1. 사설IP 주소대역&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사설IP 주소는 다음 3가지 주소대역으로 고정된다.&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;Class A :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;10&lt;/b&gt;.0.0.0 ~&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;10&lt;/b&gt;.255.255.255&lt;/li&gt;
&lt;li&gt;Class B :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;172.16&lt;/b&gt;.0.0 ~&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;172.31&lt;/b&gt;.255.255&lt;/li&gt;
&lt;li&gt;Class C :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;192.168&lt;/b&gt;.0.0 ~&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;192.168&lt;/b&gt;.255.255&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-사설-ip와-공인-ip의-차이&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3. 사설 IP와 공인 IP의 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공인 IP (Public IP)사설 IP (Private IP)&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #212529; text-align: start; 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;&lt;b&gt;할당 주체&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;ISP(인터넷 서비스 공급자)&lt;/td&gt;
&lt;td&gt;라우터(공유기)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;할당 대상&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;개인 또는 회사의 서버(라우터)&lt;/td&gt;
&lt;td&gt;개인 또는 회사의 기기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;고유성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;인터넷 상에서 유일한 주소&lt;/td&gt;
&lt;td&gt;하나의 네트워크 안에서 유일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;공개 여부&lt;/b&gt;&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 style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;❗ 사설 IP 주소만으로는 인터넷에 직접 연결할 수 없다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;라우터를 통해 1개의 공인(Public) IP&lt;/b&gt;만 할당하고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;라우터에 연결된 개인 PC는 사설(Private) IP&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efqOaG/btr9N9z3trR/4lXt23Q4cSuNyndDSe4K01/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efqOaG/btr9N9z3trR/4lXt23Q4cSuNyndDSe4K01/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efqOaG/btr9N9z3trR/4lXt23Q4cSuNyndDSe4K01/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefqOaG%2Fbtr9N9z3trR%2F4lXt23Q4cSuNyndDSe4K01%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;312&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;312&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; ➡  : 사설 IP를 할당받은 스마트폰 혹은 개인 PC가 데이터 패킷을 인터넷으로 전송하면, 라우터(공유기)가 해당 사설 IP를 공인 IP로 바꿔서 전송한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt; ➡  : 인터넷에서 오는 데이터 패킷의 목적지도 해당하는 사설 IP로 변경한 후 개인 스마트폰 혹은 PC에 전송한다.&lt;/p&gt;
&lt;h2 id=&quot;4-고정-ip와-유동-ip&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;4. 고정 IP와 유동 IP&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;고정 IP&lt;/b&gt;는 컴퓨터에 고정적으로 부여된 IP로 한번 부여되면 IP를 반납하기 전까지는 다른 장비에 부여할 수 없는 IP 주소를 말한다.&lt;br /&gt;&lt;b&gt;유동 IP&lt;/b&gt;는 장비에 고정적으로 IP를 부여하지 않고 컴퓨터를 사용할 때 남아 있는 IP 중에서 돌아가면서 부여하는 IP를 뜻한다.&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;인터넷 상에서 서버를 운영하고자 할 때는 공인 IP를 고정 IP로 부여해야 한다는 것이 중요하다.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;즉, 공인 IP를 부여받지 못하면 다른 사람이 내 서버에 접속할 수가 없고, 고정 IP를 부여하지 않으면 내 서버가 아닌 다른 사람의 서버로 접속이 될 수도 있기 때문이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;반면에 우리가 집에서 사용하는 인터넷 서비스 업체는 각 가정마다 공인 IP를 유동 IP로 부여하고, 공유기 내부에서는 사설 IP를 유동 IP로 부여하는 것이 일반적이라고 보면 될 것이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;출처 : https://velog.io/@hidaehyunlee&lt;/b&gt;&lt;/blockquote&gt;</description>
      <category>Knowledge</category>
      <author>WinBro</author>
      <guid isPermaLink="true">https://win-bro.tistory.com/149</guid>
      <comments>https://win-bro.tistory.com/149#entry149comment</comments>
      <pubDate>Tue, 28 Mar 2023 07:27:22 +0900</pubDate>
    </item>
    <item>
      <title>Docker 개념과 명령어 사용 방법 및 예제</title>
      <link>https://win-bro.tistory.com/148</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Docker란&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Docker&lt;/b&gt;는 가상 머신처럼 독립된 실행환경을 만들어주는 것으로, 운영체제를 설치하 것과 유사한 효과를 낼 수 있지만, 실제 운영체제를 설치하지 않기 때문에 설치 용량이 적고 실행 속도 또한 빠릅니다. 예전에는 윈도에 VM Ware와 같은 가상 머신을 설치하였으나 최근에는 리눅스 계열에서 Docker가 그 역할을 대신하고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;출처:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #04beb8;&quot; href=&quot;https://ko.wikipedia.org/wiki/%EB%8F%84%EC%BB%A4_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4)&quot;&gt;위키 백과&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;br /&gt;도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증한다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Docker 를 사용하는 이유&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Docker는 다양하게 사용할 수 있습니다.&amp;nbsp; (출처:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #04beb8;&quot; href=&quot;https://namu.wiki/w/Docker&quot;&gt;나무위키&lt;/a&gt;)&amp;nbsp; 실무에서는 우분투 환경에 CentOS container를 설치하여 사용하거나, 이미 검증된 Web server의 설정 및 Binary가 설치된 container를 설치하여 복잡한 configuration 과정을 줄일 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #555555; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;&lt;span&gt;&lt;span data-key=&quot;d9a533074af24f22b2e035cb3d7a27c6&quot;&gt;&lt;span data-offset-key=&quot;d9a533074af24f22b2e035cb3d7a27c6:0&quot;&gt;&lt;b&gt;구성 단순화&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span data-offset-key=&quot;d9a533074af24f22b2e035cb3d7a27c6:1&quot;&gt;Docker는 하나의 Configuration으로 모든 플랫폼에서 실행할 수 있습니다. Configuration 파일을 코드에 넣고 환경 변수를 전달하여 다른 환경에 맞출 수 있습니다. 따라서 하나의 Docker 이미지를 다른 환경에서 사용할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot; data-key=&quot;48245bf883814dd28ab7924b700405dc&quot;&gt;&lt;span&gt;&lt;span data-key=&quot;7c98b0bef50a4cc79be8e3591a4cdeb1&quot;&gt;&lt;span data-offset-key=&quot;7c98b0bef50a4cc79be8e3591a4cdeb1:0&quot;&gt;&lt;b&gt;코드 관리&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span data-offset-key=&quot;7c98b0bef50a4cc79be8e3591a4cdeb1:1&quot;&gt;Docker는 일관된 환경을 제공하여 개발 및 코딩을 훨씬 편안하게 만들어줍니다. Docker 이미지는 변경이 불가하기에 개발환경에서 운영 환경까지 애플리케이션 환경이 변경되지 않는 이점이 존재합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot; data-key=&quot;b41241f355344f3da17b4bc1a55d8cbd&quot;&gt;&lt;span&gt;&lt;span data-key=&quot;4ea07798d3724f1486d8f822159c8b9b&quot;&gt;&lt;span data-offset-key=&quot;4ea07798d3724f1486d8f822159c8b9b:0&quot;&gt;&lt;b&gt;개발 생산성 향상&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span data-offset-key=&quot;4ea07798d3724f1486d8f822159c8b9b:1&quot;&gt;개발 환경을 운영 환경에 최대한 가깝게 복제할 수 있습니다. Docker를 사용하면 코드가 운영 환경의 컨테이너에서 실행될 수 있으며 VM과 달리 Docker는 오버 헤드 메모리 용량이 적기에 여러 서비스를 실행하는데 도움이 됩니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span data-key=&quot;61f5100c6dc04e7ba428cc5015f4a02f&quot;&gt;&lt;span data-offset-key=&quot;61f5100c6dc04e7ba428cc5015f4a02f:0&quot;&gt;또한 Docker의 Shared Volume을 사용하여 호스트에서 컨테이너의 어플리케이션 코드를 사용할 수 있도록 할 수 있습니다. 이를 통해 개발자는 자신의 플랫폼 및 편집기에서 소스 코드를 편집할 수 있으며 이는 Docker내에서 실행 중인 환경에 반영됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot; data-key=&quot;10731364f13440238668e95d89257040&quot;&gt;&lt;span&gt;&lt;span data-key=&quot;331369f7f91b44418768cd418ce37a40&quot;&gt;&lt;span data-offset-key=&quot;331369f7f91b44418768cd418ce37a40:0&quot;&gt;&lt;b&gt;애플리케이션 격리&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span data-offset-key=&quot;331369f7f91b44418768cd418ce37a40:1&quot;&gt;Web Server(e.g. Apache, Nginx)와 연결된 API 서버를 격리할 필요가 있는 경우가 있습니다. 이 경우 다른 컨테이너에서 API를 서버를 실행할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot; data-key=&quot;e8a0bd4741e544e5ae7c372821be9d3c&quot;&gt;&lt;span&gt;&lt;span data-key=&quot;9cdbdd8a1b7d4a928df1a3517220b6a1&quot;&gt;&lt;span data-offset-key=&quot;9cdbdd8a1b7d4a928df1a3517220b6a1:0&quot;&gt;&lt;b&gt;빠른 배포&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span data-offset-key=&quot;9cdbdd8a1b7d4a928df1a3517220b6a1:1&quot;&gt;컨테이너가 OS를 부팅하지 않고 어플리케이션을 실행하기 때문에 Docker 컨테이너를 매우 빠르게 만들 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Images와 Container 개념 이해&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Docker 공식 홈페이지는&amp;nbsp;&lt;a href=&quot;https://docker.com/&quot;&gt;https://docker.com/&lt;/a&gt;이며, 개념을 설명한 문서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #04beb8;&quot; href=&quot;https://docs.docker.com/get-started/overview/&quot;&gt;링크&lt;/a&gt;에 설명되어 있습니다.&amp;nbsp; Docker는 Client (docker)와 서버 (dockerd)로 구성되어 있습니다.&amp;nbsp; Docker Images는 read only의 docker container를 생성하기 위한 template이고, Container는 images가 실제 메모리에 로딩된 instance입니다. 하나의 images로 유사한 container를 만들 수 있습니다.&amp;nbsp; Registry는 Docker hub이며 images의 저장소입니다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #555555; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;Images: libs와 package의 template, read only&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;Container: Images가 설치되어 메모리에 로딩된 instance&amp;nbsp;&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;852&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blUNfy/btr9zNkEKaW/ki4AR8z5QffOBmwd4qKcl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blUNfy/btr9zNkEKaW/ki4AR8z5QffOBmwd4qKcl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blUNfy/btr9zNkEKaW/ki4AR8z5QffOBmwd4qKcl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblUNfy%2Fbtr9zNkEKaW%2Fki4AR8z5QffOBmwd4qKcl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;852&quot; height=&quot;467&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bviqtp/btqLkg4LRhJ/qo74pSME2KtAMavs9LXS20/img.png&quot; data-lightbox=&quot;lightbox&quot; data-alt=&quot;Docker 구조 (출처: https://docs.docker.com/get-started/overview/)&quot;&gt;&lt;/span&gt;Docker 구조 (출처: &lt;a href=&quot;https://docs.docker.com/get-started/overview/)&quot;&gt;https://docs.docker.com/get-started/overview/)&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;aswift_1_host&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. Container와 Virtual Machine 비교&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Container는 리눅스/Windows와 Host OS 기반에 docker가 운영&lt;/b&gt;되고, Container 별로 각각 process 단위로 bin/libs가 구동됩니다.&amp;nbsp; 반면 Virtual machine은&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Hypervisor 위에 full host OS (리눅스/윈도우)가 올라가고&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이를 기반으로 각각의 bin/libs가 구동됩니다. VM은 full OS를 구동하기 때문에 overahead가 높습니다.&amp;nbsp; 즉, Container와 Virtual machine의 차이점은 Host OS를 설치 여부에 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; 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;777&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQRYyK/btr9C4lmz5v/RY4fQOX8wVYLLoHj2VZdu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQRYyK/btr9C4lmz5v/RY4fQOX8wVYLLoHj2VZdu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQRYyK/btr9C4lmz5v/RY4fQOX8wVYLLoHj2VZdu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQRYyK%2Fbtr9C4lmz5v%2FRY4fQOX8wVYLLoHj2VZdu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;777&quot; height=&quot;313&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djp55N/btqLcUhzMFt/n3v7qj8wgN9v1Kljb7rxLk/img.png&quot; data-lightbox=&quot;lightbox&quot; data-alt=&quot;Container와 Virtual Machine&amp;amp;nbsp;(출처: https://docs.docker.com/get-started/overview/)&quot;&gt;&lt;/span&gt;Container와 Virtual Machine&amp;nbsp;(출처: &lt;a href=&quot;https://docs.docker.com/get-started/overview/)&quot;&gt;https://docs.docker.com/get-started/overview/)&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. Docker 설치 및 사용 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Docker에 대한 설명은 아래 동영상을 참조해주세요.&amp;nbsp; 쉽게 설명되어 있으며, 꼭 필요한 명령어를 설명하고 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=Bhzz9E3xuXY&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cfI5Lq/hySe6UDRCN/HGTMiAkHupvSMdiyBiVq7K/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Bhzz9E3xuXY&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;https://youtu.be/Bhzz9E3xuXY&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5.1 Docker 설치&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;우분투 기준으로 Docker 설치 방법을&lt;a style=&quot;color: #04beb8;&quot; href=&quot;https://docs.docker.com/engine/install/ubuntu/&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;링크&lt;/a&gt;에 설명되어 있습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;자동 설치 script 활용합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;get-docker.sh&amp;nbsp;&lt;/b&gt;에서는 OS 맞는 설치 방법을 자동으로 선택하고 우분투의 경우에는 apt update 후 repository를 추가해서 docker를 패키지를 설치합니다. 설치 script 진행 후에는 Docker client와 server의 설치 버전을 표시합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;$ curl -fsSL&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://get.docker.com&quot;&gt;https://get.docker.com&lt;/a&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-o&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;get-docker.sh&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;$ sudo sh&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;get-docker.sh&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;# docker는 sudo 계정을 필요로 합니다. 일반 user 계정에서 사용하는 아래 명령어를 사용해주세요.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$&amp;nbsp; sudo usermod -aG docker [your-user]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KGuZz/btr9A4sHh0l/9Wp2kRqCP1CJvJtddZUSHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KGuZz/btr9A4sHh0l/9Wp2kRqCP1CJvJtddZUSHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KGuZz/btr9A4sHh0l/9Wp2kRqCP1CJvJtddZUSHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKGuZz%2Fbtr9A4sHh0l%2F9Wp2kRqCP1CJvJtddZUSHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;872&quot; height=&quot;654&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5p7P7/btqLkK5z38J/1kXPiAzcxZ1IJT5HybrkDk/img.png&quot; data-lightbox=&quot;lightbox&quot; data-alt=&quot;Docker 설치 명령어&quot;&gt;&lt;/span&gt;Docker 설치 명령어&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5.2. Docker 삭제&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Docker 를 삭제하기 위해서는 아래 명령어를 사용합니다. Docker client와 서버를 삭제하고 docker에서 설치한 images와 container를 수동으로 삭제합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#Uninstall the Docker Engine, CLI, and Containerd packages:&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;$ sudo apt-get purge docker-ce docker-ce-cli&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;containerd.io&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;# Images, containers, volumes, or customized configuration files on your host are not automatically removed. To delete all images, containers, and volumes:&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;$ sudo rm -rf /var/lib/docker&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5.3. Docker Image 검색 (docker search) 및 다운로드 (docker pull)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;# docker image 검색 (&lt;a style=&quot;color: #04beb8;&quot; href=&quot;https://hub.docker.com/&quot;&gt;Docker Hub&lt;/a&gt;에서 검색)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$ sudo&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;docker search [검색 단어]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$&amp;nbsp;sudo&amp;nbsp;docker&amp;nbsp;search&amp;nbsp;centos&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; 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;950&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doRKTe/btr9sgnqW9i/PnUOFjaxAfuDhTWc7NXDK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doRKTe/btr9sgnqW9i/PnUOFjaxAfuDhTWc7NXDK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doRKTe/btr9sgnqW9i/PnUOFjaxAfuDhTWc7NXDK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoRKTe%2Fbtr9sgnqW9i%2FPnUOFjaxAfuDhTWc7NXDK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;950&quot; height=&quot;454&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;#docker image 받아오기&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;docker&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;pull&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&amp;lt;이미지&amp;nbsp;이름&amp;gt;:&amp;lt;태그&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;#최신 버전의 centos&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$&amp;nbsp;sudo&amp;nbsp;docker&amp;nbsp;pull&amp;nbsp;centos&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;#특정 버전 (특정 tag)의 centos :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #04beb8;&quot; href=&quot;https://registry.hub.docker.com/_/centos?tab=tags&quot;&gt;registry.hub.docker.com/_/centos?tab=tags&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$ sudo&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;docker pull centos:centos7&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oONID/btr9C5R6wJN/ikj6Vd5faON5FfrAZYvLPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oONID/btr9C5R6wJN/ikj6Vd5faON5FfrAZYvLPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oONID/btr9C5R6wJN/ikj6Vd5faON5FfrAZYvLPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoONID%2Fbtr9C5R6wJN%2Fikj6Vd5faON5FfrAZYvLPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;644&quot; height=&quot;702&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dThmCz/btqLjsYEmJt/KtzPaS1dzdwU5YNYngkF21/img.png&quot; data-lightbox=&quot;lightbox&quot; data-alt=&quot;Docker Hub에서 Image와 Tag 확인&quot;&gt;&lt;/span&gt;Docker Hub에서 Image와 Tag 확인&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;aswift_2_host&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5.3.&lt;span&gt;&amp;nbsp;&lt;/span&gt;Docker image에서 container 실행&amp;nbsp; (docker run)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;#docker image에서 container 실행&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;docker run &amp;lt;옵션&amp;gt; &amp;lt;이미지 이름:Tag이름&amp;gt; &amp;lt;실행할 파일&amp;gt; 형식입니다&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$ sudo docker run -i -t&amp;nbsp; centos:centos7 /bin/bash&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;-i(interactive), -t(Pseudo-tty) 옵션을 사용하면 실행된 Bash Shell에 입력 및 출력을 할 수 있습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Docker run 실행하면&amp;nbsp; root 계정으로 bash를 실행합니다.&amp;nbsp; 우분투에서 CentOS7 cotainer를 설치 후에 OS를 확인하면 아래와 같습니다.&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;407&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbh58L/btr9wIKYG3z/p0Aajajx9kDy0bg8cKD0f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbh58L/btr9wIKYG3z/p0Aajajx9kDy0bg8cKD0f1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbh58L/btr9wIKYG3z/p0Aajajx9kDy0bg8cKD0f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdbh58L%2Fbtr9wIKYG3z%2Fp0Aajajx9kDy0bg8cKD0f1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;407&quot; height=&quot;297&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7oiwq/btqK84RZ2zy/AFy6kG2jVWq1124u5Xe4xk/img.png&quot; data-lightbox=&quot;lightbox&quot; data-alt=&quot;docker 에서 설치된 OS 확인 결과&quot;&gt;&lt;/span&gt;docker 에서 설치된 OS 확인 결과&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;# Container 시작&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$ sudo docker&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;start&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[컨테이너 이름 or ID]&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;# Container 접속&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$ sudo docker&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;attach&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[컨테이너 이름 or ID]&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;Bash Shell에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;exit&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Ctrl+D&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를 입력하면 컨테이너가 정지됩니다. 여기서는&lt;span&gt;&amp;nbsp;단축키&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Ctrl+P와 Ctrl+Q&lt;/span&gt;&lt;/b&gt;&lt;span&gt;를 차례대로 입력하여 컨테이너를 정지하지 않고, 컨테이너에서 빠져나옵니다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5.4.&lt;span&gt;&amp;nbsp;&lt;/span&gt;Docker image 리스트 확인 (docker images) 및 삭제&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;# 설치된 이미지 리스트 확인&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$&amp;nbsp;sudo&amp;nbsp;&lt;b&gt;docker&amp;nbsp;images&lt;/b&gt;&lt;br /&gt;REPOSITORY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TAG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IMAGE&amp;nbsp;ID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CREATED&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SIZE&lt;br /&gt;ubuntu&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latest&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9140108b62dc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&amp;nbsp;weeks&amp;nbsp;ago&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;72.9MB&lt;br /&gt;hello-world&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latest&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bf756fb1ae65&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&amp;nbsp;months&amp;nbsp;ago&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;13.3kB&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;# doker image 삭제&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$ sudo docker&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;rmi&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[image id]&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$ sudo docker rmi bf756fb1ae65&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xtp1c/btr9GbEhELZ/ZKGiFQkHBqWTUAYZrI88g1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xtp1c/btr9GbEhELZ/ZKGiFQkHBqWTUAYZrI88g1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xtp1c/btr9GbEhELZ/ZKGiFQkHBqWTUAYZrI88g1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxtp1c%2Fbtr9GbEhELZ%2FZKGiFQkHBqWTUAYZrI88g1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;845&quot; height=&quot;76&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5.4.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;동작 중인 container 확인 (docker ps)&amp;nbsp; 및 삭제 (docker rm)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;# 동작 중인 container 확인&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$ sudo&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;docker ps&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;#정지된 container 확인&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$&amp;nbsp;sudo&amp;nbsp;docker&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp;ps&amp;nbsp;-a&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1301&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ae4VX/btr9z9ONGB2/DxOT720CbY2IYTrn5pZhPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ae4VX/btr9z9ONGB2/DxOT720CbY2IYTrn5pZhPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ae4VX/btr9z9ONGB2/DxOT720CbY2IYTrn5pZhPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAe4VX%2Fbtr9z9ONGB2%2FDxOT720CbY2IYTrn5pZhPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1301&quot; height=&quot;53&quot; data-origin-width=&quot;1301&quot; data-origin-height=&quot;53&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;#container 삭제&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$ sudo&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;docker&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;rm&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[container id]&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$ sudo docker rm afc479607c11 fdfe0a5387ef&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5.6. 파일 공유를 위한 Volume mount 및 파일 복사&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Host의 storage를 container로 전달하는 명령어입니다. -v (volume)을 사용할 수입니다. Host와 container 사이에 storage를 공유할 수 있습니다&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;# 로컬 volume을 container의&lt;span&gt;&amp;nbsp;&lt;/span&gt;/conainer_volume&amp;nbsp; 로 마운트&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;docker run -i -t&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;-v&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;/home/host_volume:/conainer_volume&amp;nbsp; centos:centos7 /bin/bash&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;# 로컬 파일을 cotainer로 복사:&lt;span&gt;&amp;nbsp;&lt;/span&gt;로컬의 &amp;ldquo;~/data/test.md&amp;rdquo; 라는 파일을 컨테이너의 &amp;ldquo;/root/data/&amp;rdquo;로 복사&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;docker&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;cp&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;~/data/test.md tmp_container:/root/data/&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;aswift_3_host&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5.7. Docker 명령어 리스트&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Management&amp;nbsp;Commands:&lt;br /&gt;&amp;nbsp;&amp;nbsp;builder&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manage&amp;nbsp;builds&lt;br /&gt;&amp;nbsp;&amp;nbsp;config&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manage&amp;nbsp;Docker&amp;nbsp;configs&lt;br /&gt;&amp;nbsp;&amp;nbsp;container&amp;nbsp;&amp;nbsp;&amp;nbsp;Manage&amp;nbsp;containers&lt;br /&gt;&amp;nbsp;&amp;nbsp;context&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manage&amp;nbsp;contexts&lt;br /&gt;&amp;nbsp;&amp;nbsp;engine&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manage&amp;nbsp;the&amp;nbsp;docker&amp;nbsp;engine&lt;br /&gt;&amp;nbsp;&amp;nbsp;image&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manage&amp;nbsp;images&lt;br /&gt;&amp;nbsp;&amp;nbsp;network&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manage&amp;nbsp;networks&lt;br /&gt;&amp;nbsp;&amp;nbsp;node&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manage&amp;nbsp;Swarm&amp;nbsp;nodes&lt;br /&gt;&amp;nbsp;&amp;nbsp;plugin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manage&amp;nbsp;plugins&lt;br /&gt;&amp;nbsp;&amp;nbsp;secret&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manage&amp;nbsp;Docker&amp;nbsp;secrets&lt;br /&gt;&amp;nbsp;&amp;nbsp;service&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manage&amp;nbsp;services&lt;br /&gt;&amp;nbsp;&amp;nbsp;stack&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manage&amp;nbsp;Docker&amp;nbsp;stacks&lt;br /&gt;&amp;nbsp;&amp;nbsp;swarm&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manage&amp;nbsp;Swarm&lt;br /&gt;&amp;nbsp;&amp;nbsp;system&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manage&amp;nbsp;Docker&lt;br /&gt;&amp;nbsp;&amp;nbsp;trust&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manage&amp;nbsp;trust&amp;nbsp;on&amp;nbsp;Docker&amp;nbsp;images&lt;br /&gt;&amp;nbsp;&amp;nbsp;volume&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Manage&amp;nbsp;volumes&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Commands:&lt;br /&gt;&amp;nbsp;&amp;nbsp;attach&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Attach&amp;nbsp;local&amp;nbsp;standard&amp;nbsp;input,&amp;nbsp;output,&amp;nbsp;and&amp;nbsp;error&amp;nbsp;streams&amp;nbsp;to&amp;nbsp;a&amp;nbsp;running&amp;nbsp;container&lt;br /&gt;&amp;nbsp;&amp;nbsp;build&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Build&amp;nbsp;an&amp;nbsp;image&amp;nbsp;from&amp;nbsp;a&amp;nbsp;Dockerfile&lt;br /&gt;&amp;nbsp;&amp;nbsp;commit&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Create&amp;nbsp;a&amp;nbsp;new&amp;nbsp;image&amp;nbsp;from&amp;nbsp;a&amp;nbsp;container's&amp;nbsp;changes&lt;br /&gt;&amp;nbsp;&amp;nbsp;cp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Copy&amp;nbsp;files/folders&amp;nbsp;between&amp;nbsp;a&amp;nbsp;container&amp;nbsp;and&amp;nbsp;the&amp;nbsp;local&amp;nbsp;filesystem&lt;br /&gt;&amp;nbsp;&amp;nbsp;create&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Create&amp;nbsp;a&amp;nbsp;new&amp;nbsp;container&lt;br /&gt;&amp;nbsp;&amp;nbsp;diff&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Inspect&amp;nbsp;changes&amp;nbsp;to&amp;nbsp;files&amp;nbsp;or&amp;nbsp;directories&amp;nbsp;on&amp;nbsp;a&amp;nbsp;container's&amp;nbsp;filesystem&lt;br /&gt;&amp;nbsp;&amp;nbsp;events&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Get&amp;nbsp;real&amp;nbsp;time&amp;nbsp;events&amp;nbsp;from&amp;nbsp;the&amp;nbsp;server&lt;br /&gt;&amp;nbsp;&amp;nbsp;exec&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Run&amp;nbsp;a&amp;nbsp;command&amp;nbsp;in&amp;nbsp;a&amp;nbsp;running&amp;nbsp;container&lt;br /&gt;&amp;nbsp;&amp;nbsp;export&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Export&amp;nbsp;a&amp;nbsp;container's&amp;nbsp;filesystem&amp;nbsp;as&amp;nbsp;a&amp;nbsp;tar&amp;nbsp;archive&lt;br /&gt;&amp;nbsp;&amp;nbsp;history&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Show&amp;nbsp;the&amp;nbsp;history&amp;nbsp;of&amp;nbsp;an&amp;nbsp;image&lt;br /&gt;&amp;nbsp;&amp;nbsp;images&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;nbsp;images&lt;br /&gt;&amp;nbsp;&amp;nbsp;import&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Import&amp;nbsp;the&amp;nbsp;contents&amp;nbsp;from&amp;nbsp;a&amp;nbsp;tarball&amp;nbsp;to&amp;nbsp;create&amp;nbsp;a&amp;nbsp;filesystem&amp;nbsp;image&lt;br /&gt;&amp;nbsp;&amp;nbsp;info&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Display&amp;nbsp;system-wide&amp;nbsp;information&lt;br /&gt;&amp;nbsp;&amp;nbsp;inspect&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Return&amp;nbsp;low-level&amp;nbsp;information&amp;nbsp;on&amp;nbsp;Docker&amp;nbsp;objects&lt;br /&gt;&amp;nbsp;&amp;nbsp;kill&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Kill&amp;nbsp;one&amp;nbsp;or&amp;nbsp;more&amp;nbsp;running&amp;nbsp;containers&lt;br /&gt;&amp;nbsp;&amp;nbsp;load&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Load&amp;nbsp;an&amp;nbsp;image&amp;nbsp;from&amp;nbsp;a&amp;nbsp;tar&amp;nbsp;archive&amp;nbsp;or&amp;nbsp;STDIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;login&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log&amp;nbsp;in&amp;nbsp;to&amp;nbsp;a&amp;nbsp;Docker&amp;nbsp;registry&lt;br /&gt;&amp;nbsp;&amp;nbsp;logout&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log&amp;nbsp;out&amp;nbsp;from&amp;nbsp;a&amp;nbsp;Docker&amp;nbsp;registry&lt;br /&gt;&amp;nbsp;&amp;nbsp;logs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Fetch&amp;nbsp;the&amp;nbsp;logs&amp;nbsp;of&amp;nbsp;a&amp;nbsp;container&lt;br /&gt;&amp;nbsp;&amp;nbsp;pause&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pause&amp;nbsp;all&amp;nbsp;processes&amp;nbsp;within&amp;nbsp;one&amp;nbsp;or&amp;nbsp;more&amp;nbsp;containers&lt;br /&gt;&amp;nbsp;&amp;nbsp;port&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;nbsp;port&amp;nbsp;mappings&amp;nbsp;or&amp;nbsp;a&amp;nbsp;specific&amp;nbsp;mapping&amp;nbsp;for&amp;nbsp;the&amp;nbsp;container&lt;br /&gt;&amp;nbsp;&amp;nbsp;ps&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;nbsp;containers&lt;br /&gt;&amp;nbsp;&amp;nbsp;pull&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pull&amp;nbsp;an&amp;nbsp;image&amp;nbsp;or&amp;nbsp;a&amp;nbsp;repository&amp;nbsp;from&amp;nbsp;a&amp;nbsp;registry&lt;br /&gt;&amp;nbsp;&amp;nbsp;push&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Push&amp;nbsp;an&amp;nbsp;image&amp;nbsp;or&amp;nbsp;a&amp;nbsp;repository&amp;nbsp;to&amp;nbsp;a&amp;nbsp;registry&lt;br /&gt;&amp;nbsp;&amp;nbsp;rename&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Rename&amp;nbsp;a&amp;nbsp;container&lt;br /&gt;&amp;nbsp;&amp;nbsp;restart&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Restart&amp;nbsp;one&amp;nbsp;or&amp;nbsp;more&amp;nbsp;containers&lt;br /&gt;&amp;nbsp;&amp;nbsp;rm&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Remove&amp;nbsp;one&amp;nbsp;or&amp;nbsp;more&amp;nbsp;containers&lt;br /&gt;&amp;nbsp;&amp;nbsp;rmi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Remove&amp;nbsp;one&amp;nbsp;or&amp;nbsp;more&amp;nbsp;images&lt;br /&gt;&amp;nbsp;&amp;nbsp;run&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Run&amp;nbsp;a&amp;nbsp;command&amp;nbsp;in&amp;nbsp;a&amp;nbsp;new&amp;nbsp;container&lt;br /&gt;&amp;nbsp;&amp;nbsp;save&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Save&amp;nbsp;one&amp;nbsp;or&amp;nbsp;more&amp;nbsp;images&amp;nbsp;to&amp;nbsp;a&amp;nbsp;tar&amp;nbsp;archive&amp;nbsp;(streamed&amp;nbsp;to&amp;nbsp;STDOUT&amp;nbsp;by&amp;nbsp;default)&lt;br /&gt;&amp;nbsp;&amp;nbsp;search&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Search&amp;nbsp;the&amp;nbsp;Docker&amp;nbsp;Hub&amp;nbsp;for&amp;nbsp;images&lt;br /&gt;&amp;nbsp;&amp;nbsp;start&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Start&amp;nbsp;one&amp;nbsp;or&amp;nbsp;more&amp;nbsp;stopped&amp;nbsp;containers&lt;br /&gt;&amp;nbsp;&amp;nbsp;stats&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Display&amp;nbsp;a&amp;nbsp;live&amp;nbsp;stream&amp;nbsp;of&amp;nbsp;container(s)&amp;nbsp;resource&amp;nbsp;usage&amp;nbsp;statistics&lt;br /&gt;&amp;nbsp;&amp;nbsp;stop&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stop&amp;nbsp;one&amp;nbsp;or&amp;nbsp;more&amp;nbsp;running&amp;nbsp;containers&lt;br /&gt;&amp;nbsp;&amp;nbsp;tag&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Create&amp;nbsp;a&amp;nbsp;tag&amp;nbsp;TARGET_IMAGE&amp;nbsp;that&amp;nbsp;refers&amp;nbsp;to&amp;nbsp;SOURCE_IMAGE&lt;br /&gt;&amp;nbsp;&amp;nbsp;top&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Display&amp;nbsp;the&amp;nbsp;running&amp;nbsp;processes&amp;nbsp;of&amp;nbsp;a&amp;nbsp;container&lt;br /&gt;&amp;nbsp;&amp;nbsp;unpause&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Unpause&amp;nbsp;all&amp;nbsp;processes&amp;nbsp;within&amp;nbsp;one&amp;nbsp;or&amp;nbsp;more&amp;nbsp;containers&lt;br /&gt;&amp;nbsp;&amp;nbsp;update&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Update&amp;nbsp;configuration&amp;nbsp;of&amp;nbsp;one&amp;nbsp;or&amp;nbsp;more&amp;nbsp;containers&lt;br /&gt;&amp;nbsp;&amp;nbsp;version&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Show&amp;nbsp;the&amp;nbsp;Docker&amp;nbsp;version&amp;nbsp;information&lt;br /&gt;&amp;nbsp;&amp;nbsp;wait&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Block&amp;nbsp;until&amp;nbsp;one&amp;nbsp;or&amp;nbsp;more&amp;nbsp;containers&amp;nbsp;stop,&amp;nbsp;then&amp;nbsp;print&amp;nbsp;their&amp;nbsp;exit&amp;nbsp;codes&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;유용한 명령어 모음입니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;컨테이너의&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;로컬&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;셸&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;가져오기&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker run -i -t --entrypoint /bin/bash imageID&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;디렉터리의&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Dockerfile&lt;/span&gt;&lt;span&gt;을&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;사용하여&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;이미지&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;생성&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker build -t friendlyname .&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;포트&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;4000&lt;/span&gt;&lt;span&gt;에서&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;80&lt;/span&gt;&lt;span&gt;으로&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;friendlyname&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;매핑&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;실행&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker run -p 4000:80 friendlyname&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;동일하지만&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;분리된&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;모드에서&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker run -d -p 4000:80 friendlyname&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;실행&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;중인&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;모든&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;컨테이너&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;목록&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;보기&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker ps&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;지정된&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;컨테이너를&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;정상적으로&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;중지&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker stop &amp;lt;&lt;/span&gt;&lt;span&gt;hash&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;실행&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;중이&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;아닌&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;컨테이너를&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;포함해&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;모든&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;컨테이너&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;목록&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;보기&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker ps -a&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;지정된&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;컨테이너&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;강제&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;종료&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;kill&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;hash&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;시스템에서&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;지정된&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;컨테이너&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;제거&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker rm &amp;lt;&lt;/span&gt;&lt;span&gt;hash&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;시스템에서&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;모든&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;컨테이너&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;제거&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker rm&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;docker ps -a -q&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;시스템의&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;모든&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;이미지&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;표시&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker images -a&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;시스템에서&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;지정된&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;이미지&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;제거&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker rmi &amp;lt;imagename&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;시스템에서&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;모든&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;이미지&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;제거&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker rmi&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;docker images -q&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;# Docker&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;자격&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;증명을&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;사용하여&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;CLI&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;세션에&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;로그인&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker login&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;레지스트리에&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;업로드할&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;image&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;태그&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;지정&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker tag &amp;lt;image&amp;gt; username/repository:tag&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;태그&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;지정된&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;이미지를&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;레지스트리에&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;업로드&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker push username/repository:tag&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;레지스트리에서&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;이미지&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;실행&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker run username/repository:tag&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;출처 :&amp;nbsp;&lt;br /&gt;https://kibua20.tistory.com/135&lt;/blockquote&gt;</description>
      <category>Knowledge</category>
      <author>WinBro</author>
      <guid isPermaLink="true">https://win-bro.tistory.com/148</guid>
      <comments>https://win-bro.tistory.com/148#entry148comment</comments>
      <pubDate>Thu, 23 Mar 2023 07:06:19 +0900</pubDate>
    </item>
    <item>
      <title>[Spring MVC] HTTP 메시지 컨버터</title>
      <link>https://win-bro.tistory.com/147</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;HTTP 메시지 컨버터란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;JSON 데이터를 HTTP 메시지 바디에서 직접 읽거나 쓰는 경우,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;HTTP 메시지 컨버터&lt;/b&gt;를 사용하면 매우 편리하다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;HTTP 메시지 컨버터란, 요청 본문에서 메시지를 읽어들이거나(@RequestBody), 응답 본문에 메시지를 작성할 때(@ResponseBody) 사용하는 컨버터다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;HTTP 메시지 컨버터 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1681166372311&quot; class=&quot;gradle&quot; style=&quot;color: #555555; text-align: start;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;boolean canRead(Class&amp;lt;?&amp;gt; clazz, @Nullable MediaType mediaType);
boolean canWrite(Class&amp;lt;?&amp;gt; clazz, @Nullable MediaType mediaType);

List&amp;lt;MediaType&amp;gt; getSupportedMediaTypes();

T read(Class&amp;lt;? extends T&amp;gt; clazz, HttpInputMessage inputMessage)
	throws IOException, HttpMessageNotReadableException;
void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
	throws IOException, HttpMessageNotWritableException;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #555555; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;HTTP 요청, 응답 양방향으로 사용&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;canRead(), canWrite(): 메시지 컨버터가 해당 클래스, 미디어 타입을 지원하는지 체크&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;read(), write(): 메시지 컨버터를 통해 메시지를 읽고 쓰는 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;스프링 부트의 기본 메시지 컨버터&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;color: #666666; text-align: start; 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;ByteArrayHttpMessageConverter&lt;br /&gt;StringHttpMessageConverter&lt;br /&gt;MappingJacksonHttpMessageConverter&lt;br /&gt;...&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc; color: #555555; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;기본적으로 위의 컨버터들을 지원함&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&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;b&gt;미디어 타입&lt;/b&gt;을 체크해 사용여부 결정&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(만족하지 않는 경우 다음 메시지 컨버터로 우선순위 넘어감)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;ex1: @RequestBody String data 형식으로 요청이 오면 StringHttpMessageConverter 사용&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;ex2: @ResponseBody return helloData로 쓰고 미디어 타입 application/json인 경우 MappingJacksonHttpMessageConverter 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;HTTP 요청 데이터 읽기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #555555; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #666666;&quot;&gt;HTTP 요청이 들어오고, 컨트롤러에서 @RequestBody나 HttpEntity 파라미터 사용&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #666666;&quot;&gt;메시지 컨버터가 canRead() 호출&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;// 읽을 수 있는 메시지인지 확인&lt;br /&gt;&lt;/span&gt;- 대상 클래스 타입과 HTTP의 Content-Type 미디어 타입 지원하는지&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #666666;&quot;&gt;canRead() 만족 시 read() 호출해 객체 생성 및 반환&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;HTTP 응답 데이터 생성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #555555; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #666666;&quot;&gt;컨트롤러에서 @ResponseBody나 HttpEntity로 값 반환&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #666666;&quot;&gt;메시지 컨버터가 canWrite() 호출&amp;nbsp;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp; // 메시지를 쓸 수 있는지 확인&lt;/span&gt;&lt;br /&gt;- 대상 클래스 타입과 HTTP의 Accept 미디어 타입 지원하는지&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #666666;&quot;&gt;canWrite() 만족 시 write() 호출해 HTTP 응답 메시지 바디에 데이터 생성&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;HTTP 메시지 컨버터의 실행&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그렇다면 이제 궁금한 것이 하나 생겼다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTTP 메시지 컨버터는 어디서 실행되는걸까&lt;/b&gt;?&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SpringMvc 구조를 다시 보자&lt;/p&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;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCPTKx/btr9rgTsUxy/L1sXuxNTOMFUkF9hbSq1W1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCPTKx/btr9rgTsUxy/L1sXuxNTOMFUkF9hbSq1W1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCPTKx/btr9rgTsUxy/L1sXuxNTOMFUkF9hbSq1W1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCPTKx%2Fbtr9rgTsUxy%2FL1sXuxNTOMFUkF9hbSq1W1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;251&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #555555; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #666666;&quot;&gt;HTTP 요청이 들어오면 핸들러 조회&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #666666;&quot;&gt;핸들러를 처리할 수 있는 핸들러 어댑터 조회&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #666666;&quot;&gt;handle(handler)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #666666;&quot;&gt;&lt;b&gt;handler 호출&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #666666;&quot;&gt;ModelAndView 반환&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #666666;&quot;&gt;viewResolver 호출&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #666666;&quot;&gt;View 반환&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #666666;&quot;&gt;render(model) 호출&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 과정에서 4번 과정을 주목해보자.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;어노테이션 기반의 핸들러(컨트롤러)의 여러 파라미터를 생성해서 호출할 수 있는 '핸들러 어댑터'&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 어댑터가 HTTP 메시지 컨버터와 관련이 있다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;먼저, @RequestMapping을 처리하는 핸들러 어댑터인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;RequestMappingHandlerAdapter&lt;/b&gt;&lt;/span&gt;를 자세히 살펴보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dH04OY/btr9mhl0WnC/fDMA5VsRIE9xY6L5AuUcWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dH04OY/btr9mhl0WnC/fDMA5VsRIE9xY6L5AuUcWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dH04OY/btr9mhl0WnC/fDMA5VsRIE9xY6L5AuUcWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdH04OY%2Fbtr9mhl0WnC%2FfDMA5VsRIE9xY6L5AuUcWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;309&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #555555; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #666666;&quot;&gt;&lt;b&gt;ArgumentResolver 호출&lt;/b&gt;&lt;br /&gt;ArgumentResolver: 매우 다양한 종류의 파라미터를 유연하게 처리해&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;&lt;span&gt;&amp;nbsp;&lt;/span&gt;생성&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #666666;&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;b&gt;값을 넘겨줌&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 이제 본격적으로 HTTP 메시지 컨버터는 어디있을까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3hQlJ/btr9mhNaTqt/qvIZCpCvSiDlpAfE87PTL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3hQlJ/btr9mhNaTqt/qvIZCpCvSiDlpAfE87PTL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3hQlJ/btr9mhNaTqt/qvIZCpCvSiDlpAfE87PTL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3hQlJ%2Fbtr9mhNaTqt%2FqvIZCpCvSiDlpAfE87PTL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;337&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;만약 ArgumentResolver에&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;파라미터가 @RequestBody 또는 HttpEntity인 경우&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;HTTP 메시지 컨버터를 사용해 'read' 한다.&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;@ResponseBody 또는 HttpEntity&lt;/b&gt;를 처리하는 ReturnValueHandler에서 HTTP 메시지 컨버터를 호출해 응답 결과를 'write' 한다.\&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;출처 : 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술&lt;/b&gt;&lt;/blockquote&gt;</description>
      <category>Backend/Spring MVC</category>
      <author>WinBro</author>
      <guid isPermaLink="true">https://win-bro.tistory.com/147</guid>
      <comments>https://win-bro.tistory.com/147#entry147comment</comments>
      <pubDate>Wed, 22 Mar 2023 07:09:57 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] Logger 사용법 &amp;amp; 팁</title>
      <link>https://win-bro.tistory.com/146</link>
      <description>&lt;h1 id=&quot;1. 스프링 부트에서 로깅 사용법&quot; style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot;&gt;1. 스프링 부트에서 로깅 사용법&lt;/h1&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;스프링 부트는 spring- boot-starter-logging을 기본적으로 제공한다&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot;&gt;&lt;code&gt;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Configuration
public class RedisScheduler {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    private void log(String name) {
        logger.trace(&quot;trace log={}&quot;, name);
        logger.debug(&quot;debug log={}&quot;, name);
        logger.info(&quot; info log={}&quot;, name);
        logger.warn(&quot; warn log={}&quot;, name);
        logger.error(&quot;error log={}&quot;, name);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;1.1.1. {}, xxx 문법을 사용하는 이유&quot; style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1.1.1. {}, xxx 문법을 사용하는 이유&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위에 예제 코드를 보면,&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp;logger.trace(&quot;trace log={}&quot;, name)&lt;/span&gt;로 되어있다.&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;logger.trace(&amp;rdquo;trace log=&amp;rdquo; + name)&lt;/span&gt;으로 사용하면 안될까?&lt;br /&gt;사용하면 안되는데 이유를 알아보자.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;의미없는 문자열 연산이 일어난다. 반면 name을 파라미터로 넘기면, 연산이 일어나지 않는다.&lt;/li&gt;
&lt;li&gt;로그 레벨에 따라서 출력되지 않는 로그 레벨의 문자열 연산이 일어난 후 로그 레벨을 검사한다.&lt;br /&gt;만약 debug 레벨인 경우 trace는 아예 동작할 필요가 없기 때문에 trace는 검사만 하고, 출력하지 않는다.&lt;br /&gt;하지만 문자열 연산이 있으면, 문자열 연산을 하고 레벨을 검사하는 것이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;1.1.2. 로그 레벨 설정하기&quot; style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1.1.2. 로그 레벨 설정하기&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;application.properties&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot; style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot;&gt;&lt;code&gt;logging.level.project=debug&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;debug 레벨로만 설정하면 하위 레벨은 로깅되지 않음. 즉, trace는 로깅되지 않음.&lt;br /&gt;별도로 설정하지 않는다면, info가 기본값.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;logging.level.root=debug&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기본값은 이렇게 root에 debug가 아닌 info가 되어있다고 했다.&lt;br /&gt;만약 debug나 trace로 변경하면, 라이브러리들의 모든 로그까지 다 로깅하기 때문에&lt;br /&gt;필요한 경로에 별도로 지정해서 사용하자.&lt;/p&gt;
&lt;h3 id=&quot;1.1.3. 로그 레벨&quot; style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1.1.3. 로그 레벨&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;trace&lt;/li&gt;
&lt;li&gt;debug&lt;/li&gt;
&lt;li&gt;info&lt;/li&gt;
&lt;li&gt;warn&lt;/li&gt;
&lt;li&gt;error&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;2. 로그 설정 팁&quot; style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot;&gt;2. 로그 설정 팁&lt;/h1&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 id=&quot;2.1.1. 개발 서버는 debug&quot; style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2.1.1. 개발 서버는 debug&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;디버깅에 필요한 상세 정보를 봐야하기 때문이다.&lt;br /&gt;디버깅이 더 상세한 정보를 보여주기도 하고, 개발 중 작성한 로그가 실수로 운영에도 반영되는 일이 방지할 수 있음.&lt;br /&gt;실제로 이런 경우가 많음. System.out.println은 방법이 없음.&lt;/p&gt;
&lt;h3 id=&quot;2.1.2. 운영 서버는 info&quot; style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2.1.2. 운영 서버는 info&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;운영 서버에서 디버깅은 필요없고 기본 정보나 에러가 발생할 경우만 로그가 필요하기 때문이다.&lt;br /&gt;트래픽도 많기 때문에 의미없는 로그는 없애야하기 때문이다.&lt;/p&gt;
&lt;h1 id=&quot;3. Log 라이브러리 사용하는 이유&quot; style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot;&gt;3. Log 라이브러리 사용하는 이유&lt;/h1&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;대표적으로 SLF4J 인터페이스있고, Logback, log4j, log4j2 구현체가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;쓰레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;출력 모양을 가독성 좋게 변경할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;로그 레벨에 따라 환경에 맞게 설정할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;콘솔에만 출력이 아닌 네트워크, 파일로도 남길 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;파일로 남길 때는 특정 용량에 따라 로그를 분리하는 것도 가능하다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;성능도 일반 System.out보다 수십배 차이가 난다고 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;출처 : https://dev-monkey-dugi.tistory.com/&lt;/b&gt;&lt;/blockquote&gt;</description>
      <category>Backend/Spring Boot</category>
      <author>WinBro</author>
      <guid isPermaLink="true">https://win-bro.tistory.com/146</guid>
      <comments>https://win-bro.tistory.com/146#entry146comment</comments>
      <pubDate>Mon, 20 Mar 2023 07:42:41 +0900</pubDate>
    </item>
    <item>
      <title>[Spring MVC] 쿼리 파라미터, 쿼리스트링, 패스변수 (Query parameter, Query String ,  Path Variable)</title>
      <link>https://win-bro.tistory.com/145</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;웹에서 데이터를 보내고 받기 위해서는 어떤 식으로 전송하고 어떤 경로(End-point)에 전달할지를 중요하게 본다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; 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;으로는 GET, POST 등의 HTTP 메서드가 있고, 관련해서 REST API라는 개념이 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; 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;b&gt;Query Paramete&lt;/b&gt;r와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Path Variable&lt;/b&gt;에 대해서 정리해보려 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;Query Parameter (Query String)&lt;/b&gt;&lt;/span&gt;&lt;/h2&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;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rJash/btr7RrJzeiB/dbEaVbiSwwikRW8vYtJXBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rJash/btr7RrJzeiB/dbEaVbiSwwikRW8vYtJXBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rJash/btr7RrJzeiB/dbEaVbiSwwikRW8vYtJXBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrJash%2Fbtr7RrJzeiB%2FdbEaVbiSwwikRW8vYtJXBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;137&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 이미지는 우리가 흔하게 보는 URL의 구조이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서&lt;span&gt;&amp;nbsp;&lt;/span&gt;?&lt;span&gt;&amp;nbsp;&lt;/span&gt;이후부터 시작되는 Parameters라는 부분이 바로 Query Parameter이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;흔히 Query String, 쿼리 스트링이라고 부르기도 한다. 쿼리 파라미터와 쿼리 스트링은 같은 표현이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Query String은&lt;span&gt;&amp;nbsp;&lt;/span&gt;key와&lt;span&gt;&amp;nbsp;&lt;/span&gt;value로 쌍을 이룬 문자 형태이며 &amp;amp; 로 연결한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 구조로 따지면 2개의 key, value 쌍이 parameter에 들어가 있는 것이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 담겨진 Query String은 웹서버로 전달된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같은 경우는 q라는 key에 abc를 담아 전달한다고 보면 되겠다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;code&gt;/search?q=abc&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;Path Variable&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Path Variable은 경로를 변수로 사용한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;게시글을 조회한다고 가정하면, 해당 게시글의 id를 서버로 넘겨주어야만 조회할 수 있을 것이다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;code&gt;/boards/100&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위와 같은 형태로, id 같은 특정 인덱스에 대한 조회를 하는 경우 Path Variable을 사용한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;각각 언제 쓰는 것이 좋을까?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 Query Parameter와 Path Variable을 사용하기 적절한 때는 언제일까?&lt;br /&gt;아래와 같이 정리해볼 수 있겠다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none; color: #555555;&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;Query Paramater : id를 어떤 리소스를 식별하고 싶을 때 더 적절!&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;code&gt;/users  // 모든 사용자 목록 가져오기
/users/123  // 회원 번호 혹은 id가 123인 사용자 정보 가져오기&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none; color: #555555;&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;Path Variable : 필터링을 하거나 정렬을 하는 경우 사용하는 것이 이상적!&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;code&gt;/posts  // 모든 게시글 목록 가져오기
/posts?user=abc  // 작성자가 abc인 게시글만 가져오기&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;항상 모든 경로에 Query String이나 Path Variable이 필요한 것은 아니다.&lt;br /&gt;필요에 따라, 경우에 맞게 사용하면 된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;출처 : 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술&lt;/b&gt;&lt;/blockquote&gt;</description>
      <category>Backend/Spring MVC</category>
      <author>WinBro</author>
      <guid isPermaLink="true">https://win-bro.tistory.com/145</guid>
      <comments>https://win-bro.tistory.com/145#entry145comment</comments>
      <pubDate>Mon, 20 Mar 2023 07:04:21 +0900</pubDate>
    </item>
    <item>
      <title>[Backend] 이클립스 디버깅(Eclipse) - Debugging 사용법</title>
      <link>https://win-bro.tistory.com/144</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; font-family: 'Nanum Gothic';&quot;&gt;프로그래밍을 하다 보면 필연적으로 각종 오류에 부딪치게 되고 그 오류를 해결하는 과정에서 디버깅은 필수입니다. 디버깅을 얼마나 잘하느냐에 따라 프로그램의 생산성과 개발자의 능력이 좌우되기도 합니다. 그렇기에 모든 IDE에는 디버깅을 할 수 있는 기능들이 아주 잘 되어있습니다. 자바 개발이나 웹 개발을 할 때 많이 쓰이는 이클립스에도 디버깅 기능이 있습니다. 오늘은 이클립스의 디버깅 기능에 대해 포스팅 해보려 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 id=&quot;h&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&amp;nbsp;Break Point 지정&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;176&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3UG1w/btr6qOZ77Xa/a09qVZtkkbAc2k7c6Yt5f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3UG1w/btr6qOZ77Xa/a09qVZtkkbAc2k7c6Yt5f0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3UG1w/btr6qOZ77Xa/a09qVZtkkbAc2k7c6Yt5f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3UG1w%2Fbtr6qOZ77Xa%2Fa09qVZtkkbAc2k7c6Yt5f0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;176&quot; height=&quot;222&quot; data-origin-width=&quot;176&quot; data-origin-height=&quot;222&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;440&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NOl4D/btr6lqsM2F5/S2LHW0uiiEdvi2IFw5W7A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NOl4D/btr6lqsM2F5/S2LHW0uiiEdvi2IFw5W7A0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NOl4D/btr6lqsM2F5/S2LHW0uiiEdvi2IFw5W7A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNOl4D%2Fbtr6lqsM2F5%2FS2LHW0uiiEdvi2IFw5W7A0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;440&quot; height=&quot;393&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;393&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;디버깅을 진행하기 위해서는 가장 먼저 우선 자신이 조사하고 싶은 시점에 브레이크 포인트를 지정해주어야 합니다. 이클립스 좌측의 라인에서 오류가 의심가는 부분에&amp;nbsp;&lt;b&gt;더블클릭 or 우클릭 -&amp;gt; Toggle Breakpoint&lt;/b&gt;를 누르면 좌측 그림과 같이 조그마한 점이 찍힙니다. 이것이 브레이크 포인트입니다. 반복하면 브레이크 포인트가 해제됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 id=&quot;h_1&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&amp;nbsp;디버그 모드 실행&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbzwww/btr53H9XShK/jflgGhubbZISKvRpwoHda1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbzwww/btr53H9XShK/jflgGhubbZISKvRpwoHda1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbzwww/btr53H9XShK/jflgGhubbZISKvRpwoHda1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbzwww%2Fbtr53H9XShK%2FjflgGhubbZISKvRpwoHda1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;415&quot; height=&quot;84&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;84&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;430&quot; data-origin-height=&quot;123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tXvjp/btr6pd634Hl/np9tIYny4A0An9NjSTc9Y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tXvjp/btr6pd634Hl/np9tIYny4A0An9NjSTc9Y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tXvjp/btr6pd634Hl/np9tIYny4A0An9NjSTc9Y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtXvjp%2Fbtr6pd634Hl%2Fnp9tIYny4A0An9NjSTc9Y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;430&quot; height=&quot;123&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;123&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;디버그 모드를 실행시키려면 상단바에 있는 벌레모양 Debug를 클릭하거나 Run -&amp;gt; Debug를 클릭합니다. 단축키는 [F11]입니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqlG9Z/btr6tXoQPnB/jPXb1FKXgsu7jhwhC6SXEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqlG9Z/btr6tXoQPnB/jPXb1FKXgsu7jhwhC6SXEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqlG9Z/btr6tXoQPnB/jPXb1FKXgsu7jhwhC6SXEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqlG9Z%2Fbtr6tXoQPnB%2FjPXb1FKXgsu7jhwhC6SXEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;440&quot; height=&quot;389&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;디버깅 중 위와 같은 메시지 창이 뜬다면 Switch를 눌러 디버깅 모드로 전환하도록 합시다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 id=&quot;h_2&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&amp;nbsp;디버깅 진행&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G8IAw/btr5902xWLf/vWsahK6k5bWs96DSRyPkK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G8IAw/btr5902xWLf/vWsahK6k5bWs96DSRyPkK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G8IAw/btr5902xWLf/vWsahK6k5bWs96DSRyPkK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG8IAw%2Fbtr5902xWLf%2FvWsahK6k5bWs96DSRyPkK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;94&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;디버깅을 시작하면 위와 같이 브레이크 포인트를 지정한 부분에 정확히 멈춥니다. 여기서 디버깅을 진행하기 위해서는 자주 사용하는 단축키를 외워두시면 좋은데 자주 사용하는 단축키는 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Step Into(F5) :&lt;/b&gt;&amp;nbsp;한 줄씩 진행하되 함수 안이면 함수 안으로 들어갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Step Over(F6) :&lt;/b&gt;&amp;nbsp;한줄씩 진행하되 함수 호출은 건너뜁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Step Return(F7) :&lt;/b&gt;&amp;nbsp;현재 함수 끝까지 바로 가서 리턴 후 함수 호출부로 되돌아갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Resume(F8) :&lt;/b&gt;&amp;nbsp;다음 브레이크 포인트까지 건너뜁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwzp6X/btr6oYa8KH4/0SgCKPFGZDFokzFqlvrDP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwzp6X/btr6oYa8KH4/0SgCKPFGZDFokzFqlvrDP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwzp6X/btr6oYa8KH4/0SgCKPFGZDFokzFqlvrDP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcwzp6X%2Fbtr6oYa8KH4%2F0SgCKPFGZDFokzFqlvrDP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;45&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;단축키가 싫으신 분들은 위와 같이 Debug Toolbar를 활용해도 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBXzcj/btr6lo9AcIb/rbz9AikUL7hTaKswpcH6gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBXzcj/btr6lo9AcIb/rbz9AikUL7hTaKswpcH6gk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBXzcj/btr6lo9AcIb/rbz9AikUL7hTaKswpcH6gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBXzcj%2Fbtr6lo9AcIb%2Frbz9AikUL7hTaKswpcH6gk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;403&quot; height=&quot;235&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;403&quot; data-origin-height=&quot;235&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;만약 Debug툴이 없으시다면 Debug창의 우측에 3개의 세로 점 아이콘 (View Menu)를 클릭하신 후 Show Debug Toolbar를 클릭하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Debug Toolbar 사용법&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;897&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qlQ7N/btr6loPdfMn/EXjyYTRk0v9ZUnVLUo7BoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qlQ7N/btr6loPdfMn/EXjyYTRk0v9ZUnVLUo7BoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qlQ7N/btr6loPdfMn/EXjyYTRk0v9ZUnVLUo7BoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqlQ7N%2Fbtr6loPdfMn%2FEXjyYTRk0v9ZUnVLUo7BoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;897&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;897&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;변수의 값 확인&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3557D/btr6rx41EyR/xwuKpMZBeAZR1HhLFPkv90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3557D/btr6rx41EyR/xwuKpMZBeAZR1HhLFPkv90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3557D/btr6rx41EyR/xwuKpMZBeAZR1HhLFPkv90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3557D%2Fbtr6rx41EyR%2FxwuKpMZBeAZR1HhLFPkv90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;980&quot; height=&quot;376&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;대부분의 사소한 오류들은 자신이 선언해놓은 변수들에 정확한 값이 들어와있는지 검증을 통해 해결이 가능합니다. 디버깅 모드를 실행하고 변수에 커서를 가져다 대면 위와 같이 변수에 있는 값들을 확인하실 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;h_3&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #409d00; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&amp;nbsp;디버깅 활용&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;현재 설정되어 있는 Break Point 모두 확인하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZnUbt/btr6rxYgSfY/sakTKVDydTzIyQe685OsUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZnUbt/btr6rxYgSfY/sakTKVDydTzIyQe685OsUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZnUbt/btr6rxYgSfY/sakTKVDydTzIyQe685OsUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZnUbt%2Fbtr6rxYgSfY%2FsakTKVDydTzIyQe685OsUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;381&quot; height=&quot;151&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;현재 설정되어있는 브레이크 포인트들은 Breakpoints탭에서 확인이 가능합니다. 어느 프로젝트 어느 라인에 설정이 되어있는지 객관적으로 확인이 가능합니다. 주로 가고 싶은 브레이크 포인트를 더블클릭하여 해당 브레이크 포인트로 이동하고 싶을 때 사용하며 체크박스를 해제하여 비활성화도 할 수 있고 우클릭 -&amp;gt; Remove ALL을 눌러 모두 해제할 수도 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;현재 설정되어있는 변수의 모든 값 확인하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zYC2a/btr6oXDkg6Y/m3ELs1IIla0paHNjhZ7OPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zYC2a/btr6oXDkg6Y/m3ELs1IIla0paHNjhZ7OPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zYC2a/btr6oXDkg6Y/m3ELs1IIla0paHNjhZ7OPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzYC2a%2Fbtr6oXDkg6Y%2Fm3ELs1IIla0paHNjhZ7OPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;326&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Variables탭에서는 커서가 지나쳐온 모든 변수의 값을 확인하실 수 있습니다.&amp;nbsp;마우스 오버로는 하나의 변수밖에 한 번에 확인하실 수 없지만 이 탭에서는 모든 변수들의 값을 확인이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;특정 변수의 값 확인하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRyHK5/btr6otPX4Wl/jinhQ4KcOSo8JH6O0zikgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRyHK5/btr6otPX4Wl/jinhQ4KcOSo8JH6O0zikgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRyHK5/btr6otPX4Wl/jinhQ4KcOSo8JH6O0zikgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRyHK5%2Fbtr6otPX4Wl%2FjinhQ4KcOSo8JH6O0zikgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;232&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Expressions탭에서는 자신이 확인하고 싶은 특정 변수의 값을 확인할 수 있습니다. 확인하고 싶은 변수의 값을 추가할 때는 Add new expression을 누른 뒤 변수명을 입력하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;603&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KmFfh/btr6tXh4QzM/nNllXKxJ4WVejNL3TSJVWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KmFfh/btr6tXh4QzM/nNllXKxJ4WVejNL3TSJVWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KmFfh/btr6tXh4QzM/nNllXKxJ4WVejNL3TSJVWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKmFfh%2Fbtr6tXh4QzM%2FnNllXKxJ4WVejNL3TSJVWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;603&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;603&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;만약 위의 탭이 존재하지 않는다면 Window -&amp;gt; Show View에서 활성화시키시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;h_4&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #409d00; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&amp;nbsp;디버그 모드 전환&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clKPNx/btr6ofxzuWL/ZFO8OtzdqaYLRFsIEaeGx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clKPNx/btr6ofxzuWL/ZFO8OtzdqaYLRFsIEaeGx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clKPNx/btr6ofxzuWL/ZFO8OtzdqaYLRFsIEaeGx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclKPNx%2Fbtr6ofxzuWL%2FZFO8OtzdqaYLRFsIEaeGx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;557&quot; height=&quot;226&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이클립스를 사용하다 보면 의도하지 않은 상황에서 강제로 디버깅 모드로 전환이 되기도 하고 특정 작업을 위해 디버깅 모드로 전환을 하고 싶을 때도 있습니다. 이럴 때 즉시 전환할 수 있는 기능이 있습니다. 이클립스의 우측 상단을 보시면 위와 같은 아이콘이 있습니다. 여기서&lt;b&gt;&amp;nbsp;Debug버튼&lt;/b&gt;을 누르면 즉시 디버그 모드로 전환됩니다. 디버그 모드를 해제하고 다시 원래대로 돌아가고 싶다면 Java EE나 Java버튼을 누르시면 됩니다. Open Perspective 버튼을 눌러 자신이 전환하고 싶은 모드를 선택할 수도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9M5sV/btr6odGvs6r/kiBIowpLxjfTCLhTecZxbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9M5sV/btr6odGvs6r/kiBIowpLxjfTCLhTecZxbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9M5sV/btr6odGvs6r/kiBIowpLxjfTCLhTecZxbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9M5sV%2Fbtr6odGvs6r%2FkiBIowpLxjfTCLhTecZxbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;374&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;만약 위와 같은 아이콘이 없다면&amp;nbsp;&lt;b&gt;Windows -&amp;gt; Perspective -&amp;gt; Open Perspective -&amp;gt; Debug&lt;/b&gt;를 누르셔도 됩니다. 모든 디버깅은 이 Debug모드에서 하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;출처 : https://coding-factory.tistory.com/642&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>Backend</category>
      <author>WinBro</author>
      <guid isPermaLink="true">https://win-bro.tistory.com/144</guid>
      <comments>https://win-bro.tistory.com/144#entry144comment</comments>
      <pubDate>Fri, 17 Mar 2023 08:16:46 +0900</pubDate>
    </item>
    <item>
      <title>[Backend] 인텔리제이 디버깅(Intellij) - Debugging 사용법</title>
      <link>https://win-bro.tistory.com/143</link>
      <description>&lt;h2 id=&quot;-디버거&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;디버거&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램을 한 줄씩 실행시킬 수 있고 실행될 때 변하는 변수와 그 값들을 확인할 수 있다.&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;메뉴설명&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKetMy/btr6qOTpjHm/u01f8k4nwdeP4MbnKUT4ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKetMy/btr6qOTpjHm/u01f8k4nwdeP4MbnKUT4ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKetMy/btr6qOTpjHm/u01f8k4nwdeP4MbnKUT4ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKetMy%2Fbtr6qOTpjHm%2Fu01f8k4nwdeP4MbnKUT4ik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;937&quot; height=&quot;223&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;223&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;Step Over (F8) : 현재 정지되어 있는 시점에서 명령어 하나만 실행이 된다&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;103&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/42Npx/btr6srXUVIt/V3NJTkbkRMcrTi4CXBXvck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/42Npx/btr6srXUVIt/V3NJTkbkRMcrTi4CXBXvck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/42Npx/btr6srXUVIt/V3NJTkbkRMcrTi4CXBXvck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F42Npx%2Fbtr6srXUVIt%2FV3NJTkbkRMcrTi4CXBXvck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;103&quot; height=&quot;122&quot; data-origin-width=&quot;103&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;Step Into (F7) : 현재 위치의 메소드를 확인할 수 있다.&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;98&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mQlCM/btr6lo2OvNG/NxMaLp6PxLx6rkmKaauD00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mQlCM/btr6lo2OvNG/NxMaLp6PxLx6rkmKaauD00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mQlCM/btr6lo2OvNG/NxMaLp6PxLx6rkmKaauD00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmQlCM%2Fbtr6lo2OvNG%2FNxMaLp6PxLx6rkmKaauD00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;98&quot; height=&quot;93&quot; data-origin-width=&quot;98&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;Run to Cursor (Alt + F9) : 현재 커서까지 디버그할 수 있도록 도와준다.&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;100&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfCn1O/btr6btXOhZn/0m6nzCYp4hwC555xWOc7Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfCn1O/btr6btXOhZn/0m6nzCYp4hwC555xWOc7Wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfCn1O/btr6btXOhZn/0m6nzCYp4hwC555xWOc7Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfCn1O%2Fbtr6btXOhZn%2F0m6nzCYp4hwC555xWOc7Wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;100&quot; height=&quot;103&quot; data-origin-width=&quot;100&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&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;342&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9VjCd/btr6perlTsN/JSzOb3RKPP5vkBABNkCTZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9VjCd/btr6perlTsN/JSzOb3RKPP5vkBABNkCTZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9VjCd/btr6perlTsN/JSzOb3RKPP5vkBABNkCTZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9VjCd%2Fbtr6perlTsN%2FJSzOb3RKPP5vkBABNkCTZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;342&quot; height=&quot;509&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;509&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;Resume Program (F9) : 현재에서 다음 Breakpoint까지 디버그해준다.&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;102&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l3O1U/btr6eTaVCaJ/Ok3IHks4TxjpAfYzKUsWaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l3O1U/btr6eTaVCaJ/Ok3IHks4TxjpAfYzKUsWaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l3O1U/btr6eTaVCaJ/Ok3IHks4TxjpAfYzKUsWaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl3O1U%2Fbtr6eTaVCaJ%2FOk3IHks4TxjpAfYzKUsWaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;102&quot; height=&quot;127&quot; data-origin-width=&quot;102&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;Stop(ctrl + F2) :현재 디버그를 중지해준다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;98&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X8qbi/btr6oeZJlRO/dwKMzlLUnIDDpXiKICwKmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X8qbi/btr6oeZJlRO/dwKMzlLUnIDDpXiKICwKmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X8qbi/btr6oeZJlRO/dwKMzlLUnIDDpXiKICwKmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX8qbi%2Fbtr6oeZJlRO%2FdwKMzlLUnIDDpXiKICwKmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;98&quot; height=&quot;118&quot; data-origin-width=&quot;98&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;Return : 처음에 디버그한 파일로 돌아갈 수 있게해준다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;100&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8s1KZ/btr53Fxu1d7/oKPMR6rqDlSMFYhMZMqDX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8s1KZ/btr53Fxu1d7/oKPMR6rqDlSMFYhMZMqDX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8s1KZ/btr53Fxu1d7/oKPMR6rqDlSMFYhMZMqDX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8s1KZ%2Fbtr53Fxu1d7%2FoKPMR6rqDlSMFYhMZMqDX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;100&quot; height=&quot;113&quot; data-origin-width=&quot;100&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;디버깅 과정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;1. 처음에 Breakpoint를 만들고 Debug 현재파일을 시작한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhzKdX/btr590haWsl/vKtMyD1hjR9mYN1Q46PBPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhzKdX/btr590haWsl/vKtMyD1hjR9mYN1Q46PBPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhzKdX/btr590haWsl/vKtMyD1hjR9mYN1Q46PBPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhzKdX%2Fbtr590haWsl%2FvKtMyD1hjR9mYN1Q46PBPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;709&quot; height=&quot;160&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;img src=&quot;https://blog.kakaocdn.net/dn/c71Er2/btr6eWeuyXk/vpYkQXRpYErVdhsFkWy0m1/img.png&quot; width=&quot;709&quot; height=&quot;235&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Breakpoint가 빨간색 동그라미고, id에 값 할당 전까지 디버그한것이다. 변수도 아직 args에 대해서만 할당되었다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;2. Step Over(F8)로 바로 다음 명령어만 실행시킨다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJGAqi/btr6rxjErSC/Ismok1I9ydJFnZcKbmAWm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJGAqi/btr6rxjErSC/Ismok1I9ydJFnZcKbmAWm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJGAqi/btr6rxjErSC/Ismok1I9ydJFnZcKbmAWm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJGAqi%2Fbtr6rxjErSC%2FIsmok1I9ydJFnZcKbmAWm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;173&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;img src=&quot;https://blog.kakaocdn.net/dn/csNoSj/btr6os4D475/l3kWuah0HmMMqANoPZ7XV1/img.png&quot; width=&quot;710&quot; height=&quot;90&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 다음 파란색 줄로 밑줄이 쳐져있는 곳으로 이동하였고 id의 값을 디버그 했으며 변수가 저장된 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;3. resume을 클릭하여 다음에 있는 BreakPoint까지 이동한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWTPxf/btr53FK4wYd/ghjft2NM5HCkybmPiWxo01/img.png&quot; width=&quot;709&quot; height=&quot;212&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;4. 현재 위치한 메소드를 확인하기 위해 Step Into(F7) 클릭한다.&lt;/b&gt;&lt;/span&gt;&amp;rarr; Step Into를 클릭하면 on이라는 함수의 위치로 이동하여 그 메소드를 확인할 수있다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OTuux/btr53H9XHNY/KPxnUJIk2jt1Lwue3LXlB0/img.png&quot; width=&quot;705&quot; height=&quot;118&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;5. 다시 처음 파일로 돌아가기 위해 Return을 클릭한다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;rarr; 디버그 페이지가 종료된다.&lt;/p&gt;</description>
      <category>Backend</category>
      <author>WinBro</author>
      <guid isPermaLink="true">https://win-bro.tistory.com/143</guid>
      <comments>https://win-bro.tistory.com/143#entry143comment</comments>
      <pubDate>Fri, 17 Mar 2023 07:32:00 +0900</pubDate>
    </item>
    <item>
      <title>[Spring MVC] RequestMapping</title>
      <link>https://win-bro.tistory.com/142</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring&amp;nbsp;Framework는&amp;nbsp;다양한&amp;nbsp;방식으로&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;HTTP&amp;nbsp;요청을&amp;nbsp;처리&lt;/span&gt;할&amp;nbsp;수&amp;nbsp;있는데,&amp;nbsp;그&amp;nbsp;중에서도&amp;nbsp;가장&amp;nbsp;많이&amp;nbsp;사용되는&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;방식&amp;nbsp;중&amp;nbsp;하나가&amp;nbsp;RequestMapping&lt;/span&gt;&amp;nbsp;입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RequestMapping은 &lt;span style=&quot;color: #ee2323;&quot;&gt;컨트롤러의 메서드와 HTTP 요청을 매핑시켜주는 애노테이션&lt;/span&gt;으로,&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;Spring은&amp;nbsp;HTTP&amp;nbsp;요청을&amp;nbsp;컨트롤러&amp;nbsp;메서드와&amp;nbsp;매핑시켜&amp;nbsp;해당&amp;nbsp;메서드를&amp;nbsp;실행하게&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;RequestMapping은&amp;nbsp;다양한&amp;nbsp;방식으로&amp;nbsp;사용될&amp;nbsp;수&amp;nbsp;있는데,&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;방식으로&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;1. URL 경로 매핑&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;RequestMapping은&amp;nbsp;URL&amp;nbsp;경로와&amp;nbsp;매핑되는&amp;nbsp;기능을&amp;nbsp;수행합니다.&amp;nbsp;URL&amp;nbsp;경로&amp;nbsp;매핑은&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;단순 경로 :&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;@RequestMapping(&quot;/hello&quot;)&lt;/b&gt;&lt;/span&gt;와&amp;nbsp;같이&amp;nbsp;요청&amp;nbsp;URL&amp;nbsp;경로를&amp;nbsp;직접&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를&amp;nbsp;들어,&amp;nbsp;&quot;/hello&quot;&amp;nbsp;경로에&amp;nbsp;대한&amp;nbsp;요청이&amp;nbsp;들어오면&amp;nbsp;해당&amp;nbsp;메서드가&amp;nbsp;실행됩니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;경로 변수 :&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;@RequestMapping(&quot;/users/{id}&quot;)&lt;/b&gt;와&amp;nbsp;같이&amp;nbsp;중괄호({})&amp;nbsp;안에&amp;nbsp;변수&amp;nbsp;이름을&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를&amp;nbsp;들어,&amp;nbsp;&quot;/users/123&quot;&amp;nbsp;경로에&amp;nbsp;대한&amp;nbsp;요청이&amp;nbsp;들어오면,&amp;nbsp;id&amp;nbsp;변수에&amp;nbsp;&quot;123&quot;&amp;nbsp;값이&amp;nbsp;할당되어&amp;nbsp;해당&amp;nbsp;메서드가&amp;nbsp;실행됩니다.&amp;nbsp;경로&amp;nbsp;변수는&amp;nbsp;여러&amp;nbsp;개&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있으며,&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;@PathVariable&amp;nbsp;애노테이션을&amp;nbsp;사용해&amp;nbsp;변수를&amp;nbsp;매핑&lt;/span&gt;할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ant 스타일 패턴 :&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;@RequestMapping(&quot;/users/&quot;)&lt;/b&gt;와&amp;nbsp;같이&amp;nbsp;와일드카드(*)와&amp;nbsp;더블&amp;nbsp;와일드카드()를&amp;nbsp;사용해&amp;nbsp;패턴을&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;&quot;/users/123/orders&quot;&amp;nbsp;경로에&amp;nbsp;대한&amp;nbsp;요청이&amp;nbsp;들어오면&amp;nbsp;해당&amp;nbsp;메서드가&amp;nbsp;실행됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;2. HTTP Method 매핑&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;RequestMapping은&amp;nbsp;HTTP&amp;nbsp;요청&amp;nbsp;메서드와도&amp;nbsp;매핑됩니다.&amp;nbsp;HTTP&amp;nbsp;Method&amp;nbsp;매핑은&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;GET&amp;nbsp;요청:&amp;nbsp;@RequestMapping(value&amp;nbsp;=&amp;nbsp;&quot;/users&quot;,&amp;nbsp;method&amp;nbsp;=&amp;nbsp;RequestMethod.GET)와&amp;nbsp;같이&amp;nbsp;value와&amp;nbsp;method&amp;nbsp;속성을&amp;nbsp;사용해&amp;nbsp;GET&amp;nbsp;요청에&amp;nbsp;대한&amp;nbsp;매핑을&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;@GetMapping(&quot;/users&quot;)와&amp;nbsp;같이&amp;nbsp;간편하게&amp;nbsp;사용할&amp;nbsp;수도&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;POST&amp;nbsp;요청:&amp;nbsp;@RequestMapping(value&amp;nbsp;=&amp;nbsp;&quot;/users&quot;,&amp;nbsp;method&amp;nbsp;=&amp;nbsp;RequestMethod.POST)와&amp;nbsp;같이&amp;nbsp;value와&amp;nbsp;method&amp;nbsp;속성을&amp;nbsp;사용해&amp;nbsp;POST&amp;nbsp;요청에&amp;nbsp;대한&amp;nbsp;매핑을&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;@PostMapping(&quot;/users&quot;)와&amp;nbsp;같이&amp;nbsp;간편하게&amp;nbsp;사용할&amp;nbsp;수도&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;PUT&amp;nbsp;요청:&amp;nbsp;@RequestMapping(value&amp;nbsp;=&amp;nbsp;&quot;/users/{id}&quot;,&amp;nbsp;method&amp;nbsp;=&amp;nbsp;RequestMethod.PUT)와&amp;nbsp;같이&amp;nbsp;value와&amp;nbsp;method&amp;nbsp;속성을&amp;nbsp;사용해&amp;nbsp;PUT&amp;nbsp;요청에&amp;nbsp;대한&amp;nbsp;매핑을&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;@PutMapping(&quot;/users/{id}&quot;)와&amp;nbsp;같이&amp;nbsp;간편하게&amp;nbsp;사용할&amp;nbsp;수도&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;DELETE&amp;nbsp;요청:&amp;nbsp;@RequestMapping(value&amp;nbsp;=&amp;nbsp;&quot;/users/{id}&quot;,&amp;nbsp;method&amp;nbsp;=&amp;nbsp;RequestMethod.DELETE)와&amp;nbsp;같이&amp;nbsp;value와&amp;nbsp;method&amp;nbsp;속성을&amp;nbsp;사용해&amp;nbsp;DELETE&amp;nbsp;요청에&amp;nbsp;대한&amp;nbsp;매핑을&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;@DeleteMapping(&quot;/users/{id}&quot;)와&amp;nbsp;같이&amp;nbsp;간편하게&amp;nbsp;사용할&amp;nbsp;수도&amp;nbsp;있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;3. 파라미터 매핑&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;RequestMapping은&amp;nbsp;요청&amp;nbsp;파라미터에도&amp;nbsp;매핑&lt;/span&gt;됩니다.&amp;nbsp;요청&amp;nbsp;파라미터에&amp;nbsp;대한&amp;nbsp;매핑은&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;@RequestParam&amp;nbsp;애노테이션을&amp;nbsp;사용해&amp;nbsp;지정&lt;/span&gt;할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;@RequestMapping(&quot;/user&quot;)&amp;nbsp;애노테이션과&amp;nbsp;함께&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;@RequestParam(&quot;userId&quot;)&amp;nbsp;String&amp;nbsp;userId&lt;/span&gt;&amp;nbsp;라는&amp;nbsp;파라미터가&amp;nbsp;있다면,&amp;nbsp;&quot;/user?userId=1234&quot;와&amp;nbsp;같은&amp;nbsp;요청에&amp;nbsp;대해&amp;nbsp;해당&amp;nbsp;메서드가&amp;nbsp;실행되어&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;userId&amp;nbsp;파라미터에&amp;nbsp;&quot;1234&quot;&amp;nbsp;값을&amp;nbsp;전달&lt;/span&gt;받게&amp;nbsp;됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring MVC에서는 &lt;b&gt;@RequestParam, @PathVariable, @RequestBody&lt;/b&gt; 등의 애노테이션을 사용하여 파라미터 매핑을 수행합니다. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;@RequestParam&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;- @RequestParam 애노테이션은 HTTP 요청 파라미터를 메서드 파라미터와 매핑합니다. 이 애노테이션은 다음과 같이 사용할 수 있습니다.&lt;br /&gt;- @RequestParam(&quot;파라미터 이름&quot;) 타입 변수명: HTTP 요청 파라미터 이름과 메서드 파라미터 이름을 지정합니다. &lt;br /&gt;&lt;br /&gt;- @RequestParam(value=&quot;파라미터 이름&quot;, required=false, defaultValue=&quot;기본값&quot;) 타입 변수명: value 속성으로 HTTP 요청 파라미터 이름을, required 속성으로 필수 여부를, defaultValue 속성으로 기본값을 지정할 수 있습니다. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;@PathVariable&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;- @PathVariable 애노테이션은 URI 경로 변수를 메서드 파라미터와 매핑합니다. 이 애노테이션은 다음과 같이 사용할 수 있습니다.&lt;br /&gt;- @PathVariable(&quot;변수 이름&quot;) 타입 변수명: URI 경로 변수 이름과 메서드 파라미터 이름을 지정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;@RequestBody&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;- @RequestBody 애노테이션은 HTTP 요청 본문을 메서드 파라미터와 매핑합니다. 이 애노테이션은 다음과 같이 사용할 수 있습니다.&lt;br /&gt;- @RequestBody 타입 변수명: HTTP 요청 본문의 내용을 메서드 파라미터 타입으로 변환하여 매핑합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;@RequestHeader&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;- @RequestHeader 애노테이션은 HTTP 요청 헤더를 메서드 파라미터와 매핑합니다. 이 애노테이션은 다음과 같이 사용할 수 있습니다.&lt;br /&gt;- @RequestHeader(&quot;헤더 이름&quot;) 타입 변수명: HTTP 요청 헤더 이름과 메서드 파라미터 이름을 지정합니다.&lt;br /&gt;- @RequestHeader(value=&quot;헤더 이름&quot;, required=false, defaultValue=&quot;기본값&quot;) 타입 변수명: value 속성으로 HTTP 요청 헤더 이름을, required 속성으로 필수 여부를, defaultValue 속성으로 기본값을 지정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이러한&amp;nbsp;파라미터&amp;nbsp;매핑&amp;nbsp;애노테이션을&amp;nbsp;사용하면&amp;nbsp;HTTP&amp;nbsp;요청&amp;nbsp;파라미터,&amp;nbsp;경로&amp;nbsp;변수,&amp;nbsp;요청&amp;nbsp;본문&amp;nbsp;등을&amp;nbsp;메서드&amp;nbsp;파라미터와&amp;nbsp;쉽게&amp;nbsp;매핑할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;컨트롤러&amp;nbsp;메서드에서&amp;nbsp;HTTP&amp;nbsp;요청을&amp;nbsp;처리할&amp;nbsp;때&amp;nbsp;매우&amp;nbsp;편리하게&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;출처 : 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술&lt;/b&gt;&lt;/blockquote&gt;</description>
      <category>Backend/Spring MVC</category>
      <author>WinBro</author>
      <guid isPermaLink="true">https://win-bro.tistory.com/142</guid>
      <comments>https://win-bro.tistory.com/142#entry142comment</comments>
      <pubDate>Thu, 16 Mar 2023 07:50:06 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] @Controller와 @RestController 차이</title>
      <link>https://win-bro.tistory.com/141</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전통적인 Spring MVC의 컨트롤러인 @Controller와 Restuful 웹서비스의 컨트롤러인 @RestController의 &lt;span style=&quot;color: #ee2323;&quot;&gt;주요한 차이점은 HTTP Response Body가 생성되는 방식&lt;/span&gt;입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 2가지 어노테이션의 차이와 사용법에 대해 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #f15f5f;&quot;&gt;1. @Controller 이해하기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[&amp;nbsp;Controller로&amp;nbsp;View&amp;nbsp;반환하기&amp;nbsp;]&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;전통적인&amp;nbsp;Spring&amp;nbsp;MVC의&amp;nbsp;컨트롤러인&amp;nbsp;@Controller는&amp;nbsp;주로&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;View를&amp;nbsp;반환하기&amp;nbsp;위해&lt;/span&gt;&amp;nbsp;사용합니다.&amp;nbsp;아래와&amp;nbsp;같은&amp;nbsp;과정을&amp;nbsp;통해&amp;nbsp;Spring&amp;nbsp;MVC&amp;nbsp;Container는&amp;nbsp;Client의&amp;nbsp;요청으로부터&amp;nbsp;View를&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;1259&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb81ye/btr4AVtRXUc/grpNKEK03isYaF01iEsfi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb81ye/btr4AVtRXUc/grpNKEK03isYaF01iEsfi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb81ye/btr4AVtRXUc/grpNKEK03isYaF01iEsfi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb81ye%2Fbtr4AVtRXUc%2FgrpNKEK03isYaF01iEsfi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1259&quot; height=&quot;618&quot; data-origin-width=&quot;1259&quot; data-origin-height=&quot;618&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Client는 URI 형식으로 웹 서비스에 요청을 보낸다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;DispatcherServlet이 요청을 위임할 HandlerMapping을 찾는다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;HandlerMapping을 통해 요청을 Controller로 위임한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Controller는 요청을 처리한 후에 ViewName을 반환한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Controller가 반환환 뷰의 이름으로부터 View를 렌더링하기 위해서는 ViewResolver가 사용되며, ViewResolver 설정에 맞게 View를 찾아 렌더링합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[ Controller로 Data 반환하기 ]&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만&amp;nbsp;Spring&amp;nbsp;MVC의&amp;nbsp;컨트롤러를&amp;nbsp;사용하면서&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;Data를&amp;nbsp;반환해야&amp;nbsp;하는&amp;nbsp;경우&lt;/span&gt;도&amp;nbsp;있습니다.&amp;nbsp;컨트롤러에서는&amp;nbsp;데이터를&amp;nbsp;반환하기&amp;nbsp;위해&amp;nbsp;@ResponseBody&amp;nbsp;어노테이션을&amp;nbsp;활용해주어야&amp;nbsp;합니다.&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;Controller도&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;Json&amp;nbsp;형태로&amp;nbsp;데이터를&amp;nbsp;반환&lt;/span&gt;할&amp;nbsp;수&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;1255&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EtzrG/btr4v79YLq1/3TADv2TOBMRUIuW4va1JIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EtzrG/btr4v79YLq1/3TADv2TOBMRUIuW4va1JIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EtzrG/btr4v79YLq1/3TADv2TOBMRUIuW4va1JIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEtzrG%2Fbtr4v79YLq1%2F3TADv2TOBMRUIuW4va1JIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1255&quot; height=&quot;585&quot; data-origin-width=&quot;1255&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Client는 URI 형식으로 웹 서비스에 요청을 보낸다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;DispatcherServlet이 요청을 위임할 HandlerMapping을 찾는다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;HandlerMapping을 통해 요청을 Controller로 위임한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Controller는 요청을 처리한 후에 객체를 반환한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;반환되는 객체는 Json으로 Serialize되어 사용자에게 반환된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;컨트롤러를 통해 객체를 반환할 때에는 일반적으로 ResponseEntity로 감싸서 반환을 합니다. 그리고 객체를 반환하기 위해서는&amp;nbsp;viewResolver 대신에 HttpMessageConverter가 동작합니다. HttpMessageConverter에는 여러 Converter가 등록되어 있고, 반환해야 하는 데이터에 따라 사용되는 Converter가 달라집니다. 단순 문자열인 경우에는 StringHttpMessageConverter가 사용되고, 객체인 경우에는 MappingJackson2HttpMessageConverter가 사용되며, 데이터 종류에 따라 서로 다른 MessageConverter가 작동하게 됩니다. Spring은 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해 적합한 HttpMessageConverter를 선택하여 이를 처리합니다. MessageConverter가 동작하는 시점은 HandlerAdapter와 Controller가 요청을 주고 받는 시점이다. 그림의 4번에서는 메세지를 객체로, 6번에서는 객체를 메세지로 변환하는데 메세지 컨버터가 사용된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[&amp;nbsp;@Controller&amp;nbsp;예제&amp;nbsp;코드&amp;nbsp;]&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1679265883904&quot; class=&quot;java&quot; style=&quot;background-color: #eff9fb; color: #000000; text-align: start;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    @GetMapping(value = &quot;/users&quot;)
    public @ResponseBody ResponseEntity&amp;lt;User&amp;gt; findUser(@RequestParam(&quot;userName&quot;) String userName){
        return ResponseEntity.ok(userService.findUser(user));
    }
    
    @GetMapping(value = &quot;/users/detailView&quot;)
    public String detailView(Model model, @RequestParam(&quot;userName&quot;) String userName){
        User user = userService.findUser(userName);
        model.addAttribute(&quot;user&quot;, user);
        return &quot;/users/detailView&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 예제의 findUser는 User 객체를 ResponseEntity로 감싸서 반환하고 있고, User를 json으로 반환하기 위해 @ResponseBody라는 어노테이션을 붙여주고 있습니다. detailView 함수에서는 View를 전달해주고 있기 때문에 String을 반환값으로 설정해주었습니다. (물론 이렇게 데이터를 반환하는 RestController와 View를 반환하는 Controller를 분리하여 작성하는 것이 좋습니다.)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #f15f5f;&quot;&gt;2. @RestController 이해하기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[&amp;nbsp;RestController&amp;nbsp;]&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@RestController는 @Controller에 @ResponseBody가 추가된 것입니다. 당연하게도 RestController의 주용도는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Json 형태로 객체 데이터를 반환&lt;/span&gt;하는 것입니다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;최근에 데이터를 응답으로 제공하는 REST API를 개발할 때 주로 사용하며 객체를 ResponseEntity로 감싸서 반환합니다. 이러한 이유로 동작 과정 역시 @Controller에 @ReponseBody를 붙인 것과 완벽히 동일합니다.&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;1255&quot; data-origin-height=&quot;587&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl6z3l/btr4JLjU7cY/2bWQGrah2vX3ABR59PoOj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl6z3l/btr4JLjU7cY/2bWQGrah2vX3ABR59PoOj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl6z3l/btr4JLjU7cY/2bWQGrah2vX3ABR59PoOj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl6z3l%2Fbtr4JLjU7cY%2F2bWQGrah2vX3ABR59PoOj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1255&quot; height=&quot;587&quot; data-origin-width=&quot;1255&quot; data-origin-height=&quot;587&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Client는 URI 형식으로 웹 서비스에 요청을 보낸다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;DispatcherServlet이 요청을 위임할 HandlerMapping을 찾는다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;HandlerMapping을 통해 요청을 Controller로 위임한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Controller는 요청을 처리한 후에 객체를 반환한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;반환되는 객체는 Json으로 Serialize되어 사용자에게 반환된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[&amp;nbsp;@RestController&amp;nbsp;예제&amp;nbsp;코드&amp;nbsp;]&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1679265883909&quot; class=&quot;java&quot; style=&quot;background-color: #eff9fb; color: #000000; text-align: start;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
@RequestMapping(&quot;/user&quot;)
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    @GetMapping(value = &quot;/users&quot;)
    public User findUser(@RequestParam(&quot;userName&quot;) String userName){
        return userService.findUser(user);
    }

    @GetMapping(value = &quot;/users&quot;)
    public ResponseEntity&amp;lt;User&amp;gt; findUserWithResponseEntity(@RequestParam(&quot;userName&quot;) String userName){
        return ResponseEntity.ok(userService.findUser(user));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;findUser는 User 객체를 그대로 반환하고 있습니다. 이러한 경우의 문제는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;클라이언트가 예상하는 HttpStatus를 설정&lt;/span&gt;해줄 수 없다는 것입니다. 예를 들어 어떤 객체의 생성 요청이라면 201 CREATED를 기대할 것이지만 객체를 그대로 반환하면 HttpStatus를 설정해줄 수 없습니다. 그래서 객체를 상황에 맞는 ResponseEntity로 감싸서 반환해주어야 합니다.&lt;/p&gt;</description>
      <category>Backend/Spring Framework</category>
      <author>WinBro</author>
      <guid isPermaLink="true">https://win-bro.tistory.com/141</guid>
      <comments>https://win-bro.tistory.com/141#entry141comment</comments>
      <pubDate>Wed, 15 Mar 2023 08:23:47 +0900</pubDate>
    </item>
  </channel>
</rss>